[
        {
          "id": "powershell-start-lyncbackup",
          "title": "New-SfBBackup",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "OnlineHelp, Lync, PowerShell",
          "url": "/powershell/start-lyncbackup/",
          "content": "This script exports Lync Core Data and Settings according to the documentation availabe on TechNet\nIt is intended to be run as scheduled task, the Retention parameter can be used to indicate how long to keep existing backup files in the target directory.\n\nInputs\nNone. This script does not take any pipeline input.\n\nOutputs\nNone. This script does not write any output to the pipeline.\n\nPermissions\nThe Account used to run this script needs to be member of the RTCUniversalServerAdmins group.\n\nExample 1\n.\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\SERVER\\Share\\CSBackup\n\n\nThis example exports Lync config and saves it into a subfolder at \\\\SERVER\\Share\\CSBackup\n\nExample 2\n.\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\SERVER\\Share\\CSBackup -Retention 10\n\n\nThis example exports Lync config and saves it into a subfolder at \\\\SERVER\\Share\\CSBackup. It deletes existing backups in the destination directory if they are older than 10 days.\n\nDownload &amp; Source for New-SfBBackup\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name New-SfBBackup -Scope CurrentUser\n\nSave-Script -Name New-SfBBackup -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-test-groupmembership",
          "title": "Test-GroupMembership",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "blog, archives, PowerShell, OnlineHelp",
          "url": "/powershell/test-groupmembership/",
          "content": "This function uses [ADSI] to test group membership based on the constructed security token of the principal. You can pipe objects to this function. The function writes $true or $false for each tested object.\n\n\nThis function makes use of Richard Muellers “PowerShell script to check group membership”. Check the related link.\n\nInputs\n[Microsoft.ActiveDirectory.Management.ADAccount]\nYou can pipe an ADAccount object, such as returned by Get-AdUser or Get-AdComputer, to Test-GroupMembership.\n\nOutputs\n[bool]\nTest-GroupMembership returns $true or $false for each tested account.\n\nExample 1\nGet-AdUser -Filter * | Test-GroupMemership -GroupName \"Domain Users\"\n\nThis example gets users from Active Directory and tests wether or not they are member of the “Domain Users” security group.\n\nExample 2\nGet-AdComputer -Filter * | Test-GroupMemership -GroupName \"Domain Computers\"\n\nThis example gets computers from Active Directory and tests wether or not they are member of the “Domain Computers” security group.\n\nRelated Links\nRichard Muellers Script in the TechNet ScriptCenter: http://gallery.technet.microsoft.com/scriptcenter/5adf9ad0-1abf-4557-85cd-657da1cc7df4\n\nDownload &amp; Source for Test-GroupMembership\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Test-GroupMembership -Scope CurrentUser\n\nSave-Script -Name Test-GroupMembership -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-invoke-sefautil",
          "title": "Invoke-SEFAUtil",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, OnlineHelp, Lync",
          "url": "/powershell/invoke-sefautil/",
          "content": "This is a wrapper function for the SEFAUtil.exe tool from the Lync Resource Kit Tools. It’s intended purpose is to make dealing with the cmdline tool easier.\n\n\n\nSYNTAX\n\n.\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddTeamMember &lt;String&gt;] [-RemoveTeamMember &lt;String&gt;] [-DelayRingTeam &lt;Int32&gt;] [-DisableTeamCall] [-SimulRingTeam] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n.\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddDelegate &lt;String&gt;] [-RemoveDelegate &lt;String&gt;] [-DelayRingDelegates &lt;Int32&gt;] [-FwdToDelegates] [-SimulRingDelegates] [-DisableDelegation] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n.\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableSimulRing &lt;String&gt;] [-DisableSimulRing] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n.\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableFwdNoAnswer &lt;String&gt;] [-EnableFwdImmediate &lt;String&gt;] [-CallAnswerwaitTime &lt;Int32&gt;] [-DisableFwdImmediate] [-DisableFwdNoAnswer] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\n\nThe default Value for the Path parameter assumes Lync 2013 Resource Kit Tools are installed at C:\\Program Files\\Microsoft Lync Server 2013\\ResKit. This function requires version 3 of PowerShell as well as the Lync Module for user validation. Note: Check the related links for a really cool GUI wrapper by MVP Johan Veldhuis.\n\nRELATED LINKS\n\n\n  Invoke-SEFAUtil – a PowerShell wrapper function\n  Updated: Invoke-SEFAUtil\n  SefaUtil GUI\n  Skype for Business Server 2015 Resource Kit Tools Documentation\n\n\nEXAMPLE 1\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it \n\n\nThis example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.\n\nEXAMPLE 2\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567\n\n\nThis example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.\n\nEXAMPLE 3\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.it\n\n\nThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.\n\nEXAMPLE 4\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 \n\n\nThis example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.it\n\nEXAMPLE 5\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCall\n\n\nThis example disables Team Call for thomas@tomt.it\n\nEXAMPLE 6\n\nGet-CsUser -OU \"OU=users,OU=tomt,DC=tomt,DC=local\" | .\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.it\n\n\nThis example uses Get-CsUser to get all Lync Users from within the specified Organizational Unit and adds thomas@tomt.it as delegate.\n\nDownload &amp; Source for Invoke-SEFAUtil\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Invoke-SEFAUtil -Scope CurrentUser\n\nSave-Script -Name Invoke-SEFAUtil -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-restore-vmpermission",
          "title": "Restore-VMPermission",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "OnlineHelp, Hyper-V, PowerShell",
          "url": "/powershell/restore-vmpermission/",
          "content": "Adds permissions for the VMId to all assigned disks.\n\nSYNTAX\n.\\Restore-VMPermission.ps1 [-VM] &lt;String[]&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis script uses the Hyper-V Module to update permissions for all assigned disks on one ore more VMs. This is useful if you move/replace VHDs and the read permission ACE for VMId is missing.\n\nPARAMETERS\n-VM &lt;String[]&gt;\n    VM, specify the VM that needs permissions fixed.\n\n    Required?                    true\n    Position?                    1\n    Default value\n    Accept pipeline input?       true (ByPropertyName)\n    Accept wildcard characters?  false\n\n-WhatIf [&lt;SwitchParameter&gt;]\n\n    Required?                    false\n    Position?                    named\n    Default value\n    Accept pipeline input?       false\n    Accept wildcard characters?  false\n\n-Confirm [&lt;SwitchParameter&gt;]\n\n    Required?                    false\n    Position?                    named\n    Default value\n    Accept pipeline input?       false\n    Accept wildcard characters?  false\n\n&lt;CommonParameters&gt;\n    This cmdlet supports the common parameters: Verbose, Debug,\n    ErrorAction, ErrorVariable, WarningAction, WarningVariable,\n    OutBuffer, PipelineVariable, and OutVariable. For more information, see\n    about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216).\n\n\nINPUTS\nYou can pipe objcets with a VMName property, such as returned by Get-VM, to this script.\n\n\nOUTPUTS\nNone. This script does not write any objects to the pipeline.\n\n\nEXAMPLE 1\nPS C:\\&gt;Restore-VMPermission.ps1 -VM dc01\n\nThis example adds permission for dc01 VMId to the ACL of all assigned disks for dc01.\n\nEXAMPLE 2\nPS C:\\&gt;Get-VM | Restore-VMPermission.ps1\n\nThis example uses Get-VM to get all VMs on the local machine. It gets all disks for all VMs and adds the required premissions for VMId to the ACL.\n\nDownload &amp; Source for Restore-VMPermission\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Restore-VMPermission -Scope CurrentUser\n\nSave-Script -Name Restore-VMPermission -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-create-ucszoninghints",
          "title": "Create-UcsZoningHints",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "Cisco, PowerShell, OnlineHelp",
          "url": "/powershell/create-ucszoninghints/",
          "content": "This script uses the CiscoUcs PowerTool to get information about one or more service profiles and creates SIST zoning configuration for NX-OS. The Target’s device-alias as well as the name for the ZoneSet and the VSAN can be specified with parameters. Zone names will be automatically created.\n\n\nSyntax\n.\\Create-UcsZoningHints.ps1 -Name &lt;String&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]\n\n.\\Create-UcsZoningHints.ps1 -InputObject &lt;Object&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]\n\n.\\Create-UcsZoningHints.ps1 [-UcsCentral] -TemplateName &lt;String&gt; [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]\n\n\nInputs\n\n  Cisco.Ucsm.LsServer\n  Cisco.UcsCentral.LsServer\n\n\nYou can pipe objects of the above types to this script.\n\nOutputs\n\n  System.Management.Automation.PSObject\n  System.String\n\n\nDepending on the parameters used, this script writes a custom PSObject or a System.String to the pipeline. The default behavior is to output a custom PSObject. If the –OutFile parameter is used, a string will be output instead.\n\nExample 1\nPS Scripts:\\&gt; Connect-Ucs 192.168.1.100\nPS Scripts:\\&gt; Get-UcsServiceProfile -Name HVSV02 | .\\Create-UcsZoningHints.ps1 -TargetAlias vnx-a\n\nId CommandLine\n-- -----------\n0 ! Fabric A\n1 device-alias database\n2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:41\n3 device-alias commit\n4 ! Zones\n5 zone name HVSV02-vHba-A_vnx-a vsan 1\n6  member device-alias vnx-a\n7  member device-alias HVSV02-vHba-A\n8 ! Zoneset\n9 zoneset name myZoneSet vsan 1\n10  member HVSV02-vHba-A_vnx-a\n11 ! zoneset activate name myZoneSet vsan 1\n\n\nIn this example, we use Connect-Ucs to connect to an instance of UCS Manager. Using Get-UcsServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, creates the output shown above. The –TargetAlias parameter specifies the device-alias to use as zone target.\nLines 1-3 create a device-alias for the vHBA of Fabric A in the NX-OS configuration.\nLines 5-7 create a zone create a SIST zone and adds the vHBA’s and the target’s device-aliases as members.\nLines 9 and 10 add the newly created zone to an existing zoneset configuration.\nLine 11 can be uncommented to activate the updated zoneset.\n\nExample 2\nPS Scripts:\\&gt; Connect-UcsCentral 192.168.1.102\nPS Scripts:\\&gt; Get-UcsCentralServiceProfile -Name HVSV02 | .\\Create-UcsZoningHints.ps1 -TargetAlias vnx-a -UcsCentral\n\nId CommandLine\n-- -----------\n0 ! Fabric A\n1 device-alias database\n2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:41\n3 device-alias commit\n4 ! Zones\n5 zone name HVSV02-vHba-A_vnx-a vsan 1\n6  member device-alias vnx-a\n7  member device-alias HVSV02-vHba-A\n8 ! Zoneset\n9 zoneset name myZoneSet vsan 1\n10  member HVSV02-vHba-A_vnx-a\n11 ! zoneset activate name myZoneSet vsan 1\n\nIn this example, we use Connect-UcsCentral to connect to an instance of UCS Central. Using Get-UcsCentralServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, using the Parameter –UcsCentral creates the output shown above.\n\nExample 3\nPS Scripts:\\&gt; Get-UcsServiceProfile -AssignState assigned | .\\Create-UcsZoningHints.ps1 –TargetAlias vnx-b -Fabric B -ZoneSet cfg-prod\n\nId CommandLine\n-- -----------\n0 ! Fabric B\n1 device-alias database\n2  device-alias name ESX01-vHba-B pwwn 20:01:00:25:B5:00:0B:01\n3  device-alias name ESX02-vHba-B pwwn 20:01:00:25:B5:00:0B:02\n4  device-alias name HVSV02-vHba-B pwwn 20:01:00:25:B5:00:0B:41\n5 device-alias commit\n6 ! Zones\n7 zone name ESX01-vHba-B_vnx-b vsan 1\n8  member device-alias vnx-b\n9  member device-alias ESX01-vHba-B\n10 zone name ESX02-vHba-B_vnx-b vsan 1\n11  member device-alias vnx-b\n12  member device-alias ESX02-vHba-B\n13 zone name HVSV02-vHba-B_vnx-b vsan 1\n14  member device-alias vnx-b\n15  member device-alias HVSV02-vHba-B\n16 ! Zoneset\n17 zoneset name cfg-prod vsan 1\n18  member ESX01-vHba-B_vnx-b\n19  member ESX02-vHba-B_vnx-b\n20  member HVSV02-vHba-B_vnx-b\n21 ! zoneset activate name cfg-prod vsan 1\n\nThis example uses the -AssignState parameter when getting Service Profiles from UCS Manager. This will retrieve all Service Profiles that are assigned to a physical server. Piping the retrieved Service Profile objects to this script, creates zones from each individual vHBA of each server to the device-alias specified using the –TargetAlias parameter.\nThe -Fabric parameter specifies which Cisco UCS SwitchId is used to query vHBA information.\nThe -ZoneSet parameter specifies the name of the zoneset to use in the configuration snippet.\n\nExample 4\nPS Scripts:\\&gt; Get-UcsServiceProfile | .\\Create-UcsZoningHints.ps1 -Fabric B -Vsan 200 -OutFile c:\\temp\\zoneset.txt\n! Fabric A\ndevice-alias database\ndevice-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:41\n...\n\nThis example creates zoning configuration for all configured Service Profiles. The -OutFile parameter specifies a filename where the output is written to. The output is also written to the pipeline.\nNote: Using the -OutFile parameter does not output an object but a simple string of commands to make copy/pasting easier. \n(alternatively use “| Select-Object -ExpandProperty CommandLine”)\nThe -Vsan parameter specifies the Id of the vsan to use in the NX-OS configuration.\n\nExample 5\nPS Scripts:\\&gt; Get-UcsServiceProfile | .\\Create-UcsZoningHints.ps1 -TargetAlias vnx-1-a,vnx-2-a\n\nThis example creates zoning configuration for all configured Service Profiles to all specified Targets.\n\nDownload &amp; Source for Create-UcsZoningHints\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Create-UcsZoningHints -Scope CurrentUser\n\nSave-Script -Name Create-UcsZoningHints -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-start-testwebserver",
          "title": "Start-TestWebServer",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, OnlineHelp",
          "url": "/powershell/start-testwebserver/",
          "content": "Start-TestWebServer\n\nSYNOPSIS\nWebserver for load balancer testing.\n\nSYNTAX\n\nStart-TestWebServer.ps1 [[-Port] &lt;Int32&gt;] [-CreateFirewallRule]\n\n\nDESCRIPTION\nStart a web listener that listens on a specified port and simply answers to any request, returning JSON object containing the request.\nRequires administrative rights to create the listener.\n\nEXAMPLES\n\n————————– EXAMPLE 1 ————————–\n.\\Start-TestWebServer -Port 8001\n\n\nStart the test WebServer on port 8001.\n\n————————– EXAMPLE 2 ————————–\n.\\Start-TestWebServer -Port 80 -CreateFirewallRule\nInvoke-RestMethod -Uri http://localhost | Select-Object UserAgent\n\n\nStart the test WebServer on port 80 and create a Firewall Rule to allow traffic to the specified port.\nThe Invoke-RestMethod cmdlet is used to send a request to the listener and parse the output.\n\nPARAMETERS\n\n-Port\nSpecify a TCP port number for the HTTP listener to use.\nDefaults to 8000.\n\nType: Int32\nParameter Sets: (All)\nAliases: \n\nRequired: False\nPosition: 1\nDefault value: 8000\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-CreateFirewallRule\nUse this switch to automatically create a Windows Firewall rule to allow incoming connections on the specified port.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: \n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nINPUTS\n\nNone.\n\nOUTPUTS\n\nNone.\n\nNOTES\n\nRELATED LINKS\n\nhttps://ntsystems.it/PowerShell/start-testwebserver/\n\nDownload &amp; Source for Start-TestWebServer\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall- -Name Start-TestWebServer -Scope CurrentUser\n\nSave- -Name Start-TestWebServer -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-send-splunkevent",
          "title": "Send-SplunkEvent",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, OnlineHelp",
          "url": "/powershell/send-splunkevent/",
          "content": "SYNOPSIS\nSend events to Splunk’s HTTP Event Collector.\n\nSYNTAX\n\nSend-SplunkEvent.ps1 [-InputObject] &lt;Object&gt; [[-HostName] &lt;String&gt;] [[-DateTime] &lt;DateTime&gt;] [[-Uri] &lt;String&gt;] [[-Key] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to send structured data to Splunk HTTP Event Collector.\nUse the \nHostName and DateTime parameters to control Splunk’s ‘host’ and ‘time’ properties for the generated event.\n\nEXAMPLES\n\nEXAMPLE 1\n.\\Send-SplunkEvent.ps1 -InputObject @{message=\"Hello Splunk!\"} -Key &lt;token&gt;\n\n\nThis example sends a simple event containing “message”: “Hello Splunk!” to the event collector running on the local system.\n\nEXAMPLE 2\nImport-Csv logs.csv | .\\Send-SplunkEvent -Key &lt;token&gt; -HostName SBC1 -Uri \"https://splunk01.example.com:8088/services/collector\"\n\n\nThis example imports logs from a CSV file and sends each one of them to event collector running on splunk01.example.com.\nThe HostName parameter specifies which host created the logs.\n\nPARAMETERS\n\n-InputObject\nData object that will be sent to Splunk’s HTTP Event Collector.\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-HostName\nHostName to be used for Splunk’s ‘host’ property.\nDefault’s to name of the local system.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: (hostname)\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-DateTime\nDate and Time of the event.\nDefaults to now() on the local system.\n\nType: DateTime\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: (Get-Date)\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Uri\nURI of the Splunk HTTP Event Collector instance.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: Http://localhost:8088/services/collector\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Key\nKey for the Splunk HTTP Event Collector instance.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: wi\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Confirm\nPrompts you for confirmation before running the cmdlet.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: cf\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\nINPUTS\n\n[psobject]\n\nOUTPUTS\n\nNone.\n\nNOTES\nAuthor: @torggler\n\nRELATED LINKS\n\nhttps://ntsystems.it/PowerShell/Send-SplunkEvent/\n\nDownload &amp; Source for Send-SplunkEvent\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Send-SplunkEvent -Scope CurrentUser\n\nSave-Script -Name Send-SplunkEvent -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-remove-logfile",
          "title": "Remove-LogFile",
          "collection": {
            "label": "Scripts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, OnlineHelp",
          "url": "/powershell/remove-logfile/",
          "content": "SYNOPSIS\nDeletes log files.\n\nSYNTAX\n\nRemove-LogFile.ps1 -Path &lt;Object&gt; [-Age &lt;Int32&gt;] [-Filter &lt;String&gt;] [-LogFile &lt;FileInfo&gt;] [-Recurse] [-WhatIf]\n [-Confirm] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nDeletes log files, parameters can be used to specify the root folder, whether or not to include subfolders, a file extension filter and the age. This is intended to be run as scheduled task to regularly clean-up log files.\n\nEXAMPLES\n\nExample 1\n.\\Remove-LogFile.ps1 -Path C:\\inetpub\\logs -Age 7 -Recurse\n\n\nThis example removes all *.log files older than 7 days from C:\\inetpub\\logs and any subfolders.\n\nPARAMETERS\n\n-Age\nSpecify a number of days. Files with a LastWriteTime older than this will be deleted.\n\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Confirm\nPrompts you for confirmation before running the cmdlet.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: cf\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Filter\nSpecify file extension filter. Defaults to ‘*.log’.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-LogFile\nSpecify a path to a log file. The script will log information and erros to the file.\n\nType: FileInfo\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Path\nSpecify folder in which logs will be deleted.\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Recurse\nInclude subfolders.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: wi\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.\nFor more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS\n\nDownload &amp; Source for Remove-LogFile\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Remove-LogFile -Scope CurrentUser\n\nSave-Script -Name Remove-LogFile -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell"
        },
        {
          "id": "powershell-psspeech",
          "title": "PSSpeech",
          "collection": {
            "label": "Modules",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/powershell/psspeech/",
          "content": "PSSpeech is a collection of functions to work with Azure Cognitive Services, more specifically the Speech Service.\n\nThe function  Get-SpeechToken can be used to get an OAuth token for authentication to the service. The function Get-SpeechVoicesList can be use to get a list of available voices and the function Covert-TextToSpeech can be used to convert a given string to speech.\n\nGet-SpeechToken -Key &lt;yourkey&gt; \nConvert-TextToSpeech -Text \"Hi there, how are you doing today?\" -Path hithere.mp3\n\n\nFunctions\n\n\n    \n    \n    \n    \n    \n    \n        Convert-TextToSpeech\n        Convert a string to audio using Azure Cognitive Services.\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n        Get-SpeechToken\n        Get OAuth token for authorization to Azure Cognitive Services.\n    \n    \n    \n        Get-SpeechTokenResult\n         Get-SpeechTokenResult \n    \n    \n    \n        Get-SpeechVoicesList\n        Get a list of available voices from the speech service.\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n\nDownload &amp; Source for PSSpeech\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall- -Name PSSpeech -Scope CurrentUser\n\nSave- -Name PSSpeech -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler"
        },
        {
          "id": "powershell-tak",
          "title": "TAK",
          "collection": {
            "label": "Modules",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/powershell/tak/",
          "content": "Tom’s Admin Kit, or TAK, is a PowerShell script module that contains useful tools which I collected or created over the years.\n\nThe main goal of creating the module and writing the scripts it contains, was learning PowerShell and making my job a little bit easier. As I am currently looking into continuous integration, I used this module to build an example deployment pipeline. You can read more about that here.\n\nFunctions\n\n\n    \n    \n        Add-EtcHostsEntry\n        Add an entry to local hosts file.\n    \n    \n    \n        Connect-Lync\n        Connect to Skype for Business Server or Online.\n    \n    \n    \n        Connect-SfB\n        Connect to Skype for Business Server or Online.\n    \n    \n    \n        Convert-SubnetMask\n        Convert a SubnetMask to PrefixLength or vice-versa.\n    \n    \n    \n    \n        ConvertFrom-Base64\n        Convert Base64 to ClearText String\n    \n    \n    \n        ConvertFrom-SID\n        Get the account name for a SID.\n    \n    \n    \n        ConvertTo-Base64\n        Convert a String to Base64\n    \n    \n    \n        ConvertTo-SID\n        Get the SID for an account name\n    \n    \n    \n        Edit-EtcHosts\n        Edit etc hosts file with notepad.\n    \n    \n    \n        Get-DKIMRecord\n        Get DKIM Record for a domain.\n    \n    \n    \n        Get-DMARCRecord\n        Get DMARC Record for a domain.\n    \n    \n    \n        Get-MacAddressVendor\n        Mac Address vendor lookup.\n    \n    \n    \n        Get-MxRecord\n        Get MX Records for a domain.\n    \n    \n    \n        Get-SPFRecord\n        Get SPF Record for a domain. If the include tag is present, recursively get that SPF Record, too.\n    \n    \n    \n    \n    \n    \n        Get-TakHash\n        Get hash for a string.\n    \n    \n    \n        Get-WlanProfile\n         Get-WlanProfile \n    \n    \n    \n        Import-Csr\n        Import certificate signing request from base64 text.\n    \n    \n    \n        Import-DhcpServerLog\n        Import DHCP Server Log files.\n    \n    \n    \n        Import-IISLog\n        Import IIS log files with default header.\n    \n    \n    \n        Invoke-WhoisRequest\n        Wohis request.\n    \n    \n    \n        New-FirewallRule\n        Create a new Windows Firewall Rule.\n    \n    \n    \n        New-RgsReport\n        Gather information about Skype for Business Response Groups, Queues, Agent Groups.\n    \n    \n    \n        New-SPFRecord\n        Create SPF record for a given mail domain.\n    \n    \n    \n        Remove-EtcHostsEntry\n        Remove an entry from local hosts file by it's IP address.\n    \n    \n    \n        Show-EtcHosts\n        Display /etc/hosts file content on Windows or Linux/macOS.\n    \n    \n    \n        Show-WlanProfile\n        Get wlan pre-shared key.\n    \n    \n    \n        Test-ExchangeAutodiscover\n        Test Exchange Autodiscover Web Service.\n    \n    \n    \n        Test-FederationService\n        Test the ADFS web service\n    \n    \n    \n        Test-LyncDNS\n        Test DNS entries for Skype for Business / Lync deployments.\n    \n    \n    \n        Test-LyncDiscover\n        Test the Lyncdiscover service for Skype for Business/Lync deployments\n    \n    \n    \n        Test-OOSFarm\n        Get internal and external URLs for PowerPoint sharing.\n    \n    \n    \n        Test-SfBDNS\n        Test DNS entries for Skype for Business / Lync deployments.\n    \n    \n    \n        Test-SfBDiscover\n        Test the Lyncdiscover service for Skype for Business/Lync deployments\n    \n    \n    \n        Test-TCPConnection\n        Test if a TCP Connection can be established.\n    \n    \n    \n        Test-TLSConnection\n        Test if a TLS Connection can be established.\n    \n    \n    \n        Update-FileWriteTime\n        Touch a file.\n    \n\nDownload &amp; Source for TAK\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Module -Name TAK -Scope CurrentUser\n\nSave-Module -Name TAK -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/TAK"
        },
        {
          "id": "powershell-ntsystemspsdrive",
          "title": "ntSystemsPSDrive",
          "collection": {
            "label": "Modules",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/powershell/ntsystemspsdrive/",
          "content": "ntSystemsPSDrive is a SHiPS provider for ntSystems.it.\n\nIt uses the SHiPS module to create a PSProvider for our blog which exposes our json-api as PSDrive and enables the following:\n\nImport-Module ntSystemsPSDrive\nNew-ntSystemsPSDrive\ndir ntSystems:\ndir ntSystems: -Depth 1\nGet-ChildItem 'ntSystems:\\Posts by Category\\PowerShell\\' | Select-Object -Property name,url\nGet-Content 'ntSystems:\\Posts by Category\\ntSystems\\Jekyll Fun: Consuming ntSystems with PowerShell' \n\n\nYou can read more about it here.\n\nFunctions\n\n\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n\nDownload &amp; Source for ntSystemsPSDrive\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Module -Name ntSystemsPSDrive -Scope CurrentUser\n\nSave-Module -Name ntSystemsPSDrive -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/ntSystemsPSDrive"
        },
        {
          "id": "powershell-add-etchostsentry",
          "title": "Add-EtcHostsEntry",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/add-etchostsentry/",
          "content": "Add-EtcHostsEntry\n\nSYNOPSIS\nAdd an entry to local hosts file.\n\nSYNTAX\n\nAdd-EtcHostsEntry [-IPAddress] &lt;String&gt; [-Fqdn] &lt;String&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nAdds a lines to the /etc/hosts file of the local computer.\nRequires write access to /etc/hosts - if running PowerShell Core on  Linux/macOS try “sudo powershell”\n\nEXAMPLES\n\nEXAMPLE 1\nAdd-EtcHostsEntry -IPAddress 1.1.1.1 -Fqdn test.fqdn\n\n\nThis example adds following line to the hosts file\n1.1.1.1 test.test\n\nPARAMETERS\n\n-IPAddress\nIPAddress of the hosts entry to be added\n\nType: String\nParameter Sets: (All)\nAliases: ip\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Fqdn\nFQDN of the hosts entry to be added\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: wi\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Confirm\nPrompts you for confirmation before running the cmdlet.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: cf\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-connect-lync",
          "title": "Connect-Lync",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/connect-lync/",
          "content": "Connect-Lync\n\nSYNOPSIS\nConnect to Skype for Business Server or Online.\n\nSYNTAX\n\nDESCRIPTION\nThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Servers\nor Skype for Business Online.\nThe resulting PS Session is then imported and makes cmdlets available in the current session.\nThe Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.\n\nThis function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6\n\nEXAMPLES\n\nEXAMPLE 1\nConnect-SfB -Online -AdminDomain uclab\n\n\nThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.com\n\nPARAMETERS\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\nNone.\nNOTES\nAuthor: @torggler\n\nRELATED LINKS"
        },
        {
          "id": "powershell-connect-sfb",
          "title": "Connect-SfB",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/connect-sfb/",
          "content": "Connect-SfB\n\nSYNOPSIS\nConnect to Skype for Business Server or Online.\n\nSYNTAX\n\nServer\nConnect-SfB -Server &lt;Object&gt; [-Credential &lt;PSCredential&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;]\n [&lt;CommonParameters&gt;]\n\n\nOnline\nConnect-SfB [-AdminDomain &lt;String&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Servers\nor Skype for Business Online.\nThe resulting PS Session is then imported and makes cmdlets available in the current session.\nThe Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.\n\nThis function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6\n\nEXAMPLES\n\nEXAMPLE 1\nConnect-SfB -Online -AdminDomain uclab\n\n\nThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.com\n\nPARAMETERS\n\n-Server\nSpecifies the ServerName that the session will be connected to\n\nType: Object\nParameter Sets: Server\nAliases:\n\nRequired: True\nPosition: Named\nDefault value: None\nAccept pipeline input: True (ByPropertyName)\nAccept wildcard characters: False\n\n\n-AdminDomain\nSpecify the admin doamin to connect to (OverrideAdminDomain parameter)\n\nType: String\nParameter Sets: Online\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Credential\nCredential used for connection; if not specified, the currently logged on user will be used\n\nType: PSCredential\nParameter Sets: Server\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Timeout\nSession idle timeout in seconds\n\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: 3600\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ProxyType\nProxyAccessType to use for the PsSession\n\nType: ProxyAccessType\nParameter Sets: (All)\nAliases:\nAccepted values: None, IEConfig, WinHttpConfig, AutoDetect, NoProxyServer\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\nNone.\nNOTES\nAuthor: @torggler\n\nRELATED LINKS"
        },
        {
          "id": "powershell-convert-subnetmask",
          "title": "Convert-SubnetMask",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/convert-subnetmask/",
          "content": "Convert-SubnetMask\n\nSYNOPSIS\nConvert a SubnetMask to PrefixLength or vice-versa.\n\nSYNTAX\n\nConvert-SubnetMask [-SubnetMask] &lt;Object&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nLong description\n\nEXAMPLES\n\nEXAMPLE 1\nConvert-SubnetMask 24\n\n\n255.255.255.0\n\nThis example converts the PrefixLength 24 to a dotted SubnetMask.\n\nEXAMPLE 2\nConvert-SubnetMask 255.255.0.0\n\n\n16\n\nThis example counts the relevant network bits of the dotted SubnetMask 255.255.0.0.\n\nPARAMETERS\n\n-SubnetMask\nSubnetMask to convert\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\n[string]\nOUTPUTS\n\n[string]\nNOTES\nLogic from: https://d-fens.ch/2013/11/01/nobrainer-using-powershell-to-convert-an-ipv4-subnet-mask-length-into-a-subnet-mask-address/\n\nRELATED LINKS"
        },
        {
          "id": "powershell-convert-texttospeech",
          "title": "Convert-TextToSpeech",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "psspeech",
          "tags": "",
          "url": "/powershell/convert-texttospeech/",
          "content": "Convert-TextToSpeech\n\nSYNOPSIS\nConvert a string to audio using Azure Cognitive Services.\n\nSYNTAX\n\nConvert-TextToSpeech [-Text] &lt;String&gt; [-Path] &lt;FileInfo&gt; [[-Voice] &lt;String&gt;] [[-OutputFormat] &lt;String&gt;]\n [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to call the Azure Cognitive Service Speech Service API, convert a string to speech, and save the resulting audio to a file.\n\nEXAMPLES\n\nEXAMPLE 1\nConvert-TextToSpeech -Text \"Hi, this is a test.\" -Path test.mp3\n\n\nThis example converts the string “Hi, this is a test.” to speech and saves the audio to the test.mp3 file.\n\nPARAMETERS\n\n-Text\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Path\n\nType: FileInfo\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Voice\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: En-GB-LibbyNeural\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-OutputFormat\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: Audio-16khz-32kbitrate-mono-mp3\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\nNone.\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-convertfrom-base64",
          "title": "ConvertFrom-Base64",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/convertfrom-base64/",
          "content": "ConvertFrom-Base64\n\nSYNOPSIS\nConvert Base64 to ClearText String\n\nSYNTAX\n\nConvertFrom-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis Function uses [System.Convert] to convert Base64 encoded String to ClearText.\nThe Encoding parameter can be used to specify which encoding to use.\nBelieve it or not, works on Linux/macOS!\n\nEXAMPLES\n\nEXAMPLE 1\nConvertFrom-Base64 'YXdlc29tZSwgaXNuJ3QgaXQ/'\n\n\nThis example converts the given Base64 encoded string to clear text.\n\nPARAMETERS\n\n-String\nOne or more Strings to be converted\n\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Encoding\nThe Encoding to use.\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: Default\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-convertfrom-sid",
          "title": "ConvertFrom-SID",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/convertfrom-sid/",
          "content": "ConvertFrom-SID\n\nSYNOPSIS\nGet the account name for a SID.\n\nSYNTAX\n\nConvertFrom-SID [-SID] &lt;SecurityIdentifier&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nUse [System.Security.Principal.SecurityIdentifier].Translate() to get the samAccountName for a SID\n\nEXAMPLES\n\nEXAMPLE 1\nConvertFrom-SID -Sid S-1-5-21-2330142668-2157844774-769409458\n\n\nEXAMPLE 2\n\"S-1-3-1\" | ConvertFrom-SID\n\n\nPARAMETERS\n\n-SID\nSID, specify the SID to translate.\n\nType: SecurityIdentifier\nParameter Sets: (All)\nAliases: Value\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nYou can pipe input to this function.\nOUTPUTS\n\nReturns string values.\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-convertto-base64",
          "title": "ConvertTo-Base64",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/convertto-base64/",
          "content": "ConvertTo-Base64\n\nSYNOPSIS\nConvert a String to Base64\n\nSYNTAX\n\nConvertTo-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis Function uses [System.Convert] to convert a ClearText String to Base64.\nThe Encoding parameter can be used to specify which encoding to use.\nBelieve it or not, works on Linux/macOS!\n\nEXAMPLES\n\nEXAMPLE 1\nConvertTo-Base64 'my cleartext'\n\n\nThis example converts ‘my cleartext’ to Base64 using ‘Default’ encoding.\n\nPARAMETERS\n\n-String\nOne or more Strings to be converted\n\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Encoding\nThe Encoding to use.\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: Default\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-convertto-sid",
          "title": "ConvertTo-SID",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/convertto-sid/",
          "content": "ConvertTo-SID\n\nSYNOPSIS\nGet the SID for an account name\n\nSYNTAX\n\nConvertTo-SID [-SamAccountName] &lt;NTAccount&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nUse [System.Security.Principal.SecurityIdentifier].Translate() to get the SID for a samAccountName\n\nEXAMPLES\n\nEXAMPLE 1\nConvertTo-SID -SamAccountName ttorggler\n\n\nEXAMPLE 2\n\"ntsystems\\ttorggler\" | ConvertTo-SID\n\n\nPARAMETERS\n\n-SamAccountName\nSamAccountName, specify the account name to translate.\n\nType: NTAccount\nParameter Sets: (All)\nAliases: Value\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nYou can pipe input to this function.\nOUTPUTS\n\nReturns string values.\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-edit-etchosts",
          "title": "Edit-EtcHosts",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/edit-etchosts/",
          "content": "Edit-EtcHosts\n\nSYNOPSIS\nEdit etc hosts file with notepad.\n\nSYNTAX\n\nEdit-EtcHosts\n\n\nDESCRIPTION\nThis funtion starts notepad.exe as administrator and opens the hosts file for editing.\nIf this function is running on PowerShell Core, it runs “sudo vi /etc/hosts”\n\nrun notepad as administrator and open the hosts file for editing\n\nEXAMPLES\n\nExample 1\nPS C:\\&gt; \n\n\nPARAMETERS\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-dkimrecord",
          "title": "Get-DKIMRecord",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-dkimrecord/",
          "content": "Get-DKIMRecord\n\nSYNOPSIS\nGet DKIM Record for a domain.\n\nSYNTAX\n\nGet-DKIMRecord [-DomainName] &lt;String&gt; [[-Selector] &lt;String[]&gt;] [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Resolve-DNSName to get the DKIM Record for a given domain.\nObjects with a DomainName property,\nsuch as returned by Get-AcceptedDomain, can be piped to this function.\nThe function defaults to “selector1” as this\nis typically used with Exchange Online.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-AcceptedDomain | Get-DKIMRecord\n\n\nThis example gets DKIM records for all domains returned by Get-AcceptedDomain.\n\nPARAMETERS\n\n-DomainName\nSpecify the Domain name to use in the query.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n\n\n-Selector\nSpecify a selector name to use in the query.\n\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: @(\"selector1\",\"selector2\")\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Server\nSpecify a DNS server to query.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-dmarcrecord",
          "title": "Get-DMARCRecord",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-dmarcrecord/",
          "content": "Get-DMARCRecord\n\nSYNOPSIS\nGet DMARC Record for a domain.\n\nSYNTAX\n\nGet-DMARCRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Resolve-DNSName to get the DMARC Record for a given domain.\nObjects with a DomainName property,\nsuch as returned by Get-AcceptedDomain, can be piped to this function.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-AcceptedDomain | Get-DMARCRecord\n\n\nThis example gets DMARC records for all domains returned by Get-AcceptedDomain.\n\nPARAMETERS\n\n-DomainName\nSpecify the Domain name to use for the query.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n\n\n-Server\nSpecify a DNS server to query.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-macaddressvendor",
          "title": "Get-MacAddressVendor",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-macaddressvendor/",
          "content": "Get-MacAddressVendor\n\nSYNOPSIS\nMac Address vendor lookup.\n\nSYNTAX\n\nGet-MacAddressVendor [-MacAddress] &lt;Object&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-WebRequest to look up the vendor of a Mac Address’ Organizationally Unique Identifier (OUI).\nWorks on PowerShell Core for Linux/macOS.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-MacAddressVendor -MacAddress '00-50-56-C0-00-01','00:0F:FE:E8:4F:27'\n\n\nThis example looks up the vendor for the two specified Mac Addresses.\n\nEXAMPLE 2\nGet-NetAdapter | Get-MacAddressVendor\n\n\nThis example looks up the vendor of all network adapters returned by Get-NetAdapter.\n\nEXAMPLE 3\nGet-NetAdapterConfig -ComputerName Server01.domain.local | Get-MacAddressVendor\n\n\nThis example looks up the vendor of all network adapters returned by Get-NetAdapterConfig which supports remoting.\n\nEXAMPLE 4\nGet-DhcpServerv4Lease -ComputerName DhcpServer -ScopeId 192.168.1.0 | Get-MacAddressVendor\n\n\nThis example looks up the vendor of all currently assigned address leases on a DHCP Server.\n\nPARAMETERS\n\n-MacAddress\nSpecifiy a MAC Address to look up\n\nType: Object\nParameter Sets: (All)\nAliases: ClientId, MA\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName)\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nSystem.Management.Automation.PSObject\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-mxrecord",
          "title": "Get-MxRecord",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-mxrecord/",
          "content": "Get-MxRecord\n\nSYNOPSIS\nGet MX Records for a domain.\n\nSYNTAX\n\nGet-MxRecord [-Domain] &lt;String&gt; [[-Server] &lt;IPAddress&gt;] [-ResolvePTR] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nUses Resolve-DnsName to get MX Records, Priority and the IP Address of the records.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-MxRecord ntsystems.it\n\n\nThis example gets the MX record for the domain ntsystems.it.\n\nPARAMETERS\n\n-Domain\nSpecify the Domain name for the query.\n\nType: String\nParameter Sets: (All)\nAliases: DomainName\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Server\nSpecify the DNS server to query.\n\nType: IPAddress\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ResolvePTR\nAlso resolve PTR\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\n[string]\nOUTPUTS\n\n[Selected.Microsoft.DnsClient.Commands.DnsRecord_MX]\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-spfrecord",
          "title": "Get-SPFRecord",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-spfrecord/",
          "content": "Get-SPFRecord\n\nSYNOPSIS\nGet SPF Record for a domain.\nIf the include tag is present, recursively get that SPF Record, too.\n\nSYNTAX\n\nGet-SPFRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [-Recurse] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Resolve-DNSName to recursively get the SPF Record for a given domain.\nObjects with a DomainName property,\nsuch as returned by Get-AcceptedDomain, can be piped to this function.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-AcceptedDomain | Get-SPFRecord\n\n\nThis example gets SPF records for all domains returned by Get-AcceptedDomain.\n\nPARAMETERS\n\n-DomainName\nSpecify the Domain name for the query.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n\n\n-Server\nSpecify the Domain name for the query.\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Recurse\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-speechtoken",
          "title": "Get-SpeechToken",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "psspeech",
          "tags": "",
          "url": "/powershell/get-speechtoken/",
          "content": "Get-SpeechToken\n\nSYNOPSIS\nGet OAuth token for authorization to Azure Cognitive Services.\n\nSYNTAX\n\nGet-SpeechToken [-Region] &lt;String&gt; [-Key] &lt;String&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to get a bearer token that can be used in the Authorization header when calling \nAzure Cognitive Services.\nThis requires access to an Azure subscription and API key for the speech service.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-SpeechToken -Region &lt;region&gt; -Key &lt;apikey&gt;\n\n\nThis example gets a token using the provided key and region.\n\nPARAMETERS\n\n-Region\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Key\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\n[psobject]\nNOTES\nKey should probably be a secure string, update once secrets management module is released.\nThe token is stored in $script:SpeechToken and can be retrieved with Get-SpeechTokenResult\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-speechtokenresult",
          "title": "Get-SpeechTokenResult",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "psspeech",
          "tags": "",
          "url": "/powershell/get-speechtokenresult/",
          "content": "Get-SpeechTokenResult\n\nSYNOPSIS\n\nSYNTAX\n\nGet-SpeechTokenResult\n\n\nDESCRIPTION\n\nEXAMPLES\n\nExample 1\nPS C:\\&gt; \n\n\nPARAMETERS\n\nINPUTS\n\nNone\n\nOUTPUTS\n\nSystem.Object\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-speechvoiceslist",
          "title": "Get-SpeechVoicesList",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "psspeech",
          "tags": "",
          "url": "/powershell/get-speechvoiceslist/",
          "content": "Get-SpeechVoicesList\n\nSYNOPSIS\nGet a list of available voices from the speech service.\n\nSYNTAX\n\nGet-SpeechVoicesList [[-token] &lt;Object&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to get a list of available voices from the Azure Cognitive Services Speech Service.\nUse the Token parameter\nto specify a token created with Get-SpeechToken and use the Region parameter to specify a region other than the default westeurope.\nIf the Token parameter is not specified, the global variable created by Save-SpeechToken is used.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-SpeechVoicesList\n\n\nThis example gets a list of available voices.\n\nPARAMETERS\n\n-token\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: $script:SpeechToken.Token\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\n[psobject]\nNOTES\nGeneral notes\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-takhash",
          "title": "Get-TakHash",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-takhash/",
          "content": "Get-TakHash\n\nSYNOPSIS\nGet hash for a string.\n\nSYNTAX\n\nGet-TakHash [-String] &lt;String&gt; [[-Algorithm] &lt;Object&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses various various crypto service providers to get the hash value for a given input string.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-TakHash \"Hello World!\"\n\n\nThis example returns the MD5 hash of “Hello World!”.\n\nEXAMPLE 2\nGet-TakHash \"Hello World!\" -Algorithm Sha256\n\n\nThis example gets the SHA256 hash of “Hello World!”.\n\nPARAMETERS\n\n-String\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Algorithm\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-get-wlanprofile",
          "title": "Get-WlanProfile",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/get-wlanprofile/",
          "content": "Get-WlanProfile\n\nSYNOPSIS\n\nSYNTAX\n\nGet-WlanProfile\n\n\nDESCRIPTION\n\nEXAMPLES\n\nExample 1\nPS C:\\&gt; \n\n\nPARAMETERS\n\nINPUTS\n\nNone\n\nOUTPUTS\n\nSystem.Object\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-import-csr",
          "title": "Import-Csr",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/import-csr/",
          "content": "Import-Csr\n\nSYNOPSIS\nImport certificate signing request from base64 text.\n\nSYNTAX\n\nImport-Csr [[-Path] &lt;FileInfo&gt;] [-ShowText] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses the Windows Subsystem for Linux to invoke `openssl` to decode a certificate signing request.\n\nEXAMPLES\n\nEXAMPLE 1\nImport-Csr c:\\temp\\cert.req\n\n\nThis example imports a CSR located at the given path and decodes it’s contents.\n\nPARAMETERS\n\n-Path\n\nType: FileInfo\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ShowText\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone\nOUTPUTS\n\n[psobject]\nNOTES\nAuthor: @torggler\nDate: 2019-06-14\n\nRELATED LINKS"
        },
        {
          "id": "powershell-import-dhcpserverlog",
          "title": "Import-DhcpServerLog",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/import-dhcpserverlog/",
          "content": "Import-DhcpServerLog\n\nSYNOPSIS\nImport DHCP Server Log files.\n\nSYNTAX\n\nImport-DhcpServerLog [[-Path] &lt;Object&gt;] [[-Filter] &lt;Object&gt;] [[-ComputerName] &lt;Object&gt;] [-Latest]\n [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function imports DHCP Server Log files from CSV format.\n\nEXAMPLES\n\nEXAMPLE 1\nImport-DhcpServerLog\n\n\nImport all logs found in the default log folder.\n\nPARAMETERS\n\n-Path\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: C:\\Windows\\System32\\dhcp\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Filter\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: DhcpSrvLog*.log\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ComputerName\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Latest\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\n\nOUTPUTS\n\n[psobject]\nNOTES\nGeneral notes\n\nRELATED LINKS"
        },
        {
          "id": "powershell-import-iislog",
          "title": "Import-IISLog",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/import-iislog/",
          "content": "Import-IISLog\n\nSYNOPSIS\nImport IIS log files with default header.\n\nSYNTAX\n\nImport-IISLog [[-Path] &lt;String&gt;] [[-Filter] &lt;String&gt;] [[-Line] &lt;Object&gt;] [[-Tail] &lt;Int32&gt;] [[-Count] &lt;Int32&gt;]\n [-Wait] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function imports IIS log files from CSV format.\n\nEXAMPLES\n\nEXAMPLE 1\nImport-IISLog\n\n\nImport the latest log found in the default log folder.\n\nEXAMPLE 2\nImport-IISLog -Tail 10 -Wait\n\n\nImport the latest 10 lines of the latest log found in the default log folder and wait for new lines until stopped with ctrl-c.\n\nPARAMETERS\n\n-Path\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: C:\\inetpub\\logs\\LogFiles\\*\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Filter\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: *.log\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Line\n\nType: Object\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: True (ByPropertyName)\nAccept wildcard characters: False\n\n\n-Tail\n\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: -1\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Count\n\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: 1\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Wait\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\n\nOUTPUTS\n\n[IISLogEntry]\nNOTES\nGeneral notes\n\nRELATED LINKS"
        },
        {
          "id": "powershell-invoke-whoisrequest",
          "title": "Invoke-WhoisRequest",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/invoke-whoisrequest/",
          "content": "Invoke-WhoisRequest\n\nSYNOPSIS\nWohis request.\n\nSYNTAX\n\nInvoke-WhoisRequest [-DomainName] &lt;String&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function creats a New-WebServiceProxy and then uses the GetWhoIs method to query whois information from www.webservicex.net\n\nEXAMPLES\n\nEXAMPLE 1\nInvoke-WhoisRequest -DomainName ntsystems.it\n\n\nThis example queries whois information for the domain ntsystems.it\n\nPARAMETERS\n\n-DomainName\n\nType: String\nParameter Sets: (All)\nAliases: domain\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-new-firewallrule",
          "title": "New-FirewallRule",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/new-firewallrule/",
          "content": "New-FirewallRule\n\nSYNOPSIS\nCreate a new Windows Firewall Rule.\n\nSYNTAX\n\nNew-FirewallRule [[-Port] &lt;Int32&gt;] [[-Protocol] &lt;String&gt;] [[-Store] &lt;String&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function is wrapper for New-NetFirewallRule with the goal of making it easier to create simple firewall rules and have consistent naming.\n\nEXAMPLES\n\nEXAMPLE 1\nNew-FirewallRule -Port 6060\n\n\nThis example creats a new firewall rule to allow connections on tcp/6060.\n\nPARAMETERS\n\n-Port\n\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: 0\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Protocol\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: TCP\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Store\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: PersistentStore\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\nNone.\nNOTES\nAuthor: @torggler\n\nRELATED LINKS"
        },
        {
          "id": "powershell-new-rgsreport",
          "title": "New-RgsReport",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/new-rgsreport/",
          "content": "New-RgsReport\n\nSYNOPSIS\nGather information about Skype for Business Response Groups, Queues, Agent Groups.\n\nSYNTAX\n\nNew-RgsReport [[-Filter] &lt;String&gt;] [-Path] &lt;FileInfo&gt; [-Html] [-PassThru] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses varios cmdlets of the Lync module (or an appropriate remote session) to \ngather information about Response Groups.\n\nEXAMPLES\n\nEXAMPLE 1\nGet-RgsReport -Filter Office -Path .\\Desktop\\report.csv\n\n\nThis example creates a CSV report for all RGS workflows matching Office.\n\nEXAMPLE 2\nGet-RgsReport -Filter Office -Path .\\Desktop\\report.html -Html\n\n\nThis example creates a HTML report for all RGS workflows matching Office.\n\nEXAMPLE 3\nGet-RgsReport -Filter Office -Path .\\Desktop\\report.html -Html -PassThru | Out-GridView\n\n\nThis example creates a HTML report for all RGS workflows matching Office, because the PassThru switch is present,\nthe collected data will also be written to the pipeline.\nFrom there we can use it and pipe it to Out-GridView or do whatever.\n\nPARAMETERS\n\n-Filter\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Path\n\nType: FileInfo\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Html\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-PassThru\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nNone.\nOUTPUTS\n\n[psobject]\nNOTES\nAuthor: @torggler\n\nRELATED LINKS"
        },
        {
          "id": "powershell-new-spfrecord",
          "title": "New-SPFRecord",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/new-spfrecord/",
          "content": "New-SPFRecord\n\nSYNOPSIS\nCreate SPF record for a given mail domain.\n\nSYNTAX\n\nNew-SPFRecord [[-DomainName] &lt;String&gt;] [-mx] [-a] [-ptr] [[-IncludeIP] &lt;IPAddress[]&gt;]\n [[-IncludeDomain] &lt;String&gt;] [[-IncludeHost] &lt;String&gt;] [[-Action] &lt;String&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function helps with creating SPF records for mail domains.\nThe SPF record should look something like this:\n\nv=spf1 mx a ptr ip4:127.1.1.1/24 a:host.example.com include:example.com -all\n\nMore information: https://www.ietf.org/rfc/rfc4408.txt\n\nEXAMPLES\n\nEXAMPLE 1\nGet-AcceptedDomain | New-SPFRecord -mx -IncludeDomain spf.protection.outlook.com -IncludeIP 192.0.2.1,2001:DB8::1 -Action Fail\n\n\nDomainName : uclab.eu\nRecord     : “v=spf1 mx ip4:192.0.2.1 ip6:2001:DB8::1 include:spf.protection.outlook.com -all”\n\nThe above example creates SPF records for all accepted domains in Exchange (Online).\n\nPARAMETERS\n\n-DomainName\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByPropertyName, ByValue)\nAccept wildcard characters: False\n\n\n-mx\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-a\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ptr\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-IncludeIP\n\nType: IPAddress[]\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-IncludeDomain\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-IncludeHost\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Action\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 5\nDefault value: Fail\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\n[string]\n[AcceptedDomain]\nThis function accepts a string or objects with a DomainName property (such as returned by Get-AcceptedDomain) as input.\nOUTPUTS\n\n[psobject]\nThis function writes a custom object to the pipeline.\nNOTES\nAuthor: @torggler\n\nRELATED LINKS"
        },
        {
          "id": "powershell-remove-etchostsentry",
          "title": "Remove-EtcHostsEntry",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/remove-etchostsentry/",
          "content": "Remove-EtcHostsEntry\n\nSYNOPSIS\nRemove an entry from local hosts file by it’s IP address.\n\nSYNTAX\n\nRemove-EtcHostsEntry [[-IPAddress] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nFind an IP address and remove all lines where it appears from the \\etc\\hosts file of the local computer.\n\nEXAMPLES\n\nEXAMPLE 1\nRemove-EtcHostsEntry -IPAddress 1.1.1.1\n\n\nThis example removes following lines from the hosts file\n1.1.1.1 test.test\n1.1.1.1 another.test.com\n\nPARAMETERS\n\n-IPAddress\nIPAddress of the hosts entry to be added\n\nType: String\nParameter Sets: (All)\nAliases: ip\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-WhatIf\nShows what would happen if the cmdlet runs.\nThe cmdlet is not run.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: wi\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Confirm\nPrompts you for confirmation before running the cmdlet.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: cf\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-show-etchosts",
          "title": "Show-EtcHosts",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/show-etchosts/",
          "content": "Show-EtcHosts\n\nSYNOPSIS\nDisplay /etc/hosts file content on Windows or Linux/macOS.\n\nSYNTAX\n\nShow-EtcHosts [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis funtion gets the content of the hosts file, parses the lines and outputs\na custom object with HostName and IPAddress properties.\n\nEXAMPLES\n\nExample 1\nPS C:\\&gt; \n\n\nPARAMETERS\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-show-wlanprofile",
          "title": "Show-WlanProfile",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/show-wlanprofile/",
          "content": "Show-WlanProfile\n\nSYNOPSIS\nGet wlan pre-shared key.\n\nSYNTAX\n\nShow-WlanProfile [[-Name] &lt;String&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function invokes the netsh tool to get the pre-shared key for a given wireless lan profile.\n\nEXAMPLES\n\nEXAMPLE 1\nShow-WlanProfile \"my_net\"\n\n\nThis example shows the key for the wlan profile “my_net”\n\nEXAMPLE 2\nGet-WlanProfile | Show-WlanProfile\n\n\nThis example shows the keys for all known wlan profiles on the system.\n\nPARAMETERS\n\n-Name\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-exchangeautodiscover",
          "title": "Test-ExchangeAutodiscover",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-exchangeautodiscover/",
          "content": "Test-ExchangeAutodiscover\n\nSYNOPSIS\nTest Exchange Autodiscover Web Service.\n\nSYNTAX\n\nTest-ExchangeAutodiscover [[-EmailAddress] &lt;String&gt;] [[-ComputerName] &lt;String&gt;] [[-Credential] &lt;PSCredential&gt;]\n [-ExcludeExplicitO365Endpoint] [[-Report] &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function tests the Exchange Autodiscover Web Serivce for a given Emailaddress.\nIf ComputerName is not specified,\nthe function tries to look up the Autodiscover service using the Outlook Clients logic.\nLocally cached and SCP data\nare not evaluated.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-ExchangeAutodiscover thomas@ntsystems.it -Credential (Get-Credential)\n\n\nThis example tests the Autodiscover service for the given mailbox.\nIt will query dns for autodiscover.ntsystems.it and _autodiscover._tcp.ntsystems.it. \nIt will then try to retrieve an Autodiscover payload from https://ntsystems.it, https://autodiscover.ntsystems.it and the Office 365 endpoint.\n\nPARAMETERS\n\n-EmailAddress\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ComputerName\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Credential\n\nType: PSCredential\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 3\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-ExcludeExplicitO365Endpoint\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Report\n\nType: FileInfo\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\n[psobject]\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-federationservice",
          "title": "Test-FederationService",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-federationservice/",
          "content": "Test-FederationService\n\nSYNOPSIS\nTest the ADFS web service\n\nSYNTAX\n\nTest-FederationService [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to test if the federation service metadata can be retrieved from a given server.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-FederationService -ComputerName fs.uclab.eu\n\n\nThis example gets federation service xml information over the server fs.uclab.eu\n\nPARAMETERS\n\n-ComputerName\nSpecifies the name of the federation server\n\nType: String\nParameter Sets: (All)\nAliases: Server\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-lyncdns",
          "title": "Test-LyncDNS",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-lyncdns/",
          "content": "Test-LyncDNS\n\nSYNOPSIS\nTest DNS entries for Skype for Business / Lync deployments.\n\nSYNTAX\n\nDESCRIPTION\nThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.\nThe NameSever parameter can be used to specify a nameserver.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-LyncDNS -SipDomain uclab.eu\n\n\nThis example queries DNS records for the domain uclab.eu\n\nPARAMETERS\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-lyncdiscover",
          "title": "Test-LyncDiscover",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-lyncdiscover/",
          "content": "Test-LyncDiscover\n\nSYNOPSIS\nTest the Lyncdiscover service for Skype for Business/Lync deployments\n\nSYNTAX\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-LyncDiscover -SipDomain uclab.eu -Http\n\n\nThis example gets Lyncdiscover information over http for the domain uclab.eu\n\nPARAMETERS\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-oosfarm",
          "title": "Test-OOSFarm",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-oosfarm/",
          "content": "Test-OOSFarm\n\nSYNOPSIS\nGet internal and external URLs for PowerPoint sharing.\n\nSYNTAX\n\nTest-OOSFarm [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to get and parse hosting discovery information for Office Online Server farms.\nIf successfull, it returns a custom object with the internal and external URL for PowerPoint sharing.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-OOSFarm -Name oos.example.com\n\n\nThis example tries to retrieve information from https://oos.example.com/hosting/discovery\n\nPARAMETERS\n\n-ComputerName\nSpecifies the name of the OOS server/farm\n\nType: String\nParameter Sets: (All)\nAliases: Server, Farm, Name\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\n\nOUTPUTS\n\n[psobject]\nNOTES\nGeneral notes\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-sfbdns",
          "title": "Test-SfBDNS",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-sfbdns/",
          "content": "Test-SfBDNS\n\nSYNOPSIS\nTest DNS entries for Skype for Business / Lync deployments.\n\nSYNTAX\n\nTest-SfBDNS [-SipDomain] &lt;String&gt; [[-NameServer] &lt;IPAddress&gt;] [-OpenDNS] [-internal] [-testConnection]\n [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.\nThe NameSever parameter can be used to specify a nameserver.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-LyncDNS -SipDomain uclab.eu\n\n\nThis example queries DNS records for the domain uclab.eu\n\nPARAMETERS\n\n-SipDomain\nSpecifies the DNS domain name to test\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-NameServer\nSpecifies the nameserver which is used by Resolve-DnsName\n\nType: IPAddress\nParameter Sets: (All)\nAliases: Server\n\nRequired: False\nPosition: 2\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-OpenDNS\nA quick way to use OpenDns servers instead of using NameServer\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-internal\nDo also query for internal records, they should only resolve when testing from the internal network\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-testConnection\nDo also test a TLS connection to the servers received from the query\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-sfbdiscover",
          "title": "Test-SfBDiscover",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-sfbdiscover/",
          "content": "Test-SfBDiscover\n\nSYNOPSIS\nTest the Lyncdiscover service for Skype for Business/Lync deployments\n\nSYNTAX\n\nTest-SfBDiscover [-SipDomain] &lt;String&gt; [-Http] [-internal] [-Online] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-LyncDiscover -SipDomain uclab.eu -Http\n\n\nThis example gets Lyncdiscover information over http for the domain uclab.eu\n\nPARAMETERS\n\n-SipDomain\nSpecifies a DNS domain name to test\n\nType: String\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Http\nUse HTTP instead of HTTPS\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-internal\nUse internal name (lyncdiscoverinternl) instead of the external one (lyncdiscover)\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Online\nTest against Office 365 endpoints\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-tcpconnection",
          "title": "Test-TCPConnection",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-tcpconnection/",
          "content": "Test-TCPConnection\n\nSYNOPSIS\nTest if a TCP Connection can be established.\n\nSYNTAX\n\nTest-TCPConnection [-ComputerName] &lt;Object&gt; [[-Port] &lt;Object&gt;] [-Count &lt;Int32&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses System.Net.Sockets.Tcpclient to test if a TCP connection can be established with a\nComputerName on a given port.\nMuch like “telnet” which is not installed by default.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-TcpConnection -ComputerName www.ntsystems.it\n\n\nThis example tests if port 80 can be reached on www.ntsystems.it\n\nEXAMPLE 2\nTest-TcpConnection -ComputerName www.ntsystems.it -Port 25 -Count 4\n\n\nThis example tests for 4 times if port 25 can be reached on www.ntsystems.it\n\nPARAMETERS\n\n-ComputerName\nSpecifies the DNS name of the computer to test\n\nType: Object\nParameter Sets: (All)\nAliases: HostName, Server, RemoteHost\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Port\nSpecifies the TCP port to test on the remote computer.\n\nType: Object\nParameter Sets: (All)\nAliases: RemotePort\n\nRequired: False\nPosition: 2\nDefault value: 80\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Count\nSpecifies the number of tests to run, this can be useful when testing load-balanced services; default is 1\n\nType: Int32\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: 1\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nSystem.Boolean\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-test-tlsconnection",
          "title": "Test-TLSConnection",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/test-tlsconnection/",
          "content": "Test-TLSConnection\n\nSYNOPSIS\nTest if a TLS Connection can be established.\n\nSYNTAX\n\nComputerName\nTest-TLSConnection [-ComputerName] &lt;Object&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;]\n [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert]\n [-Quiet] [&lt;CommonParameters&gt;]\n\n\nUri\nTest-TLSConnection -Uri &lt;Uri&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;]\n [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function uses System.Net.Sockets.Tcpclient and System.Net.Security.SslStream to connect to a ComputerName and\nauthenticate via TLS.\nThis is useful to check if a TLS connection can be established and if the certificate used on\nthe remote computer is trusted on the local machine.\nIf the connection can be established, the certificate’s properties will be output as custom object.\nOptionally the certificate can be downloaded using the -SaveCert switch.\nThe Protocol parameter can be used to specifiy which SslProtocol is used to perform the test.\nThe CheckCertRevocationStatus parameter\ncan be used to disable revocation checks for the remote certificate.\n\nEXAMPLES\n\nEXAMPLE 1\nTest-TlsConnection -ComputerName www.ntsystems.it\n\n\nThis example connects to www.ntsystems.it on port 443 (default) and outputs the certificate’s properties.\n\nEXAMPLE 2\nTest-TlsConnection -ComputerName sipdir.online.lync.com -Port 5061 -Protocol Tls12 -SaveCert\n\n\nThis example connects to sipdir.online.lync.com on port 5061 using TLS 1.2 and saves the certificate to the temp folder.\n\nEXAMPLE 3\nTest-TlsConnection -IPAddress 1.1.1.1 -ComputerName whatever.cloudflare.com\n\n\nThis example connects to the IP 1.1.1.1 using a Hostname of whatever.cloudflare.com.\nThis can be useful to test hosts that don’t have DNS records configured.\n\nEXAMPLE 4\n\"host1.example.com\",\"host2.example.com\" | Test-TLSConnection -Protocol Tls11 -Quiet\n\n\nThis example tests connection to the hostnames passed by pipeline input.\nIt uses the -Quiet parameter and therefore only returns true/flase.\n\nPARAMETERS\n\n-ComputerName\nSpecifies the DNS name of the computer to test\n\nType: Object\nParameter Sets: ComputerName\nAliases: Server, Name, HostName\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Uri\n\nType: Uri\nParameter Sets: Uri\nAliases: ExternalUrl\n\nRequired: True\nPosition: Named\nDefault value: None\nAccept pipeline input: True (ByPropertyName)\nAccept wildcard characters: False\n\n\n-IPAddress\nSpecifies the IP Address of the computer to test.\nCan be useful if no DNS record exists.\n\nType: IPAddress\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: None\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Port\nSpecifies the TCP port on which the TLS service is running on the computer to test\n\nType: Object\nParameter Sets: (All)\nAliases: RemotePort\n\nRequired: False\nPosition: 2\nDefault value: 443\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Protocol\n\nType: SslProtocols[]\nParameter Sets: (All)\nAliases:\nAccepted values: None, Ssl2, Ssl3, Tls, Default, Tls11, Tls12, Tls13\n\nRequired: False\nPosition: 3\nDefault value: Tls12\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-FilePath\nSpecifies a path to a file (.cer) where the certificate should be saved if the SaveCert switch parameter is used\n\nType: FileInfo\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: 4\nDefault value: Temp.cer\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-CheckCertRevocationStatus\nCheck revocation information for remote certificate.\nDefault is true.\n\nType: Boolean\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: True\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-SaveCert\nSaves the remote certificate to a file, the path can be specified using the FilePath parameter\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\n-Quiet\nOnly returns true or false, instead of a custom object with some information.\n\nType: SwitchParameter\nParameter Sets: (All)\nAliases: Silent\n\nRequired: False\nPosition: Named\nDefault value: False\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nSystem.Management.Automation.PSObject\nSystem.Boolean\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "powershell-update-filewritetime",
          "title": "Update-FileWriteTime",
          "collection": {
            "label": "OnlineHelp",
            "name": "Posts"
          },
          "categories": "tak",
          "tags": "",
          "url": "/powershell/update-filewritetime/",
          "content": "Update-FileWriteTime\n\nSYNOPSIS\nTouch a file.\n\nSYNTAX\n\nUpdate-FileWriteTime [-Name] &lt;String[]&gt; [-Date &lt;DateTime&gt;] [&lt;CommonParameters&gt;]\n\n\nDESCRIPTION\nThis function checks whether a given file exists, and if so, updates the LastWriteTime property of the given file.\nShould the file not exist, a new, empty file is created.\nThis function works on Linux/macOS.\n\nEXAMPLES\n\nEXAMPLE 1\ntouch myfile\n\n\nThis example creates myfile if it does not exist in the current directory.\nIf the file does exist, the LastWriteTime property will be updated.\n\nPARAMETERS\n\n-Name\nOne or more filenames to be touched\n\nType: String[]\nParameter Sets: (All)\nAliases:\n\nRequired: True\nPosition: 1\nDefault value: None\nAccept pipeline input: True (ByValue)\nAccept wildcard characters: False\n\n\n-Date\nSpecify a specific date for LastWriteTime\n\nType: DateTime\nParameter Sets: (All)\nAliases:\n\nRequired: False\nPosition: Named\nDefault value: (Get-Date)\nAccept pipeline input: False\nAccept wildcard characters: False\n\n\nCommonParameters\nThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.\n\nINPUTS\n\nOUTPUTS\n\nNOTES\n\nRELATED LINKS"
        },
        {
          "id": "tags-adfs",
          "title": "ADFS",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/adfs/",
          "content": ""
        },
        {
          "id": "tags-ai",
          "title": "AI",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/ai/",
          "content": ""
        },
        {
          "id": "tags-asr",
          "title": "ASR",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/asr/",
          "content": ""
        },
        {
          "id": "tags-appv",
          "title": "AppV",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/appv/",
          "content": ""
        },
        {
          "id": "tags-audiocodes",
          "title": "AudioCodes",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/audiocodes/",
          "content": ""
        },
        {
          "id": "tags-azure",
          "title": "Azure",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/azure/",
          "content": ""
        },
        {
          "id": "tags-basics",
          "title": "Basics",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/basics/",
          "content": ""
        },
        {
          "id": "tags-cisco",
          "title": "Cisco",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/cisco/",
          "content": ""
        },
        {
          "id": "tags-citrix",
          "title": "Citrix",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/citrix/",
          "content": ""
        },
        {
          "id": "tags-client",
          "title": "Client",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/client/",
          "content": ""
        },
        {
          "id": "tags-cloud",
          "title": "Cloud",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/cloud/",
          "content": ""
        },
        {
          "id": "tags-crypto",
          "title": "Crypto",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/crypto/",
          "content": ""
        },
        {
          "id": "tags-events",
          "title": "Events",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/events/",
          "content": ""
        },
        {
          "id": "tags-exchange",
          "title": "Exchange",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/exchange/",
          "content": ""
        },
        {
          "id": "tags-firewall",
          "title": "Firewall",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/firewall/",
          "content": ""
        },
        {
          "id": "tags-github",
          "title": "GitHub",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/github/",
          "content": ""
        },
        {
          "id": "tags-go",
          "title": "Go",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/go/",
          "content": ""
        },
        {
          "id": "tags-help",
          "title": "Help",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/help/",
          "content": ""
        },
        {
          "id": "tags-home-server",
          "title": "Home-Server",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/home-server/",
          "content": ""
        },
        {
          "id": "tags-hybrid",
          "title": "Hybrid",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/hybrid/",
          "content": ""
        },
        {
          "id": "tags-hyper-v",
          "title": "Hyper-V",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/hyper-v/",
          "content": ""
        },
        {
          "id": "tags-intune",
          "title": "Intune",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/intune/",
          "content": ""
        },
        {
          "id": "tags-jekyll",
          "title": "Jekyll",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/jekyll/",
          "content": ""
        },
        {
          "id": "tags-lync",
          "title": "Lync",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/lync/",
          "content": ""
        },
        {
          "id": "tags-markdown",
          "title": "MarkDown",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/markdown/",
          "content": ""
        },
        {
          "id": "tags-network",
          "title": "Network",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/network/",
          "content": ""
        },
        {
          "id": "tags-office365",
          "title": "Office365",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/office365/",
          "content": ""
        },
        {
          "id": "tags-onlinehelp",
          "title": "OnlineHelp",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/onlinehelp/",
          "content": ""
        },
        {
          "id": "tags-powershell",
          "title": "PowerShell",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/powershell/",
          "content": ""
        },
        {
          "id": "tags-rds",
          "title": "RDS",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/rds/",
          "content": ""
        },
        {
          "id": "tags-rm",
          "title": "RM",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/rm/",
          "content": ""
        },
        {
          "id": "tags-sql",
          "title": "SQL",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/sql/",
          "content": ""
        },
        {
          "id": "tags-security",
          "title": "Security",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/security/",
          "content": ""
        },
        {
          "id": "tags-server-2003",
          "title": "Server-2003",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/server-2003/",
          "content": ""
        },
        {
          "id": "tags-server-2008-r2",
          "title": "Server-2008-R2",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/server-2008-r2/",
          "content": ""
        },
        {
          "id": "tags-server-2008",
          "title": "Server-2008",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/server-2008/",
          "content": ""
        },
        {
          "id": "tags-server-2012-r2",
          "title": "Server-2012-R2",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/server-2012-r2/",
          "content": ""
        },
        {
          "id": "tags-server-2012",
          "title": "Server-2012",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/server-2012/",
          "content": ""
        },
        {
          "id": "tags-server",
          "title": "Server",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/server/",
          "content": ""
        },
        {
          "id": "tags-sharepoint",
          "title": "Sharepoint",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/sharepoint/",
          "content": ""
        },
        {
          "id": "tags-skype4b",
          "title": "Skype4B",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/skype4b/",
          "content": ""
        },
        {
          "id": "tags-teams",
          "title": "Teams",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/teams/",
          "content": ""
        },
        {
          "id": "tags-update",
          "title": "Update",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/update/",
          "content": ""
        },
        {
          "id": "tags-vmware",
          "title": "VMware",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/vmware/",
          "content": ""
        },
        {
          "id": "tags-veeam",
          "title": "Veeam",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/veeam/",
          "content": ""
        },
        {
          "id": "tags-wsl",
          "title": "WSL",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/wsl/",
          "content": ""
        },
        {
          "id": "tags-workplace",
          "title": "Workplace",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/workplace/",
          "content": ""
        },
        {
          "id": "tags-zed",
          "title": "Zed",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/zed/",
          "content": ""
        },
        {
          "id": "tags-de",
          "title": "de",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/de/",
          "content": ""
        },
        {
          "id": "tags-en",
          "title": "en",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/en/",
          "content": ""
        },
        {
          "id": "tags-macos",
          "title": "macOS",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/macos/",
          "content": ""
        },
        {
          "id": "tags-ntsystems",
          "title": "ntSystems",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/ntsystems/",
          "content": ""
        },
        {
          "id": "tags-technology",
          "title": "technology",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/technology/",
          "content": ""
        },
        {
          "id": "tags-uag",
          "title": "uag",
          "collection": {
            "label": "tags",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/uag/",
          "content": ""
        },
        {
          "id": "post-lost-found-ai-highlights",
          "title": "lost & found: AI highlights of the week",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "AI",
          "url": "/post/lost-found-ai-highlights/",
          "content": "I learned a lot attending AI Lowlands this week and wanted to share some links and highlights.\n\ngpt-realtime and vibevoice\n\nOpenAI’s gpt-realtime is available on Microsoft Foundry very fast but quite expensive.\n\nMicrosoft just launched VibeVoice-Realtime.\n\nllms.txt and NLweb\n\nllms.txt as a way to provide LLM-friendly content has been around for a little while.\n\nMicrosoft proposes NLweb as a proof-of-concept for conversational interfaces and a semantic layer for the web.\n\nplanetary defense\n\nhera.space is on a mission to study asteroid deflection. the website is also a super-cool multi-modal AI showcase."
        },
        {
          "id": "post-technology-transforms-everything",
          "title": "The Ecological Nature of Technological Change",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "technology",
          "url": "/post/technology-transforms-everything/",
          "content": "Technological change is not additive; it is ecological. A new medium does not add something; it changes everything.\n\n\nI’ve been thinking about this quote from media theorist Neil Postman lately. \nWritten in the 1990s about television’s impact on society, it feels more relevant than ever as we watch AI reshape our industry.\n\nFrom Smartphones to AI: Patterns of Change\n\nConsider the smartphone: it didn’t just add a portable phone to our lives - \nit transformed how we navigate spaces (goodbye paper maps), coordinate socially \n(from fixed meeting times to fluid arrangements), and process information. \nThis wasn’t simply adding features; it was a fundamental reshaping of our behaviors and capabilities.\n\nThe AI Transformation in IT\n\nToday, we’re witnessing a similar ecological transformation with AI in the IT industry. \nLike previous technological waves, the initial phase brings a surge of integration work - \nmuch as we saw with cloud adoption. But AI isn’t just another tool being added to our stack; \nit’s reshaping the entire landscape of how we work.\n\nThe traditional cycle of coding, debugging, and deployment is evolving. \nBut perhaps most intriguingly, while previous technological advances often reduced human interaction, \nAI might do the opposite. By handling routine tasks, it could create more space for \nmeaningful human collaboration.\n\nLooking Ahead\n\nHowever, this remains largely theoretical. \nWhile we’re seeing increased integration work now, the deeper transformation of workplace \ndynamics will take time. Technology capabilities may advance rapidly, but organizational \nand human adaptation follows its own pace.\n\nThe challenge ahead isn’t just technical implementation - \nit’s about thoughtfully shaping AI’s role to enhance rather than diminish human connection in our work. \nAs with any ecological change, the outcomes will depend not just on the technology itself, \nbut on how we choose to integrate it into our (professional) lives.\n\n— Tom\n\nThis post was generated from a conversation I had with Claude."
        },
        {
          "id": "post-zed-pwsh",
          "title": "Zed and PowerShell on macOS",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "Zed, PowerShell",
          "url": "/post/zed-pwsh/",
          "content": "VSCode has been my daily driver pretty much since it launched. It’s got a great community and amazing extensions, but sometimes it’s slow, and it started draining my battery a lot. I began looking for alternatives, and it wasn’t long before I came across Zed. Zed is a relatively new, high-performance code editor. It’s so fast that typing literally feels easier :)\n\nMost of my (coding) work revolves around PowerShell, so the lack of support was a problem for me. I followed Zed Industries’ GitHub and noticed that some good soul closed this issue a few days ago. Did they just add support for PowerShell? The answer is yes, as it turns out!\n\nThe Extension\n\nFirst of all, we need to install the PowerShell extension. Like in VSCode, press ⌘ ⇧ X (Command + Shift + X) to open the extensions tab. Type “PowerShell” and press install.\n\nPowerShell Editor Services\n\nThen we need a language server to provide common editor features for the PowerShell language. Think tab completion, IntelliSense, best practices, and so on. There’s a PowerShell module that provides just that: \n    \n        PowerShell/PowerShellEditorServices\n    \n\nDownload the latest release and unzip it to a folder on your local device; in my case, it is: /Users/tom/code/PowerShellEditorServices.\n\nZed Configuration\n\nLastly, we need to tell Zed where to find the language server (LSP). Again, like in VSCode, press ⌘ , (Command + ,) to open settings and configure the LSP. You can also set pwsh as the default shell and much more.\n\n\"terminal\": {\n  \"shell\": {\n    \"program\": \"pwsh\"\n  }\n},\n\"lsp\": {\n  \"powershell-es\": {\n    \"command\": \"pwsh\",\n    \"args\": [\n      \"-NoProfile\",\n      \"-Command\",\n      \"/Users/tom/code/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1\"\n    ]\n  }\n}\n\n\nHave fun!"
        },
        {
          "id": "post-setup-sign-in-with-apple-with-azure-swa",
          "title": "Configure Sign in with Apple for Azure Static Web App",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "Azure",
          "url": "/post/setup-sign-in-with-apple-with-azure-swa/",
          "content": "I’m working on a side project and decided to use Sign in with Apple as an additional authentication provider, next to AAD that I would normally use.\n\nAs per Microsoft’s documentation, adding apple as custom authentication provider is simple enough, just add the following lines to your staticwebapp.config.json file:\n\n\"identityProviders\": {\n    \"apple\": {\n    \"registration\": {\n        \"clientIdSettingName\": \"APPLE_CLIENT_ID\",\n        \"clientSecretSettingName\": \"APPLE_CLIENT_SECRET\"\n    }\n  }\n}\n\n\nThen we add the two setting names to the Web App’s configuration and we’re done, right? Almost.\n\nFirst we have to take a deep-dive into JWT as the APPLE_CLIENT_SECRET must be a signed JWT. There is no documentation specifically for Static Web Apps but this one for App Service is close enough.\n\nI converted the sample C# code to powershell for easier use. The required package have a dependency loop and so, instead of easily installing them with Install-Package I had to use nuget. Follow the documentation above to obtain client id, team id, key id, and the key in pkcs8 format, then use the following snippet to generate the client secret:\n\nfunction Get-AppleClientSecret {\n    param (\n        [string]$TeamId,\n        [string]$ClientId,\n        [string]$KeyId,\n        [System.IO.FileInfo]$P8KeyFile\n    )\n\n    $p8Content = Get-Content -Path $p8keyfile\n    $p8key = $p8Content.where{$_ -notmatch \"^---\"} -join(\"\")\n\n    [string]$audience = \"https://appleid.apple.com\"\n    [string]$issuer = $teamId\n    [string]$subject = $clientId\n    [string]$kid = $keyId\n\n    $Claims = New-Object -TypeName System.Collections.Generic.List[System.Security.Claims.Claim]\n    $Claims.Add(\n        (New-Object -TypeName System.Security.Claims.Claim(\"sub\", $subject))\n    )\n    \n    $cngKey = [System.Security.Cryptography.CngKey]::Import(\n        [Convert]::FromBase64String($p8key), \n        [System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob\n    )\n\n    $signingCred = New-Object Microsoft.IdentityModel.Tokens.SigningCredentials(\n        (New-Object Microsoft.IdentityModel.Tokens.ECDsaSecurityKey(\n            (New-Object System.Security.Cryptography.ECDsaCng($cngKey)\n        ))),\n        \"ES256\" # EcdsaSha256\n    )\n\n    $NotBefore = Get-Date\n    $Expires = (Get-Date).AddDays(180)\n    $token = New-Object -TypeName System.IdentityModel.Tokens.Jwt.JwtSecurityToken(\n        $Issuer, \n        $Audience, \n        $Claims, \n        $NotBefore, \n        $Expires, \n        $signingCred\n    )\n\n    $null = $token.Header.Add(\"kid\", $kid)\n    $null = $token.Header.Remove(\"typ\")\n\n    $tokenHandler = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler\n    \n    return $tokenHandler.WriteToken($token)\n}\n\n# install &amp; import requirements\nInvoke-WebRequest -Uri 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' -OutFile \"$env:USERPROFILE\\Downloads\\nuget.exe\"\n&amp; \"$env:USERPROFILE\\Downloads\\nuget.exe\" Install System.IdentityModel.Tokens.Jwt -Version 6.32.0 -OutputDirectory \"$env:USERPROFILE\\Downloads\\.nuget\"\n\nAdd-Type -Path \"$env:USERPROFILE\\.nuget\\packages\\Microsoft.IdentityModel.Tokens\\6.32.0\\lib\\netstandard2.0\\Microsoft.IdentityModel.Tokens.dll\"\nAdd-Type -Path \"$env:USERPROFILE\\.nuget\\packages\\System.IdentityModel.Tokens.Jwt\\6.32.0\\lib\\netstandard2.0\\System.IdentityModel.Tokens.Jwt.dll\"\nAdd-Type -Path \"$env:USERPROFILE\\.nuget\\packages\\Microsoft.IdentityModel.Logging\\6.32.0\\lib\\netstandard2.0\\Microsoft.IdentityModel.Logging.dll\"\nAdd-Type -Path \"$env:USERPROFILE\\.nuget\\packages\\Microsoft.IdentityModel.JsonWebTokens\\6.32.0\\lib\\netstandard2.0\\Microsoft.IdentityModel.JsonWebTokens.dll\"\nAdd-Type -Path \"$env:USERPROFILE\\.nuget\\packages\\microsoft.identitymodel.abstractions\\6.32.0\\lib\\netstandard2.0\\Microsoft.IdentityModel.Abstractions.dll\"\n\n# set parameters and get secret\n$p = @{\n    TeamId = \"Q847A7FG64\"\n    ClientId = \"wtf.onprem.appleid\"\n    KeyId = \"8QKD4J6XDZ\"\n    P8KeyFile = \".\\AuthKey_8QKD4J6XDZ.p8\"\n}\nGet-AppleClientSecret @p\n\n\nOnce we have obtained the APPLE_CLIENT_SECRET, the sign in process with Apple should be successful. However, after signing in, we are redirected to the Static Web App and greeted with a 403: Forbidden:\n\n\n  We need an email address or a handle from your login service. To use this login, please update your account with the missing info.\n\n\nIt turns out the identityProviders example given in Microsoft’s documentation is not quite complete. Sign in with Apple only inserts the user’s email address as claim in the authentication token if we specifically ask for it during the sing in process. To do that, we have to add the scopes property to the staticwebapp.config.json file:\n\n\"identityProviders\": {\n    \"apple\": {\n    \"registration\": {\n        \"clientIdSettingName\": \"APPLE_CLIENT_ID\",\n        \"clientSecretSettingName\": \"APPLE_CLIENT_SECRET\"\n    },\n    \"login\": {\n        \"scopes\": [\"email\"]\n    }\n  }\n}\n\n\nAdding the scope will allow new users to sign in successfully. Users that had already signed in must first remove the app from Sign in with Apple in their Apple account.\n\nSo, after adding the scope and removing the app from Sign in with Apple, we can finally attempt to sign in again and we should see that the user has to consent sharing their email address in the sign in process:"
        },
        {
          "id": "post-mastodon-and-webfinger",
          "title": "Mastodon and WebFinger",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "ntSystems, PowerShell",
          "url": "/post/mastodon-and-webfinger/",
          "content": "With the uncertainty surrounding Twitter I have decided to set up an account on Mastodon. If you haven’t heard about it Mastodon is an de-centralized, open-source alternative to centralized social media. It is powered by open protocols such as ActivityPub and WebFinger which allow federation of individual servers (called instances).\n\nIf a user on one server searches for a user on another server, they will enter the full name, i.e. @user@example.com, into the search field. The server will then look for information about the user at the path https://example.com/.well-known/webfinger. If found, the reply contains information about where the profile of the user can be found.\n\nWe can use this protocol to be discoverable by servers on our own domain. We are using Bridgetown to build this site so placing a JSON file at this path src/.well-known/webfinger did the trick. So even though my profile is currently hosted at masto.ai you can still find me with @tom@onprem.wtf. And if you do find me, give me a follow :)\n\nI used this PowerShell function to test the WebFinger endpoint on our and other sites.\n\nfunction Invoke-WebFinger {\n    [CmdletBinding()]\n    param(\n        [Parameter(ValueFromPipeline)]\n        [ValidatePattern('^@?[\\d\\w]+@[\\d\\w]+\\.[\\d\\w]+')]\n        [string]$Uri,\n        [string]$Server,\n        [string]$Username\n    )\n    process {\n        if($Uri){\n            $Username, $server = $uri -replace '^@' -split '@'\n        }\n        $webFingerUri = \"https://$server/.well-known/webfinger?resource=acct:$Username@$Server\"\n        Write-Verbose \"GET $webFingerUri\"\n        $r = Invoke-RestMethod -Uri $webFingerUri\n        [PSCustomObject]@{\n            Uri = $Username,$Server -join '@'\n            Subject = $r.subject\n            Aliases = $r.Aliases\n            ProfilePage = $r.links.where{$_.rel -eq 'http://webfinger.net/rel/profile-page'}.href\n        }\n    }\n}\n\n# Examples\n\n'tto@masto.ai','@tom@onprem.wtf' | Invoke-WebFinger\n\nInvoke-WebFinger -Uri tom@onprem.wtf\n\nInvoke-WebFinger -Server onprem.wtf -Username tom\n\n\nOther people wrote about this:\n\n\n  Use your own user @ domain for Mastodon discoverability with the WebFinger Protocol without hosting a server\n  Mastodon on your own domain without hosting a server\n  Using Cloudflare to Customize Your Mastodon Username Domain"
        },
        {
          "id": "post-how-to-connect-exchange-online-managed-identity",
          "title": "How to connect to Exchange Online powershell with a managed identity",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "PowerShell, Azure, Exchange",
          "url": "/post/how-to-connect-exchange-online-managed-identity/",
          "content": "The latest preview version of the ExchangeOnlineManagement powershell module includes the following new parameters: -ManagedIdentity and -ManagedIdentityAccountId.\n\nAs their names imply, they can be used to connect to Exchange Online with a managed identity. According to the documentation this is currently only supported with Azure Virtual Machines and Virtual Machine Scale Sets, however I have used this successfully within Azure Automation runbooks.\n\nCreate the automation account\n\nIf you have an existing account skip this step. I will be reusing the variables from this first example, so fill in the name of your automation account and the resource group.\n\n$accountName = 'azautomation1'\n$rgName = 'onprem-core'\n$location = 'West Europe'\nConnect-AzAccount\nNew-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -Location $location\n\n\nGet the module\n\nThe first step is to add the module to the Automation Account. Installing it through the Azure Portal did not work, as that way only seems to support the latest non-preview version. I used the following commands from the Az powershell module to install the preview version of the module in my automation account:\n\n$moduleName = 'ExchangeOnlineManagement'\n$moduleVersion = '2.0.6-Preview7'\nNew-AzAutomationModule -AutomationAccountName $accountName -ResourceGroupName $rgName -Name $moduleName -ContentLinkUri \"https://www.powershellgallery.com/api/v2/package/$moduleName/$moduleVersion\"\n\n\nManaged Identity\n\nNow it’s time to enable the system assigned managed identity for the automation account. We can do this through the Azure portal by navigating to the automation account and setting the Status to On under Identity. Alternatively, we can use the Az powershell module like this:\n\nSet-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -AssignSystemIdentity\n\n\nNext we will need the id of the managed identity. It will show up in the Azure portal once it has been enabled or it can be retrieved with Az powershell:\n\nGet-AzADServicePrincipal -DisplayName $accountName\n\n\nIn my case the object id is b395da15-4904-490c-9109-2bc91a12a08d. With this id in hand, we use the Microsoft Graph powershell SDK to grant the necessary permissions to the managed identity.\n\nConnect-MgGraph\n$params = @{\n    ServicePrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id\n    PrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id\n    ResourceId = (Get-MgServicePrincipal -Filter \"AppId eq '00000002-0000-0ff1-ce00-000000000000'\").id # Exchange online\n    AppRoleId = \"dc50a0fb-09a3-484d-be87-e023b12c6440\" # Exchange.ManageAsApp\n}\nNew-MgServicePrincipalAppRoleAssignedTo @params\n\n\nLastly we want to assign the role Exchange Administrator to the managed identity. Again, we can do this through the Azure portal or with the following command:\n\n$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter \"DisplayName eq 'Exchange Administrator'\").id\nNew-MgRoleManagementDirectoryRoleAssignment -PrincipalId b395da15-4904-490c-9109-2bc91a12a08d -RoleDefinitionId 29232cdf-9323-42fd-ade2-1d097af3e4de -DirectoryScopeId \"/\"\n\n\n\nPlease assign the role with the least amount of privileges to complete the task you need.\n\nConnect to Exchange Online in the runbook\n\nAfter completing the steps above we are ready to connect to Exchange Online using the managed identity in the runbook. If you create a new runbook, please make sure to use runtime version 5.1 as the that’s where we have imported the module earlier.\n\nConnect-ExchangeOnline -ManagedIdentity -Organization 'onpremwtf.onmicrosoft.com'\nGet-AcceptedDomain\n\n\nTom"
        },
        {
          "id": "post-goodbye-jekyll",
          "title": "Goodbye Jekyll, hello Bridgetown!",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "Jekyll",
          "url": "/post/goodbye-jekyll/",
          "content": "We have been using Jekyll for our little site since 2016. It was fast, simple, it did it’s job nicely. Bridgetown does all the same things, and much more. It’s Jekyll’s modern cousin.\n\nWe have used GitHub pages to host our site as it integrates nicely with Jekyll. I have long wanted to play with Cloudflare pages, so I decided to upgrade the site and move it over to Cloudflare in the progress.\n\nHow to run Bridgetown on Cloudflare pages?\n\nWell, it’s easy enough, we just have to things to consider:\n\n\n  Include a .node-version file because Cloudflare pages defaults to 12.18.0 and bridgetown requires a version newer than 14\n  Set the BRIDGETOWN_ENV environment variable to production\n\n\nTo tell Cloudflare pages to use a newer version of node, I created the file .node-version with the content 16.16.0 in the root directory of my repository. Just like with Jekyll, the base is a GitHub repository. All that’s left to do is sign in to Cloudflare and create a new pages project. I sign in to my GitHub account from Cloudflare, select the repository and enter the following information:\n\nBuild command: bin/bridgetown deploy\nBuild output directory: output\nEnvironment variable: BRIDGETOWN_ENV  production\n\nDone.\n\nCloudflare redirects\n\nWe have used Jekyll’s jekyll-redirect-from plugin to create redirects for some URLs. It seems bridgetown does not yet have a plugin for that, so I used Cloudflare page’s _redirect file instead. I created a file with the name _redirect in the src folder of my bridgetown project. The content of the file is like this:\n\n/a/very/long/url/path /shorturl 301\n\n\nYou can read more in the docs\n\nI used the following few lines of powershell code to find Jekyll’s redirect_from statements in my source folder, convert them into slugs, and add them to the _redirect file.\n\nGet-ChildItem ./src/ -Recurse -Filter *.md | Select-String -pattern \"redirect_from\" | ForEach-Object {\n    $p = $_.path\n    $n = $_.filename\n    $l = $_.line\n    # remove date and extension from filename as slug contains neither\n    if($n -match \"^\\d{4}-\"){\n        $n = $n -replace \"\\d{4}-\\d{2}-\\d{2}-\",\"\" \n    }\n    $n = $n -replace \".md\",\"\"\n    $name = $n.ToLower()\n\n    # find parent path and create slug\n    $p = Split-Path -Path $p -Parent | Split-Path -Leaf\n    switch($p){\n        \"_OnlineHelp\" { $slug = \"/powershell/$name\" }\n        \"Archive\" { $slug = \"/post/$name\" }\n        \"_Modules\" { $slug = \"/powershell/$name\" }\n        \"_Scripts\" { $slug = \"/powershell/$name\" }\n        \"_posts\" { $slug = \"/post/$name\" }\n    }\n\n    # write _redirects file\n    $l -replace \"redirect_from: \",\"\" | ConvertFrom-Json | ForEach-Object {\n        \"$_ $slug 301\"\n    } \n} | Set-Content ./src/_redirects"
        },
        {
          "id": "post-sender-authentication-exo-2021",
          "title": "How to configure sender authentication for Exchange Online in 2021",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Office365, Exchange, Security",
          "url": "/post/sender-authentication-exo-2021/",
          "content": "The current state of email\n\nThe year is 2021 and, despite many efforts to kill it off, email is still going strong. According to Microsoft’s latest digital defense report Exchange Online Protection processed 6 trillion messages last year, 13 billion of which malicious. 6 trillion, that’s a number with 12 zeros. And that’s just Exchange Online. Worldwide we are sending and receiving over 300 billion emails every day, according to this site. 300 billion. Every day.\n\nWith these numbers there’s no wonder email is one of the main threat vectors.\n\nAs many organizations are moving their mailboxes to Exchange Online, I thought I would share my basic setup for new tenants. This will help you getting started with a secure configuration in no time. I have two goals with this basic setup:\n\n\n  Protect your brand (domain) from being spoofed/abused\n  Protect your users from receiving malicious emails\n\n\nSender Authentication\n\nSo you have just signed up for a new tenant with Microsoft 365 and you are adding your custom domains. The wizard will ask you, whether or not you are planning to use Exchange Online and, if you select yes, it will help you setup SPF.\n\nSender policy framework\n\nEven though it has only been published as proposed standard by the IETF in 2014, SPF has been around since the early 2000’s. Despite it’s age it is still something we regularly find missing or misconfigured in customer environments. SPF gives an administrator of an email domain a way to specify which systems (IP addresses) are allowed to send emails using the domain. The admin publishes a TXT record in the DNS, listing all IP addresses that are allowed to send emails. This would typically be your onprem Exchange servers or email gateways.\n\nReceiving systems check the TXT record and see if the system that’s trying to deliver a message is allowed to do so.\n\nIf you want to start sending emails from Exchange Online, you should add the following line to your existing SPF record.\n\ninclude: include:spf.protection.outlook.com\n\n\nIf you don’t have an SPF record in place, create a new TXT record at the root of your domain with this content:\n\nv=spf include:spf.protection.outlook.com -all\n\n\n\n  If you are not using a domain for outbound email, please publish the following SPF record to make it harder for criminals to abuse your domain:\n\n  TXT: v=spf -all\n\n\nThis is how far the wizard goes but we should really always configure the following records as well.\n\nDomainKeys Identified Mail\n\nDKIM has been standardized in 2011 and, in parts thanks to Exchange Online, is being used widely. However, we find SPF is better known and understood by our customers. DKIM leverages digital signatures that let a receiving system cryptographically verify whether an email was sent by an authorized system or not. The signature includes a domain name (d=) that should match the domain in the mail from address. Like SPF, DKIM uses DNS records in the sender’s email domain. The administrator of the domain publishes a TXT record that contains a public key and then configures the email server to sign all outgoing messages with the corresponding private key.\n\nReceiving systems see the signature and a so called selector in the header of the email. The selector tells the receiving system where to find the public key to verify the signature. As always with certificates, keys have to be rotated periodically which means DKIM DNS records must be updated accordingly. Sounds like a lot of complicated work, right?\n\nWith Exchange Online, Microsoft does that work for you. All outgoing emails from Exchange Online are signed with a key that Microsoft manages. The only thing we have to do, is point our DNS to that key and enable the configuration. There is a lengthy docs article about DKIM and how to build the DNS records you have to publish. I am using a few lines of PowerShell to make that process easier.\n\nUse the following PowerShell snippet to:\n\n\n  Create a new DKIM signing configuration for your custom domain\n  Publish DNS records pointing to Microsoft domains\n  Enable the DKIM signing configuration\n\n\n# Create DKIM signing config for all domains that do not have one\n\n$d = Get-DkimSigningConfig\n$domains = $d.domain\n\nGet-AcceptedDomain | % {​​​​​​ \n    if ($_.DomainName -in $domains) {​​​​​​}​​​​​​ \n    else {​​​​​​ New-DkimSigningConfig -KeySize 2048 -DomainName $_.DomainName -Enabled $false}​​​​​​ \n}​​​​​\n\n# Create DNS Records\nGet-DkimSigningConfig | Where-Object Name -NotMatch onmicrosoft | Select-Object Name,*cname*,@{\n    n=\"Selector1\";\n    e={($_.Selector1CNAME -split \"-\" | Select-Object -First 1),$_.name -join \"._domainkey.\"}},@{  \n    n=\"Selector2\";\n    e={($_.Selector2CNAME -split \"-\" | Select-Object -First 1),$_.name -join \"._domainkey.\"}\n} \n\n\nOnce the DNS records are in place, we can go ahead and enable the DKIM configuration:\n\nGet-DkimSigningConfig | Set-DkimSigningConfig -Enabled $true\n\n\n\n  If you are not using a domain for outbound email, you don’t have to worry about DKIM.\n\n\nDomain-based Message Authentication, Reporting and Conformance\n\nDMARC is the new kid on the bloc. Well kind of, the RFC is from 2015. It is yet another DNS record that an administrator can use to tell receiving systems what exactly they should do with emails that fail SPF or DKIM. Essentially DMARC builds on SPF and DKIM and uses both to calculate an authentication result that supports scenarios where SPF alone would fail (forwarding). The DMARC policy is also used to define what should happen with unaligned or failing DKIM signatures as DKIM itself doesn’t really specify that.\n\nSo, another DNS record you said? Here we go:\n\nName: _dmarc.example.com\nType: TXT\nValue: v=DMARC1; p=none; pct=100;\n\n\n\n  While the SPF record must be published at the root of your domain, the DMARC record must be at _dmarc.\n\n\nWith DMARC it is recommended to implement monitoring, so we will have to look at an additional tool. I have found the DMARC Monitor from ValiMail is a good option to get started, it is also free for Microsoft 365 customers. There are many alternatives, please check with your security team if you already have a tool. Whichever tool you end up using, it will ask you to update your DMARC record to include an URI of a mailbox to send reports to. The rua and ruf tags in the TXT record are used for that, in the case of ValiMail the complete record looks like this:\n\nv=DMARC1; p=none; pct=100; rua=mailto:dmarc_agg@vali.email;\n\n\nThis record tells a receiving system to deliver emails independent of the authentication result (p is set to none) and send aggregated reports (rua) to ValiMail.\n\nWith this record in place, you are now ready to send emails from Exchange Online. But we’re not completely done with DMARC just yet.\n\nThe ultimate goal is to set the DMARC policy to p=reject thereby telling any receiving system to reject emails that fail authentication. Before we can do that, we must make sure all legitimate emails pass authentication. The monitoring helps us verify exactly that, the example in the following screenshot shows outbound emails from our systems for the last month. As you can see, all of them authenticated successfully:\n\n\n    \n        \n    \n\n\n\n  Exchange Online does currently not send DMARC reports, so if you are sending only to Exchange Online recipients, don’t expect much information in your monitoring.\n\n\nRemember that I said from our systems above, now let’s change that filter in ValiMail and look at all emails from our domain. As you can see in the screenshot below, over the same period of time, 90 emails failed DMARC authentication:\n\n\n    \n        \n    \n\n\nIn our case, we already have a reject policy in place, so receiving systems should not accept these emails which are spam or worse. So, after setting up DMARC monitoring with a policy of none, observe the situation for some time and, if you are confident your systems are configured correctly, go ahead and update the record:\n\nv=DMARC1; p=reject; pct=100; rua=mailto:dmarc_agg@vali.email;\n\n\n\n  If you are not using a domain for outbound email, please publish the following DMARC record to make it harder for criminals to abuse your domain:\n\n  TXT: v=DMARC1; p=reject; pct=100;\n\n\nIn the next post we will have a look at preset security policies in Exchange Online Protection.\n\n— Tom."
        },
        {
          "id": "post-why-is-this-website-fast",
          "title": "Why is this website so fast?",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "Jekyll, ntSystems, GitHub",
          "url": "/post/why-is-this-website-fast/",
          "content": "I have recently updated our website and have learned a few things while doing so. As mentioned on the home page, this website is still built with Jekyll. The so-called grandfather of static website generators is maybe not perfect, but the following reasons make it a good option for me.\n\n\n  It just works: I don’t have much time to tinker with this side-project, there are no complicated, always changing dependencies like with newer, javascript-based tools (oh and no gigantic node_modules either)\n  It’s simple: True how variables are handled is not always intuitive but I have learned enough to use it effectively\n  GitHub pages: The build process is automated, I just push my changes and the rest is taken care of\n\n\nYou promised fast, what’s all this?\n\nI’m getting there. Fast websites are generally associated with more modern site generators like Gatsby. These typically use a lot of javascript that makes them fast but also more complicated. I wanted to see, if I could get good results with good old Jekyll.\n\nThis site is fast because it’s small and very simple. I’m not saying bigger sites don’t need all that node_modules goodness, I’m saying small sites - like this one - don’t need it.\n\nThis site is also fast, because I’ve added a few extra lines to the head section of the html. At the end of every post you can find a next navigation button that brings you to the next post. With a little help from Jekyll, I was able to include the relative URL of the next post as link to the head section with the keyword rel=next. This little keyword tells the browser to download the post whenever it has a free moment:\n\n{% if page.next %}\n&lt;link rel=\"next\" href=\"{{ page.next.url }}\"&gt;\n{% endif %}\n\n\nThe result is a super fast navigation experience because the target has already been downloaded. I’m also preloading fonts with rel=\"preload\" and the little CSS we use is inlined.\n\nService workers\n\nAnother thing I learned while looking at modern websites is the concept of service workers. This is a little bit of javascript that can be very powerful indeed. Essentially, a service worker is a script that is installed in the browser when a user opens the website. Once installed it can intercept and handle network requests from the browser to the site. It’s a kind of proxy in your browser just for our site.\n\nI’m using a service worker to create a local cache for use with this site. On the first visit, the service downloads a few static files that visitors will definitely need (fonts, main pages). It uses a cache-first strategy, so whenever the browser requests something, the service worker looks in the cache first and returns any results from there. After that it goes out to the site and retrieves the latest version of what the browser was looking for. If there’s no cache-hit, the resource is fetched from the network.\n\nThe service worker needs a manifest and we have to tell the browser where to find it. We add the manifest to the head section and use a few lines of javascript to trigger the installation of the service worker. This is the pointer to the manifest file:\n\n&lt;link rel=\"manifest\" href=\"/manifest.json\"&gt;\n\n\nAnd this is the code that registers the service worker in your browser after the page is loaded. I have added a condition to skip the registration if the site is accessed through localhost, which is the case when developing locally:\n\nif ('serviceWorker' in navigator &amp;&amp; !(/localhost/.test(window.location.href))) {\n  window.addEventListener('load', function() {\n    navigator.serviceWorker.register('//serviceworker.js')\n    console.log('Servie worker registered.');\n  });\n}\n\n\nFaster build times with Jekyll on WSL\n\nI have used Jekyll on Windows 10 leveraging the Windows Subsystem for Linux since 2017. Today I realized that actually storing the files within WSL makes the build time much (much) faster. Until today I stored the repository in my Windows user profile, something like C:\\users\\tto\\.... In the WSL I happily changed into this directory following /mnt/C/Users... before running jekyll serve. Build time was around 5 minutes. Not great.\n\nToday it ocurred to me to clone the repository again, this time into the WSL. So I can access it using a WSL path, something like /home/tto/.... Build time is now less than one minute. Not bad.\n\nWebpageTest results\n\nYou don’t have to take my word for it, webpagetest also thinks this website is pretty fast:\n\n\n    \n        \n    \n\n\n— Tom"
        },
        {
          "id": "post-so-long-2020",
          "title": "So long, 2020",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "Jekyll, ntSystems, GitHub",
          "url": "/post/so-long-2020/",
          "content": "Goodbye 2020! What a year it has been.\n\nTrue, I had to cancel some trips and I stayed home a lot more than usual, but apart from that, it was a pretty spectacular year for me. I moved to Amsterdam from a smaller city in the outskirts. I was able to go to Zürich, Sardinia, Marbella, Napoli and a few other places. In a prolonged episode of lockdown blues I managed to get about 1000 km on my road bike done. However, that was sometime before the summer, since then I have been (a lot) less active. I worked a lot. I learned a lot.\n\nSince a certain global event made more travelling impossible, or at least not very recommendable, I’m staying in Amsterdam for the holiday season and started building this new site.\nAfter more than 10 years, it’s now time to say: Goodbye ntSystems.it\n\nWelcome onprem.wtf\n\nWelcome to our new home. This site is still build with Jekyll and hosted on GitHub pages. I replaced the default minima theme with a custom one, mostly because I wanted to learn and experiment with some CSS features. I also had a good look at some of the more modern static site generators and other alternatives but decided to stick with Jekyll because it is simple and I really don’t need all of that node_modules stuff for just a simple blog.\n\nThe new site has a simpler layout with less clutter, should be easier to read on any screen, and it also has a dark theme. Actually, unless you select a theme, it will use the same settings that your operating system (or browser) uses. Pretty slick, right?\n\nWhat about the domain name you ask? Well, this one was available and it kind of fits with what we are doing at the moment. If you find a better one, I’m open to suggestions 😉\n\nWhat’s next?\n\nWell that’s a good question. For now, like many others, I’ll be watching how the vaccine rollout is going and what’s happening in the US of A. I would like to become a better writer so I will try to publish my thoughts more regularly. We’ll see how that goes.\n\nWith that I wish you all the best for the new year.\n\n— Tom."
        },
        {
          "id": "post-converting-powershell-help-to-a-website",
          "title": "Convert PowerShell Help to a Website",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, Help, MarkDown",
          "url": "/post/converting-powershell-help-to-a-website/",
          "content": "How to use the platyPS PowerShell module to convert comment-based help to markdown and easily host it on GitHub pages.\n\n\n\nNow you might have read that our blog is powered by Jekyll, which is a static-site generator that turns markdown files into html. So, obviously, if I would be able to convert PowerShell help content to markdown files, I could simply put them into a folder an serve them via the blog.\n\nCreate markdown files\n\nThe first step is to install platyPS (available on the PS Gallery) and create the markdown files for every function.\n\nInstall-Module platyPS\nImport-Module platyPS, TAK, PSSpeech\n\nforeach ($cmdlet in (Get-Command -Module PSSpeech)) { \n    $h = Get-Help $($cmdlet.Name)\n    $meta = @{\n        'layout' = 'pshelp';\n        'author' = 'tto';\n        'title' = $($cmdlet.Name);\n        'category' = $($cmdlet.ModuleName.ToLower());\n        'excerpt' = \"`\"$($h.Synopsis)`\"\";\n        'date' = $(Get-Date -Format yyyy-MM-dd);\n        'redirect_from' = \"[`\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name)/`\", `\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name.ToLower())/`\", `\"/PowerShell/$($cmdlet.Name.ToLower())/`\"]\"\n    }\n    if($h.Synopsis -notmatch \"\\[|\\]\") {\n        New-MarkdownHelp -Command $cmdlet -OutputFolder .\\_OnlineHelp\\a -Metadata $meta -Force \n    }\n}\n\nThe above example creates a .md help file for every function in the TAK module. The files are almost ready to be used by our Jekyll-powered blog, I’m using the -Metadata parameter to add some additional information to the ‘front matter’ of each file.\n\n\n  I could be using New-MarkdownHelp -Module TAK but that way, I was not able to include the metadata automatically.\n\n\nRename files for Jekyll\n\nThe only thing that I have to do now, in order to have Jekyll pick up the files and create websites, is to rename them accordingly.\n\nforeach ($file in (Get-ChildItem '.\\tak-md-help\\*.md')) {\n    $timestamp = (Get-Date -Format 'yyyy-MM-dd')\n    $NewName = $timestamp, $file.name -join '-'\n    Rename-Item -Path $file.FullName -NewName $NewName\n}\n\n\nThe above example renames all *.md files in the tak-md-help folder to include a timestamp. This step is not necessary if you are using a collection in Jekyll.\n\nInclude HelpUri\n\nThe Get-Help command has an -Online parameter, that can be used to easily open a related link when looking for help. To include this functionality in my scripts, I just have to put the URL of the online article in the [CmdletBinding()] statement, like so:\n\n[CmdletBinding(HelpUri = 'https://ntsystems.it/PowerShell/TAK/test-tlsconnection/')]\n\n\nLinks\n\n  https://github.com/PowerShell/platyPS\n\n\nThat’s it :)\n\nTom"
        },
        {
          "id": "post-using-powershell-and-azure-cognitive-services-to-convert-text-to-speech",
          "title": "Using PowerShell and Azure Cognitive Services to convert text to speech",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "PowerShell, Azure",
          "url": "/post/using-powershell-and-azure-cognitive-services-to-convert-text-to-speech/",
          "content": "In one of our recent Microsoft Teams projects I needed some voice prompts for a customer service call queue. I figured it would be nice to have Azure’s artificial-intelligence-powered speech service convert my text input to an audio file. Turns out it’s easier than I thought it would be.\n\nAzure Cognitive Speech Service\n\nFirst of all we need an Azure Subscription where we can deploy our Speech Services instance. If you don’t have an Azure subscription, you can sign up for a trial account using the links below. If you already have a subscription, you can easily create a free Speech Services account using the following commands from Azure Cloud Shell:\n\naz group create -n ntsystems-speech -l WestEurope\naz cognitiveservices account create -n ntsystems-speech -g ntsystems-speech --kind SpeechServices --sku F0 -l WestEurope --yes\n\n\nNow the account was created and we can start using it right away. To authenticate our calls from PowerShell, we need an API key, again we can use Azure Cloud Shell to retrieve the key:\n\naz cognitiveservices account keys list -n ntsystems-speech -g ntsystems-speech\n\n\nPowerShell\n\nThe speech service provides a well documented API that can easily be called using PowerShell’s native Invoke-RestMethod command. The required information is available on Microsoft Docs (link below), all I had to do is wrap a little PowerShell around it and I had created a quick module. You can install the module using the following command:\n\nInstall-Module PSSpeech\n\n\nBefore we can call any of the speech service’s API endpoints, we have to use the API key to get a token and store it in a variable for later use:\n\nGet-SpeechToken -Key yourapikey | Save-SpeechToken\n\n\nNow we should be able to get a list of available voices using Get-SpeechVoicesList | Format-Table.\n\nAnd finally we can convert some input text to speech using one of the voices from the list:\n\nConvert-TextToSpeech -Voice en-US-JessaNeural -Text \"Hi Tom, I'm Jessa from Azure!\" -Path jessa.mp3\nConvert-TextToSpeech -Voice en-GB-HarryNeural -Text \"Hi Tom, I'm Harry from Azure!\" -Path harry.mp3\n\n\nYou can find a lot of information about the speech service in the links below, be sure to check out the SSML structure to see how you can customize the voices, introduce pauses to the audio file, and many other things.\n\nYou can find the code for the module in my GitHub, please let me know if you find it useful and feel free to submit a pull request with your optimizations :)\n\nThis is the first post in this new year, best wishes and thanks for reading!\n\nTom\n\nLinks\n\n  Speech Services\n  Speech Synthesis Markup Language (SSML)\n  Text to Speech REST API\n  PSSpeech Module"
        },
        {
          "id": "post-configuring-policy-based-qos-for-teams-with-intune",
          "title": "Configuring policy-based QoS for Teams with Intune",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Workplace, Intune, Teams",
          "url": "/post/configuring-policy-based-qos-for-teams-with-intune/",
          "content": "Traditional Active Directory with group policy has no place in the big-picture of the modern workplace, so we need a novel solution to apply policy-based QoS to our Teams clients. One could argue that QoS has no place in the modern workplace either, but that’s a discussion for another day.\n\nConfiguration Service Provider\n\nSo a CSP or configuration service provider is pretty much exactly what everyone with some traditional enterprise IT background would expect from a group policy object, but delivered from the cloud and, at least in theory, applicable to various types of devices. According to Microsoft Docs it is “an interface to read, set, modify, or delete configuration settings on the device. These settings map to registry keys or files.”\n\nYou can find a link to the CSP reference below.\n\nNetworkQoSPolicy CSP\n\nNow it turns out there is a CSP for policy-based QoS but it just applies to Surface Hub devices. If you’re lucky enough to configure QoS on such a device, here is a screenshot of the settings you will most likely use.\n\n\n  The port numbers may be different in your environment.\n\n\n\n    \n        \n    \n\n\nMSFT_NetQosPolicySettingData\n\nSo here we are trying to configure QoS settings on our Windows 10 clients but CSPs are of no great help. Luckily we can use PowerShell to configure policy-based QoS and Intune provides an easy way to deploy PowerShell scripts to our clients.\n\nTo configure Windows 10 to tag packets sent by the Teams.exe and on the configured source ports for each modality, we could use three simple commands like in the example below:\n\nNew-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50020 -IPSrcPortEndMatchCondition 50039 -DSCPValue 46 -Name \"Teams Audio\"\nNew-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50400 -IPSrcPortEndMatchCondition 50059 -DSCPValue 34 -Name \"Teams Video\" \nNew-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50069 -IPSrcPortEndMatchCondition 50070 -DSCPValue 28 -Name \"Teams AppSharing\"\n\n\nYou can find a link to the cmdlet reference for New-NetQosPolicy below.\n\nSave the above commands to a file with ps1 extension and head over to endpoint.microsoft.com. Create a new script for Windows 10, upload the the ps1 file and set it to run in system context and using the 64 bit PowerShell host. Now assign the script to a group that contains your devices.\n\n\n    \n        \n    \n\n\nOnce the script was applied you can use Get-NetQosPolicy to verify the policies were applied correctly.\n\nTeams Meeting Settings\n\nFor the above configuration to make any sense, we first have to specify a port range for each modality in the Microsoft Teams admin center.\n\nYou can find a link to the Teams admin center below.\n\nThe following screenshot shows an example configuration where a distinct port range is used for each type of traffic, this allows us to distinguish the traffic types and apply different DSCP tags using policy-based QoS.\n\n\n    \n        \n    \n\n\nSpecial thanks to Mr. Workplace Expert Dave Wenger! Check out his blog in the links below.\n\nLinks\n\n  Configuration service provider reference\n  New-NetQosPolicy\n  Microsoft Teams admin center\n  https://blog.contoso-bern.ch/"
        },
        {
          "id": "post-send-check-point-logs-to-azure-sentinel-beta",
          "title": "Send Check Point Logs to Azure Sentinel (beta)",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Security",
          "tags": "Azure, Cloud, Security",
          "url": "/post/send-check-point-logs-to-azure-sentinel-beta/",
          "content": "Azure Sentinel is Microsoft’s new, cloud-native security information and event management (SIEM) tool. In my simplistic point-of-view it is a security-focused, machine-learning-driven add-on for Log Analytics (OMS). Today we will be looking into ingesting Check Point Firewall logs into Log Analytics.\n\n\n\nLog Analytics Agent (linux)\n\nLog Analytics currently lists only linux-based agents for syslog forwarding. In this case I installed Ubuntu Server 18.10, for production it maybe better to stick with 18.04. The following command installs required components:\n\nsudo apt install python auditd\n\n\nFrom the Azure Portal, copy the snippet to install the Log Analytics agent (non-Azure Linux VM). It should look something like this and already have the correct values for workspace id and key.\n\nsudo wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh &amp;&amp; sh onboard_agent.sh -w &lt;workspace-id&gt; -s &lt;workspace-key&gt; -d opinsights.azure.com\n\n\nFinally, download the security configuration file for OMS agent. This contains the required regular expressions for the oms.security event type:\n\nsudo wget -O /etc/opt/microsoft/omsagent/&lt;workspace-id&gt;/conf/omsagent.d/security_events.conf \"https://aka.ms/syslog-config-file-linux\"\n\n\nSyslog (rsyslog.d)\n\nNow with the Log Analytics agent ready, we need to configure rsyslog to accept logs from the firewall and forward them to the agent.\n\nUncomment the following lines in the file /etc/rsyslog.conf to enable the rsyslog listener on udp port 514:\n\nmodule(load=\"imudp\")\ninput(type=\"imudp\" port=\"514\")\n\n\nNow lets create a new configuration file to tell rsyslog to forward all events that contain the string “Check Point” to the Log Analytics agent. Azure Sentinel documentation creates the file at /etc/rsyslog.d/security-config-omsagent.conf:\n\n:msg, contains, \"Check Point\" @127.0.0.1:25226\n\n\nAt last it may be a good idea to change the default configuration in such a way that not all logs are written to a file. The default configuration for rsyslog is located at /etc/rsyslog.d/50-default.conf. Just modify the line with *.* accordingly:\n\n#*.*;auth,authpriv.none         -/var/log/syslog\nlocal.*;auth,authpriv.none      -/var/log/syslog\n\n\nWhen we’re done with the configuration we use the following commands to restart the Log Analytics agent and the rsyslog service:\n\nsudo /opt/microsoft/omsagent/bin/service_control restart &lt;workspace-id&gt;\nSudo service rsyslog restart\n\n\nCheck Point\n\nCheck Point publish information about how to configure log export in the article sk122323, see links below. On version R80.20 the required packages are already installed and we just add a log export target like this. Note that this is using export mode shell:\n\ncp_log_export add name azsentinel target-server 10.1.1.1 target-port 514 protocol udp format cef read-mode semi-unified\n\n\nMake sure to select cef log format and set the read-mode to semi-unified. The existing configuration can be verified with:\n\ncp_log_export show\n\nname: azsentinel\n     enabled: true\n     target-server: 10.1.1.1\n     target-port: 514\n     protocol: udp\n     format: cef\n     read-mode: semi-unified\n\n\nTroubleshoot\n\nAccording to the Sentinel documentation it can take a while before the first logs show up in Log Analytics, in my case it didn’t take more than five minutes. But if they don’t show up at all, the following steps can be helpful for troubleshooting:\n\nCheck if syslog services are listening:\n\ntom@azsentinel:~$ netstat -anu\nActive Internet connections (servers and established)\nProto Recv-Q Send-Q Local Address           Foreign Address         State\nudp        0      0 127.0.0.53:53           0.0.0.0:*\nudp        0      0 0.0.0.0:514             0.0.0.0:*\nudp        0      0 127.0.0.1:25224         0.0.0.0:*\nudp        0      0 127.0.0.1:25226         0.0.0.0:*\nudp        0      0 0.0.0.0:33569           0.0.0.0:*\nudp6       0      0 :::514                  :::*\n\n\nNote: rsyslog listens on 514 and the omsagent listens on 25224 and 25226, the latter is of interest in this case.\n\nCheck if logs are coming in from Check Point:\n\nsudo tcpdump -A -ni any port 514 -vv\n\n\nCheck if logs are forwarded to omsagent:\n\nsudo tcpdump -A -ni any port 25226 -vv\n\n\nLog Analytics agent log file:\n\nsudo tail /var/opt/microsoft/omsagent/log/omsagent.log\n\n\nLinks\n\n  Check Point Log Export (sk122323)\n  Azure Sentinel Documentation"
        },
        {
          "id": "post-create-a-sas-token-for-azcopy",
          "title": "Create a SAS token for AzCopy",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "DevOps",
          "tags": "PowerShell, Cloud, Azure",
          "url": "/post/create-a-sas-token-for-azcopy/",
          "content": "I’ve spent way too much time trying to figure this out, so here goes a quick note that hopefully saves someone a minute.\n\n\n\nAzCopy\n\nIs a command-line tool that can be used to copy data to all kinds of Azure storage. In this post I am focusing on the Azure Files service because I want to use AzCopy to copy data from an existing file server to a new file share in Azure.\n\nAccording to the documentation, AzCopy supports authentication via Azure AD (using azcopy login) and SAS-token. For the files part, however, only SAS-token authentication is supported.\n\nShared Access Signatures?\n\nA shared access signature, SAS, is a string that can be used to delegate access to resources in Azure. It looks something like that:\n\n?sv=2018-11-09&amp;sig=&lt;..key..&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=bfqt&amp;sp=racupwdl\n\n\nThere is some documentation out there on how to create the SAS token with the SDK but I couldn’t find much that I could easily use. So after some searching around I found the New-AzStorageAccountSASToken cmdlet in the Az PowerShell module.\n\nPowerShell Az Module\n\nThe Az module is the latest version (I believe) of the PowerShell module to manage Azure. We are going to use it to create the SAS token, so if you don’t have it already, install via the PowerShell Gallery (requires PowerShell 5.1):\n\nInstall-Module Az -AllowClobber\n\n\nOnce installed I can login to my Azure subscription and create the token:\n\nConnect-AzAccount\n$StorageContext = New-AzStorageContext -StorageAccountName mystorageaccount -StorageAccountKey \"storageaccountkey==\"\nNew-AzStorageAccountSASToken -Service File -ResourceType Service,Container,Object -Permission racwdlup -Context $StorageContext -ExpiryTime (Get-Date).AddDays(+3)\n\n\nThe -ExpiryTime parameter can be used to set an expiration time for the generated token. I believe the default is one hour, so if you expect the copy job to take longer adjust accordingly.\n\nPlease note: I could also create the storage context without specifying the -StorageAccountKey parameter, but that would lead to the following error message when creating the token:\n\nNew-AzStorageAccountSASToken : Cannot create Shared Access Signature unless Account Key credentials are used.\n\n\nCopying the data\n\nActually copying files or directories to Azure Files is pretty straight-forward once we have the SAS-token, we just pass it along with the url.\n\nTo copy a single file:\n\n.\\azcopy.exe cp D:\\Data\\file.txt \"https://mystorageaccount.file.core.windows.net/myshare/file.txt?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\"\n\n\nTo copy a directory:\n\n.\\azcopy.exe cp D:\\Data \"https://mystorageaccount.file.core.windows.net/myshare?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\" --recursive\n\n\nLinks\n\n  https://github.com/Azure/azure-storage-azcopy\n  https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstorageaccountsastoken\n  https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-files\n  https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1"
        },
        {
          "id": "post-ntsystemspsdrive-a-ships-drive-for-the-blog",
          "title": "ntSystemsPSDrive: a SHiPS drive for the blog",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, Jekyll, ntSystems",
          "url": "/post/ntsystemspsdrive-a-ships-drive-for-the-blog/",
          "content": "Some time ago I wrote a post about Consuming ntSystems with PowerShell. It boils down to this: we have a json-based API that is available via https://ntsystems.it/api/v1/ and returns json elements for posts and pages on the blog. For more information check out the linked post. Then I wanted play around with the SHiPS module for some time and finally got around to doing it this past weekend. Now I’m happy to be sharing another method do consume ntSystems with PowerShell: It can be mounted as PSDrive.\n\n\n\nPSProvider\n\nPowerShell has always had the concept of providers which serve as a way of accessing and interacting with data that would otherwise not be easily available at the command-line. According to about_Providers they are Microsoft .NET Framework-based programs that make the data in a specialized data store available in PowerShell so that you can view and manage it.\n\nThere are some built-in providers such as Alias, Certificate, and Registry that you will be familiar with. Essentially they provide a file-system-like view into the data stores, so we can easily see all defined aliases with the following command:\n\nGet-ChildItem -Path Alias:\n\n\nWe can see installed certificates in the Cert: drive and access the registry via hkcu: and hklm:. Not only can we list the content of the data stores with cmdlets such as Get-ChildItem, we can also modify values with Set-Item or Set-ItemProperty like this:\n\n# Create a new REG_SZ \nNew-ItemProperty -Path HKCU:\\Environment\\ -PropertyType string -Name TestPS -Value \"test pwsh\"\n\n# Create an alias\nNew-Item Alias:\\test -Value \"Get-Process\"\n\n# Remove expired Certificates\nGet-ChildItem Cert:\\CurrentUser\\my | Where-Object NotAfter -lt (Get-Date) | Remove-Item\n\n\nWell, you get it by now: providers make it relatively easy to work data stored in certain locations.\n\nSome vendors, such as VMware, add providers to their PowerShell tools. So after installing PowerCLI and connecting to a server, we can browse the inventory using:\n\nGet-ChildItem vi:\nGet-ChildItem vmstore:\n\n\nWe can see all available drives using Get-PSDrive.\n\nThere are not too many 3rd-party providers out there, probably because it was quite hard to write them. Enter SHiPS.\n\nSimple Hierarchy in PowerShell (SHiPS)\n\nAccording to the SHiPS GitHub repository, “developing PowerShell provider got so much easier”. The module leverages PowerShell classes to create the hierarchy and items that are then exposed as a PS Drive.\n\nHow easy you ask? Well I gave it a shot the other day and here is the result.\n\nntSystemsPSDrive\n\nAs stated above, the module requires the SHiPS module and builds on top of it. So in the code we first declare the following:\n\nusing namespace Microsoft.PowerShell.SHiPS\n\n\nThen we go ahead and create classes for our navigation nodes, folders (items containing child items) inherit from SHiPSDirectory and leafs (like files) inherit from SHiPSLeaf.\n\nIn the classes we define constructors and methods as needed, if a folder shall be used as root node, i.e. the entry point used by New-PSDrive, it must have a constructor with the node name as parameter.\n\nHome([string]$name): base($name) { }\n\n\nAll folder nodes must define a GetChildItem() method that is called when browsing the directory.\n\n[object[]] GetChildItem() { }\n\n\nSo for example the Home node in the module ntSystemsPSDrive is used as root (entry point) when mounting the PSDrive:\n\nNew-PSDrive -Name $Name -PSProvider SHiPS -Root \"ntSystemsPSDrive#Home\" -Scope Global -ErrorAction Stop\n\n\nTo create such a node and its contents, we define a class like this :\n\nclass Home : SHiPSDirectory {\n    # required constructor for root nodes\n    Home([string]$name): base($name) {\n    }\n    # The method GetChildItems is called when listing directory content\n    [object[]] GetChildItem() {\n        $obj = @()\n        $obj += [ntSystemsType]::new(\"Category\")\n        $obj += [ntSystemsType]::new(\"Tags\")\n        $obj += [ntSystemsType]::new(\"Author\")\n        $obj += [ntSystemsType]::new(\"Language\")\n        return $obj\n    }\n}\n\n\nThe above example contains the constructor required for root nodes as well as a method GetChildItem that returns an array of objects when it gets called.\n\nSee it in action:\n\nImport-Module ntSystemsPSDrive\nNew-ntSystemsPSDrive\ndir ntSystems:\ndir ntSystems: -Depth 1\nGet-ChildItem 'ntSystems:\\Posts by Category\\PowerShell\\' | Select-Object -Property name,url\nGet-Content 'ntSystems:\\Posts by Category\\ntSystems\\Jekyll Fun: Consuming ntSystems with PowerShell' \n\n\nPretty cool, right? Thanks for reading, have fun!\n\nTom\n\nLinks\n\n\n  SHiPS\n  SHiPS Architecture"
        },
        {
          "id": "post-powershell-script-to-enable-specific-office-365-service",
          "title": "Powershell Script to enable specific Office 365 Service",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Azure",
          "tags": "PowerShell, Azure",
          "url": "/post/powershell-script-to-enable-specific-office-365-service/",
          "content": "Currently I’m in an Exchange Migration project to migrate all mailboxes from Exchange onPremise to Exchange Online. Yeah.. of course.. killing Exchange onPrem… again :)\n\n\n\nI have the following situation that all users already have Office 365 Licenses assigned like E1 / E3 or E5. There are some users that don’t have all Office 365 services the license includes enabled and so there are some disabled services. The license situation is not really structured.. When I’m going to migrate the mailboxes to Exchange Online I need to enable the Exchange service for every user so they can access the mailbox.\n\nIt doesn’t sound like a big deal but the tricky part is I want to preserve the disabled services for every user. I cannot apply a default license to all users and I’m too lazy to click through all users and enable the Exchange Online switch manually..\n\nSo now I want to share with you a script that does all the magic automatically.. Maybe its also helpful for you in some situations.\n\nPlease consider:\n\nI’m not a DEV :)\n\n  The Scripts works for one service at a time\n  The Script works for E1 / E3 / E5 licenses but can easily extend to include other license types\n  I write out a LOG file with the detail the script does\n  The user list can also be a CSV file\n\n\n# Connect\nConnect-MsolService\n\n# Load User List\n$UserList = \"User1@domain.local\",\"User2@domain.local\",\"User3@domain.local\"\n$LogFile = \"C:\\Users\\nitz_\\LOG\\LicenseLog.txt\"\n# Troubleshoot\n#$UserList = \"user1@domain.com\"\n#$User = \"user1@domain.com\"\n\nForEach($User in $UserList){\n    If (Get-MsolUser -User $User)\n    {\n        #Variable\n        $UserLicense = $Null\n        $ChangeLicense = $false\n\n        # Check what License the user has\n        $LicensesAssigned = (Get-MsolUser -User $User).Licenses.AccountSkuId\n        If ($LicensesAssigned -like \"*ENTERPRISEPREMIUM*\" -and $LicensesAssigned -notlike \"*STANDARDPACK*\" -and $LicensesAssigned -notlike \"*ENTERPRISEPACK*\"){\n            Write-Host \"User $User has E5\"\n            $LicenseToActivate = \"EXCHANGE_S_ENTERPRISE\"\n            $UserLicense = \"ENTERPRISEPREMIUM\"\n            $ChangeLicense = $True\n            Add-content $Logfile -value \"User $User has E5\"\n        }\n        ElseIf($LicensesAssigned -notlike \"*ENTERPRISEPREMIUM*\" -and $LicensesAssigned -notlike \"*STANDARDPACK*\" -and $LicensesAssigned -like \"*ENTERPRISEPACK*\"){\n            Write-Host \"User $User has E3\"\n            $LicenseToActivate = \"EXCHANGE_S_ENTERPRISE\"\n            $UserLicense = \"ENTERPRISEPACK\"\n            $ChangeLicense = $True\n            Add-content $Logfile -value \"User $User has E3\"\n        }\n        ElseIf($LicensesAssigned -notlike \"*ENTERPRISEPREMIUM*\" -and $LicensesAssigned -like \"*STANDARDPACK*\" -and $LicensesAssigned -notlike \"*ENTERPRISEPACK*\"){\n            Write-Host \"User $User has E1\"\n            $LicenseToActivate = \"EXCHANGE_S_STANDARD\"\n            $UserLicense = \"STANDARDPACK\"\n            $ChangeLicense = $True\n            Add-content $Logfile -value \"User $User has E1\"\n        }\n        Else{\n            Write-Host \"User $User has License mismatch, please check\" -ForegroundColor Red\n            Add-content $Logfile -value \"ERROR -- User $User has License mismatch, please check\"\n        }\n\n\n        # Change License\n        If($ChangeLicense)\n        {\n            $DisabledLicenses = @()\n                $License = (Get-MsolUser -User $User).Licenses | where{$_.AccountSkuId -like \"*$UserLicense*\"}\n                ForEach($LicenseOption in $License.ServiceStatus){\n                    If($LicenseOption.ProvisioningStatus -eq \"Disabled\"){\n                        If($LicenseOption.ServicePlan.ServiceName -eq $LicenseToActivate){\n                            Write-Host \"Skip disabling License $LicenseToActivate for User $User\" -ForegroundColor Green\n                        }Else{\n                            If($DisabledLicenses -eq $Null){$DisabledLicenses = $LicenseOption.ServicePlan.ServiceName}\n                            Else{$DisabledLicenses = $DisabledLicenses + $LicenseOption.ServicePlan.ServiceName}                \n                        }\n                    }\n                }\n                Add-content $Logfile -value \"User $User has disabled Plans $DisabledLicenses\"\n                # Assign new License Option\n                $LicenseOptions = New-MsolLicenseOptions -AccountSkuId $License.AccountSkuId -DisabledPlans $DisabledLicenses\n                Write-Host \"Applying License Option to User $User\" -ForegroundColor Green\n                Set-MsolUserLicense -UserPrincipalName $User -LicenseOptions $LicenseOptions\n                Add-content $Logfile -value \"User $User assigned new License Option\"\n        }\n\n    }else{\n        Add-content $Logfile -value \"ERROR -- User $User NOT FOUND\"\n    }\n}\n\n\nFeel free to use this script or just to take the basic functions and improve it to fulfill your special needs.\n\nDaniel"
        },
        {
          "id": "post-windows-server-2019-radius",
          "title": "Windows Server 2019 and RADIUS",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Server",
          "tags": "Security, Firewall",
          "url": "/post/windows-server-2019-radius/",
          "content": "First of all, happy new year :) Today we will have a quick look at Windows Server 2019, more specifically the Network Policy Server role.\n\n\n\nBackground\n\nI was recently asked to help with an enterprise WiFi deployment and decided to use a RADIUS server for authentication purposes. I went on to deploy a new Windows 2019 VM and installed the NPS role. After adding the RADIUS client and configuring the required policies, I added the NPS server’s IP address to the WiFi controller and tried to authenticate. A simple task generally, but this time it did not work.\n\nTroubleshooting\n\nThe RADIUS server was located behind a NAT device so my first guess was that I had misconfigured a policy or mistyped an address or something. I double checked the configuration and, as it looked ok, started to scratch my head. In order to better understand what was going on, I installed wireshark on the NPS machine and saw packets incoming from the WiFi controller quite happily. But packet were only incoming, I could not find a single response coming from NPS. The Security Event Log on the VM, where you would typically find NPS logs, had no events related to NPS. So basically the NPS was not responding to RADIUS messages at all.\n\nSolution\n\nAfter a quick google search for “Windows 2019 NPS” I found an entry in the TechNet Forums (link below) where someone explained the Windows Firewall had to be configured to allow RADIUS (udp/1812, udp/1813) traffic even though such a rule did already exist. Sure enough, after adding the firewall rule, authentication worked.\n\nDHCP Relay (update)\n\nSo today, half a year later, I had a very similar problem with DHCP relay. The Windows 2019 DHCP Server would receive DHCP requests from a relay agent but it would never respond to them. I configured the local firewall to allow traffic on UDP ports 67 and 69 and voilà, DHCP started working.\n\nLinks\n\n  TechNet Forums\n  User Voice"
        },
        {
          "id": "post-sending-events-to-splunks-http-event-collector-with-powershell",
          "title": "Sending events to Splunk's HTTP Event Collector with PowerShell",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell",
          "url": "/post/sending-events-to-splunks-http-event-collector-with-powershell/",
          "content": "Using Invoke-RestMethod to send events to a Splunk instance.\n\n\n\nSplunk\n\nIf you don’t know Splunk this article is not going to give a thorough introduction. Let’s just say it’s a pretty fancy log collector/analytics tool. According to the company’s profile, Splunk turns machine data into answers. The goal of this article is to demonstrate how to use PowerShell to send events to the HTTP Event Collector which is Splunk’s REST interface to ingest logs.\n\nEnable Event Collector and create API Key (Token)\n\nConnect to your Splunk’s web interface with appropriate permissions and using Settings, Data inputs, click on HTTP Event Collector. If you are not already using the Event Collector service it has to be enabled using the Global Settings button in the top right corner.\n\n\n\nThen use the New Token button to create a new API key and configure how Splunk handles data it receives using this token. In the first step, give a name to the token you are about to create.\n\n\n\nThe second step is about handling the data, select an appropriate source type, I use json in this case, and the the right App Context. I select the search app for this example, though it can be any installed Splunk app. At the bottom of step two, select the index where Splunk will store the data. If you are not sure which index to use, create a new one. I created an index with the name of PowerShell and assigned it to the search application as selected before.\n\n\n\nReview the configuration in the last step and create the new token. Take note of the Token Value, you will need it later.\n\nOnce the token has been created, you can click on Start Searching and Splunk will automatically create the right search for you. As we have not yet sent data, the search should not return any results.\n\nPowerShell Send-SplunkEvent\n\nI put together a quick wrapper for Invoke-RestMethod that makes sending logs to Splunk relatively easy. All you need is the API key (Token Value) from above and the URI of your event collector service. For this example I am using a Splunk instance on my local machine, so the Uri is “http://localhost:8088/services/collector”, for a production environment, you would probably use https and replace localhost with the name of your instance.\n\nThe idea behind the script was to sort through logs from different systems in PowerShell, turn them into structured data and send them to Splunk. As logs originate on systems other than the one where this script runs, the HostName parameter can be used to specify the ‘host’ property of the event and the DateTime parameter can be used to set the ‘time’ property.\n\nExamples and usage\n\nThe script has two required parameters, InputObject and Key. Use the InputObject parameter to pass an object (or hashtable) to the script. This will be turned into json, using PowerShell’s ConvertTo-Json and then sent to the REST API using Invoke-RestMethod.\n\nUse the Key parameter to pass the HTTP Event Collector token that we created above to the script.\n\n.\\Send-SplunkEvent.ps1 -InputObject @{message=\"Hello Splunk!\";severity=\"INFO\"} -Key &lt;token&gt; \nGet-Service wuauserv | .\\Send-SplunkEvent.ps1 -Key &lt;token&gt; -Uri http://localhost:8088/services/collector\n\n\nThe first example just sends a custom hashtable with the two fields message and severity. The second example gets a service object and converts it into a json object before sending it.\n\nNote: The Uri parameter defaults to localhost, you will have to specify it like in the second example, if sending to a remote instance.\n\nSearch\n\nNow search for the events in the newly created PowerShell index: index=\"powershell\" sourcetype=_json\n\n\n\nPerformance\n\nAs the script is making a new RESTful call for every single event, this is not the fastest way to get logs into Splunk. I have made some tests to compare WindowsPowerSell with the Core edition, here is what I’ve found:\n\nMeasure-Command { Get-Process | .\\Send-SplunkEvent.ps1 -Key &lt;token&gt; }\n\n\nThe above command takes 30 seconds on WindowsPowerShell, while it takes about 280 seconds on Core (tested with 6.1.0 and 6.2.0 preview 2).\n\nDownload &amp; Source for\n\nThe Script is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall- -Name  -Scope CurrentUser\n\nSave- -Name  -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler\n    \n\nLinks:\n\n\n  Send-SplunkEvent\n  Splunk REST API Reference\n  PowerShell Invoke-RestMethod"
        },
        {
          "id": "post-lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5",
          "title": "lost & found: FFmpeg and Skype4B, Security Baseline for RS5",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "Skype4B, WSL, Client, Server",
          "url": "/post/lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5/",
          "content": "A quick edition of lost &amp; found on how to use FFmpeg on WSL to create audio files that can be used for Skype for Business announcements. And an observation about the recently published security baseline for Windows 10 1809 and Server 2019.\n\n\n\nFFmpeg\n\nAccording to it’s website, FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.\n\nPackages are available for various operating systems but since Ubuntu runs just fine on Windows 10, I started using linux-style command-line tools in the Windows Subsystem for Linux.\n\nCheck if you are running the latest version using ffmpeg -version or install to tool using sudo apt-get install ffmpeg.\n\nAccording to @greiginsydney a 16 kHz, mono, 16-bit Wave file is recommended for best performance.\n\nTo convert an MP3 file to Wave with the above specifications, we can use something like this:\n\nffmpeg -i Downloads/ringtone.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ringtone.wav\n\n\nSecurity Baseline\n\nMicrosoft recently released the draft of the security baseline configuration for RS5 builds, that’s Windows 10 v1809 and Windows Server 2019. You can find more information about that on the Security Guidance blog, I just wanted to share a quick note for the Office 365 Admins out there:\n\nThe security baseline configuration contains a setting to disable Basic Authentication for the WinRM client. After applying the baseline configuration, I was no longer able to connect to Exchange Online or Skype for Business Online remote PowerShell Sessions as they rely on basic authentication.\n\nSet the following configuration to Not Configured on your admin machines:\n\nAdministrative Templates\\Windows Components\\Windows Remote Management (WinRM)\\WinRM Client\\Allow Basic authentication\n\n\nLinks:\n\n\n  Audio file formats for Lync and Exchange\n  FFmpeg\n  Security baseline (DRAFT) for Windows 10 v1809 and Windows Server 2019"
        },
        {
          "id": "post-remote-ems-over-ipmi-serial-over-lan",
          "title": "Remote EMS over IPMI serial-over-lan",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Skype4B",
          "tags": "Network, PowerShell, Server, AudioCodes",
          "url": "/post/remote-ems-over-ipmi-serial-over-lan/",
          "content": "Using standards-based IPMI to get some sort of out-of-band management for AudioCodes’ embedded server modules.\n\n\n\nBackground\n\nWe’ve installed a number of session border controllers with embedded server modules for our international customers. The embedded server modules are typically used to run Skype for Business survivable branch servers which provide limited calling services in case of a connectivity issue with the Front End pools. Because IT personnel is not available in branch sites or the devices are installed in data centres with limited access, we relied upon Intel’s AMT for out-of-band management of the earlier version of the server module.\n\nAudioCodes upgraded the embedded server module and it turns out, the new version no longer has an AMT chip. Studying the data sheet of the OEM that builds the module, we found that it Supports IPMI v1.5 and Serial-over-LAN function. The OEM couldn’t help much so I basically googled/tried my way to this solution, maybe my experience saves someone a few hours in the future.\n\nIntelligent Platform Management Interface (IPMI)\n\nFirst of all, I had to read up on IPMI. According to Wikipedia it provides management and monitoring capabilities independently of the host system’s CPU, firmware (BIOS or UEFI) and operating system. Windows does implement some basic functionality through CIM and the PcsvDevice PowerShell module, but, apart from that, we have to rely on other tools such as ipmiutil to communicate with this interface.\n\nipmiutil is an open-source utility to manage and interpret IPMI systems with common software. If used inside the OS on the server, it can access and configure the local Baseboard Management Controller (BMC). Once configured, the utility can be used to invoke IPMI functions remotely.\n\nIPMI configuration\n\nTo show the current configuration of the local BMC we can use the following examples:\n\n.\\ipmiutil.exe config\n.\\ipmiutil.exe lan -l\n\n\nTo set an IP address and the username/password to use for remote connections, we can use something like this:\n\n.\\ipmiutil.exe lan -e -I 192.168.120.131 -S 255.255.255.0 -G 192.168.120.254 -L 5 -p ipmipass -u ipmiadmin\n\n\nThe above example sets the IP address of the BMC to 192.168.120.131/24 and the default gateway to 192.168.120.254. Additionally, we set the username to ipmiadmin and the password to ipmipass.\n\nWe verify the configuration using the ipmiutil config from the first example, if it looks good, we can try the same from a remote system:\n\n[PS] ~\\ipmiutil&gt; .\\ipmiutil.exe config -N 192.168.120.131 -U ipmiadmin -R ipmipass\nipmiutil config ver 3.10\nConnecting to node  192.168.120.131\n-- BMC version 1.08, IPMI version 2.0\n### ipmiutil config, GetPefEntry ...\n# GetPefEntry(1): ret = 193 Invalid Command\n### ipmiutil config, GetLanEntry for channel 5 ...\nLanParam 5,0,0:  00\nLanParam 5,1,0:  14\nLanParam 5,2,0:  14 14 14 14 00\nLanParam 5,3,0:  c0 a8 78 83\n# LanParam(5,3,0) IP address: 192.168.120.131\nLanParam 5,4,0:  01\nLanParam 5,5,0:  c4 00 ad 01 f5 73\n...\n\n\nIn the above example, we run ipmiutil config on another machine and use the -N parameter to specify a remote host, -U and -R are used to specify the username and password, respectively. The output shows the connection succeeded and thus, we have remote connectivity.\n\nNow we have an way to manage certain features of the remote system independently from the operating system that’s installed on said system. We can, for example, use ipmiutil reset to control the systems power state.\n\n.\\ipmiutil.exe reset -c -N 192.168.120.131 -U ipmiadmin -R ipmipass\n.\\ipmiutil.exe reset -d -N 192.168.120.131 -U ipmiadmin -R ipmipass\n.\\ipmiutil.exe reset -u -N 192.168.120.131 -U ipmiadmin -R ipmipass\n\n\nThe above lines power cycle, power down or power up the remote system. Use with caution.\n\nIf the BMC is not reachable from a remote system, I’ve found ipmiutil reset -k useful. This does reset the BMC, without affecting the OS.\n\nSerial over LAN (sol) and Emergency Management Services (EMS)\n\nApart from controlling the systems power state, IPMI also implements serial-over-lan connectivity. This can be used to connect to a remote system’s serial console using an IP connection. Now on Windows servers we do not typically use serial connections, at least not for management. But, as it happens, the Emergency Management Services console provides exactly that: a special management console over serial connections. The Emergency Services are not enabled by default, so we have to enable it and make sure it uses our serial-over-lan connection.\n\nTo do this, we use the bcdedit utility (from an administrative command-line), first to redirect the EMS console to serial port #2, then to enable EMS for the current Windows installation:\n\nbcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200\nbcdedit /ems on \n\n\nTo activate the change and enable EMS, Windows must be rebooted. After that, we can go ahead and start our first sol session using the following command:\n\n[PS] ~\\ipmiutil&gt; .\\ipmiutil.exe sol -a -N 192.168.120.131 -U ipmiadmin -R ipmipass\nipmiutil sol ver 3.10\nConnecting to node  192.168.120.131\n-- BMC version 1.08, IPMI version 2.0\nOpening lanplus connection to node 192.168.120.131 ...\n[SOL session is running, use '~.' to end, '~?' for help.]\n\nSAC&gt;\n\n\nThe SAC prompt indicates we are now connected to the special administration console. This console can be used to retrieve information about the system, it’s network interfaces and running processes. We can also connect to the OS via cmd.\n\nSAC&gt;cmd\nSAC&gt;ch -si 1\n\n\nThe above example creates a new cmd channel and connects to it. It will prompt for credentials to connect to Windows and, upon success, we have a remote cmd.exe interface. Type in powershell and enjoy :)\n\nFinally, we can use -d to disconnect from the sol session:\n\n.\\ipmiutil.exe sol -d -N 192.168.120.131 -U ipmiadmin -R ipmipass\n\n\nThis is also useful if the sol session fails with the message: “SOL payload already active on another session”.\n\nSecurity\n\nNow as you can see, enabling IPMI and making the SAC available over serial-over-lan, adds another way of managing the system. This can be convenient but it also increases the system’s attack surface. Make sure to limit access to IPMI endpoints and don’t use high-privilege accounts when logging into the SAC remotely.\n\nLinks:\n\n\n  Sourceforge download and man page\n  AudioCodes 1000 sbc\n  Boot Parameters to Enable EMS Redirection"
        },
        {
          "id": "post-network-assessment-with-policy-based-qos-and-iperf3",
          "title": "Network assessment with policy-based QoS and iperf3",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Skype4B",
          "tags": "Network, Skype4B, PowerShell",
          "url": "/post/network-assessment-with-policy-based-qos-and-iperf3/",
          "content": "In Skype for Business and, more recently, Teams deployments, a solid network and a good knowledge of it are fundamentally important.\n\n\n\nWe typically work very closely with the network/security departments and make sure to involve them from the beginning to have their support throughout the project. After deploying QoS, ideally before rolling out voice/video for the end-users, we run some tests to verify the QoS configuration, measure the reserved bandwidth and whether it remains stable over some amount of time. There are various tools available for this task, I mostly use iperf3 to generate traffic and measure basic parameters.\n\niperf3 basics\n\nAccording to the GitHub page, iperf3 is “a tool for active measurements of the maximum achievable bandwidth on IP networks”. It is primarily developed on Linux but Windows executable are available from various sources. I’m using the version 3.6 build that can be found on NeoWin (see below).\n\nAfter copying the files to the machine, we can start the server using the the following command line. This starts a listener at tcp/udp 5201 and waits for iperf clients to connect.\n\n.\\iperf3.exe -s\n\n\nOn the client side, we have multiple options, as stated above, iperf’s goal is to measure the maximum bandwidth, so if we start the client without parameters, that is what it will do:\n\n .\\iperf3.exe -c 192.168.120.185\n Connecting to host 192.168.120.185, port 5201\n[  5] local 192.168.120.160 port 52070 connected to 192.168.120.185 port 5201\n[ ID] Interval           Transfer     Bitrate\n[  5]   0.00-1.00   sec   530 MBytes  4.44 Gbits/sec\n[  5]   1.00-2.00   sec   607 MBytes  5.09 Gbits/sec\n...\n\n\nNote that in the above example, iperf uses TCP and measures end-to-end available bandwidth between the client and server. This may saturate network links in between. Use with caution.\n\nWe can also try to simulate RTP media (small UDP packets) by specifying the following parameters:\n\n .\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200\n\n\nNote that with UDP, the target bitrate defaults to 1 Mbit per second, this can be changed with the -b parameter. Also, when using UDP, jitter and packet loss are measured.\n\nMore information: NeoWin, GitHub, Documentation (outdated)\n\nNow that we have a tool to generate traffic and measure bandwidth, we can go ahead and put some DSCP tags on the traffic to see how the network handles quality of service.\n\n\n  iperf has a –dscp parameter, this does not work on Windows as applications are not trusted to set DSCP values. The only way (that I know of) to tag packets with DSCP values is policy-based QoS.\n\n\nCreating the QoS Policies\n\nWe would typically use group policies to manage policy-based QoS settings but since this is a test, we can go ahead and use the NetQos PowerShell module on the client/server machines to create temporary policies.\n\nA quick Get-Command -Module NetQos shows that the module provides four cmdlets, we can Get, Set, Remove, and create New QoS policies with the respective *NetQosPolicy cmdlet.\n\nSo we create two policies for the iperf server and client applications. The server listens on port 5201 by default, so all traffic originating from the server will use that source port.\n\nNew-NetQosPolicy -Name \"iperf_server\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPSrcPort 5201 -DSCPValue 46 -PolicyStore ActiveStore\n\n\nThe client will communicate with the server by sending to the port 5201, so all traffic originating from the client will use that destination port.\n\nNew-NetQosPolicy -Name \"iperf_client\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPDstPort 5201 -DSCPValue 46 -PolicyStore ActiveStore\n\n\nNote: By specifying ActiveStore as the policy store, the QoS policy will not be persistent. On the next reboot of the system, it will be gone.\n\n\n  We want to measure both directions, so we create both policies on the server and both on the client.\n\n\nTest and trace\n\nNow it’s time to start a network trace on the client and the server and run iperf again. If QoS has been configured, we should see packets leaving the client tagged with DSCP 46 and this tag should be preserved and be displayed on the server-side as well. I run the following two tests on the client, the -R parameter reverses the flow, so in the second case, the server sends packets to the client:\n\n .\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -J --logfile send.json\n .\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -R -J --logfile recv.json\n\n\nThe following screenshots show a trace from the above test on the client (1) and on the server (2). We can see that packets from client to the server (source: 192.168.120.160, destination: 192.168.120.185) are tagged on the client…\n\n\n\n… and the tag is still present when the server receives them.\n\n\n\nAfter switching the stream’s direction (with -R), we observe the same: packets leave the server tagged, and are received by the client with the tag still on.\n\nWith the -J and --logfile parameters we instruct iperf to write output in JSON format and redirect it to a text file. With PowerShell we can now easily work with that data:\n\n$send = Get-Content send.json -Raw | ConvertFrom-Json\n$send.intervals.streams | Out-GridView\n$send.end.sum\n\n\nAt this point, it’s important to note that until now we have only proved, that the network does not remove the DSCP tags we put on our test packets. Whether the network actually prioritizes such packets is not yet clear. The easy way to verify that, would be to log into the network devices (QoS policies are typically enforced on routers) and get some counters/statistics. If that is not possible, we have to find out how much bandwidth is reserved for a given class empirically. To do that, we need a link that can be saturated (no congestion, no prioritization) and then run the above test again.\n\nMore about QoS Policies\n\nWhen configuring policy-based QoS, either by group policy or by PowerShell, check the event log to see if the system refreshed the policy correctly. The following event is logged, when a policy change is detected:\n\nLog Name:      Microsoft-Windows-Policy/Operational\nSource:        Microsoft-Windows-EQoS\nEvent ID:      2\nLevel:         Information\nDescription:   Computer QoS policies successfully refreshed. Policy changes detected.\n\n\nThe NetQos module is a wrapper for the WMI/CIM objects managing the quality of service policies. We can also manipulate the CIM instance directly, e.g. to delete policies:\n\nGet-CimInstance -Namespace ROOT/StandardCimv2 -ClassName MSFT_NetQosPolicySettingData | Remove-CimInstance\n\n\nLinks:\n\n\n  How to validate VPN throughput to a virtual network"
        },
        {
          "id": "post-exchange-hybrid-observations",
          "title": "Exchange Hybrid Observations",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Office365, Hybrid, Exchange",
          "url": "/post/exchange-hybrid-observations/",
          "content": "Like I did here with Skype for Business, I’m collecting some observations and useful snippets about Exchange in hybrid environments.\n\nCompleting individual migration users\n\nRecently we have been using the CompleteAfter flag in favour of the older SuspendWhenReadyToComplete to set a date for migration batches to complete. To update this timestamp for a single mailbox in a batch, we can use the following command:\n\nGet-MoveRequest tom | Set-MoveRequest -CompleteAfter (Get-Date).AddHours(-1)\n\n\nIn the above example, the move request for the mailbox tom will be completed immediately without affecting other mailboxes in the batch.\n\nGetting details about BadItems\n\nPart of every migration are mailboxes with items that are either corrupt or cannot be imported to Exchange Online for some reason. Now if we don’t just increase the BadItemLimit counter but want more information about the corrupt items, we can get more information by using the -IncludeReport parameter with the Get-MigrationUser cmdlet:\n\n$Stats = Get-MigrationUserStatistics -Identity tom@ntsystems.it -IncludeReport \n$Stats.Report.BadItems\n\n\nRecipient Permissions\n\nThe *RecipientPermission cmdlets are used to manage SendAs permissions in Exchange Online. A nice goody of the Get-RecipientPermission cmdlet is the option to find permissions by assignee, i.e. by user to whom the permissions are granted. To get all entries that grant permissions to the user tom we use the -Trustee parameter like this:\n\nGet-RecipientPermission -Trustee tom\n\n\nLikewise, we can find all permissions by access right using the -AccessRights parameter. The following example gets all entries that grant SendAs permissions:\n\nGet-RecipientPermission -AccessRights SendAs\n\n\nShared Mailboxes\n\nStarting with the June 2018 quarterly updates (2013 CU21 and 2016 CU10), the management of shared mailboxes in hybrid scenarios got easier. A -Shared parameter got added to the *RemoteMailbox cmdlets, instead creating a shared mailbox on-prem and then moving it to Exchange Online, we can now use New-RemoteMailbox -Name Office -Shared.\n\nYou have already updated to CU21/CU10 but the Shared parameter is not available? Run .\\setup.exe /PrepareAD /IAcceptExchangeServerLicenseTerms\n\nMore Info: KB4133605\n\nTom"
        },
        {
          "id": "post-lost-found-no-tracking-on-ntsystems",
          "title": "lost & found: Updates and no more tracking on ntSystems.it",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "Jekyll, ntSystems",
          "url": "/post/lost-found-no-tracking-on-ntsystems/",
          "content": "I’ve recently updated the sources of the blog and moved to the gem-based version of the minima theme. This should make the site easier to maintain in the future.\n\n\n\nOn the old, blogengine-based site, we used Google Analytics to get some information about our readers.  Since the migration to GitHub pages and Jekyll, I’ve tried to remove external scripts and tracking as much as possible.\n\nThis is just a static website with some free (as in beer) content we’d like to share. We do no longer inject any tracking code and the few scripts we use are served directly from GitHub pages. But, until recently, there was one last exception to this: the comments. We’ve used Disqus comments for a long time now and I don’t really see a need to change that.\n\nHowever, as the comments iFrame is loaded from an external source (and may include tracking code), I’ve decided to stop automatically loading the iFrame and instead give you, the reader, an option to load it.\n\nFrom now on, you’ll see a “Show comments.” link at the bottom of each post and only after clicking the link, external content is loaded.\n\nWhat do you think? Leave a comment below ;)\n\nTom"
        },
        {
          "id": "post-azure-functions-building-a-telegram-bot-with-powershell-2",
          "title": "Azure Functions: Building a Telegram Bot with PowerShell 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Azure",
          "tags": "PowerShell, Cloud",
          "url": "/post/azure-functions-building-a-telegram-bot-with-powershell-2/",
          "content": "Welcome back to the second part of our little fun experiment with Telegram and Azure Functions. In the first part we created the function app and the bot, now let’s hook them up.\n\n\n\nConnecting the bot with the Azure Function\n\nWe can get updates from Telegram bots in two ways, there is a getUpdate method that can be polled periodically, or we can use Webhooks. Our HTTP trigger function in Azure will run whenever it receives a http request, so it is just perfect for the latter.\n\nTo configure our Azure Function as a destination for the bot’s webhook, we use the setWebhook method and pass a hashtable with an URL parameter:\n\nInvoke-RestMethod -Uri https://api.telegram.org/bot528059907:AAxxVs/setWebhook -Body @{\n    \"url\"=\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\"\n} -Method Post\n\n\nTo verify that the URL has been set correctly, we can call getWebhookInfo:\n\n[PS] C:\\&gt; Invoke-RestMethod https://api.telegram.org/bot528059907:AAxxVs/getWebhookInfo\n\n  ok result\n  -- ------\nTrue @{url=https://ntsystemsbot.azurewebsites.net/api/Listener?code=Waa...\n\n\nAt this point our function will get a http request every time someone writes to the Bot account. So now it’s time to do something with it.\n\nOverview\n\nFirst of all: I am sure there are a hundred ways this can be done better… What I am trying to accomplish with this simple example is a demonstration of Azure Functions and the different triggers, inputs, and outputs it provides. That said, here’s what I came up with:\n\nOur first function, the Listener, uses a HTTP trigger as input and Azure Queue Storage as output. This function will run, whenever a user sends a message to our bot and it will take the message and write it to a Storage Queue.\n\nAnother function, I called it UpdateData uses a timer trigger to get information from the blog and write it to Azure Blob Storage.\n\nThe third function, our Worker, uses Azure Queue Storage as trigger and Azure Blob Storage as input. The trigger is the same Queue that the Listener writes to, so a request coming from Telegram will be written to a Queue by the Listener function and trigger this Worker function.\n\nA last function, the Responder, finally sends a POST request to the Telegram bot. This function is triggered by the Worker’s output queue and uses no other inputs or outputs.\n\nTo summarize, the Storage Queues are connected like this:\n\n\n  Listener &gt; Worker &gt; Responder\n\n\nThe Functions\n\nThere are different ways to create or modify functions. The Azure console provides an easy-to-use GUI to configure triggers, inputs and outputs. It even has an editor for the functions’s code :) For the more advanced stuff, we can connect to the functions Kudu Services and upload files directly or use the debug consoles. Each function basically consists of a folder, the folder contains a function.json file which describes the function (type, trigger, input, output) and a run.ps1 file which contains the PowerShell code.\n\nThe Listener\n\nAs mentioned before, the first function just listens for a http request by the Telegram Bot and writes it to a storage queue.\n\nThe function.json file defines the trigger httpTrigger and the input/output variables. The following is the actual configuration file for my Listener function:\n\n{\n  \"bindings\": [\n    {\n      \"name\": \"req\",\n      \"type\": \"httpTrigger\",\n      \"direction\": \"in\",\n      \"webHookType\": \"genericJson\"\n    },\n    {\n      \"name\": \"res\",\n      \"type\": \"http\",\n      \"direction\": \"out\"\n    },\n    {\n      \"type\": \"queue\",\n      \"name\": \"outputQueueItem\",\n      \"queueName\": \"listenerqueue\",\n      \"connection\": \"AzureWebJobsDashboard\",\n      \"direction\": \"out\"\n    }\n  ],\n  \"disabled\": false\n}\n\n\nThe name defined in each object is made available as variable in the function’s code and contains a file path. That allows us to use Get-Content $req to get the HTTP request’s body. As well as Out-File $outputQueueItem and Out-File $res to write to the Storage Queue or respond to the HTTP request, respectively. How cool is that?!\n\nThe functions code, in the run.ps1 file is as simple as that:\n\n# POST method: $req\n$requestBody = Get-Content $req -Raw \n\n# Wirte input to Queue\nOut-File -FilePath $outputQueueItem -Encoding Ascii -inputObject $requestBody\n\n# Respond to the incoming web request\nOut-File -Encoding Ascii -FilePath $res -inputObject $true\n\n\nThe request body is made available through the $req variable, we read the variable and write it to the $outputQueueItem which represents the Storage Queue listenerqueue\\outputQueueItem in the AzureWebJobsDashboard storage account.\n\nWe do also respond to the incoming web request by writing to the $res variable.\n\nThe Worker\n\nThe next function is triggered by the same listenerqueue\\outputQueueItem we write to in the first function, so it will always run, after the first function finished. The content of the storage queue is made available through the $triggerInput variable:\n\n{\n  \"bindings\": [\n    {\n      \"name\": \"triggerInput\",\n      \"type\": \"queueTrigger\",\n      \"direction\": \"in\",\n      \"queueName\": \"listenerqueue\",\n      \"connection\": \"AzureWebJobsDashboard\"\n    },\n    {\n      \"type\": \"blob\",\n      \"name\": \"inPosts\",\n      \"path\": \"outcontainer/posts\",\n      \"connection\": \"AzureWebJobsStorage\",\n      \"direction\": \"in\"\n    },\n    {\n      \"type\": \"queue\",\n      \"name\": \"outputQueueItem\",\n      \"queueName\": \"workerqueue\",\n      \"connection\": \"AzureWebJobsDashboard\",\n      \"direction\": \"out\"\n    }\n  ],\n  \"disabled\": false\n}\n\n\nThis function does not send HTTP responses, so there is no need to define an HTTP output. The only output for the Worker is another storage queue.\n\nAs you’ve noted, we define another input for this function, namely outcontainer/posts, we’ll get to that later.\n\nThe PowerShell code in run.ps1 does the actual work, so it evaluates the input and decides what to do with it.\n\n\n# Read input from StorageQueue\n$requestBody = Get-Content $triggerInput -Raw | ConvertFrom-Json\n$posts = Get-Content $inPosts -Raw | ConvertFrom-Json | Select-Object -Expand items\n...\nOut-File -Encoding Ascii -FilePath $outputQueueItem -inputObject ($outObj | ConvertTo-Json)\n\n\nAgain, we simply read the input using Get-Content and write the output to the defined variable. I’ve omitted the actual code, to make this readable. You can find the code here: \n    \n        ntsystemsit/ntsystemsbot\n    \n\nThe Responder\n\nThe responder is finally triggered by the workerqueue\\outputQueueItem and sends an http request to the Telegram Bot API, thereby responding to the user. The configuration is basically the same as above, and you can find it in the GitHub repo.\n\nTo actually send a message to the Telegram Bot, I’ve created the following helper function. It uses Invoke-RestMethod to send a POST request to the /sendMessage API endpoint.\n\nfunction New-TelegramMessage {\n    [cmdletbinding()]\n    param(\n        $ChatId,\n        $Text,\n        $Mode = \"Markdown\",\n        $ReplyId,\n        $ReplyMarkup\n    )\n    $body = @{\n        \"parse_mode\" = $mode;\n        \"chat_id\"= $ChatId;\n        \"text\" = $Text;\n    }\n    if($ReplyId) {\n        $body.Add(\"reply_to_message_id\",$ReplyId)\n    }\n    if($ReplyMarkup) {\n        $body.Add(\"reply_markup\",(ConvertTo-Json $ReplyMarkup -Depth 5))\n    }\n    Invoke-RestMethod -Uri https://api.telegram.org/bot$env:TG_Token/sendMessage -Body $body -Method Post\n}\n\n\n\n  Note: The URL must contain the Bot’s API key. As I wanted to publish the code, I’ve stored the key in the function’s application settings. These settings are available as environment variables in the code, so I can access the key thorough: $env:TG_Token.\n\n\nUpdate Data\n\nThe last piece we need for our little example is the UpdateData function. This one uses a timer trigger and just gets all posts of our blog and stores them in an Azure Storage Blob.\n\nThe function definition contains the schedule and the Storage Blob we want to write to:\n\n{\n  \"bindings\": [\n    {\n      \"name\": \"myTimer\",\n      \"type\": \"timerTrigger\",\n      \"direction\": \"in\",\n      \"schedule\": \"0 0 1 * * *\"\n    },\n    {\n      \"type\": \"blob\",\n      \"name\": \"outPosts\",\n      \"path\": \"outcontainer/posts\",\n      \"connection\": \"AzureWebJobsStorage\",\n      \"direction\": \"out\"\n    }\n  ],\n  \"disabled\": false\n}\n\nThe schedule is in a cron-type format, so this function will run at 01:00 hours every day.\n\nAgain, the PowerShell code is simple enough:\n\n(Invoke-WebRequest https://ntsystems.it/api/v1/posts/ -UseBasicParsing).content | Out-File -Encoding ascii -FilePath $outPosts\n\n\nThe Bot in action\n\nOk, so with all of our code in place, we should now be able to communicate with our Bot using the Telegram messenger. Just search for the ntsystemsbot account and try it out :)\n\n\n\nThis turned out to be a long story and there is so much left to explore. I hope the first two posts of this little series helped you understand the basics of Azure Functions, if someone finds a more practical use case a PowerShell-based Chatbot, I’d like to hear about it :)\n\nThanks for reading!\n\nTom\n\nMore Information:\n\n\n  Telegram Bot Api\n  Azure Functions Webhooks"
        },
        {
          "id": "post-azure-functions-building-a-telegram-bot-with-powershell-1",
          "title": "Azure Functions: Building a Telegram Bot with PowerShell 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Azure",
          "tags": "PowerShell, Cloud",
          "url": "/post/azure-functions-building-a-telegram-bot-with-powershell-1/",
          "content": "Today I’ve got a fun one, we’re going to use Azure Functions to build a Telegram Bot with PowerShell. Sounds interesting? Well here we go. Before diving into the technical details, lets have a quick overview of what we’re trying to do.\n\n\n\nA Telegram Bot is an application that runs inside Telegram; users can interact with a Bot by sending them messages (or commands). The bot’s administrator controls the bot through a https-based API.\n\nAzure Functions is a serverless platform that lets us run pieces of code (functions) without worrying about the infrastructure. It’s called serverless because we just deploy code, no need to install virtual machines or applications. Azure functions support different programming languages, one of them is PowerShell. It’s still in experimental state, but it works just fine for what we’re going to do.\n\nSo yes, we’re going to hook up our bot with a function app running PowerShell code in Azure.\n\nAzure Functions\n\nIn order to deploy our Azure Function, we have to login to the Azure Portal and create a new resource. Select the “Serverless Function App” which is currently listed in the Popular section of the marketplace, if it doesn’t show up, search for “Function App” and click Create.\n\n\n\nWe’ll have to give a name to our app and select a storage account and location for the deployment. Once the deployment is finished, we can find the application through the All resources button on the left side in the Azure portal. Click the function app and add a new function. As noted before, PowerShell support is still experimental, so we have to create a new custom function, enabling the “Experimental Language Support”.\n\n\n\nFunctions can have different triggers as well as various inputs and outputs. For our example, we’ll go with the “HTTP trigger” function. This function will run whenever it receives a HTTP request. Set the Language to PowerShell and the Authorization level to Function.\n\n\n\nThe function is created with some basic code to get started, I’ve changed it a bit so that it will just return the object we pass to it.\n\n# POST method: $req\n$requestBody = Get-Content $req -Raw | ConvertFrom-Json\n# Response: $res\nOut-File -Encoding Ascii -FilePath $res -inputObject ($requestBody | ConvertTo-Json)\n\n\nPlease make note of the function URL, right there next to the Run button. Remember that we selected an Authorization level of Function when creating the function, so we need to use a key when calling the function. This makes sure, that only our bot can call the function.\n\n\n\nTo test the function, we can use Invoke-RestMethod to send a POST request:\n\n[PS] C:\\&gt; Invoke-RestMethod -Uri \"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\" -Body '{\"Name\": \"Tom\"}' -Method Post\n\nName\n----\nTom\n\n\nOk, so now that we’ve got a working function, let’s go ahead and create the bot.\n\nTelegram Bot\n\nTo create a Telegram bot, well, we use a bot. Look up the @BotFather account and follow the instructions.\n\n\n\nFor this basic example, it was enough to specify a name and account name:\n\n\n\nThe BotFather will guide you through the process and, at the end, give you access token for the http API. To edit the bot after the fact, just use the /myBots command. To test the access token and verify the bot has been created, we can call the following URL:\nhttps://api.telegram.org/bot&lt;AccessToken&gt;/getMe\n\n\nReplace &lt;AccessToken&gt; with the actual token, just like that:\n\n[PS] C:\\&gt; Invoke-RestMethod -Uri \"https://api.telegram.org/bot528059907:AAxxVs/getMe\"\n\n  ok result\n  -- ------\nTrue @{id=550258749; is_bot=True; first_name=ntSystems.it; username=ntsystemsbot}\n\n\nOk, now we should have a working Azure function app and a barebones Telegram bot. Continue to part two for the next steps."
        },
        {
          "id": "post-lost-found-onion-service-cloudflare-dns",
          "title": "lost & found: ntSystems Onion Service, Cloudflare DNS",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "PowerShell",
          "url": "/post/lost-found-onion-service-cloudflare-dns/",
          "content": "It’s Friday and here’s another edition of lost &amp; found.\n\n\n\nWe’re on tor\n\nOur few twitter followers may already know it, for the rest of you here’s the news: Our little website is now also available as an Onion Service. Check it out at: ntsystcp…id.onion\n\nI’ve made some changes to the site in order to improve our readers privacy. Basically trying to serve all content directly and, for the Onion version, there are no Disqus comments as that requires external content and automatically loads some tracking scripts.\n\nCloudflare launches 1.1.1.1\n\nWe have been using Cloudflare to enable TLS and IPv6 (and more) for quite some time now. They launched a consumer DNS service on the first day of April. No, it was no joke. The Service is available at 1.1.1.1 and 1.0.0.1 and, interestingly, supports DNS over HTTPS.\n\nI have not been aware of DoH until now, and even though there don’t seem to be any existing client implementations, it enables some nice use cases. We can now use PowerShell’s Invoke-RestMethod to make DNS queries :)\n\nHere’s a quick function that does it:\n\nfunction Resolve-HttpsDns {\n    param(\n        [Parameter(Mandatory=$true)]\n        [string]\n        $Name,\n        [string]\n        $Type = \"A\",\n        [ipaddress]\n        $Server = \"1.1.1.1\"\n    )\n    $uri = -join(\"https://\",$Server,\"/dns-query\")\n    Invoke-RestMethod -Uri $uri -Body @{\n        ct = \"application/dns-json\"\n        name = $Name\n        type = $Type.toUpper()\n    } | Select-Object -ExpandProperty Answer\n}\n\n\nAnd there is a much more advanced module on GitHub and the PowerShell Gallery.\n\nSun’s out, so let’s have a cold one. Nice weekend!\n\nTom"
        },
        {
          "id": "post-skype-for-business-hybrid-observations",
          "title": "Skype for Business Hybrid Observations",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Office365, Lync, Skype4B, Hybrid, Exchange",
          "url": "/post/skype-for-business-hybrid-observations/",
          "content": "A collection of information about Skype for Business in hybrid environments.\n\n\n\nHosting Provider\n\nExchange Online Hosted VoiceMail\n\nNew-CsHostingProvider -Identity 'ExchangeOnline' -Enabled:1 -EnabledSharedAddressSpace:1 -HostsOCSUsers:0 -ProxyFqdn \"exap.um.outlook.com\" -IsLocal:0 -VerificationLevel UseSourceVerification\n\n\nSkype for Business Online\n\nNew-CsHostingProvider -Identity \"SkypeforBusinessOnline\" –Enabled:1 -ProxyFQDN \"sipfed.online.lync.com\" – EnabledSharedAddressSpace:1 -VerificationLevel UseSourceVerification – HostsOCSUsers:1 -AutodiscoverUrl 'https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root'\n\n\n\n  Note: Make sure the Edge Servers can lookup the _sipfederationtls records for your domains. The targets must be the Edge Server’s external interface.\n\n\nPush Notification\n\nFor the push notification service to work, make sure the Skype for Business Online hosting provider has been configured and add push.lync.com to the allowed domains. Then enable the Push Notification Configuration:\n\nNew-CsAllowedDomain -Identity \"push.lync.com\"\nSet-CsPushNotificationConfiguration -EnableMicrosoftPushNotificationService $True – EnableApplePushNotificationService $True\n\n\nExchange Online Integration\n\n# SFB Online PowerShell: Get Tenant Guid\n(Get-CsTenant).TenantId.Guid\n\n# SFB On-Premises PowerShell: OAuth Configuration\nNew-CsOAuthServer microsoft.sts -MetadataUrl \"https://accounts.accesscontrol.windows.net/&lt;GUID from above&gt;/metadata/json/1\"\nNew-CsPartnerApplication -Identity microsoft.exchange -ApplicationIdentifier 00000002-0000-0ff1-ce00-000000000000 -ApplicationTrustLevel Full -UseOAuthServer\nSet-CsOAuthConfiguration -ServiceName 00000004-0000-0ff1-ce00-000000000000\n# SFB On-Premises PowerShell: Export SfB OAuth Certificate (on Front End Server)\n$thumbprint = (Get-CsCertificate -Type OAuthTokenIssuer).Thumbprint\nExport-Certificate -Cert Cert:\\localMachine\\my\\$Thumbprint -FilePath C:\\oAuth.cer\n# SFB On-Premises PowerShell: Point Autodiscover to EXO\nSet-CsOAuthConfiguration -ExchangeAutodiscoverUrl \"https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc\"\n\n# MSOnline PowerShell: Publish OAuth Cert and Add Service Principal Name\n$certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate\n$certificate.Import(\"C:\\oAuth.cer\")\n$binaryValue = $certificate.GetRawCertData()\n$credentialsValue = [System.Convert]::ToBase64String($binaryValue)\nNew-MsolServicePrincipalCredential -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000 -Type Asymmetric -Usage Verify -Value $credentialsValue\n# Add Service Principal Name (sfb pool web services)\n$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000\n$MsolSP.ServicePrincipalNames.Add(\"00000004-0000-0ff1-ce00-000000000000/sfbwebext.uclab.eu\")\n$MsolSP | Set-MsolServicePrincipal\n\n\nThe Service Principal Names can alternatively be set using the *-AzureRmADServicePrincipal cmdlets from the AzureRM module.\n\nOnce the configuration is complete, we can test Exchange Storage connectivity with the following command:\n\nTest-CsExStorageConnectivity -SipUri \"sip:tom@uclab.eu\" -Verbose\n\n\n\n  Note: The Front End Servers must be able to communicate with Exchange Online (directly or via proxy), otherwise the “Add Skype meeting” button will not be visible in Exchange Online OWA. This is also required for Modern Hybrid Authentication.\n\n\nTo troubleshoot the Exchange Online Integration, run an UCWA (Web Infrastructure) trace on the Front End Servers. You should see incoming requests from Exchange Online and the corresponding responses from the Front End.\n\n# Request: \nStart-Line: POST /ucwa/oauth/v1/applications\nStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/defaultValues\nStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/customInvitation\nStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/phoneDialInInformation\n...\nUser-Agent: Exchange/15.20.588.14/OnlineMeeting\nContent-Type: application/vnd.microsoft.com.ucwa+json\nAccept: application/vnd.microsoft.com.ucwa+json\nX-ExCompId: OnlineMeeting\n\n# Response:\nStart-Line: 200 OK\nContent-Type: application/vnd.microsoft.com.ucwa+json; charset=utf-8\n{\"accessLevel\": \"Everyone\",\"entryExitAnnouncement\":\"Enabled\",\"attendees\":[],\"automaticLeaderAssignment\":\"SameEnterprise\",\"description\":\"\",\"leaders\":[],\"onlineMeetingId\":\"RMANN9FF\",\"onlineMeetingUri\":\"sip:tom@uclab.eu;gruu;opaque=app:conf:focus:id:RMANN9FF\",\"onlineMeetingRel\":\"myOnlineMeetings\",\"organizerUri\":\"sip:tom@uclab.eu\",\"conferenceId\":\"257150\",\"phoneUserAdmission\":\"Enabled\",\"lobbyBypassForPhoneUsers\":\"Disabled\",\"subject\":\"\",\"joinUrl\":\"https://meet.uclab.eu/tom/RMANN9FF\",\"2c04865e-a621-4a4d-81e0-8047131f87d8\":\"please pass this in a PUT request\",\"_links\":{\"self\":{\"href\":\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF\"},\"onlineMeetingExtensions\":{\"href\":\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF/extensions\"}},\"rel\":\"myOnlineMeeting\",\"etag\":\"3055269905\"}\n...\n\n\nModern Authentication\n\nTo use modern authentication with Skype for Business, the ADFS Server has to be prepared using the sfbadalscripts. More information about how to use the scripts can be found here. The script has to be run on the ADFS server, be sure to include all internal and external URLs of the Skype deployment in the PoolIds parameter.\n\n.\\Setup-Adfs2016OAuthTrustForSfB.ps1 -PoolIds 'https://sfbwebext.uclab.eu/','https://sfbwebint.uclab.eu/'\n\n\nWhen the ADFS Server has been prepared, the following commands can be used to enable modern authentication.\n\n\n  Note: This can only be configured globally, double-check the prerequisites and, even though existing sessions will not be re-authenticated, schedule a maintenance window.\n\n\n# Create new OAuth Server\nNew-CsOAuthServer -Identity uclabFS -Type ADFS -MetadataURL \"https://fs.uclab.eu/FederationMetadata/2007-06/FederationMetadata.xml\"\n# Require Authorization using ADFS\nSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity uclabFS\n\n\nAfter that just wait for the management store replication to publish the change and test it with a client or the Test-CsRegistration cmdlet.\n\n\n  To roll back the change simply set the ClientAuthorizationOAuthServerIdentity parameter to $null.\n\n\nHybrid Modern Authentication\n\nFor hybrid authentication to work, we need to add more SPNs to the MSOL Service Principal. Add all internal and external Web Services URLs of the Skype deployment to the list:\n\n# MSOnline PowerShell\n$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000\n$MsolSP.ServicePrincipalNames.Add(\"https://sfbwebext.uclab.eu\")\n$MsolSP.ServicePrincipalNames.Add(\"https://sfbwebint.uclab.eu\")\n$MsolSP | Set-MsolServicePrincipal\n\n\nThen, add the evoSTS (Azure AD Federation Service) to the Skype for Business OAuth configuration and enable it using:\n\n# Create new OAuth Server\nNew-CsOAuthServer -Name evoSTS -IssuerIdentifier sts.windows.net -MetadataUrl \"https://login.windows.net/common/FederationMetadata/2007-06/FederationMetadata.xml\" -Type AzureAd -AcceptSecurityIdentifierInformation $True\n# Require Authorization using Azure AD\nSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity evoSTS\n\n\nOn the client, make sure to set AllowAdalForNonLyncIndependentOfLync and Enable Modern Authentication if required.\n\n$a = New-CsClientPolicyEntry -name AllowAdalForNonLyncIndependentOfLync -value \"True\"\nSet-CsClientPolicy -Identity Global -PolicyEntry @{Add=$a} \n\n\nHKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Office\\1x.0\\Lync\n\"AllowAdalForNonLyncIndependentOfLync\"=dword:00000001\n\n\nHybrid Voice\n\nIf we move enterprise voice users to the cloud they can still use our on-perm PSTN connectivity to make and receive calls. For that to happen, we need Skype for Business Edge Servers and the edge’s next-hop pool must also be running Skype. Then we configure a PSTN Usage for the online users as well as an Online Voice Routing policy. In it’s most basic form we need the following:\n\n# SFB Online PowerShell: Create the PSTN Usage\nSet-CsOnlinePstnUsage  -Identity Global -Usage @{Add=\"Unrestricted\"}\n\n# Create and assign the Voice Routing policy\nNew-CsOnlineVoiceRoutingPolicy OnlineVRP -OnlinePstnUsages Unrestricted\nGrant-CsOnlineVoiceRoutingPolicy -Identity tom@uclab.eu -PolicyName OnlineVRP\n\n\nTo move a user from on-premises to Skype for Business Online, use the following:\n\nMove-CsUser -Identity tom@uclab.eu -Target sipfed.online.lync.com -Credential (Get-Credential)\n\n\nTo move a user from Skype for Business Online to on-premises, use the following:\n\nMove-CsUser -Identity tom@uclab.eu -Target sfb01.uclab.eu -Credential (Get-Credential) -HostedMigrationOverrideUrl https://admin1e.online.lync.com/HostedMigration/hostedmigrationService.svc\n\n\nThe host part of the HostedMigrationOverrideUrl parameter can change based on where your tenant is hosted. To determine the host part, open the legacy Skype for Business admin center and copy the URL. It should look something like this: https://webdir1e.online.lync.com/LSCP\n\nThen replace webdir with admin and LSCP with HostedMigration/hostedmigrationService.svc. You think I am making this up, right? Read more here.\n\nSkype for Business Online users must be assigned an E5 license or have PSTN calling added to their E1/E3 plans to be able to make and receive calls.\n\nTo be continued ;)\n\nTom"
        },
        {
          "id": "post-aad-connect-failed-to-load-configuration-information",
          "title": "Azure AD Connect: Failed to load configuration information",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Cloud, Azure, Office365",
          "url": "/post/aad-connect-failed-to-load-configuration-information/",
          "content": "When upgrading Azure AD Connect (ADSync), the wizard fails with the error: “Failed to load configuration information from primary ADFS server”.\n\n\n\nProblem\n\nThis can happen if the federation service was moved to a different machine after installing Azure AD Connect. Subsequent updates to the synchronization service fail with the above error message. This is because AD Connect stores the name of the original ADFS server in the PersistedState XML file.\n\nThe fils is located at: C:\\ProgramData\\AADConnect\\PersistedState.xml\n\nThe ADFS servername is stored in the IAdfsContext.TargetAdfsServers property, oh and it’s Base64 encoded. PowerShell can be used to easily read the file:\n\n[xml]$xml = Get-Content \"C:\\ProgramData\\AADConnect\\PersistedState.xml\"\n$xml.PersistedStateContainer.Elements.PersistedStateElement\n\n\nSolution\n\nSimply update the value of the IAdfsContext.TargetAdfsServers with the servername of the new ADFS machine, as the servername has to be Base64 encoded, the following PowerShell code can be used to convert a string:\n\n$name = \"adfs01.example.com\"\n[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($name))\n\n\nCheers,\n\nTom"
        },
        {
          "id": "post-tunneling-ssh-through-tor",
          "title": "Tunneling SSH through Tor",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Privacy",
          "tags": "WSL, Cloud",
          "url": "/post/tunneling-ssh-through-tor/",
          "content": "I’ve been using Onion Services aka. Hidden Services to connect to remote machines for some time now. Tor clients can connect to such services through the Tor network, there is no need to know the IP address of the destination machine, likewise there is no need to configure inbound port mappings or firewall rules.\n\n\n\nDestination (running the Onion Service)\n\nOn the destination machine, we need to install Tor. For best results follow the instructions here.\n\nOnce installed, we configure the hidden service in the /etc/tor/torrc configuration file. Find the section dedicated to hidden services in the file and create a new service or uncomment on of the examples.\n\nHiddenServiceDir /var/lib/tor/my_hidden_service/\nHiddenServicePort 80 127.0.0.1:80\nHiddenServicePort 2244 127.0.0.1:22\n\n\nThe above example, creates a service with the name of my_hidden_service which will listen on port 80 and provide whatever runs on 127.0.0.1:80 over the Tor network. It will also listen on port 2244 and provide ssh (which runs on 127.0.0.1:22) as a hidden service.\n\nSecuring SSH\n\nAs you are essentially making your sshd accessible to the whole Tor network, it might be a good idea to disallow password authentication and root access. To do that, make sure your /etc/ssh/sshd_config contains the following lines:\n\nPasswordAuthentication no\nPermitRootLogin prohibit-password\n\n\nHostname and Keys\n\nAfter configuring the Onion Service, restart the Tor service: sudo service tor restart. After it has started, the hidden service directory (as configured in HiddenServiceDir) will have been created and we can find two files in the directory. The hostname file contains the hostname that we need on the client side in order to connect to the service.\n\nsudo cat /var/lib/tor/my_hidden_service/hostname\nxxxxxxx.onion\n\n\nClient (accessing the Onion Service)\n\nTo connect to the first hidden service, a website running on port 80, we can simply use Tor Browser and open the hostname we found in the hidden service directory above. To connect via SSH, there are multiple options but first, we do also need to install Tor. Again for best results follow the official instructions.\n\nOn WSL I was able to install it by simply using sudo apt-get install tor. We will also need the nc tool from the netcat-openbsd package, if it is not available on your system, install it using: sudo apt-get install netcat-openbsd.\n\nOnce installed, start tor by typing tor --runasdaemon 1.\n\ntorify\n\nTorify comes with the installation of the Tor package on the client and is a simple wrapper that tries to connect a given application through Tor.\n\ntorify ssh tom@xxxxxxx.onion 2244\n\n\nThe above example connects ssh to the .onion address on port 2244. On my system, torify throws a few errors but finally works well enough.\n\n.ssh/config\n\nAnother option is to add the destination hostname to the ssh config file of the client. This can typically be found in the users profile directory at .ssh/config.\n\nSimply add a line for each destination you want to connect to. The ProxyCommand uses the nc tool, to tunnel the connection through 127.0.0.1:9050 which is the clients Tor endpoint.\n\nHost t01\n HostName xxxxxxxx.onion\n port 2244\n ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %p\n\n\nPlease note, on Mac OS I had to use ncat instead of nc, so the ProxyCommand looks like:\n\n   proxyCommand ncat --proxy rhel01:9050 --proxy-type socks5 %h %p\n\n\n\n  A final note on privacy: This guide is meant to help connect to remote systems behind NAT routers or firewalls with and changing public IPs. Think connect to your home network from work. It is not meant to provide the best possible privacy. For that, please refer to the official documentation.\n\n\nHave fun!\n\nTom"
        },
        {
          "id": "post-testing-coinhive",
          "title": "Testing CoinHive",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "ntSystems",
          "tags": "ntSystems, Crypto",
          "url": "/post/testing-coinhive/",
          "content": "I’ve recently stumbled upon coinhive and with all the recent fuzz about crypto currencies, I decided to have a look at it. So what’s that all about?\n\n\n\ncoinhive: A JavaScript Monero Miner\n\nMany crypto currencies rely on a https://en.wikipedia.org/wiki/Proof-of-work_system algorithm in order to verify transactions. There are quite a few different algorithms out there, some of them more difficult than others. Bitcoin for example uses hashcash which, at current difficulty levels, can only be feasibly generated on specialized hardware (ASIC).\n\nAnother one of those PoW algorithms is CryptoNight which has been designed to be ASIC resistant and can feasibly be generated on modern CPUs and GPUs. Monero, a private and censorship-resistant digital currency, happens to use the CryptoNight algorithm, which means it can be mined efficiency on consumer devices.\n\nThat’s what the coinhive miner does. It essentially runs a JavaScript application in the users web browser and uses the devices CPU to mine Monero. The mined Monero will then be payed out to a wallet we own.\n\nntSystems\n\nNow as this website is a side-project and does not make us any money at all (and we don’t like Ads), we decided to test drive coinhive for a week.\n\n\n  Starting today, by visiting our side your device will be used to mine Monero and, by doing so, help us maintain the site and deliver more awesome content.\n\n\nAfter the first week’s trial we will publish the stats and discuss the ethics behind “abusing” our visitors spare CPU cycles.\n\nThe following code has been added to the site’s footer in order to start the miner:\n\n/edit: removed code\n\n\nUpdate\n\nAfter one week of testing here are the results of this little experiment. This site has between 300 and 600 active users on a given day, not a lot but it’s something. So with the above code, we are using up to 90% of the visitors CPU cycles to generate Monero using coinhive’s JavaScript miner.\n\nThis resulted to be about 468 hashes per second totalling about 173.82 million hashes in a week. According to monerobenchmarks.info, these figures can be compared to what a not-very-modern GPU with 4GB of memory would produce.\n\nThe final balance after the weeks test is 0.02582 xmr, worth about 2€ at the time of this writing.\n\n\n\nAnother Update\n\nSoon after the last update, ad-blockers started blocking the download of the javascript and the hashrate dropped quite a bit. I’ve since decided to remove the code and stop (ab)using our visitors CPUs.\n\nThanks!\nTom"
        },
        {
          "id": "post-the-invisible-internet-project-and-wsl",
          "title": "The Invisible Internet Project and WSL",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Privacy",
          "tags": "PowerShell, WSL, Cloud",
          "url": "/post/the-invisible-internet-project-and-wsl/",
          "content": "The Windows Subsystem for Linux can be used to run quite a few interesting things on Windows, one of them is the Invisible Internet Project or i2p.\n\n\n\nInstall i2p\n\nFirst of all we’ll have to install i2p on our system. Before starting the installation, we have to add the required repository:\n\nsudo apt-add-repository ppa:i2p-maintainers/i2p\nsudo apt-get update\nsudo apt-get install i2p\n\n\nAfter the installation we can start the i2prouter with the following command:\n\ni2prouter start\n\n\nAs soon as the service  is running, we can access the homepage using http://127.0.0.1:7657/home likewise the configuration page is available at http://127.0.0.1:7657/config\n\nConfigure Proxy\n\nFor testing, we don’t have to change anything in the home or configuration pages and we can just point our systems proxy configuration to i2p. The i2prouter listens on ports 4444 and 4445 for http and https traffic, respectively.\n\n\n\nNow you will soon notice that pointing your system’s proxy to i2p will allow you to browse .i2p sites but the “clear” intertnet will no longer work very well.\n\nUnlike tor, i2p is not intended to be used as proxy to the internet, but it’s purpose is to enable secret communication to resources inside the i2p network. Therefore it does not make a lot of sense to route all internet traffic trough i2p, it’s enough if we use the i2prouter to access *.i2p domains.\n\nInstall Privoxy\n\nTo get that done, i.e. routing only requests to .i2p domains to the i2prouter, we’ll need another small proxy that is capable of routing requests based on pattern. Let’s install privoxy:\n\nsudo apt-get install privoxy\n\n\nAfter installing privoxy, we’ll have to configure it so that it routes requests to *.i2p domains to i2prouter which runs at localhost:4444:\n\nUse your favorite editor to update the config file at /etc/privoxy/config and add the following line:\n\nforward .i2p localhost:4444\n\n\nNow restart privoxy sudo /etc/init.d/privoxy restart and set the systems proxy configuration to 127.0.0.1:8118.\n\nSetting the proxy with PowerShell and PAC\n\nConstantly changing the proxy configuration does not work really well, I forget that I’ve set the proxy and if privoxy is not running, I have to disable the proxy in order to access the internet. In the first iteration, I wrote two quick and dirty PowerShell functions to enable/disable the proxy settings:\n\nFunction Disable-Proxy {\n    $reg=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\"\n    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 0\n    Set-ItemProperty -Path $reg -Name ProxyServer -Value \"\"\n}\nFunction Enable-Proxy {\n    param($proxyServer = \"localhost:8118\")\n    $reg=\"HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\"\n    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 1\n    Set-ItemProperty -Path $reg -Name ProxyServer -Value $proxyServer\n}\n\n\nI put these in my $PROFILE and used them for a few days. It was ok, but there had to be a better solution… So I started to look into PAC or “Proxy auto-config” which is a configuration file that defines how web browsers can automatically choose the appropriate proxy server. Read more on Wikipedia\n\nLong story short, I ended up using the following configuration file:\n\nfunction FindProxyForURL(url, host) {\n        // .onion URLs need a proxy:\n        if (shExpMatch(host, \"*.onion\"))\n        {\n                return \"PROXY localhost:8118\";\n        }\n\n        // other requests go directly\n        return \"DIRECT\";\n}\n\n\nSave the function above to a text file called proxy (without extension) and put it in C:\\Windows\\system32\\drivers\\etc\\ and set the systems AutoConfigUrl to: file://C:/Windows/system32/drivers/etc/proxy\n\nEnjoy\nTom"
        },
        {
          "id": "post-powershell-and-variable-references",
          "title": "PowerShell and Variable References",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell",
          "url": "/post/powershell-and-variable-references/",
          "content": "I’ve come across an interesting behavior (or feature) of PowerShell the other day. As I don’t really understand what’s going on, I decided to write it up, maybe someone out there can help explaining this.\n\n\n\nExpected\n\nI’m writing a script that contains multiple functions and objects get passed from one function to another. As it happens the functions modify the objects that are passed in and output the modified information. So far so good, but what I found is, that the original object gets updated. So in the end I don’t need the function to output anything and can just carry on using the passed-in object.\n\nConfused? Well I am, so let’s try it with an example:\n\n$var = 1\nfunction Update-Value ([int]$InputObject) {\n    $InputObject++\n    Write-Output $InputObject\n}\n\n\nIn the above example we define a variable with a value of 1 and a simple function that increases the value by 1 and outputs the increased value. That works as I would have expected, if we run the code, the output is:\n\nC:\\&gt; Update-Value $var\n2\nC:\\&gt; $var\n1\n\n\nUnexpected\n\nNow if we do the same exercise with an object instead of a simple integer, the outcome is not exactly as I would have expected it to be. Here goes another example:\n\n$obj = New-Object -TypeName psobject -Property ([ordered]@{ a=1; b=2; c=3; })\nfunction Update-Value ([psobject]$InputObject) {\n    $InputObject.a++\n    Write-Output $InputObject\n}\n\n\nThe idea is basically the same as above, the variable in this case contains a custom object with three properties: a, b, c. The function is still increasing the value on the input object, only that now we access the “a” property and increase it’s value.\n\nThe output is as follows:\n\nC:\\&gt; Update-Value $obj\na b c\n- - -\n2 2 3\n\nC:\\&gt; $obj\na b c\n- - -\n2 2 3\n\n\nNow apparently the variable $obj gets updated as well. While in the first example, the integer in $var did not change, i.e. after running the function it was still 1, the value of $obj.a does change when I run the function.\n\nIn my script I just decided to change the function so that it does no longer output the modified object and instead, I just call the function and carry on with my original variable. I do think the variable referencing in memory might be different when using a single integer vs. an object. It works for now, but as stated above, I don’t understand why and that worries me to some degree…\n\nThanks to anyone who cares to comment and offer an explanation!\n\nTom\n\nUpdate\n\nAfter posting this to /r/PowerShell someone referred me to this thread which explains the behavior quite well.\n\nThe variable $InputObject in my case does not contain the object but is just a pointer to $obj, which is therefore updated directly."
        },
        {
          "id": "post-jekyll-on-wsl",
          "title": "Jekyll on WSL",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "ntSystems",
          "tags": "Jekyll, WSL, ntSystems",
          "url": "/post/jekyll-on-wsl/",
          "content": "Today we are looking at running Jekyll on WSL or Bash on Ubuntu on Windows.\n\n\n\nInstall WSL\n\nFirst of all we’ll have to make sure our system fulfills the prerequisites to run the “Windows Subsystem for Linux”. We need a 64-bit version of the Windows 10 Anniversary (build 14939) or newer for that. Then we’ll have to enable the “Developer mode” using “Settings”, “Update &amp; Security” and finally “For Developers”.\n\nOnce the above prerequisites are met, we can go ahead and enable the WSL using the control panel or the following command in an elevated PowerShell session:\n\nEnable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux\n\n\nAnd finally we can type bash into an administrative command prompt to download and install bash.\n\nA detailed installation guide is available on MSDN\n\nInstall Jekyll\n\nAfter setting up Bash on Ubuntu on Windows we can now install the required packages for Jekyll using the following commands.\n\nsudo apt-add-repository ppa:brightbox/ruby-ng\nsudo apt-get -y update\nsudo apt-get install git build-essential libcurl4-openssl-dev zlib1g-dev\nsudo apt-get install ruby2.4 ruby2.4-dev\n\n\nAfter installing ruby verify the the installed version using ruby -v. Jekyll requires a version greater that 2.\n\nNow let’s install nodejs and finally Jekyll:\n\ncurl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -\nsudo apt-get install -y nodejs\nsudo gem install jekyll bundler\n\n\nServe\n\nNow that the prerequisites are installed, we can go ahead and build our static website. To get started with Jekyll, head over to the official documentation page. In my case, I just want to serve up a local copy of this great blog, so I clone the git repository and build the site locally using:\n\ngit clone https://github.com/ntsystemsit/ntsystemsit.github.io\ncd ntsystemsit.github.io/\nbundle install\nbundle exec jekyll serve -d /tmp/ntsystems\n\n\nNote: There seems to be a bug related with WSL. I have to use the --force-polling switch with the serve command on Windows 10 1607, on 1703 it works without that switch. Check the  following issue on GitHub.\n\nWell, what can I say? I really like the possibility to natively run Linux packages on Windows 10. Even though it doesn’t make the Linux part less complicated, at least I don’t need a VM anymore :)\n\nSo long,\n\nTom"
        },
        {
          "id": "post-keeping-track-of-powershellcore-releases-on-github",
          "title": "Keeping track of PowerShellCore releases on GitHub",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, GitHub",
          "url": "/post/keeping-track-of-powershellcore-releases-on-github/",
          "content": "I’ve been using PowerShell Core on my MacBook for a while now. As the code is still in its early stages, there’s no way of managing/updating the software one is running, at least none that I would be aware of. I did miss some updates and, as a result, had problems with Visual Studio Code. So I’ve put together a quick function that checks the latest release on GitHub and can conveniently be put into my $PROFILE.\n\n\n\nGitHub Releases feed\n\nPowerShell Core was open-sourced some time ago and the team behind it is using GitHub to manage the code. The latest version for all the supported operating systems can be found in the PowerShell repository. Every so often, a new release is published to the Releases feature of GitHub and it happens that GitHub does provide an atom feed for releases. This feed can be accessed by simply appending “.atom” to the URL.\n\nGet-PSVersionGitHub\n\nArmed with this information, I wrote the following simple function. It just gets the latest release from the repository’s atom feed and adds the information to a hash table, which is then output as a custom object:\n\n\n\nNow I just put the function into my $PROFILE and make it run every time PowerShell starts.\n\nEasy enough, right?\n\nTom"
        },
        {
          "id": "post-jekyll-fun-consuming-ntsystems-with-powershell",
          "title": "Jekyll Fun: Consuming ntSystems with PowerShell",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "ntSystems",
          "tags": "Jekyll, ntSystems",
          "url": "/post/jekyll-fun-consuming-ntsystems-with-powershell/",
          "content": "As you might have read before, our little blog is powered by Jekyll. Well I stumbled over the jsonify filter the other day, and so I built a little “kind-of” API :) Sound interesting? Read on.\n\n\n\nHow\n\nIt all started with search, I was looking for a search feature for our blog. After some testing with Algolia I stumbled over this great post by Katy. She’s using lunr.js with Jekyll. I liked the client-side approach of lunr.js and that it has no external dependencies, so I adopted Katy’s implementation for our site and, voilà, we have search. So, why do I keep talking about search? Well lunr.js consumes data in as json objects, so that’s how I learned about the jsonify filter.\n\nAfter some playing around with curly braces and the forloop in liquid I ended up creating the first version of our so-called API.\n\nBasically, what I’m doing is looping through the posts and creating json objects.\n\n\n\nI created a few different folders to expose different information, but more about that in the examples below.\n\nUse Invoke-RestMethod to consume the json\n\nThere are various “endpoints” available, we can get meta information about the site at /meta/ or a list of all pages and posts at /pages/and /posts/, respectively.\n\nIn the following example, we’re getting all posts with a Category of ntSystems and then just select the tags property:\n\nPS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | \nSelect-Object -ExpandProperty items | \nWhere-Object category -eq ntSystems | \nSelect-Object tags\n\ntags\n----\n{migrate, jekyll}\n{migrate, jekyll}\n{update, jekyll}\n\n\n\nAlternatively, we can get list of all categories, just like that:\n\nPS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | \nSelect-Object -ExpandProperty items | \nSelect-Object Category -Unique\n\ncategory\n--------\nCloud\nAzure\nDev\n...\n\n\n\nAwesome, right?\n\nWell, that’s all for today. Enjoy your weekend!\n\nTom"
        },
        {
          "id": "post-my-takeaways-from-ms-techsummit",
          "title": "My takeaways from MS Tech Summit",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Cloud",
          "url": "/post/my-takeaways-from-ms-techsummit/",
          "content": "Daniel and I have attended the Microsoft Tech Summit in Milan earlier this week. Overall it was a pretty good event, especially taking into account that it was free. The keynote was quite interesting, so much so, that I thought I’d share my takeaways.\n\n\n\n\n  Focus on solutions (not individual components) and add value\n\n\nThis, for me, is the message that came across most clearly. Focus on helping your business, brining value by enabling new processes and possibilities. Don’t waste your valuable time upgrading the umpteenth server or migrating from v14 to v15. Move to the cloud where it makes sense and free-up resources.\n\n\n  Infrastructure continues to lose importance and platform services get more important\n\n\nSure, there is a huge uptake in IaaS but that can only be an interim solution. If any organization is going to really benefit from using cloud services, the managing of virtual machines (just like on-prem) should not be part of the equation.\n\n\n  Skills change!\n\n\nIn a modern world, the IT pro’s focus can no longer be a single nitty-gritty technical thing. Many of us almost ignored the business’ evloving needs while pursuing mastery in that single discipline. In this increasingly cloud-first world, we will have to change. Radically.\n\n\n  GDPR: General Data Protection Regulation\n\n\nThis thing is coming and fast. The business must be prepared and IT can should play a key role in implementing the right tools and policies to follow the regulation. Oh, and tell me about changing skills ;)\n\n\n  Cloud adoption in Italy is above average and growing\n\n\nIt was really interesting to see that the economic turbulences were a driver for cloud adoption in Italy. A great customer story with a well-known, Italian media outlet showed how a sensible approach to cloud technologies could both, enable exciting new scenarios and drive down cost.\n\nSessions and slide decks can be downloaded from the Tech Community\n\nWhat do you think about the changing role of IT? Leave a comment below!\n\nTom"
        },
        {
          "id": "post-aure-site-recovery-deployment-planner",
          "title": "Azure Site Recovery Deployment Planner",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Azure, ASR",
          "url": "/post/aure-site-recovery-deployment-planner/",
          "content": "Today I was super excited about the first tests with the Azure Site Recovery Deployment Planner. Sometimes calculating the Bandwidth, Storage, local infrastructure needed for Site Recovery can be very tricky. Therefore, I’m happy that Microsoft released a helpful tool to get the right information needed.\n\n\n\nThe planner is a command-line tool in public preview for VMWare only, so the final version is not completed yet. Profiling the environment can be done remotely, so no agents or pieces of software on ESX Server or vCenter is needed. \nThe planner provides following details:\n\n  Compatibility assessment\n  Network bandwidth need versus RPO assessment\n  Azure infrastructure requirements\n  On-premises infrastructure requirements\n\n\nRequirements\n\nThe planner needs following components:\n\n  Windows Server 2012 R2\n  .Net Framework 4.5\n  VMware vSphere PowerCLI 6.0 R3\n  Microsoft Visual C++ Redistributable for Visual Studio 2012\n  Microsoft Excel\n\n\nProfiling\n\nFirst of all, we have to start profiling the VM’s that we want to protect with Azure ASR. The tool connects to the vCenter server (or ESX) to collect performance data. There is no performance impact on the VM’s because the performance data of the vCenter is taken and no data from inside the VM. The tool basically queries every 15 minutes the vCenter to get the performance data.\n\nAs first step we create a VM list with VM’s we want to profile. Connect to the vCenter with the VMWare CLI:\n\nConnect-VIServer -Server\n\n\nExport the list of all VM’s to a Text File\n\nGet-VM |  Select Name | Sort-Object -Property Name &gt;  C:\\Service\\Output.txt\n\n\nYou should get a list like this. I deleted the not needed VM’s from the Textfile and saved the changes.\n\n\n\nNow we are ready to start profiling. Microsoft recommends to profile at least 15 days. In our test we will profile 24 hours. From a Powershell window we can start profiling with the following command:\n\n.\\ASRDeploymentPlanner.exe -Operation StartProfiling -Directory “C:\\vCenter1_ProfiledData” -Server vCenter1.FQDN -VMListFile “C:\\Service\\Output.txt” -NoOfDaysToProfile 0.04 -User vCenterUser1\n\n\nA complete list of all switches can be seen here.\n\nIf you see following output in powershell you are all right. In my case, there are some VM’s not running and therefore a warning is displayed because the tool can obviously not collect performance data.\n\n\n\nGenerate report\n\nAfter profiling is completed we can see that the tool created some performance CSV Files:\n\n\n\nNow we can run the tool in report-generation mode to get the report\n\n.\\ASRDeploymentPlanner.exe -Operation GenerateReport -Server vCenter1.FQDN -Directory “C:\\vCenter1_ProfiledData” -VMListFile “C:\\Service\\Output.txt”\n\n\nA complete list of all switches can be seen here.\n\nThe report is named as “DeploymentPlannerReport” and can be opened with Excel.\n\n\n\nWhat we can see from the Excel Report is basically the number of profiled, compatible and incompatible VM’s. If we click on details, we can get the name of the not compatible VM. In my case a VM’s has a Disk with 10TB VMDK attached. (Azure has a limit of 1TB per disk).\n\n\n\nI selected in the right corner a desired RPO with 15 minutes. Based on this value the report start calculating the Mbit/s needed.\n\nIn the Required Network Bandwidth section there are 3 graphs:\n\n\n\n\n  To meet RPO 100 percent of the time: The recommended bandwidth in Mbps to be allocated to meet the desired RPO 100 percent of the time.\n  To meet RPO 90 percent of the time: If we cannot set the bandwidth needed to meet your desired RPO 100 percent of the time, we can choose to go with a lower bandwidth setting that can meet a desired RPO 90 percent of the time. \n(In my case 100 and 90 RPO are both 2 Mbit.. maybe there is still a bug with the calculation. Because the tool is in preview I guess this will be fixed before GA)\n  Achieved Throughput: This is the real Throughput that can be measured with the following command:\n\n\nASRDeploymentPlanner.exe -Operation GetThroughput\n\n\nIn my case this is $Null because I have to change the QoS rules and didn’t execute the test acutally.\n\nBased on the storage activity the planner recommends the storage accounts needed. I have one VM with heavy storage operations that needs Premium disks (SSD).\n\n\n\nVery interesting is the recommendation about the local infrastructure. In my case, only one server is needed to replicate the VM’s to Azure.\n\n\n\nThe WhatIf Graph shows what would happen if we decide to use a throughput to meet 90% of the RPO. Actually, I don’t fully understand the sense of the graph. Helpful would be to choose the bandwidth in a combo box or something similar and then see what happens.\n\n\n\nIn the Recommended VM batch size for initial replication section, Microsoft shows the recommendation of number of VMs that can be protected in parallel to complete the initial replication within 72 hours with the suggested bandwidth to meet desired RPO 100 percent of the time being set. The value can be changed using the GoalToCompleteIR parameter during report generation.\n\n\n\nLet’s switch to the “Input” Tab in Excel. Here we can see some very interesting values. The most interesting values for me is: Total Data to be replicated for initial replication\n\n\n\nConclusion\n\nSome things don’t work as expected. But we have to consider that the tool is in public preview, so many changes and improvements are expected. Stay tuned for further updates.\n\nDaniel"
        },
        {
          "id": "post-get-going-with-go",
          "title": "Get Going with Go!",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Dev",
          "tags": "Go, Basics",
          "url": "/post/get-going-with-go/",
          "content": "Everyone is talking about Go these days so I decided to have a look at it and see what it could do for me.\n\n\n\nBasics\n\nSo what is Go? Well according to golang.org\n\n  Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.\n\n\nOk, so another programing language, why do I care you ask? Well that’s a story for another day, for now, let’s say that I’m just generally interested in awesome technology.\n\nInstalling on macOS\n\nThe first “Hello World” kind of program can easily be done using tour.golang.org but I wanted to get it up and running on my MacBook so I installed the package using brew, it’s easy enough with: brew install go\n\nAfterwards, a quick go version confirmed that the latest and greatest version of Go has been installed. 1.8 at the time of writing.\n\ngo version go1.8 darwin/amd64\n\nEnvironment Variables\n\nBefore firing up an editor, some environment variables need to be set in order for Go to work and store projects and dependencies in some user-defined path. I’ve added the following to lines to my bash profile:\n\nexport GOPATH=$HOME/git/go\nexport GOBIN=$(go env GOPATH)/bin\nexport PATH=$PATH:$GOBIN\n\n\nWhat this does, is setting the GOPATH and GOBIN environment variables to a folder in my home directory and adding the GOBIN directory to the systems’ PATH variable. \nThe first variable instructs Go to look for and install sources and packages in the specified folder, the second variable defines where binaries are located and adding this to the systems’ PATH simply makes running Go programs easier.\n\nHello World with Visual Studio Code\n\nOn the Mac, I’m mostly using VS Code to write/edit text files, as it has some extensions for Go, I figured it would do the trick for the beginning. So I opened up my GOPATH directory in VS Code and created a new folder under src, hello in my case. \nIn this folder I created a hello.go file, and at this point, Visual Studio Code recognises the Go language and downloads some required tools to the GOPATH directory.\n\nAfter a restart, I created the following hello world program:\n\npackage main\n\nimport \"fmt\"\n\n// SayHelloTo takes a string and prints it to the console.\nfunc SayHelloTo(s string) {\n\tfmt.Println(\"Hello \" + s + \"!\")\n}\n\n// The main function just invokes SayHelloTo with a string\nfunc main() {\n\tSayHelloTo(\"Tom\")\n}\n\n\nRun / Build / Install\n\nTo run the above program, just change into the hello folder and run go run hello.go which should result in the following output:\n\nttor$ go run hello.go\nHello Tom!\n\n\nNow if I wanted to create a binary and install it, I could simply run go build hello.go which leaves me with the executable file. To install it, into Go’s bin directory (GOBIN) I use: go install hello.go\n\nAfter that, I can run hello and again get the above output:\n\nttor$ hello\nHello Tom!\n\n\nWell that was my quick introduction to Go, we’ll soon see if there’s more to come…\n\nNice weekend!\nTom"
        },
        {
          "id": "post-get-started-with-azure-arm-templates",
          "title": "Get started with Azure ARM Templates",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "Azure, RM",
          "url": "/post/get-started-with-azure-arm-templates/",
          "content": "To start with the deployment using Azure ARM Templates is quite easy. A first step can be to deploy an Azure SQL Database. But let’s start with a bit of background information:\n\n\n\nTemplates\n\nWe can create a template (in JSON format) that defines and configures the Azure solution. When we create a solution from the portal, the solution automatically includes a deployment template. So, we don’t have to create our template from scratch but we can download the templates for the existing deployments. \nTo get the templates open the “Resource Group” section in the Azure Portal and click on Deployments\n\n\n\nClick on “View Templates”\n\n\n\nWhat we can see now is the Template and Parameter file. When we start a new deployment, we have to define parameters for the resource template, these needs to be entered in before the deployment can start.\n\n\n\nYou can find other ARM templates on the following Microsoft Website\n\nDeployment\n\nWe are going to deploy a new SQL Database, so my template looks like this:\n\n{\n    \"$schema\": \"http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"collation\": {\n            \"type\": \"String\"\n        },\n        \"databaseName\": {\n            \"type\": \"String\"\n        },\n        \"edition\": {\n            \"type\": \"String\"\n        },\n        \"requestedServiceObjectiveId\": {\n            \"type\": \"String\"\n        },\n        \"maxSizeBytes\": {\n            \"type\": \"String\"\n        },\n        \"serverName\": {\n            \"type\": \"String\"\n        },\n        \"serverLocation\": {\n            \"type\": \"String\"\n        },\n        \"diagnosticStorageAccountId\": {\n            \"defaultValue\": \"\",\n            \"type\": \"String\"\n        },\n        \"diagnosticsTemplate\": {\n            \"defaultValue\": \"\",\n            \"type\": \"String\"\n        },\n        \"sampleName\": {\n            \"defaultValue\": \"\",\n            \"type\": \"String\"\n        }\n    },\n    \"resources\": [\n        {\n            \"type\": \"Microsoft.Sql/servers/databases\",\n            \"name\": \"[concat(parameters('serverName'), '/', parameters('databaseName'))]\",\n            \"apiVersion\": \"2014-04-01-preview\",\n            \"location\": \"[parameters('serverLocation')]\",\n            \"properties\": {\n                \"collation\": \"[parameters('collation')]\",\n                \"edition\": \"[parameters('edition')]\",\n                \"maxSizeBytes\": \"[parameters('maxSizeBytes')]\",\n                \"requestedServiceObjectiveId\": \"[parameters('requestedServiceObjectiveId')]\",\n                \"sampleName\": \"[parameters('sampleName')]\"\n            }\n        }\n    ]\n}\n\n\nLet’s focus on the parameter file that specifies the deployment. It should look like this:\n\n{\n    \"$schema\": \"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#\",\n    \"contentVersion\": \"1.0.0.0\",\n    \"parameters\": {\n        \"collation\": {\n            \"value\": \"SQL_Latin1_General_CP1_CI_AS\"\n        },\n        \"databaseName\": {\n            \"value\": \"Database3\"\n        },\n        \"edition\": {\n            \"value\": \"Basic\"\n        },\n        \"requestedServiceObjectiveId\": {\n            \"value\": \"dd6d99bb-f193-4ec1-86f2-4fe4rscbc49c\"\n        },\n        \"maxSizeBytes\": {\n            \"value\": \"2147483648\"\n        },\n        \"serverName\": {\n            \"value\": \"sqllogicalz2010\"\n        },\n        \"serverLocation\": {\n            \"value\": \"westeurope\"\n        },\n        \"diagnosticStorageAccountId\": {\n            \"value\": \"\"\n        },\n        \"diagnosticsTemplate\": {\n            \"value\": \"\"\n        },\n        \"sampleName\": {\n            \"value\": \"AdventureWorksLT\"\n        }\n    }\n}\n\n\nI modified that Database Name because I want my new Database to be called “Database3”. Lets save both files to the local machine (or GitHub if you want). Name the template file NewSQLDatabase.json and the parameter file Parameter-NewSQLDatabase.json.\n\nThe Template and Parameter files are now ready for deployment. Lets fire up Powershell and push the change to Azure. \nFirst, we have to connect to the Azure Account and select our subscription\n\n# Connect to Azure RM Account\nLogin-AzureRmAccount\n\n# Select Azure RM Subscription\nSelect-AzureRmSubscription -SubscriptionId c2a12a42-0179-*************\n\n\nWith the “New-AzureRmResourceGroupDeployment” cmdlet we start the deployment process using our template and parameter file as attributes.\n\n# ARM Template SQL Database\nNew-AzureRmResourceGroupDeployment -Name SQLDatabase -ResourceGroupName rg_Z2010 -TemplateFile \"F:\\Templates\\SQL Database\\NewSQLDatabase.json\" -TemplateParameterFile \"F:\\Parameters\\SQL Database\\Parameter-NewSQLDatabase.json\"\n\n\nAfter we executed the command we should see similar output and the Database is running on Azure :)\n\n\n\nStay tuned for further posts\n\nDaniel"
        },
        {
          "id": "post-disable-backup-protection-for-azure-vm",
          "title": "Disable Azure Backup Protection for a VM with Azure PowerShell",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, Azure, RM",
          "url": "/post/disable-backup-protection-for-azure-vm/",
          "content": "My Azure credits burn faster than expected :) So I decided to remove some VM’s and Backup that I used for a customer’s demonstration. Since I don’t use the Azure Portal for configuration anymore, I fired up Powershell and did the Job. With the following commands, I show you how to stop the Backup for a Virtual Machine and delete the associated Recovery Points.\n\n\n\nDisable and delete VM Backup\n\nLogin-AzureRmAccount\n# Select Azure RM Subscription\nSelect-AzureRmSubscription -SubscriptionId ***************\n\n$container = Get-AzureRmRecoveryServicesBackupContainer -Name VIRTUAL-MACHINE-NAME  -ContainerType AzureVM\n$BackupItem = Get-AzureRmRecoveryServicesBackupItem $container -WorkloadType AzureVM \nDisable-AzureRmRecoveryServicesBackupProtection -Item $BackupItem -RemoveRecoveryPoints\n\n\nI know you may think this is quite simple and why is this guy writing a post with only 3 lines of code.  It’s because Tom moved our blog to Git and this is my first blog post that I try to upload and don’t wanted to wait :)\n\nGreetings"
        },
        {
          "id": "post-migrating-blogengine-to-github-pages-2",
          "title": "Migrating from BlogEngine to GitHub Pages: Fixing the links",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "ntSystems",
          "tags": "Jekyll, ntSystems",
          "url": "/post/migrating-blogengine-to-github-pages-2/",
          "content": "In this episode of our little series on migration we are having a look at the URL structure of Jekyll and some of the less visible stuff that was associated with the old ntSystems.\n\n\n\nAll the existing URLs on our BlogEngine-based blog used both, upper- and lowercase letters, and had an filename extension of .aspx. Now Jekyll does not use filename extensions (or at least doesn’t display them) and it uses all lowercase letters in URLs.\n\nAdditionally we moved from https-enabled to https-only and the usage of a www. hostname was not defined. So all of those URLs would have worked on the old blog:\n\n\n  http://ntsystems.it/CONTACT.aspx\n  https://ntsystems.it/contact.aspx\n  http://www.ntsystems.it/contact.aspx\n  …\n\n\nYou see, it was a mess. On the current version of ntSystems, only the following URL will work:\n\n\n  https://ntsystems.it/contact/\n\n\nBut what about existing links from social media, other blog posts, or where ever else, you ask? Well the solution is twofold. First, enter…\n\nCloudflare\nWe have been using Cloudflare for a while to easily enable IPv6 and and https even for our old blog. Now another feature, Page Rules, comes in very handy indeed. In fact a single rule is enough to get rid of the .aspx extensions:\n\n\n\nIf the URL matches *ntsystems.it/*.aspx forward the request to https://ntsystems.it/$2 where $2 is the stuff that was matched by the second asterisk * in the matching pattern. Easy enough!\n\nJekyll URL structure\nThe second part of getting URLs right is instructing Jekyll to make them the same as before, without .aspx. And it turns out, that’s not to hard, either:\n\nThe following setting in our _config.yml file tells Jekyll to build all posts in the /post/ directory.\n\npermalink: /post/:title\n\n\nThe title property was copied into the front matter by the script we used to migrate the posts. Quite ready, but not yet.\n\nWe still have to deal with the uppercase/lowercase filenames in the URLs. We ended up using JekyllRedirectFrom to work around that. We just added the 'jekyll-redirect-from' gem to our Gemfile and used the migration script to add an uppercase version of the filename to the front matter like this:\n\nredirect_from: [\"/post/Azure-File-Services\", \"/post/azure-file-services\"]\n\n\nURLs. Check.\n\nRSS\nBlogEngine used a number of .axd scripts/handlers as endpoints for things like the RSS feed, the sitemap file, or a metaweblog extension. Obviously, the /syndication.axd URL does no longer work on Jekyll, a simple /feed.xml file is used instead.\nI tried various redirection methods but found that RSS clients (like The Old Reader) ignored them and the feed would go dead.\n\nAfter some testing I found that I could create a directory with the name of syndication.axd and simply put an index.html into it. Jekyll does not show the index.html in the URL, therefore the URL would still be /syndication.axd. I copied the content of feed.xml into the /syndication.axd/index.html and, voilá, the existing RSS link continued to work.\n\nSitemap\nThe URL of the sitemap.axd file is less important as it’s only used by search engines and not by users. So we just created a new sitemap.xml file and pointed the search engines to this new file. Additionally, we updated the Sitemap property in our robots.txt file.\n\nWell, and that’s it for today. Happy Halloween! :)\nTom"
        },
        {
          "id": "post-introducing-tak",
          "title": "Introducing: TAK",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, Cloud",
          "url": "/post/introducing-tak/",
          "content": "Over the years I did create, find, copy, paste, quite a few lines of PowerShell code. Some of which I’m turning into re-usable functions and collecting in a module, creatively called “Tom’s Admin Kit” or TAK. I hope you find it useful.\nI try to credit the sources for the stuff that I just copied off of the interwebs, even though I don’t actually remember all of them.\n\n\n\nPester\nAs written before, Pester is  a unit testing framework for PowerShell code. So one can write simple tests to verify the code actually does, what it is supposed to do. Not all functions are covered by tests, yet, but I try to be better at that. The existing tests can be found in the GitHub repo for the module.\n\nCI&amp;D: GitHub and AppVeyor\n\n\nI read a lot about this continuous integration and delivery and I thought it would be nice to play with some of the involved tools myself. So I created a small-ish release pipeline/workflow for this module using GitHub, AppVeyor and the PowerShell Gallery. Here is how it works: When a new commit is pushed to GitHub, AppVeyor picks up the latest code and deploys it to a test machine. It then runs all the pester tests and, upon success, publishes the module to the PowerShell Gallery.\n\nThe tests that should be run to verify the code, are defined in the appveyor.yml file in the GitHub repository.\n\ntest_script:\n    - ps: |\n        $testResultsFile = \".\\TestsResults.xml\"\n        $res = Invoke-Pester -OutputFormat NUnitXml -OutputFile $testResultsFile -PassThru\n        (New-Object 'System.Net.WebClient').UploadFile(\"https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)\", (Resolve-Path $testResultsFile))\n        if ($res.FailedCount -gt 0) {\n            throw \"$($res.FailedCount) tests failed.\"\n        }\n\n\nJust like the deployment task, that will be invoked if the tests passed.\n\ndeploy_script:\n  - ps: |\n      Install-PackageProvider -Name NuGet -Force\n      $manifest = Join-Path -Path $pwd -ChildPath \"TAK\\tak.psd1\"\n      (Get-Content $manifest -Raw) -Replace(\"1\\.0\\.0\\.\\d{1}\", $env:APPVEYOR_BUILD_VERSION) | Out-File $manifest\n      Publish-Module -NugetApiKey $env:psgkey -Path ($PublishPath = Join-Path -Path $pwd -ChildPath TAK) -Confirm:$false\n\n\n\nHelp\nMost functions include comment-based help and a HelpUri that links to the online version of the help article. Just add the -Online parameter when getting help, like in the following example:\n\nGet-Help Test-TCPConnection -Online\n\n\nA full list of available help files can be found here: TAK\n\nDownload &amp; Source for\n\nThe Module is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall- -Name  -Scope CurrentUser\n\nSave- -Name  -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler\n    \n\nMore information about the PowerShell Gallery can be found in the FAQ\n\nGive it a try, and, if you spot a bug or have an idea for improvement, just create in a pull request.\n\nSo long,\nTom"
        },
        {
          "id": "post-azure-stack-poc-tp2-on-vmware",
          "title": "AzureStack POC TP2 on VMware",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Cloud",
          "tags": "PowerShell, Azure",
          "url": "/post/azure-stack-poc-tp2-on-vmware/",
          "content": "I’ve been trying to make the Azure Stack Proof-of-Concept (Preview 2) run on VMware and here is what I found. \n\n\nFirst of all, the documentation to set this stuff up can be found here: Deploy Azure Stack POC\n\nPrepare VM\nAs I currently run VMware in my lab and didn’t want to re-install the physical server, I tried to get the Azure Stack up and running in a VMware VM. Following the recommendation for sizing, I created a VM with 100GB of RAM, 24 vCPUs, one vNIC and 5 hard disks with 200GB each. The many vCPUs are actually not necessary, as the hardware check does fail even though enough cores should be available. More on that later.\n\nAdditionally, I did enable the “Hardware virtualization” feature in the VM’s CPU settings. You can do this using the vSphere Web Client or use the following quick-and-dirty PowerCLI function for it:\n\n\n\nAs the Virtual Machine will run Hyper-V and some guest VMs, we have to disable the security features on the virtual Port Group where the VM is connected to:\n\nGet-VDSecurityPolicy -VDPortgroup VLAN95 |\nSet-VDSecurityPolicy -AllowPromiscuous:$true -MacChanges:$true -ForgedTransmits:$true\n\n\n\n  Note in the above example I’m using a distributed virtual Port Group. For a standard virtual Port Group use Set-SecurityPolicy.\n\n\nPrepare Windows\nThe next step is to install Windows and the VMware tools, download the Azure Stack TP2 support files (see documentation link above) and copy the CloudBuilder.vhdx file to the root of the C drive of our VM. Then I started .\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath and was confronted with an error, stating “The server is currently already booted from a virtual hard disk…”\n\nFortunatelly, the fix is easy: Open the PrepareBootFromVHD.ps1 file and find the following section:\n\nif ((get-disk | where {$_.isboot -eq $true}).Model -match 'Virtual Disk') \n    {\n    Write-Host \"The server is currently already booted from a virtual hard disk, to boot the server from the CloudBuilder.vhdx you will need to run this script on an Operating System that is installed on the physical disk of this server.\"\n    Exit\n    }\n\nNow either remove the section or just remove the Exit. That way, it will still display a warning but no longer stop the execution of the script.\n\nAgain, start .\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath which should now succeed and prompt for a reboot of the machine.\n\nInstall the Cloud\nThe VM restarts and boots from the CloudBuilder.vhdx file with the typical OOBE asking for an admin password and the product key. Once set, startup continues and we can log-in to the VM. At this point, we’ll have to install the VMware tools again. \nThe next step is to initialize the additional hard disks for the machine. The disks must be “empty” so do not create any volumes. I just run Get-Disk | Initialize-Disk and move on.\n\nNow the documentation wants us to open an administrative PowerShell console, change into the C:\\CloudDeployment\\Configuration folder and run the installation script. As a few checks are built-in to prevent this kind of setup (and verify hardware resources) this will fail with the following error message:\n\n2016-10-13 08:03:58 Error    Task: Invocation of interface 'Validate' of role 'Cloud\\Infrastructure\\BareMetal' failed: \n\nFunction 'Test-BareMetalRole' in module 'Roles\\PhysicalMachines\\PhysicalMachines.psd1' raised an exception:\n\nOne or more validation test failed for Role 'BareMetal' on machine 'WIN-MUTSIQJMO43'\nFor detailed test results look at file '\\\\WIN-MUTSIQJMO43\\C$\\CloudDeployment\\Logs\\Tests\\TestResults_WIN-MUTSIQJMO43_BareMetal_2016-10-13-08-03-44.xml'\nTest Failed: Validate that the computer 'WIN-MUTSIQJMO43' is a physical machine.\nTest Failed: Validate that at least 12 cores are available in computer WIN-MUTSIQJMO43.\nAt C:\\CloudDeployment\\Roles\\Common\\RoleHelpers.psm1:875.\n+         Trace-Error $message\nat Trace-Error, C:\\CloudDeployment\\Common\\Tracer.psm1: line 52\nat Start-Test, C:\\CloudDeployment\\Roles\\Common\\RoleHelpers.psm1: line 875\nat Test-BareMetalRole, C:\\CloudDeployment\\Roles\\PhysicalMachines\\TestPhysicalMachines.psm1: line 86\nat &lt;ScriptBlock&gt;, &lt;No file&gt;: line 18\n2016-10-13 08:03:58 Verbose  Step: Status of step '(DEP) Validate Physical Machines' is 'Error'.\n\nSo the two tests that failed use the following CIM Instances (WMI) to query information about the host system: Win32_ComputerSystem, Win32_Processor Now even though I did configure 24 vCPUs for my VM, the NumberOfEnabledCore attribute of Win32_Processor shows a value of “0”.\n\nHere too, there’s an easy fix: Find the BareMetal.Tests.ps1 file in the C:\\CloudDeployment\\Roles\\PhysicalMachines\\Tests directory and make the following tests pass:\n\n# Validate this is not a virtual machine.\nforeach ($physicalMachine in $physicalMachines)\n{\n    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `\n    {\n        $physicalMachine.IsVirtualMachine | Should Be $false\n    }\n}\n...\n# Validate the number of cores on each of the machines meets the required minimum.\nforeach ($physicalMachine in $physicalMachines)\n{\n    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `\n    {\n        ($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine\n    }\n}\n\nAgain, we could just remove the actual test (the expression inside the It {} statement) or make it a comment or modify the code to make it pass. I ended up with the following, slight modification:\n\n# Validate this is not a virtual machine.\nforeach ($physicalMachine in $physicalMachines)\n{\n    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `\n    {\n        #$physicalMachine.IsVirtualMachine | Should Be $false\n    }\n}\n...\n# Validate the number of cores on each of the machines meets the required minimum.\nforeach ($physicalMachine in $physicalMachines)\n{\n    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `\n    {\n        #($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine\n    }\n}\n\nBy the way, you’ll see that this script is signed, so in order to make it run, remove the signature and save the script.\n\nInstall the Cloud #2\nNow we can go ahead and invoke the install script to actually install Azure Stack inside the virtual machine. As there is no DHCP Server available in the network into which I’m deploying, I specify a few options when invoking the installation script:\n\n$installParams = @{\n    NatIPv4Subnet = \"172.16.8.0/24\";\n    NatIPv4Address = \"172.16.8.212\";\n    NatIPv4DefaultGateway = \"172.16.8.254\";\n    EnvironmentDNS = \"172.16.8.120\";\n}\n.\\InstallAzureStackPOC.ps1 @installParams\n\nNote that this script has a rerun parameter, so if execution failes, it can be invoked again and will continue where it left off:\n\n .\\InstallAzureStackPOC.ps1 -Rerun\n\nNote that at some point of the installation, the VM is rebooted and logged in automatically to the account “azurestack\\azurestackadmin”. From that moment on, all installation related tasks (such as a -Rerun) should be performed using this account.\n\nI did stumble over another prolem, installation stopped with the following error:\n\n2016-10-13 13:48:18 Error    Task: Invocation of interface 'Configure' of role 'Cloud\\Fabric\\NC' failed: \n\nFunction 'ConfigureNC' in module 'Roles\\NC\\NC.psd1' raised an exception:\n\nTask failed with the following error: 'The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota.'.\nAt C:\\CloudDeployment\\Roles\\Common\\RoleHelpers.psm1:83.\n+         $status.ErrorMessage\nat Trace-Error, C:\\CloudDeployment\\Common\\Tracer.psm1: line 52\nat Start-PSScriptUsingTask, C:\\CloudDeployment\\Roles\\Common\\RoleHelpers.psm1: line 83\nat ConfigureNC, C:\\CloudDeployment\\Roles\\NC\\NC.psm1: line 620\nat &lt;ScriptBlock&gt;, &lt;No file&gt;: line 18\n2016-10-13 13:48:18 Verbose  Step: Status of step '(NET) Configure NC on VMs' is 'Error'.\n\n\nApparently the default value of 500 for MaxEnvelopeSize is not enough, I used the following command to increase the size to 8192:\n\nwinrm set winrm/config '@{MaxEnvelopeSizekb=\"8192\"}'\n\n\nResult\nOnce the InstallAzureStackPOC.ps1 script finished running, there will be 13 VMs running on our “Host VM”, consuming about 52GB of RAM:\n\nGet-VM\n\nName         State   CPUUsage(%) MemoryAssigned(M) Uptime           Status             Version\n----         -----   ----------- ----------------- ------           ------             -------\nMAS-ACS01    Running 0           8192              00:46:18.2560000 Operating normally 8.0\nMAS-ADFS01   Running 0           1164              01:33:39.1820000 Operating normally 8.0\nMAS-ASql01   Running 0           4096              01:00:02.6710000 Operating normally 8.0\nMAS-BGPNAT01 Running 0           1460              01:46:26.7640000 Operating normally 8.0\nMAS-CA01     Running 0           844               01:32:56.9940000 Operating normally 8.0\nMAS-Con01    Running 0           4096              01:39:16.7620000 Operating normally 8.0\nMAS-DC01     Running 0           4096              02:09:00.7000000 Operating normally 8.0\nMAS-Gwy01    Running 0           4096              00:54:18.0770000 Operating normally 8.0\nMAS-NC01     Running 0           2048              01:19:39.9240000 Operating normally 8.0\nMAS-SLB01    Running 0           4096              01:04:11.8220000 Operating normally 8.0\nMAS-SUS01    Running 0           2048              01:37:49.5430000 Operating normally 8.0\nMAS-WAS01    Running 1           8192              01:36:31.2300000 Operating normally 8.0\nMAS-Xrp01    Running 0           8192              01:34:04.3710000 Operating normally 8.0\n\nIf you encounter problems during installation, make sure to check the summary.log.xml file in C:\\CloudDeployment\\Logs.\n\nTo actually log in to the Azure Stack Portal, open the MAS-Con01 VM’s conole and find a link to the portal on the desktop:\n\n\n\nOk, so with that: Have fun with Azure Stack and happy hacking ;)\n\nTom"
        },
        {
          "id": "post-migrating-blogengine-to-github-pages-1",
          "title": "Migrating from BlogEngine to GitHub Pages: BlogML to Markdown",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "ntSystems",
          "tags": "Jekyll, ntSystems",
          "url": "/post/migrating-blogengine-to-github-pages-1/",
          "content": "As promised here, I’m sharing the first part of our migration process from BlogEngine to GitHub Pages. A major part is, obviously, the migration of the content of the blog itself.\n\n\n\nBlogML\nAccording to Wikipedia “BlogML is an open format derived from XML to store and restore the content of a blog.” Luckily, BlogEngine has an export option that exports all content (posts and pages) to a XML file.\n\n  Note: The XML file contains only the text content. So images, files and other assets have to be migrated separately.\n\n\nI downloaded the BlogML file and started to look around for solutions to somehow convert the stuff to something Jekyll could use. After some googling, I found this blog describing something very similar. Apparently he was using a ruby script to create a properly formatted markdown (.md) file for each post in the BlogML file. Thankfully, the script could be found in his GitHub Repo.\n\nThe script was almost perfectly suited for our purposes after some small modifications I started it like so:\n\n$ ruby -r './blogml.rb' -e 'Jekyll::BlogML.process(\"BlogML.xml\")'\n\n\nNote that in my case the BlogML.xml file is located in the same directory as the script and a new directory named “_posts” is created in the same path. Any existing directory with the same name will be deleted.\n\nThe modified version of the script is available here.\n\nWriting\nOnce the posts (and the rest) was migrated, one has to start writing new stuff. Posts are written in plain text with markdown formatting so no super fancy editor is required and I’m getting along well with VS Code. I’m using the “Spelling and Grammar Checker” extension hoping it catches to most obvious typos ;)\n\nStay tuned for more.\nTom"
        },
        {
          "id": "post-welcome-to-the-all-new-ntsystems",
          "title": "Welcome to our new blog!",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "ntSystems",
          "tags": "Update, Jekyll, GitHub",
          "url": "/post/welcome-to-the-all-new-ntsystems/",
          "content": "This site has been running on Azure Web Sites for some time. As we are doing this for fun and are not making any money with the site (see any ad?) we had to use the “Shared” pricing tier which was economically acceptable but from a performance and feature point-of-view, well, not great. We used Cloudflare to get some caching and enable stuff like https and IPv6 for the site and it was OK :) Then came…\n\n\n\n…Jekyll\nRecently I started publishing some of the PowerShell code I’m writing to GitHub and while browsing around, I stumbled over a static page generator, called Jekyll. I was quite impressed and started hacking around for a little while… after a couple of train rides I was happy with the result and decided to give it a go. So, that’s it:\n\n\n  Welcome to our new home on GitHub!\n\n\nAs of 2016-10-02 we moved to Jekyll. The current version of our little blog is hosted on GitHub Pages and uses a slightly modified version of the default Minima theme for Jekyll.\n\nTools\nAs this is now, essentially, a static website, we have to use some tools to make it as awesome as possible:\n\n\n  Cloudflare: Security, IPv6, TLSv3, Page Rules… and more awesomeness\n  Algolia: Search as a Service\n  lunr.js: Full-text search in your browser\n  Favicon Generator\n  Shariff: Share without compromising privacy\n  Disqus: Comments\n\n\nWork in progress\nThis migration is a work in progress and therefore not all features the good, old ntsystems.it are available as of today. I intend publishing a few lines about the migration itself, and keeping it up-to-date as we move along and build new features into the site.\n\nWe do hope you enjoy our new look. It is all open source, so if you are interested in how we do stuff, just check out our repo\nOh and if you find any errors you’d wish to correct, please just send us a pull-request :-)\n\nSo long,\nTom"
        },
        {
          "id": "post-powershell-on-macos",
          "title": "PowerShell on macOS",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "PowerShell, macOS, GitHub",
          "url": "/post/powershell-on-macos/",
          "content": "Just sharing some quick notes on how to run PowerShell (and dotnet core) on macOS Sierra.\n\n\n\nOpenssl\nPowerShell requires dotnet core which, in turn, requires openssl to be installed (and linked correctly). Using brew, one can easily install openssl, if it is already installed, use brew list to show the installation location:\n\n$ brew install openssl\n$ brew list openssl\n...\n/usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib\n/usr/local/Cellar/openssl/1.0.2j/lib/libssl.1.0.0.dylib\n...\n\n\nAs of 2016-10 it is required to create symlinks for the above listed libraries (libcrypto, libssl) at /usr/local/lib, use ln -s like so:\n\n$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/lib\n$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/lib\n\n\nNote: Make sure that the path used in the link (ln) actually matches the one given by the `brew list` output.\n\n.NET Core\nHead over to https://www.microsoft.com/net/core#macos and download a copy of the installer. Installation is straight-forward, just double-click the .pkg and follow instructions.\nAfter installation, verify that dotnet works by creating the “Hello World” app as suggested on the download site:\n\n$ mkdir testapp\n$ cd testapp\n$ dotnet new\nCreated new C# project in /Users/tom/testapp.\n$ dotnet restore\n$ dotnet run\n\n\nPowerShell\nGet the latest .pkg at https://github.com/PowerShell/PowerShell/releases. Again, installation is simple, just double-click the .pkg and follow instructions. To verify installation, open a terminal and run powershell`\n\n$ powershell\nPowerShell\nCopyright (C) 2016 Microsoft Corporation. All rights reserved.\n\nPS /Users/tom&gt; $PSVersionTable\n\nName                           Value\n----                           -----\nPSVersion                      6.0.0-alpha\nPSEdition                      Core\nPSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}\nBuildVersion                   3.0.0.0\nGitCommitId                    v6.0.0-alpha.10\nCLRVersion\nWSManStackVersion              3.0\nPSRemotingProtocolVersion      2.3\nSerializationVersion           1.1.0.1\n\n\n\nNote: It's still early days, the above procedure might be simplified soon \n\nEnjoy :)"
        },
        {
          "id": "post-deploying-labs-using-azure-resource-manager",
          "title": "Deploying Labs using Azure Resource Manager",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "",
          "tags": "en, Azure, Cisco",
          "url": "/post/deploying-labs-using-azure-resource-manager/",
          "content": "I did a demo of Cisco CSR 1000v on Azure the other day and the easy deployment of a small test-network was part of that demo. I really enjoyed deploying the lab using ARM templates, so why not share the love?\n\nSo what’s ARM?\n\nAzure Resource Manager is the “new” deployment model for all kinds of resources within Azure. The great thing about it is, that it works with template and parameter files, so we can easily prepare an environment and deploy it over and over again, with either the same or different parameters.\n\nCSR 1000v?\n\nThat’s what the customer wanted to see and why I got do a demo on Azure in the first place. Cisco provides images in the Azure Marketplace (https://azure.microsoft.com/en-us/marketplace/) so that customers can run a fully featured IOS XE router in the cloud.\n\nThe Lab network\n\nSo as mentioned above, i wanted to demo the setup of a quick lab along with the CSR, having only the router and no endpoints to connect to, doesn’t make to much sense. I used the Azure Resource Manager to create a new resource group and a new virtual network with two subnets. One of which would be CSR’s “public” facing subnet (with a Public IP associated) the other one was my “backend” network for cloud workloads (without Public IPs). A Nano Server was quick to deploy and provided the “backend” for my lab.\n\n\n\nThe template\n\nI did use Visual Studio to modify and adapt the ARM template to my needs, but really any text editor/ISE can be used.\n\nThe template consists of two files, the template itself and a file for parameters. In my case, I did use the parameter file just for the passwords of the CSR and the Nano Server, the other parameters are assigned directly in the template file. There is room for improvement in this case, as the template would be more flexible if it had less “hardcoded” information.\n\nThe template specifies how the virtual network, subnets and eventually the CSR and Nano Servers should be deployed.\n\nDeploy\n\nOnce ready, the template can be be deployed to any Azure Subscription using a number of methods: One can deploy directly from Visual Studio or PowerShell or even from the cross-platform CLI on a Mac.\n\nUsing PowerShell\n\nFirst, we have to create a Resource Group to which the template will be deployed:\n\n$RGName = 'rg-tomt-lab' \n$RGLocation = 'westeurope' \nNew-AzureRmResourceGroup -Name $RGName -Location $RGLocation \n\n\nThen we prepare a variable which specifies the resource group, the template file and the parameters file.\n\n$Params = @{ \n    'ResourceGroupName' = $RGName\n    'TemplateFile' = 'C:\\azure\\azure_arm_csr_nano_template.json'\n    'TemplateParameterFile' = 'C:\\azure\\azure_arm_csr_nano_parameters.json' \n}\n\n\nUsing the Test-* cmdlet we can simulate deployment and verify that all checks out:\n\nTest-AzureRmResourceGroupDeployment @Params -Verbose\n\n\nAnd if everything looks good, we can go ahead and finally create the deployment:\n\nNew-AzureRmResourceGroupDeployment @Params -Verbose\n\n\nUsing the xPlat CLI\n\nAlmost the same thing can be be done using the cross-platform CLI, which is what I use on my Mac.\n\nCreate a Resource Group:\n\nazure group create -n rg-csr-lab -l \"West Europe\"\n\n\nDeploy the template\n\nazure group deployment create -f azure_arm_csr_nano_template.json -e azure_arm_csr_nano_parameters.json -g rg-csr-lab -n CSR01\n\n\nFind the template, parameters file and more detailed information for deployment at my GitHub: https://github.com/tomtorggler\n\nSo, once the template is prepared, deployment is just a piece of cake! That’s how deploying labs just got a lot quicker, don’t you think?\n\nEnjoy,\n\n— Tom"
        },
        {
          "id": "post-veeam-direct-restore-to-azure",
          "title": "Veeam direct restore to Azure",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure, Veeam",
          "url": "/post/veeam-direct-restore-to-azure/",
          "content": "Today I tried to restore a Veeam backed up VM directory to Microsoft Azure. Veeam gives you a free piece of software to get this done quickly with few easy steps. Lets jump into the configuration \nFirst of all we deploy the Veeam Direct Restore to Azure preconfigured VM from the Azure marketplace\n\nWhen the VM starts up, we connect and have to specify some configuration parameter. We click on “Configuration”\n\nVeeam asks us to specify the configuration File for the subscription\n\nWe can download the configuration file with the following lines of code\n\n\nNow the Veeam Part in Azure is configured and ready to convert Veeam Backup files to Azure virtual machines. We create a backup of a machine and upload the files to the Veeam virtual machine in Azure. After the files are available we start the restore process and specify the BackupFile:\n\nWe can choose which restore point we want to restore\n\nAfter that we can select the region and size of the virtual machine\n\n&nbsp;\nAfter we specified the Network and storage account the restore begins\n\n&nbsp;\nAfter few minutes the machine is restored from a Veeam backup and available in Azure. \n\n&nbsp;\nWith Veeam Version 9.5 a direct restore to Azure with API and without a convert VM is also possible. \n\nStay tuned for Version 9.5\nGreetingdn"
        },
        {
          "id": "post-lync-sdn-api-and-cisco-wlc",
          "title": "Lync SDN API and Cisco WLC",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Skype4B",
          "tags": "Lync, Cisco, en, Skype4B",
          "url": "/post/lync-sdn-api-and-cisco-wlc/",
          "content": "Some days ago I had the chance to test Cisco’s Wireless LAN Controllers with the Lync Software Defined Networking (SDN) API.\n\n\n\nFor those who don’t know what SDN API is, a quick overview: You can basically think of the SDN API as a little add-on, that can be installed on Lync Front End Servers, and that allows Lync to “let the network know” what’s going on from it’s perspective. The SDN API is made up of two components, the Lync Dialog Listener (LDL) and the Lync SDN Manager (LSM). The LDL component is installed on each Front End Server, and sends information to the LSM. The LSM forwards information to a so called SDN Controller, which, in our case, is the Cisco WLC.\n\nMore information and the API documentation is available on the MSDN: https://msdn.microsoft.com/en-us/library/office/dn387071.aspx\n\n\n\nThe WLC Side\n\nThe SDN Controller has to accept and process information coming from the LSM, Cisco has built this  functionality into it’s Wireless LAN Controller software from 7.6. We used 8.2 in this example. First we need to define a port, protocol, and enable the “Lync Server” option globally. This can be done using the “Lync Server” option in the “Wireless” tab:\n\n\n\nNow that the WLC listens for information, we’ll have to tell it, what to do with. Using the “WLANs” tab, we created a new SSID, enabled “Lync Server” and selected the appropriate QoS policy for each type of traffic:\n\n\n\nA quick excerpt from show wlan shows the QoS settings:\n\nLocal Policy\n---------------\nPolicy Name                                       Priority\n---------------                                   --------  \nLync State ...................................... Enabled\nAudio QoS Policy................................. Platinum\nVideo QoS Policy................................. Gold\nApp-Share QoS Policy............................. Silver\nFile Transfer QoS Policy......................... Bronze\n\n\nThe Lync Side\n\nMeanwhile, we’ve installed the Lync SDN Manager on a dedicated server, as it’s not recommended to run it on the Front Ends (and it didn’t work either). The LSM is configured through a configuration file SDNManager.exe.config, which can be found in the LSM’s installation directory: C:\\Program Files\\Microsoft Lync Server\\Microsoft Lync SDN API\\\n\nThe configuration is quite simple, the value submituri specifies the WLCs IP Address and Port, additionally, the value for backwardcompatibility must be set to true:\n\n&lt;appSettings&gt;\n    &lt;add key=\"submituri\" value=\"http://172.25.81.105:15120\"/&gt;\n    &lt;add key=\"backwardcompatibility\" value=\"true\"/&gt;\n\n\nWith the LSM configured, we installed the Dialog Listener on the Front End Server. During setup, we are asked for the submituri so we don’t even have to edit the config file in this case. Note that the submit URI for the LDL points to the LSM. \nThe configuration file for the LDL can be found here: C:\\Program Files\\Microsoft Lync Server\\Microsoft Lync SDN API\\LyncDialogListener.exe.config:\n\n&lt;appSettings&gt;\n  &lt;add key=\"submituri\" value=\"http://srv01.ccielab.local:9333/LDL/CallInfo\"/&gt;\n\n\nThe Client Side\n\nNow we were ready for some testing and connected our clients to the new SSID. After signing into Lync and making some calls, we were able to verify that they appeared in the WLC’s “Monitoring” tab.\n\n\n\nUsing Wireshark, we were able to verify the DSCP values for incoming packets from the WLAN:\n\n\n\nLast but not least, we had a look at the POST requests from the LSM to the WLC. As we are not using https, they are sent in clear-text and can be analyzed using Wireshark’s “Follow TCP stream” feature:\n\nPOST /LDL/CallInfo HTTP/1.1\nContent-Type: text/xml\nAccept: text/xml\nHost: srv01.ccielab.local:9333\nContent-Length: 2823\nExpect: 100-continue&lt;/p&gt;\n\nHTTP/1.1 100 Continue\n\n&lt;LyncDiagnostics Version=\"1.0\"&gt;\n  &lt;ConnectionInfo&gt;\n    &lt;FrontEnd&gt;s4b&lt;/FrontEnd&gt;\n    &lt;CallId&gt;8a5ee59e7f24cc47a8a5e5ef5408164b&lt;/CallId&gt;\n    &lt;CSEQ&gt;3&lt;/CSEQ&gt;\n    &lt;ConversationId&gt;AdHItACZ40eYIzsElkmUXxEpJfdLYA==&lt;/ConversationId&gt;\n    &lt;TimeStamp&gt;2016-06-17T16:36:16.0502033Z&lt;/TimeStamp&gt;\n  &lt;/ConnectionInfo&gt;\n  &lt;StartOrUpdate Type=\"audio\"&gt;\n    &lt;From&gt;\n      &lt;Id&gt;1c36b0157b&lt;/Id&gt;\n      &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;\n      &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;\n      &lt;IP&gt;172.25.81.237&lt;/IP&gt;\n      &lt;Port&gt;21448&lt;/Port&gt;\n    &lt;/From&gt;\n    &lt;To&gt;\n      &lt;Id&gt;94b8a54712&lt;/Id&gt;\n      &lt;EPId&gt;213808492931&lt;/EPId&gt;\n      &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;\n      &lt;Contact&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local;\n      opaque=user:epid:vaj8zwoldfc0zkl6hghhoaaa;gruu&lt;/Contact&gt;\n      &lt;IP&gt;172.25.81.238&lt;/IP&gt;\n      &lt;Port&gt;11616&lt;/Port&gt;\n    &lt;/To&gt;\n    &lt;Properties&gt;\n      &lt;Protocol&gt;UDP&lt;/Protocol&gt;\n      &lt;EstimatedBandwidth Codec=\"SIREN/16000\"&gt;\n        &lt;Low&gt;52600&lt;/Low&gt;\n        &lt;High&gt;68600&lt;/High&gt;\n      &lt;/EstimatedBandwidth&gt;\n      &lt;EstimatedBandwidth Codec=\"PCMU/8000\"&gt;\n        &lt;Low&gt;97000&lt;/Low&gt;\n        &lt;High&gt;161000&lt;/High&gt;\n      &lt;/EstimatedBandwidth&gt;\n      &lt;EstimatedBandwidth Codec=\"PCMA/8000\"&gt;\n        &lt;Low&gt;97000&lt;/Low&gt;\n        &lt;High&gt;161000&lt;/High&gt;\n      &lt;/EstimatedBandwidth&gt;\n      &lt;EstimatedBandwidth Codec=\"RED/8000\" /&gt;\n      &lt;EstimatedBandwidth Codec=\"CN/8000\" /&gt;\n      &lt;EstimatedBandwidth Codec=\"CN/16000\" /&gt;\n      &lt;EstimatedBandwidth Codec=\"telephone-event/8000\" /&gt;\n    &lt;/Properties&gt;\n  &lt;/StartOrUpdate&gt;\n\n…\n\n&lt;StartOrUpdate Type=\"video\"&gt;\n  &lt;From&gt;\n    &lt;Id&gt;94b8a54712&lt;/Id&gt;\n    &lt;EPId&gt;213808492931&lt;/EPId&gt;\n    &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;\n    &lt;IP&gt;172.25.81.238&lt;/IP&gt;\n    &lt;Port&gt;15150&lt;/Port&gt;\n  &lt;/From&gt;\n  &lt;To&gt;\n    &lt;Id&gt;1c36b0157b&lt;/Id&gt;\n    &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;\n    &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;\n    &lt;Contact&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local;\n    opaque=user:epid:a_6tcapa01gtycf5ts8qnqaa;gruu&lt;/Contact&gt;\n    &lt;IP&gt;172.25.81.237&lt;/IP&gt;\n    &lt;Port&gt;6490&lt;/Port&gt;\n  &lt;/To&gt;\n  &lt;Properties&gt;\n    &lt;Protocol&gt;UDP&lt;/Protocol&gt;\n    &lt;EstimatedBandwidth Codec=\"x-rtvc1/90000\"&gt;\n      &lt;Low&gt;460000&lt;/Low&gt;\n      &lt;High&gt;2510000&lt;/High&gt;\n    &lt;/EstimatedBandwidth&gt;\n  &lt;/Properties&gt;\n&lt;/StartOrUpdate&gt;\n\n\nAs you can see, the LSM uses simple http POST requests to send information to a network controller. The network controller just has to “listen” for such data and act on it.\n\nThis concludes our journey into the wireless network for today, hope you enjoyed it as much as I did :)\n\nMany thanks to my colleague and fellow call-quality-optimizer KD!\n\nCheers,\nTom"
        },
        {
          "id": "post-azure-backup-part-three",
          "title": "Azure Backup - Part Three",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure",
          "url": "/post/azure-backup-part-three/",
          "content": "In my previous posts I gave you an overview of Azure Backup und explained the “Direct Backup Azure VM to Backup Vault” solution a bit in detail. Lets now focus on the Azure Backup Server option which we can backup Files and Applications like ActiveDirectory, SQL, Sharepoint, Exchange and Hyper-V. \nInstallation\nFirst of all you have to access the Backup vault and download the Microsoft Azure Backup Agent.\n\nSelect a server in your organization that is domain joined where you want to install the Backup software. Before the server uploads the data to the backup vault it saves at least one copy to a local drive. Give the server an empty volume with some space.\n\nAt the end you pair the server with our backup vault with a vault credential file. The file can be downloaded from the backup vault. Specify a Passphrase to encrypt your backups.\n\nThe server is now registered in visible in the backup vault.\nPrerequisites and a more detailed description can be found here: https://azure.microsoft.com/en-us/documentation/articles/backup-azure-microsoft-azure-backup/\nBackup plan\nThe next step is to define a Backup plan for the servers we want to protect. This task is pretty straight forward, I explain only the most important parts:\nWe specify Disk and online protection. Disk protection represents the short term and online the long term protection.\n\nWe specify how much restore points we keep on local disk for short term protection\n\nNext step is to define the online Backup schedule and retention policy. In this example we configure the schedule to upload restore points daily at 09:00 PM.\n\n&nbsp;\nSimple restore\nThe Backup runs now everyday and uploads the restore point to the backup vault. If we want to restore data we can see where the server recovers them from:\n\n&nbsp;\nFull restore\nLets assume we backup our whole infrastructure with the Backup Server and upload the restore points to Azure. The local infrastructure isn’t available due to fire / server damage and we cannot access the backup server (and short term backups) anymore. All of our backups are in the cloud and we want to restore the whole infrastructure.\nIt's a bit more complicated: To get access to the Azure Backups we have to install a Backup Server. To install the Backup Server we need a machine that's domain joined. Because of this prerequisites we have to follow some additional steps to recover the whole environment.\nHere are the steps we have to do to get the full restore done:\n Install a new server Create a temporary domain and make the server its domain controller Install a second new server Join the server to the temporary domain Install Azure Backup Server on the second server Join the Backup Server to the Azure Backup vault. We have now access to the restore points Restore the system state backup from a domain controller to a network location Throw away everything except the restored backup Install a new server, this will be the domain controller Restore the system state backup on the new domain controller Verify that the restored AD is working properly Install a new server as the Azure Backup Server Join the new Azure Backup Server to the restored domain Install Azure Backup Server and connect it to the Azure Backup vault Restore the DPM database Start restoring everything else according to your DR plan&lt;/ul&gt; Greetings"
        },
        {
          "id": "post-lost-found-nano-server-github-psgallery-pester",
          "title": "lost & found: Nano Server, GitHub, PSGallery, Pester",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "en, PowerShell",
          "url": "/post/lost-found-nano-server-github-psgallery-pester/",
          "content": "Nano Server status update\nIt would be about time for the next post in the series about hyper-converged-infrastructure with Nano Server. Over the past few days I deployed Nano on some real hardware and I can't wait to share my findings. But, unfortunately I'm facing a few issues, probably related to hardware, with the lab servers and I didn't have a lot of time to investigate further. As TP5 should be out any day now, I decided to wait for that before wasting too much time. \nGitHub\nIn the meantime I have started to move some of my PowerShell scripts to GitHub for source control and publish them to the PowerShell Gallery for easy installation. I thought it might be interesting to share my process, so here we go.\nFirst of all, I’m not your typical developer, so I had a general idea about source control and I knew GitHub existed but never really used it, much less with PowerShell. The ongoing discussions about Continuous Integration and DevOps and what not, sparked my interest and so I decided to give it a try. The benefits of putting scripts under version control are obvious, the more you commit, the more history you get and the easier it gets to track code changes and errors. Additionally I really enjoy the community that has formed around PowerShell and publishing code to GitHub is one of many ways to contribute and give back to said community.\nShould you like to get started with git and don’t now where to start, this article helped me a lot when setting it up on my machines.\nAnd you can find my stuff at: https://github.com/tomtorggler\nPowerShell Gallery\nIn case you didn’t know, Windows 10 (actually WMF5) comes with package management, yes that’s right, kind of like you know it from Linux or OSX. OneGet was introduced a while ago and eventually evolved into the PackageManagement module that is now included in WMF5. The PSGallery is already configured as a PackageSource and can therefore be used right away. Just try Find-Script or Find-Module and install whatever you find interesting with Install-Script or Install-Module. Now anyone can publish scripts to this PSGallery thing, which is exactly what I did with Invoke-SEFAUtil.ps1 and Restore-VMPermission.ps1.\nOther Package Sources can obviously be added, find out more at: https://msdn.microsoft.com/en-us/powershell/wmf/oneget_cmdlets\nPester\nAlong with the move to GitHub I started to write some Unit Tests for my code. So what does that mean? Well I told you, I’m not your typical developer so I’m still figuring this thing out :) The basic idea of unit testing is to write additional code that tests your code automatically. So when you change something in a script, you run the tests and if everything is green, the script is ready to go into production. \nPester is a unit testing framework for PowerShell, that can be used to achieve exactly that. Once I have found out enough to explain it in a better way, there might be a dedicated post :)\n&nbsp;\nWith that, have a great weekend!\nTom"
        },
        {
          "id": "post-azure-storage-explorer",
          "title": "Azure Storage Explorer, the easy way to manage your storage",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure",
          "url": "/post/azure-storage-explorer/",
          "content": "Today I gave a try to the new Azure Storage Explorer. Its actually in preview but already amazing. You can download the Explorer from the official website.\nWhen you open Azure Storage Explorer the first time the program asks for an subscription:\n\nAfter you specify username and password you are able to see your storage accounts.\n\nWithin the explorer you can manage all of your Azure Storage Accounts, copy Blob containers, delete VHD’s or copy them to another location and much more:\n&nbsp;&lt;/p&gt; &lt;/code&gt; Give it a tryGreetings"
        },
        {
          "id": "post-azure-backup-part-two",
          "title": "Azure Backup - Part Two",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure",
          "url": "/post/azure-backup-part-two/",
          "content": "Let’s focus on Option 1 the direct Azure VM Backup:\nThe Backup Tasks\nWe are now going to Backup an Azure VM from the Web interface. First of all, you have to start a discovery search.\n\n\nWhen the discovery search is completed you can select the VM you want to Backup. Keep in mind: Today it’s not possible to Backup VM’s that's located on the Azure premium storage (SSD) or VM’s in created with the Resource Manager model.  The next step is to create a Backup policy. You can have a single policy that works for all servers or multiple policies with different settings regarding Backup Windows and retention period. This step should be known from other Backup solutions.  On the retention range page you specify how long protected VM’s are kept.  We have created the Backup policy and can now assign it to our VM. From now a VM Backup will be started on a daily basis. Lets restore a VM To restore a VM you basically highlight the VM in the Backup Vault and select the Restore function.   After you selected the restore point you want to restore, the wizard asks you some information. This step is important because you can specify the name and VNET the VM will belong to. Be careful to not place you restores VM in the same Network as the productive one as this is only a test.   A nice log shows the progress and result of the restore request.  When the restore is done a new VM with the specified name is visible in the Virtual Machine section of Azure. We can start this VM, restore our files or put the VM into production if this was a real restore. Greetings"
        },
        {
          "id": "post-azure-backup-part-one",
          "title": "Azure Backup - Part One",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure, en",
          "url": "/post/azure-backup-part-one/",
          "content": "On Azure you can choose basically between two different Backup Options:\n1. Direct Backup Azure VM to Backup Vault2. Backup Applications like SQL, Sharepoint… and Files, System State through Microsoft Azure Backup Server\nToday I will give you a short overview of the service.  &lt;/a&gt; Prerequisites - Backup Vault: First of all you have to create a Backup Vault (Thomas described this already in a former post)- If you use Microsoft Azure Backup Server a Internet Connection is needed Costs The costs are counted by instance and space used. An instance is either a Azure VM Server using Backup Option 1 or a Server to Backup specified with Microsoft Azure Backup Server using Option 2. (Price table from 12.2015)  When you create the Backup Vault you can choose between LRS or GRS. This can only be specified at the beginning.If you started already some Backups the GRS storage cannot be switched to LRS anymore. You have to recreate the backup vault.   &nbsp; For the Backup Data Azure Block Blob Storage is used. The costs can be seen from the following price table from 12.2015  &nbsp; In Part 2 I create a Backup Plan for some Azure VM’s and restore a Test-VMPart 3 covers a OnPrem Backup using Option 2 with Microsoft Azure Backup Server. I make a full Backup and full restore assuming the VM’s don’t exist anymore. Greetings"
        },
        {
          "id": "post-hyper-convergence-with-nano-server-part-3",
          "title": "Hyper-Convergence with Nano Server: Part 3",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, en",
          "url": "/post/hyper-convergence-with-nano-server-part-3/",
          "content": "In this post we are going to configure the Hyper-V part of our hyper-converged Nano-Server-Cluster. We already deployed the VMs in part 1 an configured Storage Spaces Direct in part 2.\n\nHyper-V\nWhen creating the Nano Server VHD files, I installed the Hyper-V role by selecting the –Compute parameter. As we have already created the cluster and the virtual disk, we could simply go ahead and create VMs now. \nBefore doing that, I wanted to configure the Hyper-V Servers to&nbsp; store VM configurations and VHD files on the Cluster Shared Volume and I created a virtual Switch that can be used by the VMs:\n\nAs you can see, I’m using the $cimSessions variable from part 1 again. This variable contains CIM Sessions to my four Nano Servers, so that the above lines do configure all servers at once. Here’s how I’ve created those sessions: \n$cimSessions = New-CimSession -ComputerName n01,n02,n03,n04\n\nVMs\nNow we are ready to create the VMs and add them to the cluster. I copied the “win2012r2.vhdx” file over to the ClusterStorage and used this as a parent disk for my VMs: \n\nThat was pretty easy, so lets have a look at what our current environment looks like in the Failover Cluster Manager.\n\nWe see all the VMs that were added to the cluster and we can go ahead and move them around between nodes using the Failover Cluster Manager. The same goes for the “nodes”, we see all four Nano Servers participating in the cluster and we can control the nodes status:\n\nIn the storage folder of the FCM we see the virtual disk and some information about health status and capacity:\n\n&nbsp;\nOk, that is pretty basic stuff if you just look at the Hyper-V part. The interesting point however, is that those same servers do also provide the shared storage that the hypervisors use.\nStay tuned for more \nTom"
        },
        {
          "id": "post-hyper-convergence-with-nano-server-part-2",
          "title": "Hyper-Convergence with Nano Server: Part 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, en",
          "url": "/post/hyper-convergence-with-nano-server-part-2/",
          "content": "In this post, we build on the Nano Servers that were set-up in the part one, we are going to create a Failover Cluster and enable Storage Spaces Direct.\n\nCluster Network\nWhen creating the Nano Server vhd files, I did add the package for failover clustering by using the –Clustering parameter of New-NanoServerImage. So now that the servers are running, I can use remote server management tools or PowerShell to create a cluster. \nBut, before doing that, I went ahead and configured the second network adapter with static IP addressing. Remember that I created the Nano VMs with two network adapters, one connected to my lab network – where DHCP provides addressing – the other connected to an internal vSwitch, as it’ll be used for cluster communication only.\n\nFailover Cluster\nBefore creating a cluster I run the “Cluster Validation Wizard” to make sure my configuration checks out. We could run that wizard using the GUI tools or using the following line of PowerShell:\nTest-Cluster –Node n01,n02,n03,n04&nbsp; –Include “Storage Spaces Direct”,Inventory,Network,”System Configuration”\nSome summary information as well as the location of the html report will be printed to the screen. In the report we can actually see the results of the tests that were run. Problems are pointed out and some level of detail is provided.\n\nThe only warning I got was the following: Failed to get SCSI page 83h VPD descriptors for physical disk 2. This was because my VMs originally used the default “LSI Logic SAS” controller for the OS disk, while the additional, 100GB disks were connected to the SATA Controller. To fix this, I did connect the OS disk to the SATA Controller as well.\nAll green, so we can go ahead and create the cluster:\nNew-Cluster -Name hc01 -Node n01,n02,n03,n04 –NoStorage\nThis will create another html report at a temporary location, the path will again be printed to the screen. My cluster has an even number of nodes, so I decided to use a File Share Witness. Using the following commands, I created a quick share on my management server (tp4):\nNew-Item -ItemType Directory -Path c:\\hc01witness New-FileShare -Name hc01witness -RelativePathName hc01witness -SourceVolume (Get-Volume c) -FileServerFriendlyName tp4Get-FileShare -Name hc01witness | Grant-FileShareAccess -AccountName everyone -AccessRight Full\nAfter that, I used the following to update the cluster quorum configuration:\nSet-ClusterQuorum -Cluster hc01 -FileShareWitness \\\\tp4.vdi.local\\hc01witness \nStorage Spaces Direct\nAt this point, we have a running cluster and we can go ahead and configure storage spaces.\n\nBut again, before doing that, I want to point something out. If we open the Failover Cluster Manager at this point, we can connect to the cluster just as we are used to. If we expand the “Storage” folder in the newly created cluster, we can see there are no Disks, no Pools and no Enclosures present at this time.\nUsing the following command, I enabled storage spaces direct for the cluster:\nEnable-ClusterS2D -S2DCacheMode Disabled -Cluster hc01\nAnd using the following command, I create a new storage pool using the “Clustered Windows Storage” subsystem:\n\nIf we go back to the Failover Cluster Manager after the above steps, we can see that now there is a Pool as well as four Enclosures, one representing each server:\n\nOk, so far it is looking quite good, and we can go ahead an create a volume (or virtual disk):\n\nOur new virtual disk will automatically be added to the Cluster Shared volumes, we can verify that using:\nGet-ClusterSharedVolume -Cluster hc01\nAlright, we are getting close. In the next post, we are going to configure the Hyper-V roles and create some virtual machines. Sounds great? Stay tuned :)\n&nbsp;\nCheers,Tom"
        },
        {
          "id": "post-azure-file-services",
          "title": "Azure File Services",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure",
          "url": "/post/azure-file-services/",
          "content": "Today I mapped an Azure File Share to my local computer  First you have to create a Storage account and a File Service\n\nWithin the Webinterface you can create folders and upload files\n\nWhen you click on “Connect” you can get the commands to map the volume. Its basically a normal Network drive.\n\nThe access key can be taken from the Settings / Key section\n\nIf you execute the command or simply mount the network volume you have the Azure File Service connected as Volume.\nGreetingsdn"
        },
        {
          "id": "post-re-register-azure-mfa-server",
          "title": "Re-register Azure MFA Server",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Azure",
          "url": "/post/re-register-azure-mfa-server/",
          "content": "If you also installed the Azure MFA Server with a MSDN Subscription and now want to switch to another subscription without re-installing the Server, you have to do the following. (Please keep in mind you loose all the settings you made within the MFA console)\n Export your users Make some screenshots of you configuration (Radius, Company settings ect..) Make a Backup of this folder: C:\\Program Files\\Multi-Factor Authentication Server\\Data Stop the service “MultiFactorAuthSvc” Delete the folders content Start the service “MultiFactorAuthSvc” When you open the console the registration wizards starts and you can register the server with another subscription\nGreetings"
        },
        {
          "id": "post-hyper-convergence-with-nano-server-part-1",
          "title": "Hyper-Convergence with Nano Server: Part 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server",
          "url": "/post/hyper-convergence-with-nano-server-part-1/",
          "content": "In this post I’m walking through the steps creating the images for my Nano Servers and then deploying them. Like in this post, I’ll use WDS for the deployment, so some steps might already be familiar.\n\n\n\nCreate Nano Server Images\n\nI installed a Windows 2016 TP4 Server with full desktop experience that serves as DHCP, WDS and management machine. I’ll run all of the scripts from there, you might as well use Windows 10 for it. So the first step is to create a new image, which is really quite similar as described in the post mentioned above.\n\nWhat’s different, is that I’m creating an image for each node and I’m using the DominBlobPath parameter, so before creating the images, I have to harvest the blobs using “djoin.exe”. My servers are going to be named n01 trough n04, so I’m using a little foreach loop to get all four blobs and build the four images:\n\n\n\nAs noted in the intro post to this series, I’m running the first version of this lab on virtual machines, as I’m using ESXi as hypervisor, I needed to add the OEMDrivers as well as drivers for vmxnet3 NICs to the image. Those vmxnet3 drivers are located at DriversPath. I do also add Compute, Storage and Clustering packages, as we need them to provide Hyper-V and Storage Spaces Direct.\n\nDo note that the boot image needs to include drivers for vmxnet3 as well, they can be added using the WDS admin console quite easily.\n\nOnce the images are created, we need to import them into WDS.\n\nImport into WDS\n\nAgain, I’m going to use the foreach loop to import all VHD files as WDS install images:\n\n\n\nNow we are ready to create the Nano Server VMs and deploy from WDS.\n\nVMs\nI create four VMs with the following specs on my lab ESXi host:\n\nNumCPU = 2;\nMemoryGB = 16;\nDiskGB = 20;\nDiskStorageFormat = 'Thin';\nGuestID = 'windows9Server64Guest'\n\n\nThen I remove the default NIC and add two of the Type ‘vmxnet3’ and make sure they are connected at startup. Finally, I add two hard disks to the VMs:\n\nStorageFormat = 'Thin';\nCapacityGB = 100;\nDiskType = 'Flat'\n\n\nOnce again, please note that I had to use the SATA controller for these data disks, using default LSA or even the VMware paravirtual controllers, resulted in the following error in the Cluster Validation Wizard:\n\n\n  Disk partition style is GPT. Disk has a Microsoft Reserved Partition. Disk type is BASIC. The required inquiry data (SCSI page 83h VPD descriptor) was reported as not being supported.\n\n\nUsing a SATA controller, and attaching the hard disks to that controller, solved the problem.\n\nTo install the Nano Servers, all I need to do now, is to boot the VMs, press F12 and select the right image on the Windows Deployment Service. About a minute later my server is ready :)\n\nYes, I did also create the VMs with PowerShell, look for a post on that soon…ish.\n\nVerify VMs\n\nOnce the VMs are installed, I create a CIM session and test connectivity by getting the system uptime like this. As all commands above, these are issued on my management machine (tp4):"
        },
        {
          "id": "post-install-office-web-apps-server-2013-on-server-2012-r2",
          "title": "Install Office Web Apps Server 2013 on Server 2012 R2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server",
          "url": "/post/install-office-web-apps-server-2013-on-server-2012-r2/",
          "content": "A quick hint about installing WAC Server. As it happens, Office Web Apps Server&nbsp;2013&nbsp;only added support for 2012R2 with SP1, and even though SP1 is about 3x the file size of RTM, you cannot install it without RTM;&nbsp;RTM setup fails and that’s where I found myself this morning. Copy SP1 files to ‘updates’ folder Download the service pack 1 for WAC Server from this link: http://go.microsoft.com/fwlink/p/?LinkId=510097 Then extract the service pack using /extract to a folder on the disk. Like this:  wacserversp2013-kb2880558-fullfile-x64-glb.exe /extract:C:\\temp\\wacsp1 Now copy all the extracted files into the “updates” folder of the RTM install files. Once the updates are there, RTM setup works on 2012R2 and automatically installs SP1, too. Note: Make sure to follow other requirements, as listed on TechNet Enjoy, Tom"
        },
        {
          "id": "post-hyper-convergence-with-nano-server-intro",
          "title": "Hyper-Convergence with Nano Server: Intro",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server",
          "url": "/post/hyper-convergence-with-nano-server-intro/",
          "content": "This is the first post of a series about building a hyper-converged solution with Nano Server in Windows Server 2016 Tech Preview 4. Over the next weeks, I’m going to cover the following parts of my journey:   building the nano servers  creating a cluster and setting up storage spaces direct  bringing in hyper-v  testing and breaking stuff&lt;/ul&gt;   Hyper…what? Before we get started, my quick introduction to hyper-converged, just in case you’ve never heard about it. The basic idea is to bring storage closer to the CPU and so minimize delay. This is achieved by creating groups of servers with local discs and, through the magic of software, pool all the disks into volumes that span the entire group. Such a solution does offer some benefits when we think about scale: adding nodes to the cluster gives you more storage as well as more processor/memory capacity. Obviously we will also see some interesting problems introduced by the complexity of said solutions where troubleshooting will require a great deal of knowledge in multiple fields. While in the old days we had storage, network and compute as cleanly separated silos, hyper-convergence brings all of that together.  So, what I’m going to build and test in this lab is cluster of four Nano Servers running Storage Spaces Direct as well as Hyper-V. The local disks of all Nano Servers will be used to create a virtual disk, that will then be used to store the virtual machines.   Building blocks In the first parts of the series I will build the solution using virtual machines, it’s all about proof-of-concept and learning the basics before getting access to lab equipment. Later I’d like to apply the topics and test the setup on actual hardware, measuring performance data and pulling some disks :)  The requirements for my lab are quite simple, I need an Active Directory domain, one 2016 TP4 Server where I can build and deploy the Nano Server images and later manage the cluster, and four VMs that will be running Nano Server.  DC01: Domain Controller, DNS, Certificate Authority  TP4: DHCP Server, Windows Deployment Services  N01..4: Nano Servers&lt;/ul&gt; I took to visio for a quick diagram, kindly think of the database symbols as disks:  So in the first post of the series, I’m going to build the Nano Server images and deploy them to my virtual machines using Windows Deployment Services. &nbsp; so long,Tom"
        },
        {
          "id": "post-lost-found-onyx",
          "title": "lost & found: Onyx",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "",
          "url": "/post/lost-found-onyx/",
          "content": "Another version of lost and found, another fling I’d like to share: \n&nbsp;\nhttps://labs.vmware.com/flings/onyx"
        },
        {
          "id": "post-happy-holidays-and-some-numbers",
          "title": "Happy holidays and some numbers",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en",
          "url": "/post/happy-holidays-and-some-numbers/",
          "content": "It’s this time of the year again, everybody is trying to relax a bit and maybe making some plans for the coming year. Well at least that’s what I’m up to these days.\nNumbers\nI thought this would be a good opportunity to share some statistics of our blog. So a little more than a year ago, we moved to azure and cloudflare, I took the following numbers mostly from cloudflare.\nWe are blogging here since July 2009, that’s almost six and a half years or around 2350 days. wow.\nIn this time, we produced 250 posts, some in german, some in english. Even though there have been some times with lower activity, that’s still about one post every 10 days.\nAll of this started over a few beers, and neither of us would have thought that it might last this long. Yet here we are, making plans for 2016 and beyond.\nNow according to cloudflare around&nbsp;8000 unique visitors are stopping by our little site each month, around 300 every single day. Not really mind-blowing, but also not bad.\nGreetings \nWith that said, we’d like to wish all of you a happy new year and we do certainly hope to see you around.\n&nbsp;\nCheers, Tom"
        },
        {
          "id": "post-lost-found-openlivewriter-rackhd-ehc-diskspd",
          "title": "lost & found: OpenLiveWriter, RackHD, EHC, diskspd",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "Client, en, Server, VMware",
          "url": "/post/lost-found-openlivewriter-rackhd-ehc-diskspd/",
          "content": "Another quick and dirty edition of “lost &amp; found”, just sharing stuff that I thought is interesting. \nOpen Live Writer\nSo this is the first post published (and written) using the open-sourced version of Live Writer. I always liked Live Writer, so I am very happy to have it back. More info at Github: https://github.com/OpenLiveWriter/OpenLiveWriter\nEMC RackHD\nAnother open source project I stumbled upon the other day is RackHD from EMC {code}. This comes a vendor independent management and orchestration solution for the datacenter. Now I know, that sounds a lot like everything and nothing but why not have a look: http://blog.emccode.com/2015/12/08/introducing-rackhd-automate-bare-metal/\nVMware Embedded Host Client\nThis is especially awesome for the MAC users out there, as you no longer need a Windows VM to run the C# vSphere Client. So you simply install a VIB package on your ESXi (lab) servers and point your browser to https://hostname/ui to manage the host. More Info: https://labs.vmware.com/flings/esxi-embedded-host-client\nInstallation is simple and doesn’t require a reboot.\nesxcli software vib install -v /tmp/esxui-signed.vib\nThe same is true for removal:  esxcli software vib remove -n esx-ui And a quick look at what you’ll get.  DiskSpd Heard of SQLIO? Meet it’s sequel, DiskSpd. A handy little tool that generates synthetic workload to help asses storage performance. There is a good post on TechNet going into quite a bit of detail. Get the tool and documentation in the TechNet Gallery. &nbsp; Thats all for tonight, so long Tom"
        },
        {
          "id": "post-domain-joining-the-vcenter-server-appliance-6",
          "title": "Domain-joining the vCenter Server Appliance 6",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server, VMware",
          "url": "/post/domain-joining-the-vcenter-server-appliance-6/",
          "content": "In this post, we started out by deploying the VCSA to a new environment, today we'll see how to join the VCSA to an Active Directory domain and authenticate using domain accounts.\n\n&nbsp;\n&nbsp;\nPrepare\n\nTo join a domain we need the distinguished name of the organizational unit where we want the VCSA's computer object to be created, as well as an account with the required permissions to join a machine to the domain.\n\nTo get the DN use your tool of choice, like PowerShell: \n\nGet-ADOrganizationalUnit -Filter {Name -like \"servers\"} | Select-Object -ExpandProperty DistinguishedName \n\n&nbsp;\n&nbsp;\nBefore joining the vCenter Server Appliance to the domain, make sure DNS is working perfectly, that includes reverse lookup.\n\n&nbsp;\n&nbsp;\nJoin\n\nNow sign-in to the vCenter using the local SSO domain created during setup and go to Administration/System Configuration/Nodes. Select the VCSA from the list of Nodes and in the right pane, go to Manage/Active Directory and click the \"Join\" button on the right.\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\nSpecify the domain name and DN of the organizational unit as well as the credentials to use.\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nAfter joining the domain, a restart is required. To perform a restart, either use SSH or use the \"Reboot\" button in the \"Actions\" menu.\n\n&nbsp;\n&nbsp;\nOnce the VCSA is restarted we can see that a Computer object has been created in AD. Now we log-in again, still using the local account, and go to Administration/Configuration where we select \"Identity Sources\" in the right pane, using the \"+\" button, add a new Identity Source. \n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nConfigure Permissions\n\nOnce the Identity Source has been added, we can configure roles and permissions for AD accounts. This can be done using Administration/Global Permissions. Using the \"+\" button, we assign an AD user or group to a vCenter Role.\n\n\n&nbsp;&nbsp;\nAlternatively, we can add AD users or groups to the preconfigured groups that can be found in the \"Single Sign-On\" section of the Administration menu.\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nVerify \n\nFinally we can log-out of the local admin account and log-in using our AD user, which should be able to access resources, as specified by the assigned roles. Note: Users with no assigned roles will also be able to log-in, obviously they won't see any objects.\n\n&nbsp;\n&nbsp;\nTroubleshoot\n\nNow if some of the steps don't work, for example you cannot log-in or you cannot access AD users or groups in the configuration, double-check DNS and have a look at the following log files:\n\n/var/log/vmware/sso/vmware-sts-idmd.log&nbsp;\n\n/storage/log/vmware/sso/ssoAdminServer.log\n\n\n&nbsp;\nI got \"Cannot load the users for the selected domain\" in the Web Client and found the &nbsp;following lines in the above mentioned logs:\n\n\n&nbsp;\nFailed to get non-GC connection to domain\n\ncom.vmware.identity.idm.IDMException: Failed to establish server connection"
        },
        {
          "id": "post-azure-backup-restore",
          "title": "Azure Backup: Restore",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Cloud, de",
          "url": "/post/azure-backup-restore/",
          "content": "In diesem Post habe ich beschrieben, wie man Daten mit Azure Backup sichert, nun wollen wir diese wiederherstellen.\n\n&nbsp;\n&nbsp;\nBackup Agent\n\nDie Wiederherstellung wird über den Azure Backup Agent gestartet, im ersten Schritt wählt man aus, welcher Server wiederhergestellt werden soll.\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nAnschließend werden die wiederherzustellenden Dateien über die Suche oder einen Filesystem Browser ausgewählt. \n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nWie üblich kann man die Dateien am ursprünglichen Ort wiederherstellen, oder einen anderen Pfad angeben. Außerdem kann ausgewählt werden, ob die Berechtigungen (ACL) wiederhergestellt werden sollen. \n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nNach der Bestätigung wird der Wiederherstellungsprozess gestartet, dieser wird auch im Azure Portal angezeigt und protokolliert.\n\n\n&nbsp;\nWeitere Infos und Doku: https://azure.microsoft.com/en-us/documentation/services/backup/"
        },
        {
          "id": "post-installing-nano-server-using-wds-and-pxe",
          "title": "Installing Nano Server using WDS and PxE ",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server",
          "url": "/post/installing-nano-server-using-wds-and-pxe/",
          "content": "Technical Preview 4 of Windows Server 2016 brings along new \"packages\" for Nano Server, it can now run DNS and IIS along other roles. See TechNet for a complete list. So to get started with Nano, I tried to deploy it via WDS.\n\n&nbsp;\n&nbsp;\nPrepare\n\nNano Server is not installed like other editions of Windows Server, one has to build a customized image with the roles and packages one needs. This underscores the very nature of Nano Server, being a minimal install with minimal overhead.\n\nNow to create this image we have to mount the Windows 2016 TP4 ISO on our workstation. In the NanoServer folder right at the root of the ISO, we find the .wim along with two PowerShell scripts. There is quite a detailed guide available on TechNet so I am not going into to much detail here:\n\n&nbsp;\n&nbsp;\nFirst import the Module: \n\nipmo .\\NanoServerImageGenerator.psm1\n\n&nbsp;\n&nbsp;\nAs I ran the New-NanoServerImage cmdlet before, it already converted the WIM to VHD (that's the VHD you'll find at the \"BasePath\") so I can omit \"MediaPath\" for subsequent runs and save a little time:\n\n&nbsp;\n&nbsp;\nNew-NanoServerImage -BasePath C:\\nanotemp -TargetPath C:\\Nano\\Nano_dns.vhd -OEMDrivers -Packages Microsoft-NanoServer-DNS-Package -ComputerName nano_dns -DomainName tomt.it -Language en-us\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nNote: I had to specify the Language parameter as I my system is not using en-us. I am planning to run the VHD on VMware, that's why I included \"OEMDrivers\" and not \"GuestDrivers\".\n\n&nbsp;\n&nbsp;\nWDS \n\nThe steps above created a VHD at the target path and in the next step I am adding this VHD as an install image to WDS:\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nI changed the name to avoid confusion :)\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nThe same can be achieved using PowerShell:\n\n&nbsp;\n&nbsp;\nImport-WdsInstallImage -Path C:\\nano\\Nano_dns.vhd -NewImageName \"Nano_dns_10.0.10586\"\n\n&nbsp;\n&nbsp;\nThat's basically it, now we have to create a new VM an pxe-boot from the WDS.\n\n&nbsp;\n&nbsp;\nInstall\n\nI created a new VM using the \"Windows 2016\" template in Fusion, but before installing I reduced the size of the new virtual disk to 10G, which still is way to much ;)\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nVery few miutes later our new DNS server is ready.\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nThere is nothing really to be done on the server console, the \"Emergency Console\" can be used to configure networking, the rest is done with RSAT or PowerShell remoting.\n\n&nbsp;\n&nbsp;\nDNS\n\nTo test the functionality of my newest Nano Server, I actually set up DNS:\n\n&nbsp;\n&nbsp;\nSo first of all, using Get-WindowsFeature I checked which features were installed and which ones were available. As you can see from the screenshot, there are not very many features available:\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\nUsing the following command, I installed DNS Server role: \n\nAdd-WindowsFeature -ComputerName nano_dns -Name DNS\n\n&nbsp;\n&nbsp;\nAfter that, I was able to add the Server to the DNS Management console and configure DNS zones:\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\nOh, and of those of you who care, the size of the virtual harddisk is 626,6MB. Awesome, right? :)\n\n&nbsp;\n&nbsp;\n\n\t\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\nEnjoy, Tom"
        },
        {
          "id": "post-lost-found-tp4-th2-win32-openssh-vs-code",
          "title": "lost & found: TP4, TH2, Win32-OpenSSH, VS Code",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "Client, en, Server",
          "url": "/post/lost-found-tp4-th2-win32-openssh-vs-code/",
          "content": "Tech Preview 4\n\nThe latest preview of Windows Server 2016 has been released, it brings many new features including options for Containers and Nano Server.\n\nDownload it from the Evaluation Center: http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview\n\t\nWindows 10 1511\n\nAka. Threshold 2 was released, pulled, and re-released, apparently because of some privacy settings. Windows Insiders got it a little earlier and so it landed on my Surface Pro 3. It leaves much more of a stable impression than \"RTM\" and fixed most of the problems I had.\n\nOpenSSH comes to Windows\n\nYes, that's right, some folks at Microsoft heard the calls and started a project on GitHub, aiming to bring OpenSSH to the Windows-world. The wiki page at GitHub has some info about installing, which is quite simple:\n\nOnce downloaded, run the following commands from an administrative PowerShell:\n\nExpand-Archive .\\OpenSSH-Win32.zip\n\ncd .\\OpenSSH-Win32\\OpenSSH-Win32\\\n\n.\\ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key\n\n.\\sshd.exe install\n\nStart-Service sshd\n\nAnd don't forget to create a firewall rule: \n\nNew-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH\n\nThen I was able to connect from my MacBook: \n\n\n\t\nFind more info, a wiki and the download over at GitHub: https://github.com/PowerShell/Win32-OpenSSH\n\t\nVisual Studio Code\n\nA free, cross platform code editor with interesting language support.\n\nhttps://code.visualstudio.com\n\t\n\n&nbsp;\nHave fun,\n\nTom"
        },
        {
          "id": "post-getting-started-with-vcenter-server-appliance-6",
          "title": "Getting started with vCenter Server Appliance 6",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server, VMware",
          "url": "/post/getting-started-with-vcenter-server-appliance-6/",
          "content": "So I’ve done some work with VMware in the past and even got certified on vSphere 4, but then I changed jobs and ended up working, almost exclusively, with Microsoft software. That included a little bit of Hyper-V but mostly I worked “higher up” in the stack, with applications like Exchange and Lync, that is. As I changed jobs again and find myself focusing on Datacenter technologies now, I decided it was time to reactivate some VMware skills and get to know the latest version.\nI deployed a vCenter Server Appliance in a new environment the other day, and thought it might be a good starting point.\nPrepare\nYou may have heard that VMware want’s to ditch the good ol’ vSphere client and switch to a Web Client kind of a thing, this has been going on for a while, but in every release they are getting more serious about it. New features almost always come “web only”. Unfortunately they decided to make this a flash-based client, yeah, it’s almost as bad as java, but that’s another story.\nSo get yourself a machine with a web browser and install/enable the flash plugin. I had troubles with Safari, Chrome and IE11 so I ended up using Firefox (think about that for a sec…).&nbsp;\n\nDownload the VCSA from vmware.com, it comes as an ISO image that you will have to mount on your management machine. The idea is, basically, to use a website to deploy an OVF template to one of your vSphere hosts.\nInstall&nbsp;\nInside the ISO you’ll find the Web Client Plugin, which is required to deploy the OVF template, it’s located at: \\vcsa\\VMware-ClientIntegrationPlugin-6.0.0.exe\nOnce the Client Plugin has been installed, open the \\vcsa-setup.html file and follow the wizard.\n\nMost steps are straightforward, first select the target ESXi host and configure the VM name and a password for the root account.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThen select how the Platform Services Controller is deployed. As far a I know, this is a new role in vCenter 6, which controls Licensing, SSO and Certificates. I selected to deploy an embedded PSC.\n&nbsp;\n\n\nThe next step is to configure Single Sign-On. In my case I created a new SSO domain, as this was the first vCenter Server in the environment. Remember the “SSO Domain name” you use, it will be required to log on later. The SSO domain name must be different than the Active Directory domain name.&nbsp;\n\n\n\n\nNote: Make sure to check documentation when upgrading an existing vCenter, as the SSO configuration has changed quite a bit.\n\n\n\nSelect an appliance size and which datastore to use for the VCSA appliance.\nFinally you can configure network settings. When entering a FQDN for the vCenter appliance, make sure it is already configured in DNS and the VCSA can reach the DNS server you specify. Deployment will fail if DNS doesn’t check out. As I had no NTP Server handy, I selected to synchronise the VCSA’s time with the ESXi host. And no, I would not recommend this.\n\nNow after the deployment of the OVF finishes, we should be able to logon to the vSphere Web Client using a browser, or to the classic vSphere Client installed on Windows. Make sure to logon using the administrator@ssodomain account, you wont be able to do much configuration as root!\n\nStay tuned for more :)\nTom"
        },
        {
          "id": "post-netscaler-as-adfs-proxy",
          "title": "Netscaler as ADFS Proxy",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "ADFS, Citrix, en",
          "url": "/post/netscaler-as-adfs-proxy/",
          "content": "I decided to use Netscaler to publish my ADFS server to the internet instead of a dedicated server in the DMZ. I checked several blogs and the official Citrix documentation but this looked overloaded. \nCitrix documentation: NetScaler as ADFS Proxy Deployment Guide - CitrixBlogs: http://blogs.citrix.com/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/, http://cividan.blogspot.it/2015/02/use-citrix-netscaler-as-replacement-for.html\nSo I searched a way to:\n- Publish ADFS to the Internet with URL filter- Do not pre-authenticate with Netscaler (Customizing multiple pre-authentication Websites can be very time consuming per tenant)- Modify the Header that ADFS server understands the request comes from external\nThere was no blog post that explained the whole configuration, so I decided to write down the required steps:\n1. The service\nFirst create the service and specify to forward the Client IP (Header: X-MS-Forwarded-Client-IP)\n\n&nbsp;\n2. The vServer&nbsp;\nCreate the vServer not directly addressable to not trash an IP address and bind the certificate\n\n3. Content switch policy\nCreate a content switch policy to forward only /adfs and the exact hostname to the vServer\n\n4. Content Switch vServer\nCreate the content switch vServer and apply the content switch policy\n\n5. Rewrite Actions\nYou want to let the ADFS know that the request comes from extranet. So you can apply different authentication methods in the different zones. You have to add the header X-MS-Proxy to the request. Therefore you create a rewrite action\n\nCreate also a rewrite action to rewrite URL /mex \n\n6. Rewrite Policy\n\n\n7. Bind the Policies\nNow bind the policies to the vServer. Both are rewrite policies for requests. Be careful with the GoTo expression to the Header transformation, this must be “NEXT”\n\n8. The Monitor\nADFS has a probe check build in. If you check /adfs/probe you get a 200 message if everything is OK. Create the monitor and add it to the service\n    &lt;p&gt;&lt;a href=\"/assets/archive/image_684.png\"&gt;&lt;img width=\"265\" height=\"339\" title=\"image\" style=\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\" alt=\"image\" src=\"/assets/archive/image_thumb_682.png\" border=\"0\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Netscaler configuration is done. You can test now the authentication if you access the URL &lt;a href=\"https://portal.office.com\"&gt;https://portal.office.com&lt;/a&gt; through Netscaler. Then you will be redirected to the ADFS website for authentication:&lt;/p&gt; &lt;p&gt;&lt;a href=\"/assets/archive/image_685.png\"&gt;&lt;img width=\"438\" height=\"156\" title=\"image\" style=\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\" alt=\"image\" src=\"/assets/archive/image_thumb_683.png\" border=\"0\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For internal requests use split DNS to forward the authentication directly to the ADFS server and not to the Netscaler ADFS proxy. So the Proxy Header is missing and your client will use internal authentication.&lt;/p&gt; &lt;p&gt;Stay tuned for my post series about configuring Exchange in Hybrid mode with Office 365.&lt;/p&gt; &lt;p&gt;Greetings&lt;br&gt;ND&lt;/p&gt;"
        },
        {
          "id": "post-azure-backup",
          "title": "Azure Backup",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Cloud, de",
          "url": "/post/azure-backup/",
          "content": "Seit einiger Zeit bieten die Recovery Services in Microsoft Azure die Möglichkeit, virtuelle Maschinen oder ganze Rechenzentren zu sichern. Das ist vor allem für Unternehmen interessant, die sich kein DR Rechenzentrum leisten können/wollen.\n\nMit Azure Backup gibt es dazu auch&nbsp;die Möglichkeit einzelne Server, Clients oder nur bestimmte Daten in die Cloud zu sichern. So kann jeder an den Luxus eines off-site Backups kommen. Im folgenden Beispiel konfiguriere ich Azure Backup für meinen Windows 10 Client.\n&nbsp;\nBackup Vault\n\nAls Grundvoraussetzung benötigt man natürlich eine Azure Subscription, hier kann man sich das Ganze im Free Trial anschauen: https://azure.microsoft.com/en-us/pricing/free-trial/\n&nbsp;\t\nIn der Subscription wird ein Backup Vault benötigt, dort werden die Backups gespeichert. Um ein Backup Vault zu erstellen, ist nach wie vor das \"alte\" Management Portal nötig, dieses erreicht man über: https://manage.windowsazure.com\n&nbsp;\t\nUnter New, Data Services, Recovery Services erstellt man das Backup Vault.\n\n\n\nEinmal angelegt muss man nur noch die \"Vault credentials\" herunterladen, diese findet man im Dashboard des neu angelegten Vaults.\n\n\n\nBackup Agent\n\nDer Backup Agent wird auf dem Client/Server installiert, welcher in das Azure Backup Vault gesichert werden soll. Der aktuelle Backup Agent kann hier heruntergeladen werden: http://aka.ms/azurebackup_agent\n&nbsp;\t\nEinmal installiert, kann man die lokale Maschine über \"Register Server\" hinzufügen, in dem Wizard werden die \"Vault Credentials\" importiert. Diese verwendet der Agent um das Vault zu finden und sich zu authentifizieren. \n\n\nDie Daten werden lokal verschlüsselt und über eine https Verbindung übertragen. Der Benutzer erstellt ein Kennwort für diese Verschlüsselung, die auch in der Cloud erhalten bleibt (at rest). Das Kennwort wird in einer Textdatei gespeichert und sollte sicher aufbewahrt werden.\n\n\n&nbsp;\t\nSobald der Client/Server registriert wurde, kann man das Backup konfigurieren. Im ersten Schritt wählt man die Daten aus, welche gesichert werden sollen.\n\n\n\t\t\n&lt;p&gt;Dann gibt man unter Backup Schedule\nand Retention Policy an, wann Backups erstellt werden sollen und wie diese\naufbewahrt werden.&lt;/p&gt;&lt;p&gt;\n \t&lt;/p&gt;&lt;p&gt;That’s it. Das Backup kann mit Backup Now gestartet werden, oder man wartet bis der geplante Task das erledigt.\n&lt;/p&gt;&lt;p&gt;\n \t&lt;/p&gt;&lt;p&gt;Kosten\n&lt;/p&gt;&lt;p&gt;Die Kosten für das Backup Vault können unter folgendem Link nachgelesen werden:\n&lt;/p&gt;&lt;p&gt;http://azure.microsoft.com/en-us/pricing/details/backup/\n \t&lt;/p&gt;"
        },
        {
          "id": "post-getting-started-with-osx",
          "title": "Getting started with OSX",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, en",
          "url": "/post/getting-started-with-osx/",
          "content": "Well yes, I am\nswitching to OSX on my work machine. I'm still using my Surface Pro 3 at home\nand for meetings, but my primary work computer will be a 13\" MacBook Pro\nfrom now on. As I had no experience whatsoever working with OSX, here are my\nnotes on getting started:\n\n&nbsp;\n\nGet\nOneNote\n\nOne of the most\nimportant productivity tools,\nfor me, is OneNote. Everything from screenshots, recipes, drafts, ideas,\nwriting, learning, to meeting notes goes there. I am simply not functional\nwithout it :) so just go to onenote.com and grab the latest version. It's free,\ntoo.\n\n&nbsp;\n\nGet\nBrew and Cask\n\nA package manager\nfor OSX, once installed you can easily install packages (including\ndependencies) just like this:\n\n$\nbrew search nmap\n\n$\nbrew install nmap\n\n&nbsp;\n\nAnd, importantly,\nupdating packages is straightforward to. No more updating all individual\napplications, just run (Caution: this will update all packages!):\n\n$\nbrew update &amp;&amp; brew upgrade \n\n&nbsp;\n\nSimple as that. Cask\nextends brew, and brings along many more packages.\n\n&nbsp;\n\nKeyboard\nshortcuts\n\nThis was really\nimportant for me, as I am using keyboard shortcuts a lot on windows. There is a\ngood list of possible shortcuts at apple.com.\n\nAnother important\npart, at least for me, in getting around in OSX are trackpad gestures. The most\nimportant can be found in the Trackpad section of \"System\nPreferences\".\n\n&nbsp;\n\nPython\n\nThere's no\nPowerShell on the Mac. Bummer. I decided to look into Python and found a couple\ngood sites for beginners.\n\n&nbsp;\n\nMore\ntools...\n\nI use KeePass on my\nWindows machines, a lot. There are multiple possible solutions on OSX, the one\nthat worked best for me is MacPass. It\nopens kdbx files and there is an autotype feature.\n\nAs I work a lot with\nconsole/command-line tools, a decent terminal emulator is key. A colleague\npointed me to iTerm2, and I love it :)\n\nAtom is a great, customizable text editor.\n\n&nbsp;\n\nWhat\nelse?\n\nAm I missing\nsomething, do you have any suggestions? Comments are highly appreciated :) \n\n&nbsp;\n\nLinksOneNote: http://onenote.comHomebrew: http://brew.shKeyboard Shortcuts: https://support.apple.com/en-us/HT201236Learn Python the\nhard way: http://learnpythonthehardway.org/book/Coursera: https://www.coursera.org/course/pythonlearnPython: https://docs.python.org/2/library/index.htmlMacPass: http://mstarke.github.io/MacPass/iTerm2: http://iterm2.com\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nAtom: https://atom.io"
        },
        {
          "id": "post-moving-on!",
          "title": "Moving on!",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de",
          "url": "/post/moving-on!/",
          "content": "Wie der Eine oder Andere vielleicht weiß, habe ich die vergangenen zwei Jahre in Paderborn verbracht. Dort durfte ich einige sehr spannende Projekte im Bereich Unified Communications umsetzen und konnte sowohl beruflich wie auch persönlich viel lernen. Ein großer Dank gilt hier meinem ehemaligen Arbeitgeber, meinen Vorgesetzten und den lieben Kollegen! ;)\n\nDer Ruf der Heimat (=Berge) wurde mit der Zeit immer lauter und so entschied ich mich Anfang des Jahres, wieder nach Südtirol zu gehen. Nachdem ich den Sommer für persönliche und kulturelle Weiterbildung (und viel Urlaub) genutzt habe, geht es für mich nun auch beruflich wieder weiter. Ich bleibe dem Leben als Dienstleister treu, freue mich aber sehr in einen neuen Bereich einzusteigen und somit meinen Horizont zu erweitern. In nächster Zeit geht es für mich weg von UC und hin zu Datacenter, Netzwerk und Storage.\nHier im Blog möchte ich, soweit es die Zeit zulässt, weiterhin&nbsp;aus der Praxis erzählen.\n\nBis bald!\nTom"
        },
        {
          "id": "post-how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you",
          "title": "How to prepare for Exchange 2013 PF migration and what the Microsoft Guide doesn’t tell you",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you/",
          "content": "I’m currently preparing my Exchange 2010 / 2013 environment for the public folder migration from 2010 to 2013. I created a test lab to simulate the migration before I do it on the productive servers. During the test migration I noticed some problems that have to been fixed before you get into the migration.\n1. Fix wrong aliases\nIf you have mail enabled folders with aliases containing special characters like spaces or “@” you get an error when you start the first migration part and Exchange wants to create the hierarchy.You can enumerate mailbox folders with, for example, spaces in aliases with the following query:\nGet-MailPublicFolder | where{$_.Name -match &quot; &quot;}\nIf you have just less than 10 folders to fix you can do it manually. But if you have more than 50 to correct you can use the script written by Johan Veldhuis (http://www.johanveldhuis.nl/tools/scripts/fix-aliasv20.ps1)\n2. Set the storage quota for the public folder mailboxes on 2013 to unlimited\nDuring migration, I recommend to set the storage quota for the public folder mailboxes to unlimited. I saw very strange problems with hierarchies on 2013 not comparing to 2010 if a folder is over quota. You can change the storage limit after migration is done.\n3. Set the legacy public folder – folder quota to unlimited\nDuring migration I had some problems with mail enabled public folders. On the 2010 side the PF are mail enabled, on the 2013 not all PF’s are mail enabled but the PF’s are able to receive mails. You cannot manage the folders with EAC or porwershell. In my case, this problem was related to a PF quota set on a folder. I have many folders with content that reached the maximum limit. For all of these folders the mail enabled option was not enabled after migration. I recommend setting the PF Quota on PF Database basis to unlimited before migration. Please keep in mind to set the quota for all folders to “use database defaults”. You can do this with the following line of powershell:\nGet-PublicFolder -Recurse | where{$_.UseDatabaseQuotaDefaults -eq $false} | Set-PublicFolder -UseDatabaseQuotaDefaults $true\nAdjust the new storage quotas later on a mailbox basis.\nGreeting   dn"
        },
        {
          "id": "post-netsh-trace-and-the-message-analyzer",
          "title": "netsh trace and the Message Analyzer",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Network, en",
          "url": "/post/netsh-trace-and-the-message-analyzer/",
          "content": "This is just a quick post about a cool feature of netsh and the successor to Microsoft’s NetMon.\nnetsh trace\nWith Windows 7 / Server 2008R2 and newer versions a cool feature has been added to netsh: the possibility to capture network traces without the need to install any third party software.\nAll you need to do is to start an elevated command prompt (run as Admin) and type the following command:\nnetsh trace start capture=yes\nThen do the stuff you want to capture and stop the trace by using:\nnetsh trace stop\nAn .etl trace will be generated and the file path is displayed.\n \nNote: if you use the persistent=yes parameter when starting the trace, you can even trace system reboots. \nMicrosoft Message Analyzer\nSo NetMon has been around for a while and IT pros around the world still love it, well at least I do ;) Some time ago, Microsoft introduced its successor, a tool by the name of “Message Analyzer”. This tool can to a lot more than just network traces, find some information on the MessageAnalyzer Blog.\nSo I just captured a trace using netsh, copied the .etl file to my machine and then opened it in Message Analyzer. As you can see in the screenshot, the layout is quite a bit different from what we’re used from NetMon but the important things are still there.\n \nFiltering is quite intuitive, either write an expression into the text box at the right-hand side, or load a filter from the library. Alternatively, just right-click a property of a packet and select “Add to Filter”\n \nWell that’s about all I know about Message Analyzer for now. I was able to verify that packets got tagged with the DSCP values I expected and I did not have to install additional software to capture a trace.\nHappy tracing,\nTom"
        },
        {
          "id": "post-considerations-when-planning-for-directaccess",
          "title": "Considerations when planning for DirectAccess",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2012-R2",
          "url": "/post/considerations-when-planning-for-directaccess/",
          "content": "I’ve seen a fair share of DirectAccess installations recently. Here are some quick questions to ask before you or your customer start getting into the technical titbits.\n Licensing: DirectAccess requires the Enterprise Edition of Windows on the Client side!  Version:   Client: DirectAccess works with Windows 7 and later, Windows 8.1 i preferred as the technology has evolved  Server: DirectAccess works with Windows Server 2008R2 and later, but Windows 2012 is highly recommended as NAT64 and DNS64 have been included.&lt;/ul&gt; IPv6: Yep, DirectAccess is an IPv6 technology. Make sure your applications support IPv6 and make sure applications always use DNS names to connect to the Servers. If the client is configured to connect to an IPv4 address directly, DirectAccess will not work.  Windows Firewall: It’s sad but I do still see many organizations disabling Windows Firewall via Group Policy. Well in that case, not only are you putting your users at risk, DirectAccess will also not work. Windows Firewall must be enabled as DA uses Connection Security Rules.  Dual NIC: The DircetAccess Server should be configured with to NICs, one for external/dmz connectivity and one for connectivity to the internal network.  Static Routing: As you set the the default gateway to the external NIC, static routes will have to be created for internal networks. Make sure to use “New-NetRoute” as “route add” is no longer recommended.  Firewall: DirectAccess requires tcp/443 to be allowed from the Internet to the external network adapter of the DA server.  Public DNS: A name must be registered in the public DNS zone, clients will use this name to connect to the corporate network.  Public Certificate: A certificate issued by a publicly trusted Certification Authority is highly recommended for the DirectAccess server’s public DNS name. The DA Client checks the Certificate Revocation List before connecting, so if you are using an internal CA, make sure the CRL is available without connectivity to the corporate network.  No Schema or AD changes required: The only requirement for DirectAccess is a Windows Server 2012 (preferably 2012R2) member server. As long as you are on a 2003 or later domain level, you are good to go.  Probe Host: Clients try to connect to a “Probe Host” do determine whether or not a DirectAccess connection should be attempted. This host should, obviously, only be accessible from inside the corporate network. The DirectAccess Wizard resolves name in the Probe Host certificate’s subject, if there is no DNS record, or the DNS record points to an incorrect IP address, the Wizard will fail. Also if the probe host fails, Clients will attempt DA connections even if they are connected to the corp. network, which may lead to problems.  2FA: DirectAccess can be configured for two-factor authentication. Force Tunnelling is not supported in that scenario.  High Availability: Multiple DirectAccess Servers can be deployed for high availability. Windows Network Load Balancing can be used but I’d recommend you use an external Load Balancer.  VPN: The Remote Access Server can be configured for VPN as well.&lt;/ul&gt; &nbsp; Phew. I don’t like bullet lists… Whatever, with those in mind you should be able to plan your remote access strategy :) Tom"
        },
        {
          "id": "post-wmf-5-preview-update-is-not-applicable-to-your-computer",
          "title": "WMF 5 Preview: Update is not applicable to your computer",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, PowerShell",
          "url": "/post/wmf-5-preview-update-is-not-applicable-to-your-computer/",
          "content": "I just stumbled upon this one on a new machine I was working with:&nbsp;&nbsp; \nAre you trying to install the Windows Management Framework 5 Preview, to get all the new PowerShell stuff, and see an error like this one?\n\"The update is not applicable to your computer\"    This preview actually requires the system local to be set to \"en-US\", you can easily check this using Get-Host within PowerShell:    In my example, the CurrentUICulture was set to \"en-GB\" and, apparently, that's why the update failed to install. Once I changed my regional settings and downloaded the \"en-US\" language pack, the update installed just fine.  In case you haven’t heard of the preview as of yet, you can grab it here: http://www.microsoft.com/en-us/download/details.aspx?id=44070  The issue is also listed in Connect: https://connect.microsoft.com/PowerShell/feedback/details/877188/update-is-not-applicable-to-your-computer-windows-management-framework-5-0-preview-may-2014  &nbsp; Have fun,Tom"
        },
        {
          "id": "post-windows-10-vhd-boot",
          "title": "Windows 10 VHD Boot",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-10-vhd-boot/",
          "content": "Seit einigen Tagen ist die Technical Preview von Windows 10 verfügbar. Auf meinem Notebook nutze ich Windows 8.1 und habe das Hyper-V Feature aktiviert um virtuelle Maschinen betreiben zu können. In so einer VM habe ich auch Windows 10 installiert und getestet.\nNach ersten erfolgreichen Tests, wollte ich dann doch mein Notebook mal mit Windows 10 booten, also habe ich mit “bcdedit” einen neuen Eintrag im Bootloader erstellt und die virtual Hard Disk der Windows 10 VM als “device” und “osdevice” angegeben.\nWichtig: Vor einer Änderung sollte man die aktuelle Konfiguration immer sichern:\nbcdedit /export \"C:\\Users\\thomas\\Documents\\bcdedit\"\nDieser Befehl kopiert den Boot Configuration Eintrag für das aktuelle Betriebssystem. Der neue Eintrag erhält eine eigene GUID, diese wird gleich ausgegeben und wird in den darauffolgenden Befehlen verwendet.\nbcdedit /copy {default} /d \"Win10 Preview”\nMit folgenden Befehlen werden die Einstellungen für den neuen Eintrag angepasst, die virtuelle Festplatte der Windows 10 VM wird als “device” konfiguriert, die GUID des oben erstellten Eintrags muss verwendet werden: bcdedit /set {&lt;new-GUID&gt;} device vhd=[C:]\\temp\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} osdevice vhd=[C:]\\temp\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} detecthal on&lt;/code&gt; Wenn das Notebook jetzt neu gestartet wird, kann ich im Bootloader zwischen Windows 8.1 und der Tech Preview von Windows 10 wählen. Auch die virtuelle Maschine kann nach wie vor verwendet werden. Viel Spaß,Tom&nbsp;"
        },
        {
          "id": "post-lost-found-windows-tech-preview-delve-sway-and-keybaseio",
          "title": "lost & found: Windows Tech Preview, Delve, Sway and Keybase.io",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "lost and found",
          "tags": "Client, Server",
          "url": "/post/lost-found-windows-tech-preview-delve-sway-and-keybaseio/",
          "content": "Windows\nSome days ago, on September 30, @tmyerson and @joebelfiore introduced Windows 10 and announced the availability of a Technical Preview. The announcement and some demos are on YouTube. Some interesting new features such as snap for 4 windows and continuum, which switches between the start menu and the start screen based on whether or not a keyboard is connected, are coming to Windows 10.\nThe preview can be downloaded at: http://windows.microsoft.com/en-us/windows/preview\nAlong with the tech preview of Windows 10 came the preview for the next version of Windows Server. A ton of new features will come to the next gen server OS, a notable one might be the SDN controller role, which provides a interface between higher layer applications (think SCVMM) and the software defined networking stack in Windows.\nThe preview for Windows Server can be downloaded at: http://technet.microsoft.com/evalcenter/dn781243\nDelve\nThe long rumored and previously shown “Office Graph” aka “Oslo” has started rolling out to Office 365 customers under the new name: “Office Delve”.\n \nTo get a chance to test new features before regular users get them, one needs to enable “First Release” in the Office 365 Admin Center.\n \nSway\nAnother addition to the Office family, by the name of “Sway”, started a limited preview a couple of days ago. More information and some demos can be found here: https://sway.com/\nKeybase.io\nAfter signing up some time ago, I finally received an invite for https://keybase.io. Keybase is an interesting approach to make public key cryptography more accessible to users, among many other features it provides&nbsp; a simple way of finding someone’s public key, based on their social media and web identities, in order to be able to encrypt messages for them. It is available as a command-line tool but the website works as client, too.\nView my publicly-auditable identity here: https://keybase.io/tomt \nSo long,Tom"
        },
        {
          "id": "post-scvmm-hyperv-script-to-reboots-vms-with-powershell",
          "title": "SCVMM–HyperV Script to reboots VM’s with powershell",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/scvmm-hyperv-script-to-reboots-vms-with-powershell/",
          "content": "Today I wondered that with Hyper-V there is no option to „reboot“ a VM with right clicking on it. With ESX I have the option to reboot the guest and so I created a script to schedule the reboot with the help of VMWare Powershell and VMWare tools.   The Hyper-V modules on SCVMM gives you the option to shut down and start a VM. Therefore I wrote a simple script that shutdown all VM machines in a specified list (you can use an argument if you want to work with multiple lists). \nThe shutdown is initiated with the “-RunAsynchronously“ switch so that the Powershell command does not wait until the vm is powered off. Immediately after sending the shutdown command a “do while” loop begins to work and waits until one of the machines is powered off. If a machine is switched off the loop powers the VM machine on. The loop ends when all machines are started up.\nAs I have also a VMWare vCenter connected in SCVMM I only touch VM machines with a filter: VirtualizationPlatform = “HyperV”   \n&#160;\n# Import Module   Import-Module -Name &quot;virtualmachinemanager&quot;\n# Clear Variables   [String[]] $VMsToStart = $Null\n# Get List of VM's to reboot   $VMsToReboot = Get-Content &quot;C:\\Program Files\\Scripts\\ServerList.txt&quot;\n# Shutdown each VM   Foreach($VMToShutdown in $VMsToReboot){    &#160;&#160;&#160; $VMToShutdownObject = Get-SCVirtualMachine $VMToShutdown    &#160;&#160;&#160; If ($VMToShutdownObject -ne $Null){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToShutdownObject.VirtualizationPlatform -eq &quot;HyperV&quot; -and $VMToShutdownObject.VirtualMachineState -eq &quot;Running&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Shutdown-VM -VM $VMToShutdownObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart += $VMToShutdown    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }Else{    &#160;&#160;&#160; Write-Verbose (&quot;Machine &quot; + $VMToShutdown + &quot; not found&quot;)    &#160;&#160;&#160; }    }\n# Start each VM after graceful shutdown   Do{    &#160;&#160;&#160; ForEach($VMToStart in $VMsToStart){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMToStartObject = Get-SCVirtualMachine $VMToStart    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToStartObject.VirtualMachineState -eq &quot;PowerOff&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Start-VM -VM $VMToStartObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart = $VMsToStart | ? {$_ -ne $VMToStart}    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }    }while($VMsToStart.Count -ne 0)"
        },
        {
          "id": "post-lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode",
          "title": "Lync 2013 backend on SQL Cluster with mixed authentication mode",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, en, Skype4B",
          "url": "/post/lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode/",
          "content": "So I came across this issue at a customer’s site the other day. \nEnvironment\nThe customer runs multiple Lync 2013 Front End Servers in an enterprise pool with the backend and monitoring databases being hosted on a SQL 2008R2 Cluster (default instance) that is also used for other applications and, thus, uses mixed authentication mode.\nA SQL admin was present during the initial installation of the Lync Pool, and his credentials were used to perform the DB installation.\nProblem\nSo far so good, but when the SQL admin was gone and the Lync Admins (members of RTCUniversalServerAdmins) tried to access the databases with cmdlets like Test-CsDatabase, Update-CsAdderssbook or Install-CsDatabase, they got a nasty little error like:\nCommand execution failed: Property DefaultSchema is not available for Database '[LcsCDR]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.\nWe verified the Logins and permissions on the SQL cluster and everything looked OK, meaning the logins and permissions for all the RTCUniversal… groups were there, just as expected. Still, the error would not go away.  The problem seems to be, that Active Directory groups cannot be used with mixed mode authentication??  Solution? The only solution we found, was to add the user account of the Lync Admin as a login on the SQL cluster and assign permissions directly to the user. Once the user was granted permissions directly (and not through an AD group membership), the error disappeared and the cmdlets worked just fine. This, by the way, explains why the initial setup worked just fine: The SQL admin, whose account was used during setup, had a login and permissions configured for his AD user. The solution is OK for a temporary workaround, but is not very feasible for an enterprise deployment. If anyone has a better solution, I’d love to hear from you :) &nbsp; Cheers,Tom"
        },
        {
          "id": "post-moving-to-azure",
          "title": "Moving to Azure…",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/moving-to-azure/",
          "content": "… well there is not much more to say. We have been using aruba.it as hosting provider since the beginning of ntSystems info|tech in 2009. On the upside, their simple “hosting windows” plan worked pretty OK and was very affordable, on the downside, they didn’t really care to update the servers and were not able to provide us with IPv6 or a possibility to manage the DNS zone for ntsystems.it.\nSo after testing out various platforms and providers Daniel and I decided to move the blog to Windows Azure. It’s simple, up to date and the new “shared infrastructure” pricing tier is not to expensive, either. We are now in control of the DNS zone and use CloudFlare to improve the sites performance and easily enable IPv6.\nAs you may already have noticed, we took advantage of Azure’s up-to-date hosting platform to migrate to the latest version of the .NET blog engine. \n&nbsp;\nWe hope you enjoy the new design as much as we do and continue to find our postings helpful and interesting :)\nCheers!\nTom"
        },
        {
          "id": "post-noop-and-nat-traversal",
          "title": "NoOp and NAT Traversal",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/noop-and-nat-traversal/",
          "content": "In a recent Lync project I came across an interesting issue with SIP Trunks, fortunately we had an AudioCodes SBC so there was a simple solution to the problem. \nProblem \nIn some call-forwarding scenarios no audio connection could be established, a debug trace on the gateway would show no RTP packets at all.\n&nbsp;\nSignaling was working just fine, all the right IPs and Ports were listed within the SDP messages, as you see in the screenshot, though, no RTP packets can be seen.\nSolution\nApparently the SIP provider used some kind of NAT or security device in front of their SIP equipment, and pinholes were only opened when this device received any incoming packets from our side of the communication.\nThat’s when I learned about the “NoOpEnable” parameter which is designed for problems, just like this one. Once the “NoOpEnable” parameter is set to “True”, the SBC will send one RTP packet (with payload No-Op) to each IP involved in the session (retrieved from SDP). The following Screenshot shows another debug trace, please note the first to RTP packets:\n\nThis did the trick, whatever device the remote side was using, it let RTP packets through once it received an incoming packet.\nFor more Information on the No-Op Payload Type, check out the following IETF Draft: A No-Op Payload Format for RTP\n\n\nEnable NoOp\nThe NoOpEnable parameter can be configured using the devices AdminPage, which can be found at: https://&lt;IPAddress&gt;/AdminPage\n \nAnother way, the one I prefer nowadays, is to use the SSH command-line interface, simply connect to the device using PuTTY or TeraTerm and use the following syntax:\nconfigure voip    media RTP-RTCP    &nbsp; no-operation-enable 1    &nbsp; activate\n&nbsp;\nLessons learned\nAlways use an SBC if dealing with SIP trunks :) \n&nbsp;\nTom"
        },
        {
          "id": "post-ipv6-im-unternehmen",
          "title": "IPv6 im Unternehmen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Network",
          "url": "/post/ipv6-im-unternehmen/",
          "content": "In diesem Artikel versuche ich ein paar Argumente für IPv6 in Unternehmensnetzwerken zu erklären, die meisten Netzwerker und Admins mit denen ich zu tun habe sind verunsichert oder schlecht informiert und versuchen aus diesen und anderen Gründen IPv6 als unwichtig oder gar unnötig abzutun.\nWarum?\nDiese Frage hört man immer wieder, dabei gibt es einige Gründe die für IPv6 sprechen. Ich teile diese Frage in zwei Bereiche auf, IPv6 im Unternehmensnetzwerk und IPv6 im Internet. \nIPv6 im Internet\nViele neuen Trends in der IT haben eines gemeinsam: immer mehr Geräte wollen immer mehr Informationen an immer mehr Teilnehmer senden. Dazu werden immer mehr Verbindungen und immer mehr Adressen benötigt. Das Internet of Things, immer-online Smartphones und viele Cloud Produkte sind ohne IPv6 bereits jetzt schon nicht mehr denkbar. Facebook stellt derzeit sogar das interne Netzwerk wegen Adressmangel auf IPv6 um.\nAus der Sicht eines Unternehmens ist IPv6 spätestens dann interessant, wenn man Geschäftspartner in Regionen mit wenigen öffentlichen IPv4 Adressen hat. So werden z.B. in Asien, Afrika und Osteuropa nur noch IPv6 Anschlüsse verkauft, nur selten ist es möglich einige IPv4 Adressen zu ergattern. \nDurch Übergangstechnologien (transition technology) bietet der Provider zwar die Möglichkeit weiterhin auf IPv4 Inhalte zuzugreifen, aber will man sich als Unternehmen wirklich darauf verlassen, dass potentielle Kunden und Partner die Website schon irgendwie erreichen werden? Dass Emails mit Aufträgen schon irgendwie ankommen werden?\nUm Problemen mit Übergangstechnologien (Tunneling, CGN…) aus dem Weg zu gehen, sollten bestimmte Dienste aus dem nativen IPv6 Netzwerk erreichbar sein. Die bereits angesprochenen Aufträge oder Webzugriffe sind dabei nur ein Grund, Mitarbeiter (und Führungskräfte) reisen in Regionen in denen IPv6 Internet bereits Normalität ist und auch von dort wollen diese auf das Firmennetzwerk zugreifen und Emails abrufen.\nWegen des einfachen (und für den Benutzer kaum merkbaren) Fallbacks ist E-Mail ein Dienst, der relativ einfach über IPv6 erreichbar gemacht werden kann, hier profitiert man sofort von einer besseren Erreichbarkeit und kann den Umgang mit der Technologie lernen.\nIPv6 im internen Netzwerk\nBei der Entwicklung von Windows Vista und Server 2008 wurde der Netzwerkstack komplett neu geschrieben, dabei wurde großer Wert auf die Implementierung von IPv6 gelegt. So ist IPv6 ab Windows Vista/2008 nicht nur standardmäßig aktiv, es wird auch bevorzugt. Bekommt ein Client also sowohl ein IPv4 als eine IPv6 Adresse für eine DNS Abfrage zurück, versucht dieser die Verbindung über IPv6 zuerst.\nDa Windows XP hoffentlich nicht mehr zum Einsatz kommt, kann man davon ausgehen, dass in den meisten Unternehmen bereits jetzt IPv6 großflächig ausgerollt wurde! Leider passiert das häufig ohne detaillierte Planung und manchmal sogar ohne das Wissen der Admins bzw. Netzwerkverantwortlichen. \nWährend das IPv4 Netzwerk genau geregelt wird, Firewalls und IPS Systeme in regelmäßigen Audits gecheckt werden, hat man einen zweiten, nicht berücksichtigen, nicht verwalteten Netzwerkstack. Aus Sicht der Netzwerksicherheit ist dies deshalb kritisch, weil Windows teilweise automatisch Tunnel aufbaut welche dem Client einen ungefilterten Zugriff auf das wachsende IPv6 Internet geben. \nDa IPv6 bevorzugt wird, kann man mit einem IPv6 “Router Advertisement” einfache Man-in-the-Middle Attacken ausführen und z.B. den gesamten Traffic eines Subnets über einen Proxy umleiten. Security Features wie DHCP Snooping und ARP Inspection sind weiterhin wichtig um das IPv4 Netzwerk zu schützen, in diesem Fall sind diese aber nutzlos.\nSpätestens zu diesem Zeitpunkt sollte man sich Gedanken über IPv6 machen! Man muss nicht gleich das gesamte Netzwerk umstellen, wichtiger ist eine genaue Planung und die Übertragung der bestehenden Sicherheitsrichtlinien auf IPv6.\nMigration\nDas (langfristige) Ziel einer IPv6 Einführung ist die komplette Migration des Netzwerkes auf natives IPv6, trotzdem wird man IPv4 über eine lange Zeit weiter betreiben. Wie bei jeder Einführung oder Migration ist auch hier die Planung ein wichtiger, erster Bestandteil.\nDabei sollten folgende Punkte berücksichtigt werden:\n   Adressplan: Welche IP Adressen, Subnets? Im Enterprise Umfeld Providerunabhängige Adressen    Übergangstechnologie: Nativ, Tunnel oder eine Mischung?    Bestehendes Equipment: Können benötigte Features abgebildet werden? Firmware Update nötig? \nDer erste Schritt bei der Einführung ist das Aktivieren des IPv6 Zugriffes am Übergangspunkt des Netzwerkes, hier muss in der Regel mit dem ISP gearbeitet werden. Sind Routing und Sicherheitsrichtlinien eingerichtet, kann IPv6 von außen nach innen ausgerollt werden. \nBeginnen sollte man mit einer Labor oder Testumgebung, diese kann in einer DMZ, nahe am Übergangspunkt angesiedelt werden, so kann man Erfahrungen sammeln ohne IPv6 ans letzte Ende des Netzwerkes zu transportieren.\nNach ausgiebigem Test bieten sich E-Mail und DNS als erste Dienste an, die in einer produktiven Umgebung für IPv6 aktiviert werden können. Beide fallen ohne Probleme auf IPv4 zurück, sodass Benutzer im Problemfall nicht betroffen sein sollten.\nEin weiterer interessanter Punkt sind Load Balancer oder Application Delivery Controller, diese veröffentlichen bereits jetzt Systeme und stellen eine Verbindung zwischen öffentlichem und privatem Netzwerk dar. In aktuellen Versionen bieten viele dieser ADCs die Möglichkeit auch über IPv6 mit dem öffentlichen Netzwerk zu kommunizieren. Verwendet der ADC eine Technologie wie NAT64 ist dies für den veröffentlichten Dienst (SharePoint, Exchange, Web…) transparent und dieser muss nicht geändert werden.\nMöglichkeiten und Vorteile\nDie Einführung von IPv6 bietet, neben der Vielfalt an Adressen weitere Vorteile, so können Router z.B. schneller arbeiten da der IP Destination Header immer an derselben Stelle im Paket zu finden ist. Außerdem erledigen sich die Themen ARP und Broadcasts, für die Auflösung der L2 Adressen wird ICMPv6 verwendet, die sogenannte Neighbor Discovery findet immer über Multicast statt.\nEin weiterer Punkt der in IPv4 Netzwerken häufig zu Problemen führt ist MTU und Paketfragmentierung, auch das gibt es in IPv6 Netzwerken nicht mehr. Über ICMPv6 wird die Path MTU ermittelt, so weiß der Client wie groß seine Pakete für den Server sein dürfen, bevor er diese losschickt.\nDie Automatische Konfiguration von Clients wird oft als Vorteil genannt, dies kann in kleineren Netzwerken sicher interessant sein, im Unternehmen wird es weiterhin DHCP und statische Adressierung für Server geben.\nEine der größten Krücken und der Grund aus dem viele immer noch an IPv4 festhalten, ist NAT oder Network Address Translation. Diese Technologie hat es überhaupt erst ermöglicht die Einführung von IPv6 so lange hinaus zu zögern, gleichzeitig hat sie aber auch jede Menge Probleme für Applikationen mit sich gebracht. Mit einem global skalierbaren IPv6 Adressplan wird eine End-to-End Kommunikation von Geräten endlich möglich, das wechseln zwischen Netzwerken kann so für den Benutzer einfacher werden. In einer mobile-first Welt ein nicht unwichtiger Punkt ;)\nNatürlich ist auch Sicherheit ein wichtiger Aspekt und auch da bietet IPv6 einige Vorteile, so ist IPSEC z.B. standardmäßig implementiert und jeder Host kann (theoretisch) verschlüsselt kommunizieren. Allerdings sieht man auch hier, dass es sich schon um ein älteres Protokoll handelt, einige Standardheader gelten heute als unsicher und es gibt schon einen Nachfolger für Neighbor Discovery, SEND oder SEcure Neigbor Discovery.\nProbleme\nWie bei jeder neuen Technologie gibt es auch bei der Einführung von IPv6 bestimmte Fallstricke, so kann es z.B. sein dass Clients zwar die IPv6 Verbindung bevorzugen, das Routing dafür aber einen weniger optimalen Pfad wählt und die Verbindung deshalb langsamer ist. Aktives Monitoring, saubere Dokumentation und gutes Configuration Management sind wie bei IPv4 unerlässlich. Hier gilt es bestehende Prozesse an die neue Technologie anzupassen. \n&#160;\nEinige hilfreiche Links zum Thema hab ich hier gesammelt: IPv6 Learning Resources\n&#160;\nIch hoffe in diesem Artikel das Interesse an IPv6 geweckt zu haben :)\nHappy hacking!   Tom"
        },
        {
          "id": "post-work-folders-demo-mit-microsoft-azure",
          "title": "Work Folders Demo mit Microsoft Azure",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/work-folders-demo-mit-microsoft-azure/",
          "content": "Vor einigen Tagen wollte ich in einer Demo das neue Windows Feature “Work Folders” zeigen, da ich gerade keine passende Umgebung hatte, habe ich kurzerhand zwei virtuelle Maschinen in Microsoft Azure IasS gestartet.\nÜbersicht\nDa es sich um eine einfache Demo handelt verwende ich nur zwei Server die ich aus dem Windows 2012R2 Image in Azure erstelle. Auf dem ersten werden die Rollen Domain Controller, ADFS, Zertifizierungsstelle und Work Folders installiert, der zweite wird als Web Application Proxy für die Veröffentlichung verwendet.\n \nDa die beiden Server miteinander kommunizieren sollen, verwende ich ein virtuelles Netzwerk in welches die beiden Server ausgerollt werden.\n \nWork Folders\nWork Folders ist ein Feature von Windows 2012R2 und kann mit OneDrive/Dropbox verglichen werden. Work Folders bieten dem Benutzer eine einfache Möglichkeit auf Daten zuzugreifen und diese über mehrere Geräte zu synchronisieren. \nLeider gibt es derzeit nur Unterstützung für Windows 7 und 8/8.1, Clients für mobile Geräte wurden noch nicht angekündigt.\nIm ersten Schritt stufe ich den ersten Server zum Domain Controller hoch und installiere/konfiguriere die Zertifizierungsstelle. Eine spezielle Konfiguration dieser Rollen ist nicht notwendig, die einzige Anpassung ist das Erstellen eines neuen Zertifikattemplates welches später für die ADFS und WAP Zertifikate verwendet wird.\n\nDNS\nVor der Konfiguration der AD FS Rolle überlege ich mir einen Namen über welchen die Federation Services später erreichbar sein sollen, hier entscheide ich mich für adfs.uclab.eu. Damit ich interne Anfragen direkt zum AD FS Server leiten kann, erstelle ich ein DNS Zone für diesen Eintrag:\n \n\nDer A-Record verweist auf meinen Domain Controller und AD FS Server.\nAD FS\nNach der Installation der Active Directory Federation Services sind folgende Schritte für die Konfiguration notwendig.\nEin Zertifikat mit dem Namen für die Federation Services sowie dem internen Servernamen wird angefordert. Hier verwende ich ein Kopie des WebServer Templates als Zertifikatsvorlage.\n \nSobald das Zertifikat installiert wurde, kann die AD FS Farm installiert werden, dafür wird der Thumbprint der Zertifikates benötigt, diesen kann man sich per PowerShell einfach anzeigen lassen:\nGet-ChildItem Cert:\\LocalMachine\\my -DnsName adfs*\nAußerdem wird ein Service Account für den AD FS Dienst benötigt, dafür verwende ich ein normales AD User Account. Jetzt kann die Farm installiert werden, dabei wird das Service Account mit Get-Credential abgefragt:\nInstall-ADFSFarm -CertificateThumbprint 9EA51F4DAA939C077602DF0B7EE7426F61E2DE0A -FederationServiceDisplayName \"Uclab Demo\" –FederationServiceName adfs.uclab.eu -OverwriteConfiguration -ServiceAccountCredential (Get-Credential) -ErrorAction Stop \nIn der AD FS Management Konsole sehen die Federation Service Properties folgendermaßen aus:\n&nbsp;\nAD FS Relying Trust\nJetzt wird ein Relying Party Trust hinzugefügt, dazu klickt man in der AD FS Management Konsole mit rechts auf “AD FS” und wählt “Add Relying Party Trust”.\n \nDie Daten müssen manuell eingegeben werden, ein Name wird für den Trust gewählt.\n \nDas AD FS Profil wird verwendet, die Auswahl des Zertifikates für Token Signierung sowie die Konfiguration der URLs für WS-Federation und SAML können übersprungen werden.\n\nAls Identifikation muss “https://windows-server-work-folders/V1” verwendet werden. Multi Faktor Authentifizierung ist in meiner Demo nicht nötig und wird auch übersprungen.\n \nDer letzte Schritt kann auch übersprungen werden, anschließend wird der Trust erstellt. Jetzt müssen noch “Claim Rules” definiert werden.\n \nFolgende Attribute werden definiert:\n \nJetzt müssen per PowerShell noch folgende Eigenschaften konfiguriert werden:\nSet-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -EnableJWT:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” –Encryptclaims:$false Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -AutoupdateEnabled:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -IssueOAuthRefreshTokensTo:’AllDevices’\nDer AD FS Server ist jetzt soweit bereit für die Authentifizierung der Work Folders.\nFile and Storage Services: Work Folders\nJetzt kann die Work Folders Rolle installiert werden, das geht am schnellsten per PowerShell:\nInstall-WindowsFeature –Name FS-SyncShareService\nNach der Installation erfolgt die Konfiguration der Work Folders über den Server Manager, die Konfiguration ist (wie die Server Rolle) unter “File and Storage Services” zu finden.\nEin neuer “Sync Share” wird angelegt, hier wird ein lokaler Pfad für die synchronisierten Daten angegeben.\n \nAnschließend wird ausgewählt wie die Ordner auf dem Server benannt werden sollen:\n \nDann können die Berechtigungen vergeben werden, Standardmäßig wird die NTFS Vererbung unterbrochen und der Benutzer erhält exklusiven Zugriff auf sein Sync Share.\n \nÜber Client Richtlinien kann geregelt werden ob die Work Folder Dateien lokal verschlüsselt werden müssen und ob das Gerät mit einem Passwort gesperrt wird.\n \nNachdem der Sync Share erstellt wurde, muss die Authentifizierung auf ADFS geändert werden, dazu muss man im Server Manager auf Server klicken und den lokalen Server auswählen, dann kann mit einem Rechtsklick “Work Folders Settings” ausgewählt werden:\n\nIch gebe die vorher erstellte AD FS Farm für Authentifizierung an. \n \nWeb Application Proxy\nJetzt ist es an der Zeit den Reverse Proxy auf meinem zweiten Server zu installieren, dieser ist nicht Mitglied der AD Domain, die Authentifizierung erfolgt über AD FS.\nNoch auf dem Domain Controller fordere ich ein Zertifikat für den Proxy an, hier verwende ich wieder den Namen der AD FS Farm sowie einen weiteren Namen über den ich die Work Folders veröffentlichen werde:\n \nDieses Zertifikat exportiere ich am Domain Controller und importiere es auf dem Reverse Proxy, da dieser nicht Mitglied der Domain ist, muss auch das Root Zertifikat importiert werden.\nJetzt kann die Rolle Web Application Proxy installiert werden, diese geht wieder am schnellsten per PowerShell:\nInstall-WindowsFeature –Name Web-Application-Proxy\nAnschließend wird die Rolle konfiguriert, dafür kann die “Remote Access Management Console” verwendet werden, da sich diese aber nach pre-Beta anfühlt bevorzuge ich auch hier PowerShell. Ein guter Tipp für unbekannte oder selten verwendete cmdlets ist “Show-Command” so kann man sich seinen Befehl einfach zusammenstellen:\n \nDer Befehl für die Konfiguration des Web Application Proxy ist dann:\nInstall-WebApplicationProxy -CertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -FederationServiceName adfs.uclab.eu -FederationServiceTrustCredential (Get-Credential)\nNun kann die Work Folder Applikation erstellt werden, auch dafür verwende ich wieder “Show-Command” um den PowerShell Befehl zu erstellen.\n\nDer Befehl für das veröffentlichen der Applikation ist:\nAdd-WebApplicationProxyApplication -BackendServerUrl https://wfdemo.intra.uclab.eu -ExternalCertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -ExternalUrl https://workfolders.uclab.eu -Name WorkFolders -ADFSRelyingPartyName WorkFolders -ExternalPreauthentication ADFS –UseOAuthAuthentication\nNachdem die Applikation über den WAP veröffentlich wurde, muss diese nur noch von außen erreichbar gemacht werden. Dazu werden in der öffentlichen DNS Zone zwei CNames erstellt, einen für die AD FS Farm den anderen für den Namen der Work Folders. Diese CNames zeigen auf den Cloud Service der Reverse Proxy VM in Microsoft Azure.\n \nDer Reverse Proxy bekommt einen HTTPS Endpunkt und wird somit erreichbar gemacht:\n \n\n\n\n\n\n\n\n\n\n\nDEMO\nNach all diesen Schritten wird es Zeit die AD FS Authentifizierung zu testen, dazu kann folgende URL verwendet werden:\nhttps://adfs.uclab.eu/adfs/ls/idpinitiatedsignon.htm\n \n \nDas sieht schon mal gut aus, also können wir die Work Folders testen, diese finden sich in der Systemsteuerung:\n \nDie URL für die veröffentlichte Applikation wird angegeben, es gibt die Möglichkeit diese in der Registry oder einem AD Attribut für Auto Discovery zu hinterlegen, beide Varianten sind aber nur auf Domain Clients interessant.\n \nFür die Anmeldung werde ich auf AD FS umgeleitet:\n \nDann kann ich einen lokalen Speicherort auswählen und werde auf die Richtlinien hingewiesen:\n  \nIn der Übersicht sieht man Status der Synchronisation und den verfügbaren Speicherplatz am Server.\n \nViel Spaß mit den Work Folders und ein schönes, langes Wochenende :)\nTom"
        },
        {
          "id": "post-activedirectory-displayname-mit-umlauten-und-audiocodes-isdn",
          "title": "ActiveDirectory DisplayName mit Umlauten und AudioCodes ISDN",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Skype4B",
          "tags": "de, Lync, Skype4B",
          "url": "/post/activedirectory-displayname-mit-umlauten-und-audiocodes-isdn/",
          "content": "Vor einigen Tagen bin ich in einem Lync Projekt auf das Problem gestoßen, dass bestimmte Benutzer keine Anrufe in das PSTN (ISDN E1) tätigen konnten. Der Kunde setzt ein AudioCodes Gateway ein, die Syslogs des Gatways sind zur Fehlersuche sehr gut geeignet. Das Gateway bekommt die SIP Signalisierung von Lync sowie die Q.931 Signalisierung aus dem ISDN mit.\n\n\n\nNach kurzer Suche hat sich herausgestellt, dass Benutzer welche keine Anrufe tätigen konnten, folgenden Fehler verursachten:\n\n&lt;132&gt;[S=831454] Error Indication: Last Command (Primitive) was not performed due to cause 100  [Trunk:0 Bchannel:1 ConnID:2] [Code:0x23127] \n&lt;133&gt;[S=831455] (   lgr_psbrdex)(833974    )   recv &lt;-- UnHandled event: EV_ISDN_ERROR_INDICATION (317) \n&lt;133&gt;[S=831456] [SID:766997237] (   lgr_psbrdex)(833975    )   pstn recv &lt;-- CALL_RELEASED Trunk:0 Conn:2 RetCause:73 NetCause:255 \n&lt;132&gt;[S=831457] REPORT_TYPE_ERROR_IN: ErrorCauseString = Incorrect parameter type, DiagnosticString= Condition unknown, ErrorCause = d, Diagnostic =  [Trunk:0 Bchannel:-1 ConnID:-1] [Code:0x23127] \n&lt;133&gt;[S=831458] [SID:766997237] (   lgr_psbrdif)(833976    )   pstn send --&gt; PlaceCall: Trunk:0 BChannel:1 ConnID:2 SrcPN=xxx SrcSN= DstPN=151xxxxxxxx DstSN= SrcNT=4 SrcNP=1 SrcPres=0 SrcScrn=0 DstNT=2 DstNP=1 ServiceCap=M RdrctNum= RdNT=0 RdNP=0 RdPres=0 RdScrn=0 RdRsn=-1 Excl=1 Display=Müller, Max IE= UUIE=0, RawData:0 CLIRReason:-1 OrigPN= OLI=-1 OffhookInd=0 \n&lt;133&gt;[S=831462] [SID:766997237] (   lgr_psbrdif)(833980    )   Abnormal Disconnect cause:255#?reason(255)? Trunk:0 Conn:2\n\n\nDie Normalisierung der Nummern ist bei allen Benutzern identisch, daran konnte es nicht liegen, nach einiger Zeit ist mir aufgefallen, dass Benutzer die keine Anrufe tätigen konnten einen Umlaut im Active Directory Anzeigenamen hatten… Dieser Namen wurde bei einem Benutzer zu Testzwecken umbenannt und schon konnte dieser auch telefonieren.\n\nLösung\n\nDas Attribut DisplayName bei allen Benutzern zu ändern kam natürlich nicht in Frage, glücklicherweise gibt es eine Einstellung auf dem AudioCodes Gateway mit der man das Verhalten steuern kann.\n\nEine Möglichkeit ist es, den Calling Name nicht ins ISDN zu signalisieren, dazu kann man den Parameter Remove Calling Name auf dem entsprechenden Trunk auf Enable setzen.\n\n\n\nAlternativ kann über die AdminPage (oder die INI Datei) der Parameter ISO8859CharacterSet auf “0” gesetzt werden, dieser ändert die Umlaute in Latin-Only Zeichen, so wird “ä” zu “a”, “ö” zu “o” usw…\n\nDieser Parameter kann auch über das CLI gesetzt werden, dazu verbindet man sich per SSH auf das Gateway. Die Einstellung versteckt sich hier:\n\nconfigure voip\n  gw digitalgw digital-gw-parameters\n   iso8859-charset no-accented\n\n\nTom"
        },
        {
          "id": "post-app-v-and-the-start-menu-folder-redirection-issue",
          "title": "App-V and the start menu folder redirection issue",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "AppV, en",
          "url": "/post/app-v-and-the-start-menu-folder-redirection-issue/",
          "content": "If you are using redirected start menu and App-V you might get into some issues with the management of the App-V application shortcuts. First let&rsquo;s start with some background information.\nStart Menu The Windows start menu is located in the following folder&hellip;. If you are using folder redirection, you can redirect the folder to a fileserver. This is a very often seen scenario in RDS and Citrix deployments.\nApp-V and the Start Menu When you publish an application for a group of users, App-V can create the folder and shortcuts in the start menu. You can manage this in the management website from App-V.\nApp-V and the System Account After you install the App-V Client on your desktop or terminalserver machine, you can find the following service &ldquo;Microsoft App-V Client&rdquo; in the services. The App-V Client services runs with the local system account. If you change this account to a domain user account with the needed permissions, you get errors when publishing / un-publishing applications.\nThe issue: You are using redirected start menu and remove an user from an App-V publishing group. The App-V Client does not delete the programs folder and shortcuts in the users start menu.\nThe reason is, that the local System account, under which the App-V Client services runs, doesn&rsquo;t have the permissions to delete the folder and shortcuts from the fileserver where your start menu is located.\nThere are 2 work around\n1. Don&rsquo;t redirect the start menu\nIf you don&rsquo;t use start menu redirection, you don&rsquo;t run into this issue\n2. Redirect the start menu and use a script to delete death program shortcuts\nI don&rsquo;t want to disable the start menu redirection and wrote a script to find &ldquo;death&rdquo; shortcuts and delete them with the appropriate folder. You can specify the following script as user logon script:\nStart-Sleep -Seconds 10\n$ErrorActionPreference = \"SilentlyContinue\" $StarMenuPath = \"REDIRECTED_FOLDER\" + [Environment]::UserName + \"\\Start Menu\"\n$Shortcuts = gci $StarMenuPath -Recurse -Filter \"*.lnk\" ForEach ($Shortcut in $Shortcuts) { &nbsp;&nbsp;&nbsp; $WshShell = New-Object -ComObject WScript.Shell &nbsp;&nbsp;&nbsp; $LocalAppDataPath = $env:LOCALAPPDATA &nbsp;&nbsp;&nbsp; $Link = $WshShell.CreateShortcut($Shortcut.Fullname) &nbsp;&nbsp;&nbsp; $PathToApp = $Link.TargetPath &nbsp;&nbsp;&nbsp; $PathToApp = $PathToApp.replace(\"C:\\Windows\\system32\\config\\systemprofile\\AppData\\Local\",$LocalAppDataPath) &nbsp;&nbsp;&nbsp; IF((!(Test-Path $PathToApp)) -and ($PathToApp.Contains(\"AppV\"))){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-item -LiteralPath $Shortcut.Fullname -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = $Null &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = gci $Shortcut.Directory.FullName -Recurse &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If($RemainingFiles -eq $Null){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Item $Shortcut.Directory.FullName -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } }\nMicrosoft will fix this I opened a MS call and last week I got an email that the issue for this problem will be fixed in the upcoming Spring release.\nGreetings dn"
        },
        {
          "id": "post-lync-sip-inter-domain-federation-with-cisco-unified-presence-2",
          "title": "Lync: SIP inter-domain federation with Cisco Unified Presence - 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-2/",
          "content": "In my last post I went through the required configuration steps on the Cisco Unified Presence Server, in this post I will cover the Lync Server configuration as well as some troubleshooting aspects.\nLync configuration\nOn the Lync server side we have to create a trusted application pool along with a trusted application in order for Lync to accept SIP requests from the CUPS. This is done using the Lync Server Management Shell:\nNew-CsTrustedApplicationPool -Identity cups.tomt.local -Registrar lync01.tomt.local -ThrottleAsServer $true -TreatAsAuthenticated $true -OutboundOnly $false -RequiresReplication $false -Site 1 \nNew-CsTrustedApplication -TrustedApplicationPoolFqdn cups.tomt.local -Port 5062 -ApplicationId CUPS\nAfter that we need a static route pointing to the CUP Server so that Lync knows where to find Users within a certain address space (@tomt.local in our case).\n$r = New-CsStaticRoute -TLSRoute -Destination cups.tomt.local -Port 5062 -MatchUri tomt.local -UseDefaultCertificate $true      Set-CsStaticRoutingConfiguration -Route @{Add=$r}\nNote: As we are using TLS as transport protocol, we create a new TLSRoute, the destination parameter specifies where requests for a certain domain (MatchUri) are routed to, as always with TLS, the common name of the certificate must match the FQDN entered as destination. I am using Port 5062 because that is the default port for the “Peer Authentication Listener” on CUP. \nOnce this configuration is in place, we need to make sure the Lync Server trusts the certificate used on the CUPS, so I made sure the CA that issued the CUPS certificate was present in the Lync Servers “Trusted Roots” store.\nNice work, Lync users can now see Cisco users presence states and they can even chat with each other :)\n &#160; \nOk, now that we have a working configuration, let’s have a look at troubleshooting.\nProblem Points\nNote: This post is in progress, I will add more troubleshooting steps over the next couple of days.\nI will list some of the more problematic points here, so just in case you have a half working configuration, make sure to check for the following issues:\nUnsupported Certificate\nIf the Lync Server certificate does not include the Enhanced Key Usage of “Client Authentication”, the TLS handshake fails. As the error occurs before the two systems are speaking SIP, we will have to rely on NetMon or Wireshark to troubleshoot the TLS Handshake, sure enough it shows an “Encrypted Alert”:\n&#160; \nIn the Binary data of the handshake we can see the alert value is 2B (hex) which translates to decimal 43 an means: unsupported certificate.\n \nSo to fix this, re-issue the Lync Server certificate (Default, Web Services don’t matter here) and make sure the template includes the Client Authentication enhanced key usage.\nLync Client signs out when searching for federated user\nThis is one of the oddest behaviors of the Lync 2013 clients that I have ever seen. A Lync user searches for another user which is homed on the Cisco Unified Presence server. As soon as the user completes the entry of the sip address (and the Lync Server sends a SUBSCRIBE message to the CUPS) the Lync user is signed out of the client.\nSame thing happens if a CUPS user sends an IM to the Lync user. The Lync client log shows that CUPS is trying to do MD5 authentication (yes md5 in 2014….) and that the Lync Clients handles this by signing out.\n### client error log ###\nCheck the ACL configuration on the CUP Server, all Lync Servers and Clients must be excluded from MD5 authentication. Also check that your static Route on Lync points to the Peer Authentication listener.\n&#160;\n\nSo long,    Tom"
        },
        {
          "id": "post-lync-sip-inter-domain-federation-with-cisco-unified-presence-1",
          "title": "Lync: SIP inter-domain federation with Cisco Unified Presence - 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-1/",
          "content": "As a consultant I do have the pleasure to be working with new customers on a regular basis. Recently I had the interesting request to make Lync 2013 talk to a Cisco Unified Presence 9.1 server. The goal for the customer was, to provide Lync users with the presence information available in the Cisco world.\nLuckily the configuration was setup with multiple domains, Lync using the public (tomt.it) and Cisco Unified Presence using an internal only (tomt.local) domain. \nWhat’s possible?\nBefore you get your hopes to high, here goes a quick list of what functionality will be available, once the federation is in place.\n   Presence     Contact List (users from both domains can add each other)     IM (Peer to Peer only)  \nThat’s it. Sure you can use Jabber to make your Cisco Desk Phone call a Lync endpoint, if you have a SIP trunk configured between the two systems, but that’s got nothing to do with the presence federation.\nBasic Topology\nThe topology I was working with, consisted of a single Lync 2013 Standard Edition Front End Server with an associated Edge server. Lync was completely configured and operational, the SIP domain I’m going to use in this example is: @tomt.it\nThe Cisco Unified Presence Server was a standalone box, too. It was hooked up to a clustered CUCM installation, though that should not matter in this example. The SIP domain on the CUPS was @tomt.local\nAll of my test VMs are located in the 10.1.1.0/24 subnet.\nCUPS configuration\nThere are a couple of requirements on the Cisco side of things. First let’s talk certificates.\nThe recommended configuration uses TLS as transport for the federation, not only is it more secure, it’s interesting enough that it’s easier to setup, too.\nSo we need a certificate on the Unified Presence server, to complete this step, log in to the “OS Administration” website of the CUP Server, to connect to the OS Administration website, use /cmplatform.\n \nOnce signed-in, go to Security, Certificate Management and: \n   Import the internal certification authority’s certificate to CUPS. Select the Type: “cup-trust”     Create a new certificate signing request (CSR). Select the Type: “cup”     Issue the certificate using a template that uses Server Authentication and Client Authentication as “Enhanced Key Usage”. Note: You’ll need a CA running on Windows Server Enterprise Edition for that, the default WebServer template does not include Client Authentication.     Import the issued certificate on the CUPS. Select the Type: “cup”  \nAfter that, my Certificate Management looked like this:\n \nThe next step is setting up the SIP Federation, this requires you to log-in to the “IM and Presence Administration” website, it can be found at /cupadmin.\nUsing Presence, Inter-Domain Federation, SIP Federation, Federated Domain we add the Lync Servers SIP Domain (tomt.it) as inter-domain federation:\n\nNote: Some documentation state that you need to check the “Direct Federation” box, I found that it will work either way. If someone with CUP knowledge reads this, please do get in touch.\nThe next step is setting up a static route from the CUP Server to Lync. This is done using the Presence, Routing, Static Routes menu. We configure a destination pattern with an associated next hop and transport protocol, do note the notation used for the destination pattern!\n \nImportant: Select TLS as “Protocol Type” and User as the “Route Type”. 5061 is the default port on which a Lync Server will listen for TLS requests.\nWhile we are in the “IM and Presence Administration” there are another couple of things to configure:\nThe Lync Servers FQDN (i.e the Common Name on the Lync Pools Certificate) must be added as TLS Peer Subject using System, Security, TLS Peer Subjects:\n\nThen, using System, Security, Peer Auth Security Context add the newly created TLS Peer Subject:\n \nAlso make sure to check the “Disable Empty TLS Fragments” box and add the TLS_RSA_WITH_3DES_EDE_CBS_SHA cipher to selected ciphers.\nStill in System, Security we need to configure ACLs. The ACLs are not traditional ACLs which allow or block IP:Port combinations, these are used to configure whether or not a communication partner has to be authenticated using MD5. Neither Lync Servers nor Lync Clients support SIP Digest authentication using MD5, so we need to make sure that they will not be prompted for authentication:\nThe following show my incoming and outgoing ACL entries:\n\nThe last configuration step on the CUP Server is to update the public FQDN using System, Service Parameters, Federation Routing Parameters:\n\nNote: The documentation and help context for this parameter state that it should not be changed, although I found the Federation Routing FQDN will be used in the Record-Route Header (maddr field) and if Lync does not have a Trusted Application Pool for this FQDN, communication will fail.\nLastly we’ll have to restart some services on the CUP Server in order for the configuration changes to become active. To do this, we need to log-in to the “IM and Presence Serviceability” website, which can be found at /ccmservice.\nNavigate to Tools, Control Center, Feature Services and restart SIP Proxy Service, then navigate to Tools, Control Center, Network Services and restart the XCP Router Service.\nOk, so that’s it on the Cisco side of things. Click here for the Lync Server Configuration.\nTom"
        },
        {
          "id": "post-lync-conf-2014-keynote",
          "title": "Lync Conf 2014 Keynote",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Lync, Skype4B",
          "url": "/post/lync-conf-2014-keynote/",
          "content": "Gestern wurde die zweite Lync Conference in Las Vegas er&ouml;ffnet. In der Keynote gab es einige interessante Ank&uuml;ndigungen:\nSkype und Mobile\nUnter anderem hat Derek Burney die lange erwartete Video Kommunikation mit Skype demonstriert. Weitere Infos dazu gibt&rsquo;s auf dem Skype Blog und auf dem Offical Microsoft Blog, hier schreibt der neue (alte) Pr&auml;sident der Lync &amp; Skype Engineering Gruppe, Gurdeep Singh Pall auch &uuml;ber weitere Ziele. Die Unterschiede in Bedienung und Funktion der Technologien die wir im privat- bzw. Arbeitsleben einsetzen, sollen wegfallen. Der Fokus liegt auf Work-Life-Balance und sogenannten Digital Natives.\nAll diese &Auml;nderungen und Ziele werden unter dem neuen Schlagwort Universal Communications zusammengefasst.\nIn einer weiteren Demonstration wurde das Lync Mobile App f&uuml;r Android Tabled vorgestellt, dieses soll in den n&auml;chsten Monaten ver&ouml;ffentlicht werden. Damit gibt es mobile Clients f&uuml;r:\n\nWindows Phone 8\nWindows 8.1 / Windows RT\niOS: iPhone und iPad\nAndroid: Phone und Tablet\n\nInterop\nInteressant f&uuml;r viele Kunden mit bestehenden Videokonferenzsystem d&uuml;rfte der &ldquo;Interop Server&rdquo; sein, dieser soll als Bestandteil der n&auml;chsten Lync Server Version ausgeliefert werden und erm&ouml;glicht u.a. die Anbindung von Tandberg VTC an Lync.\nVideo\nSeit einiger Zeit wird das Thema WebRTC mehr oder weniger hei&szlig; diskutiert, es w&auml;re sicher interessant wenn anonyme Benutzer ganz ohne Plug-in an einer Konferenz teilnehmen k&ouml;nnten. Nun konnte sich die Industrie allerdings noch nicht wirklich auf einen gemeinsamen Weg einigen, dementsprechend wenig Informationen gab es &uuml;ber die Demo eines Video Gespr&auml;ches direkt im Browser.\nBei der Technologie handelt es sich um einen Javascript Wrapper f&uuml;r die Unified Communications Web API (http://ucwa.lync.com), welche Codecs verwendet wurden und ob ein Plug-in ben&ouml;tigt wird, hat Derek allerdings nicht angesprochen.\nLync Online\nAuch f&uuml;r das Cloud Angebot hat Microsoft ein neues Feature angek&uuml;ndigt, so soll es Unterst&uuml;tzung f&uuml;r Meetings mit bis zu 2000 Teilnehmern geben. Die Unterst&uuml;tzung f&uuml;r Enterprise Voice in der Cloud wurde erneut angek&uuml;ndigt, auch hier fehlen weitere Details.\nDie Keynote wurde aufgezeichnet und kann hier angesehen werden.\nhttp://www.lyncconf.com\nNa dann, willkommen im Zeitalter der Universal Communications :)\nTom"
        },
        {
          "id": "post-exchange-2010-update-hybridconfiguration",
          "title": "Exchange 2010 Update-HybridConfiguration",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Office365, de",
          "url": "/post/exchange-2010-update-hybridconfiguration/",
          "content": "Ein schneller Tipp für Hybrid-Admins ;)\nBeim ausführen des Hybrid Configuration Wizard auf einem Exchange 2010 Server tritt folgender Fehler auf:\nFehler beim Aktualisieren der Hybridkonfiguration: 'System.Management.Automation.Remoting.PSRemotingTransportException: Beim Ausführen von Daten vom Remoteserver ist folgender Fehler aufgetreten: [ClientAccessServer=DB3PR05CAXXX,BackEndServer=db3pr05mbXXX.eurprd05.prod.outlook.com, RequestId=ce4f8474-2bcc-4b3b-b4e4-5089f60f2372,TimeStamp=2/11/2014 10:11:28 AM] The request for the Windows Remote Shell with ShellId FC244D6B-C78E-4605-B7E1-91A480CD914B failed because the shell was not found on the server. Possible causes are: the specified ShellId is incorrect or the shell no longer exists on the server. Provide the correct ShellId or create a new shell and retry the operation. Weitere Informationen finden Sie im Hilfethema &quot;about_Remote_Troubleshooting&quot;.&lt;/p&gt;    Weitere Informationen zur Fehlerbehebung finden Sie in der Protokolldatei &quot;Update-HybridConfiguration&quot; unter C:\\Program Files\\Microsoft\\Exchange Server\\V14\\Logging\\Update-HybridConfiguration\\HybridConfiguration_2_11_2014_10_10_45_635277102457617512.log.&lt;/code&gt;  Wieder mal hat das Problem mit den unterschiedlichen Datumsformaten zu tun, der Server hatte deutsche Regionaleinstellungen.      Diese müssen auf English (USA) geändert werden und schon läuft der Wizard ohne Probleme durch.  Gruß,   Tom"
        },
        {
          "id": "post-lync-2013-hosting-pack-v2-and-skype-federation",
          "title": "Lync 2013 Hosting Pack v2 and Skype federation",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/lync-2013-hosting-pack-v2-and-skype-federation/",
          "content": "With the hosting pack v2 for Lync 2013 Microsoft made the Skype federation available for hosting environments. To configure the federation, follow the official Microsoft guide.\nIf you have configured Skype federation, you have to enable Federation on to tenant:\nImport-Module LyncOnline Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowFederatedUsers $true Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowPublicUsers $true\nIf you try to send some IM&rsquo;s to a Skype user, you get the following error message in the OCS logger\nms-diagnostics: 27000;reason=\"To-Uri Domain is not in the sender-tenant allow list\";\n\nTo get the federation working, you have to add the following domains to the tenant allow list. This is the way Microsoft do this on Office 365.\n$d1 = New-CsEdgeDomainPattern -Domain \"br.live.com\" $d2 = New-CsEdgeDomainPattern -Domain \"hotmail.ch\" $d3 = New-CsEdgeDomainPattern -Domain \"hotmail.co.il\" $d4 = New-CsEdgeDomainPattern -Domain \"hotmail.co.jp\" $d5 = New-CsEdgeDomainPattern -Domain \"hotmail.co.th\" $d6 = New-CsEdgeDomainPattern -Domain \"hotmail.co.uk\" $d7 = New-CsEdgeDomainPattern -Domain \"hotmail.com\" $d8 = New-CsEdgeDomainPattern -Domain \"hotmail.com.ar\" $d9 = New-CsEdgeDomainPattern -Domain \"hotmail.com.tr\" $d10 = New-CsEdgeDomainPattern -Domain \"hotmail.es\" $d11 = New-CsEdgeDomainPattern -Domain \"hotmail.de\" $d12 = New-CsEdgeDomainPattern -Domain \"hotmail.fr\" $d13 = New-CsEdgeDomainPattern -Domain \"hotmail.it\" $d14 = New-CsEdgeDomainPattern -Domain \"live.at\" $d15 = New-CsEdgeDomainPattern -Domain \"live.be\" $d16 = New-CsEdgeDomainPattern -Domain \"live.ca\" $d17 = New-CsEdgeDomainPattern -Domain \"live.cl\" $d18 = New-CsEdgeDomainPattern -Domain \"live.cn\" $d19 = New-CsEdgeDomainPattern -Domain \"live.co.in\" $d20 = New-CsEdgeDomainPattern -Domain \"live.co.kr\" $d21 = New-CsEdgeDomainPattern -Domain \"live.co.uk\" $d22 = New-CsEdgeDomainPattern -Domain \"live.co.za\" $d23 = New-CsEdgeDomainPattern -Domain \"live.com\" $d24 = New-CsEdgeDomainPattern -Domain \"live.com.ar\" $d25 = New-CsEdgeDomainPattern -Domain \"live.com.au\" $d26 = New-CsEdgeDomainPattern -Domain \"live.com.co\" $d27 = New-CsEdgeDomainPattern -Domain \"live.com.mx\" $d28 = New-CsEdgeDomainPattern -Domain \"live.com.my\" $d29 = New-CsEdgeDomainPattern -Domain \"live.com.pe\" $d30 = New-CsEdgeDomainPattern -Domain \"live.com.ph\" $d31 = New-CsEdgeDomainPattern -Domain \"live.com.pk\" $d32 = New-CsEdgeDomainPattern -Domain \"live.com.pt\" $d33 = New-CsEdgeDomainPattern -Domain \"live.com.sg\" $d34 = New-CsEdgeDomainPattern -Domain \"live.com.ve\" $d35 = New-CsEdgeDomainPattern -Domain \"live.de\" $d36 = New-CsEdgeDomainPattern -Domain \"live.dk\" $d37 = New-CsEdgeDomainPattern -Domain \"live.fr\" $d38 = New-CsEdgeDomainPattern -Domain \"live.hk\" $d39 = New-CsEdgeDomainPattern -Domain \"live.ie\" $d40 = New-CsEdgeDomainPattern -Domain \"live.in\" $d41 = New-CsEdgeDomainPattern -Domain \"live.it\" $d42 = New-CsEdgeDomainPattern -Domain \"live.jp\" $d43 = New-CsEdgeDomainPattern -Domain \"live.nl\" $d44 = New-CsEdgeDomainPattern -Domain \"live.no\" $d45 = New-CsEdgeDomainPattern -Domain \"live.ph\" $d46 = New-CsEdgeDomainPattern -Domain \"live.ru\" $d47 = New-CsEdgeDomainPattern -Domain \"live.se\" $d48 = New-CsEdgeDomainPattern -Domain \"livemail.com.br\" $d49 = New-CsEdgeDomainPattern -Domain \"livemail.tw\" $d50 = New-CsEdgeDomainPattern -Domain \"messengeruser.com\" $d51 = New-CsEdgeDomainPattern -Domain \"msn.com\" $d52 = New-CsEdgeDomainPattern -Domain \"passport.com\" $d53 = New-CsEdgeDomainPattern -Domain \"sympatico.ca\" $d54 = New-CsEdgeDomainPattern -Domain \"tw.live.com\" $d55 = New-CsEdgeDomainPattern -Domain \"webtv.net\" $d56 = New-CsEdgeDomainPattern -Domain \"windowslive.com\" $d57 = New-CsEdgeDomainPattern -Domain \"windowslive.es\" $d58 = New-CsEdgeDomainPattern -Domain \"outlook.com\" \nGreetings nd"
        },
        {
          "id": "post-lync-client-certificate-warning-exchange-autodiscover",
          "title": "Lync Client certificate warning Exchange Autodiscover",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/lync-client-certificate-warning-exchange-autodiscover/",
          "content": "I’ve seen this problem at a customer the other day, even though I had a solution to fix it, I do still not fully understand why it happens. So I’m going to document it here, we’ll see if that sheds more light… :)\nThe Problem \nAs the title implies, the problem is similar to this one I described earlier, it does however also affect Lync 2010 clients. Once signed-in, the Lync Client will show a certificate warning, indicating that it wants to connect to some Exchange Server but the certificate was not ok, only after double (triple) checking, the certificate really was ok.\n\nBackground\nSure enough, the problem only appears in certain environments, the one I was in used different domains for the SIP address and the users primary SMTP address. So, here goes an example:\nUserPrincipalName: user@contoso.com     PrimarySMTPAddress: user@contoso.com     msRTCSIP-PrimaryUserAddress: user@fabrikam.com\nWhen this users signs into Lync, the client will perform an Exchange Autodiscover request, in order to retrieve the Exchange Web Services Endpoint. The certificate used on the Exchange Server had the following attributes:\nCN=exchange.contoso.com    DNS=exchange.contoso.com     DNS=exchange.fabrikam.com     DNS=….\nNow the warning in the Lync Client says there was a problem connecting to exchange.contoso.com, even though the certificates CN was exactly the same name, that the client tired to reach. Makes sense? Not to me…\nWorkaround\nThe workaround I described in the earlier article still applies, just add the Exchange Servers domain to the clients TrustModelData registry entry. \nThe registry key locations change depending on the client version:\n            Lync 2010                 HKEY_CURRENT_USER\\Software\\Microsoft\\Communicator\\TrustModelData                         Lync 2013                 HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Office\\15.0\\Lync                         Type        Reg_SZ                  Value        contoso.com contoso.eu        \nSo if anyone has more information on this one, please do get in touch.\nCheers,    tom"
        },
        {
          "id": "post-migration-ntsystems-mail-von-aruba-nach-office-365",
          "title": "Migration: ntSystems Mail von Aruba nach Office 365",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Office365",
          "url": "/post/migration-ntsystems-mail-von-aruba-nach-office-365/",
          "content": "Nachdem einigem &uuml;berlegen haben wir uns entschieden Mail f&uuml;r die Domain ntsystems.it nach Office 365 zu migrieren. Wir verwenden einen E1 Plan, dieser bietet f&uuml;r 6,5&euro; pro User und Monat eine Exchange Mailbox, Lync, SharePoint und SkyDrive sowie Yammer.\nAruba\nDer aktuelle Provider (und auch Hoster dieser Seite) ist Arbua. An dieser Stelle muss ich sagen, dass wir bisher zwar keine gr&ouml;&szlig;eren Probleme mit unseren Mails hatten, das Mail System allerdings nicht mehr wirklich zeitgem&auml;&szlig; ist, so fehlen z.B. Features wie Kalender, Active Sync und die Anmeldung erfolgt standardm&auml;&szlig;ig &uuml;ber http (ja richtig, unverschl&uuml;sselt. Im Jahr 2014.). Freundlicherweise wird ein Link zu einer &ldquo;Secure Version&rdquo; angezeigt&hellip;\nDNS\nEs gibt leider kein Angebot von Aruba, bei dem WebHosting und das Verwalten der DNS Zone m&ouml;glich w&auml;ren. Nach einigem hin und her, konnte ich den Support schlie&szlig;lich dazu bewegen, die ben&ouml;tigten DNS Eintr&auml;ge f&uuml;r Office 365 zu erstellen. Damit die Domain zu Office 365 hinzugef&uuml;gt werden kann, muss zun&auml;chst ein TXT Record mit einem von Microsoft vorgegebenen Wert erstellt werden:\nType: TXT Name: @ TXT Value: MS=ms93664998 TTL: 1 Hour\nJetzt kann die Domain verifiziert werden, sobald dieser Vorgang abgeschlossen ist, k&ouml;nnen Benutzer hinzugef&uuml;gt werden. Diesen Schritt habe ich &uuml;bersprungen und stattdessen der Domain ein Verwendungszweck zugewiesen. In unserem Fall: Exchange Online.\n\nSobald der Verwendungszweck ausgew&auml;hlt ist, werden weitere DNS Eintr&auml;ge ben&ouml;tigt, diese sind:\n&nbsp;\nAuch diese Eintr&auml;ge hat der Support freundlicherweise erstellt, wichtig ist hierbei, dass Office 365 die Eintr&auml;ge &uuml;berpr&uuml;ft, der MX Eintrag muss also die Priorit&auml;t 0 haben und auch der TTL Wert muss &uuml;bereinstimmen, damit die Domain hinzugef&uuml;gt werden kann.\nMail\nEine serverseitige Migration der Inhalte war nicht m&ouml;glich, Inhalten konnten &uuml;ber einen Client (Outlook) oder &uuml;ber das &ldquo;Connected Account&rdquo; Feature von Office 365, &uuml;bernommen werden. Mit diesem Feature kann ein Benutzer bis zu f&uuml;nf Postf&auml;cher zu seinem Office 365 Konto hinzuf&uuml;gen. Unterst&uuml;tzt werden Konten die POP oder IMAP unterst&uuml;tzen.\nViele Gr&uuml;&szlig;e aus der Cloud :) Tom"
        },
        {
          "id": "post-connect-to-office-365-with-powershell",
          "title": "Connect to Office 365 with Powershell",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Office365",
          "url": "/post/connect-to-office-365-with-powershell/",
          "content": "In this Post I explain how to connect to Office 365 with Powershell and manage Exchange and Lync.\n1. Install Microsoft Online Services Sign-In Assistant for IT Professionals BETA http://www.microsoft.com/en-us/download/details.aspx?id=39267\n2. Install the Office 365 cmdlets http://go.microsoft.com/fwlink/p/?linkid=236297\n3. Set Execution Policy to Remote Signed Set-ExecutionPolicy RemoteSigned\nExchange Online\n4. Connect to Exchange Online\nImport-Module MSOnline $ExchangeOnlineCred = Get-Credential $ExchangeOnlineSession = New-PSSession &ndash;ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $ExchangeOnlineCred -Authentication Basic -AllowRedirection Import-PSSession $ExchangeOnlineSession -AllowClobber Connect-MsolService &ndash;Credential $ExchangeOnlineCred\nNow you are connected to Exchange Online:\n\nLync Online\n4. Install Windows PowerShell Module for Lync Online http://www.microsoft.com/en-us/download/details.aspx?id=39366\n5. Connect to Lync Online\nImport-module lynconlineconnector $LyncOnlineCred = Get-Credential $LyncOnlineSession = New-CsOnlineSession -Credential $LyncOnlineCred Import-PSSession $LyncOnlineSession\n\nGreetings dn"
        },
        {
          "id": "post-import-certificate-to-rd",
          "title": "Import Certificate to RD",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012, en, Server-2012-R2, RDS",
          "url": "/post/import-certificate-to-rd/",
          "content": "With Server 2012 the MMC “Remote Desktop Session Host Configuration” doesn’t exist anymore. If you want to import a specific certificate to the RD Session Host you can do the following:\n1. Import the certificate to the machines personal store\n\n2. Then use the following commands to import the certificate to the Session Host:\n$pass = ConvertTo-SecureString “CERTIFICATE-PASSWORD” -AsPlainText –Force    $thumbprint = (Import-PfxCertificate -Password $pass -CertStoreLocation cert:\\localMachine\\my -FilePath '\\\\LocationToCertificate\\certificate.pfx').thumbprint    $path = (Get-WmiObject -class &quot;Win32_TSGeneralSetting&quot; -Namespace root\\cimv2\\terminalservices -Filter &quot;TerminalName='RDP-tcp'&quot;).__path    Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash=&quot;$Thumbprint&quot;}\nNow the certificate is imported.\nGreetings   dn"
        },
        {
          "id": "post-pal-performance-analyse",
          "title": "PAL: Performance Analyse",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Exchange, Lync, Skype4B",
          "url": "/post/pal-performance-analyse/",
          "content": "Neulich bin ich über ein interessantes Codeplex Projekt gestolpert, Performance Analysis of Logs (PAL) Tool\nHier handelt es sich um ein Tool, welches Perfmon Dateien (.blg) auswerten und einen schönen Report generieren kann. Interessant ist die Möglichkeit “Threshold files” zu auszuwählen, diese werden Teilweise mitgeliefert oder können selbst hinzugefügt werden. In diesen XML Dateien sind Performance Counter und entsprechende Schwellwerte hinterlegt.\nInstallation\nDie Installation erfolgt typischerweise auf einer Workstation, folgende Komponenten werden benötigt:\n   .NET Framework 3.5    Microsoft Chart Controls for Microsoft .NET Framework 3.5 (Download) \nDas PAL Tool selbst ist ein Instsaller der aus Codeplex heruntergeladen werden kann. Die Installation erfolgt nach C:\\Program Files\\PAL\\PAL\\ wo auch die mitgelieferten XML Dateien abgelegt werden. Weitere Threshold Files findet man z.B. in der TechNet Gallery, hier der Linkfür den Lync Server 2013.\nAnalyse\nInteressant an den XML Dateien ist, dass man daraus Templates für Perfmon Data Collector Sets erstellen. Man muss also nichtmehr mühsam Counter aus der Produtkdoku suchen und diese dann einzeln hinzufügen, es reicht PAL (PALWizard.exe) zu starten und im Reiter “Threshold File” auf “Export Perfmon template” zu klicken.\n&#160;\nAus diesem Template erstellt man dann ein Data Collector Set auf den Systemen die analysiert werden sollen, die Standardwerte für den Dateipfad und die Laufzeit des Sets sollte noch angepasst werden. Ist die Datensammlung abgeschlossen, wird die .blg Datei wieder auf die Workstation mit dem PAL Tool kopiert.\nDie .blg Datei wird im PAL Tool ausgewählt:\n \nAnschließend müssen im Reiter “Questions” noch drei Fragen zu den analysierten Servern beantwortet werden:\n \n\n\nUnter “Output Options” wird das Verzeichnis angegeben in welchem die Reports erstellt werden sollen.\nViel Spaß,   tom"
        },
        {
          "id": "post-windows-azure-point-to-site-vpn",
          "title": "Windows Azure – Point to Site VPN",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Cloud",
          "url": "/post/windows-azure-point-to-site-vpn/",
          "content": "An interesting feature in Windows Azure is the possibility to expand the local network to the Cloud. This feature comes in two options, a site-to-site tunnel can be created, as well as a simple client VPN, or point-to-site connection. A site-to-site tunnel is configured on a firewall device or router within the corporate network, essentially connecting the Cloud like any other remote site. \nThis post is about clients connecting to the Cloud, so called point-to-site VPN connections. This feature might be of less interest to corporate customers, however, I find it quite cool for lab and dev/test scenarios.\nAzure Virtual Network\nTo get started we need to configure a virtual network in Windows Azure, chances are that if you have been using Azure virtual machines, you might already have a virtual network configuration. It is required to have VMs communicate with one another.\nSo, in the management portal, create a new virtual network using the “Custom Create” option.\n \nAfter specifying a Name and Affinity Group, configure the DNS Server, this will be the DNS Server for the virtual machines in this virtual network. \nA quick hint: Azure virtual machines cannot be configured with static IP addresses, but the address assignment always starts with .4, so the first virtual machine that is started will get the .4 address. I do make sure to start my DNS server before starting anything else.\n \nSince we are configuring point-to-site VPN, we need to check the corresponding check box. In the next screen we are configuring an IP address range that will be used by the virtual network. This is not yet the subnet for the VM, it is just the address range within which the individual subnets will be created.\n \n\n\n\n\nAnd in the last screen we are actually configuring the subnets. We need one ore more subnets (within the address range configured before) for the virtual machines, as well as a “Gateway subnet”. This subnet will be used for the gateway.\n \nOnce the virtual network has been created, we need to add a subnet for the VPN clients that will connect to the virtual network. This is done using the “Configure” tab in the virtual network’s properties.\n \nThe last step is to create the gateway, using the “Create Gateway” button in the “Dashboard” tab of the virtual network. This process creates the required configuration within Windows Azure, an IP address and a hostname are assigned for clients to connect.\n \nVoila, that’s it from a network configuration point of view. \nAuthentication\nNow when Clients are connecting to a VPN some form of authentication is required, in our case of point-to-site VPN, the Azure virtual network uses an SSTP connection with certificates for authentication.\nThe first step is to upload the Certification Authority’s certificate (public key) to the virtual network. Certificates issued by this CA can then be used to authenticate and connect to the VPN. I am using my lab CA and had to install the CA certificate in my clients “Local Machine” trusted root store.\n \nAfter uploading the CA certificate, I requested a new certificate for my user account (using the “User” template). In order to connect to the virtual network in the Azure Cloud one last step is required, we need to download the Client VPN package which is available in the “Dashboard” tab in the virtual network configuration. The installation is simple and once installed, a new VPN connection will be available.\n \nAnd that’s it. Now I am able to connect my notebook to the Azure virtual network, making it possible to connect “directly” to the VMs running in the Cloud :)\nA quick ipconfig shows that my client got an IP address from the address range I configured earlier, the DNS servers have been assigned, too.\n&#160;\n&#160;\nOk, enough for tonight, time to get my head out of the clouds :-)    Tom"
        },
        {
          "id": "post-cng-certificates-and-lync-tmg",
          "title": "CNG Certificates and Lync/ TMG",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/cng-certificates-and-lync-tmg/",
          "content": "The other day I had a problem assigning certificates to a Lync 2013 Edge Server, today I had the same thing with TMG 2010. Here’s a quick summary, and the solution ;)\nProblem\nI tried to assign an existing certificate to a Lync Edge Server. It did not work using the Deployment Wizard, I tried the PowerShell command and it didn’t work, either.\nEvery time I tried to “Set-CsCertificate” I would get the following error:\n„Set-CsCertificate: Command execution failed: The buffer supplied to a Function was too small.”\nKind of the same thing happened with TMG Server, I tried to assign a certificate to a Web Listener and it would not show up in the Wizard. When I unchecked the “Show only valid Certificates” checkbox, the certificate in question would show with an Error saying:\n“Incorrect Key Type”\nSolution\nThe solution is to export the certificate, including private key, to a .pfx file. Copy the .pfx file to some workstation with Firefox installed and import the certificate in Firefox.\n \nNow use Firefox to “backup” the certificate, this will create a .p12 file, again containing the private key. Copy the .p12 file back to the Server delete the existing certificate and then import the .p12 file using MMC Certificates.\nWarning: Before deleting the certificate from the Server, make sure you have a working backup (like the .pfx file) or you will have to get a new one.\nTry to assign the Certificate to a Lync Service or a TMG Web Listener and enjoy.\nI realize that this sounds pretty silly at first, if you want more detail, keep on reading :)\nBackground\nIf you are still reading, there is a little more information for you. The certificates in question were using something called “Cryptography Next Generation”, which seems to be some new set of APIs that was introduced in Windows Vista and Server 2008. When creating a custom certificate request, one can select the “Template” to use, this is not the certificate template, but the “Crypto Provider” if you will.\n\nThe certificates that I mentioned, have all been requested using the CNG Template. Importing/ Exporting them in Firefox seems to fix this, maybe because Firefox prefers CAPI over CNG? If you have any information on this topic, please leave a comment.\n\nMore info on Crypto Next Generation is available on TechNet: http://technet.microsoft.com/en-us/library/cc730763(WS.10).aspx\nCheers,   tom"
        },
        {
          "id": "post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-2",
          "title": "How to build an UAG 2010 Array for Exchange publishing–Part 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange, Lync, uag, Skype4B",
          "url": "/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-2/",
          "content": "Finally I finished Part 2 of the UAG 2010 publishing post. I spent days with the UAG configuration to publish Exchange 2013 in the right way but with no success. There are some problem with Lync and OWA that I cannot fix. I decided to disable URL filters. Now my Exchange publishing works and in this final post I explain how my configurations looks like.\nFirst step is to create a new Trunk for Exchange publishing\nThen you have to create the Applications for Exchange. First create the Outlook Web Access Application:\n\nSelect the Exchange CAS Servers or the CAS Server VIP.\n\nConfigure the authentication and authorize all users.\nNext step is to rerun the Wizard to publish Outlook Anywhere and Exchange Active Sync.\n\nConfigure Authentication, Kerberos for OWA and Basic for Autodiscover\n\nDon&rsquo;t forget to configure SPN&rsquo;s and delegation in ActiveDirectory for Kerberos to work. You can export the settings needed into an LDIF File with the &ldquo;Export KCD settings&rdquo; wizard in UAG and import it in AD. Or you can set the SPN&rsquo;s manually:\n\nYou can check the SPN&rsquo;s and export the file:\n\nWhen you created the applications you have an application list like this:\n\nConfigure Portal Homepage Change the Portal Home page and uncheck display Home Page within portal frame\n\nDisable component installation To prevent UAG installing the client, disable component installation.\n\nRedirect HTTP to HTTPS\nTo redirect HTTP connections to HTTPS create the redirection Trunk in the &ldquo;HTTPS Connections&rdquo; section and select the Exchange Trunk.\n\n&nbsp;\nThe basic configuration is done and Exchange is now published via UAG. But there are some issues:\nLync: Lync Clients cannot get autodiscover settings In my environment Lync clients couldn&rsquo;t get the autodiscover configuration from Exchange. After checking the UAG logs I noticed that UAG has a problem when Lync announces his Client Agent.\nSolution: Disable scripting on the trunk\n\nOWA: 500 error message when you open another mailbox from OWA In my environment it was not possible to open another users mailbox without getting the following 500 error message:\n\nSolution: Disable &ldquo;verify URLs&rdquo; on the OWA Application\n\nConclusion\nI&rsquo;m sure with deeper troubleshooting there must be exist a better way to fix this errors but in my opinion UAG is not the right product for publishing Exchange. Better you use a load balancer or II ARR. I my next publishing post I explain how to publish Exchange 2013 with Citrix Netscaler."
        },
        {
          "id": "post-connect-sharepoint-2013-with-exchange-2013-to-sync-tasks",
          "title": "Connect Sharepoint 2013 with Exchange 2013 to sync tasks",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange, Sharepoint",
          "url": "/post/connect-sharepoint-2013-with-exchange-2013-to-sync-tasks/",
          "content": "To sync Tasks with Exchange and Sharepoint 2013 some base functionality has to be prepared:\n- Running user profile synchronization - Work management service deployed - SSL for the Web Application with valid certificate\nUser profile synchronization There are some nice how to&rsquo;s how to get this service running. In simple words you need an user account that has &ldquo;Replicating Directory Changes&rdquo; rights in AD\n\nThen you have to start the User Profile Service Application in the Sharepoint Central Administration.\n\nIf everything works both ForeFront Services are running and you can configure the user profile service.\n\n&nbsp;\nWork management \nThe Work management Service application doesn&rsquo;t need extra configuration. It only has to be deployed and working. On Technet is a short description how to create this service application.\nhttp://technet.microsoft.com/en-us/library/fp161254.aspx\nSSL\nThe Web Application needs to be SSL enabled. This can be done easily in IIS by enabling the HTTPS binding:\n\nTo verify that this works you can check if the Exchange server can access the AuthMetadataUrl with the browser. AuthMetadataUrl: https://intranet.domain.local/_layouts/15/metadata/json/1\nIf you can access the 1.json file without authentication this step worked.\n\nTip: If you have to enter credentials, check the authentication methods in IIS for the Web Application. Anonymous needs to be activated:\n\n&nbsp;\nNow you can connect Sharepoint with Exchange:\nOn Sharepoint 2013 1) Download EWSManagedAPI.msi from http://www.microsoft.com/en-us/download/details.aspx?id=35371 2) Install the EWS API with the following switches: msiexec /i EwsManagedApi.msi addlocal=\"ExchangeWebServicesApi_Feature,ExchangeWebServicesApi_Gac\" 3) Reset IIS\nOn Exchange 2013 1) Switch to the following directory: C:\\Program Files\\Microsoft\\Exchange Server\\V15\\Scripts 2) Configre Enterprise Partner Application .\\Configure-EnterprisePartnerApplication.ps1 -ApplicationType Sharepoint -AuthMetadataUrl https://intranet.domain.local/_layouts/15/metadata/json/1\nYou should get the following output\n\nNow you are able to sync Tasks with Sharepoint and Exchange 2013:\n\nTip: If this does not work and - you are not in the same Domain with Exchange (maybe in a subdomain) - you have an error with Exchange Autodiscover in the Sharepoint logs - you have authentication errors with Exchange in the Sharepoint logs  check that your subdomain (for example subdomain.domain.local) is added to the accepted domains in Exchange.\nGreetings dn"
        },
        {
          "id": "post-activesync-devices-ask-for-authentication",
          "title": "ActiveSync devices ask for authentication",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/activesync-devices-ask-for-authentication/",
          "content": "One of the first steps in an Exchange 2010 to 2013 migration is to make Exchange 2013 internet facing to handle the requests from external and internal clients.\nAfter my first attempt to switch from Exchange 2010 CAS and TMG to UAG and Exchange 2013 CAS servers on the frontend I noticed that some Android and iPad ActiveSync users got authentication requests.\nFirst thing I checked was the eventlog on the CAS machines and if the inheritance was enabled on the user accounts. Both were ok so I began to check the IIS logs first on the 2013 and then on the 2010 machine because the 2013 CAS proxies the requests to the 2010 CAS.\nOn the 2013 CAS I could see that this users tried to logon but the session ended with a HTTP 401 (Unauthorized) Error:\n\nOn the CAS 2010 I checked the logs and filtered users and time when they tried to logon. The result was that in the IIS logs the domain of the users that did not sync was different from the users that worked.\n\nUser1 &ndash;&gt; domain\\User1 User2 &ndash;&gt; domain.local\\User2 User3 &ndash;&gt; domain.local\\User3\nI checked the devices of User2 and User3 and find out that the domain was missing in the account settings. Previously when Exchange 2010 with TMG were internet facing, TMG made this stuff working.\nTo get this fixed with Exchange and UAG you can set the default domain in IIS on the Exchange 2013 CAS servers if the device does not send the domain.\n\nAfter an IIS reset the devices can successfully connected.\nGreetings dn"
        },
        {
          "id": "post-lync-2013-survivable-branch-server-installation",
          "title": "Lync 2013 Survivable Branch Server – Installation",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, de, Skype4B",
          "url": "/post/lync-2013-survivable-branch-server-installation/",
          "content": "Nach dem Planen und Veröffentlichen der Topologie kann der Server installiert werden. Wie bereits erklärt, werden nicht alle Lync Rollen installiert, weshalb die Liste der Systemvoraussetzungen deutlich kürzer ausfällt:\nWindows 2012 Systemvoraussetzungen\nAdd-WindowsFeature Windows-Identity-Foundation\nSobald die Windows Identity Foundation installiert ist, kann das Lync Setup wie gewöhnlich ausgeführt werden. Dafür wird der Deployment Wizard verwendet und im ersten Schritt der lokale “Configuration Store” installiert.\n\nAnschließend werden im Schritt zwei und drei die Lync Komponenten installiert und ein Zertifikat zugewiesen. Das Zertifikat fällt auf dem Survivable Branch Server deutlich einfacher aus, was wieder auf die reduzierten Serverrollen zurückzuführen ist. Webservices und Lyncdiscover werden nicht installiert, je nach DNS Konfiguration muss man allerdings den Eintrag für SIP berücksichtigen. In meinem Lab sieht das sieht das Zertifikat so aus:\nCN = ly15-sba.tomt.local      DNS Name = ly15-tomt.local       DNS Name = sip.tomt.it\nIst das Zertifikat zugewiesen, können die Dienste gestartet werden, der Erfolg wird am Besten per PowerShell überprüft:\nGet-CsWindowsService\n\nInfrastruktur\nDie Verfügbarkeit von Infrastrukturdienste wie DNS und DHCP muss in Außenstellen natürlich auch berücksichtigt werden.\nGibt es in der Außenstelle Telefone mit Lync Phone Edition sollte der DHCP Dienst lokal verfügbar sein, sonst verlieren diese Telefone bei Ablauf der Leases die Verbindung.\nDie DHCP Optionen werden dabei folgendermaßen konfiguriert:\nOption 42 (NTP): lokaler NTP Server, z.B. Router      Option 43 (Certificate Provisioning): Front End Server, ly15.tomt.local       Option 120 (SIP Registrar): SBS, ly15-sba.tomt.local&lt;/p&gt;    DHCPUtil -SipServer ly15-sba.tomt.local -WebServer ly15.tomt.local&lt;/code&gt;  Bei DNS kann man nicht immer eine separate Konfiguration darstellen, gibt es einen Domain Controller in der Außenstelle, stellt dieser für gewöhnlich die Active Directory integrierte Zone zur Verfügung. Das ist für Lync allerdings kein Problem, für das WebTicket benötigt der Client ohnehin eine Verbindung zum Front End Server. Wird der Benutzer dann auf den SBS verschoben, teilt der Lync Front End Server das im Anmeldeprozess mit.  Benutzer  Wenn der Survivable Branch Server einsatzbereit ist, können Benutzer auf diesen verschoben werden um von der höheren Verfügbarkeit zu profitieren. Dies kann über das Lync Server Control Panel oder die Lync Management Shell gemacht werden:  Move-CsUser –Identity user10@tomt.it –Target ly15-sba.tomt.local  Dieser Befehl verschiebt den Benutzer user10 auf den SBS. Der Anmeldeprozess am Client sieht jetzt folgendermaßen aus:  Das Erste REGISTER geht an den Lync Front End Server (10.1.1.27), dieser wurde über DNS Autokonfiguration ausgewählt, der Dienst Eintrag für _sipinternaltls.tomt.it zeigt nach wie vor auf diesen Server.     Der Front End Server antwortet mit einem “301 Redirect” und teilt dem Client seinen Home Server für die Anmeldung mit. Der Client sendet dann erneut ein REGISTER an diesen neuen “Home Server” (10.1.1.21).     Nach der erfolgreichen Anmeldung sehen wir in den Konfigurationsinformationen, dass der Client mit dem SBS Pool verbunden ist (Connected Lync Server). Außerdem fällt hier auf, dass der Client nach wie vor die Web Services des zentralen Lync Pools (Front End Server) nutzt.    Fällt die WAN Verbindung (oder der Lync Pool) aus, wechselt der Client in einen Modus mit eingeschränkter Funktionalität und zeigt eine Warnung an. Diese erinnert den Benutzer, dass er zwar seine Buddy Liste verliert, allerdings nach wie vor telefonieren kann. In diesem Fall ist es vorteilhaft wenn der Client ein lokales Adressbuch hat, die Client Policy für Benutzer auf dem SBS sollte entsprechend konfiguriert werden.    Natürlich kann auch der SBS ausfallen, in diesem Fall meldet sich der Lync Client wieder am Front End Server an und kann weiterhin die kompletten Features nutzen.  &#160;  Grüße,    Tom"
        },
        {
          "id": "post-hyper-v-general-access-denied-error",
          "title": "Hyper-V General access denied error",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Hyper-V",
          "url": "/post/hyper-v-general-access-denied-error/",
          "content": "Like many others in the ITPro world, I am using many VMs to demo, learn, troubleshoot all different kinds of products and customer scenarios. I also mess with the disk files a lot. Every now and then I get the following error when trying to start a VM:\nHyper-V Manager &lt;/p&gt;    An error occurred while attempting to start the selected virtual machine(s).     'dc02' failed to start. (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02' Microsoft Emulated IDE Controller (Instance ID 83F8638B-8DCA-4152-9EDA-2CA8B33039B4): Failed to Power on with Error 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02': IDE/ATAPI Account does not have sufficient privilege to open attachment 'C:\\Users\\Public\\Documents\\Hyper-V\\Virtual hard disks\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02':&#160; Account does not have sufficient privilege to open attachment 'C:\\Users\\Public\\Documents\\Hyper-V\\Virtual hard disks\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708) &lt;/code&gt;  Problem  The problem is rather simple, and since Hyper-V has been around for some time now, it should also be well-known to most of us: The VM does not have the necessary (read, write) permissions to use the assigned .vhd or .vhdx disk. So how do you restore the permissions?  Solution  As always, there are many solutions, one could use Hyper-V manager, remove the disk from the affected VM and then add it again. You could even use icacls to somehow get the ACLs right.  Or, simply use my Restore-VMPermission script :)  It’s a PowerShell script that can be used to easily restore permissions for a specific VM (or all VMs) on your Lab Host, it requires the Hyper-V PowerShell Module to get the VMId and then builds the required ACE and adds it to the virtual disk file’s ACL.  As always, please don’t use this in production without thoroughly testing. This is meant for Lab environments.  Verify  Just try to start your VM again, or have a look at the .vhd or .vhdx files security settings and find a similar looking entry:     &#160;  so long,    tom"
        },
        {
          "id": "post-lync-2013-survivable-branch-server-planung",
          "title": "Lync 2013 Survivable Branch Server – Planung",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Lync, Skype4B",
          "url": "/post/lync-2013-survivable-branch-server-planung/",
          "content": "Immer häufiger ersetzen Unternehmen klassische Telefonanlagen (PBX) mit Unified Communications Lösungen wie Microsoft Lync. Da Telefonie immer schon gute Verfügbarkeit hatte, müssen in der Lync Umgebung Konzepte her um diesen hohen Anforderungen gerecht zu werden.\nFür das Rechenzentrum \nIn Außenstandorten sieht das meist anders aus, durch die Zentralisierung der IT-Dienste gibt es wenige (oder gar keine) Server und kein Personal das sich um die Wartung einer komplexen Umgebung kümmern kann. Die Clients in der Außenstelle hängen also von einer zuverlässigen Verbindung zum Rechenzentrum ab. Fällt diese Verbindung aus, ist der Lync Pool nicht mehr erreichbar und somit auch Telefonie nicht mehr verfügbar.\nSurvivable Branch…?\nGenau in diesen Szenarien kommen Survivable Branch Server oder Applicances ins Spiel. Diese werden eingesetzt um Telefonie in Außenstellen unabhängiger von der Verbindung in das Rechenzentrum zu machen.\nFolgendes Schaubild habe ich im TechNet gefunden, Benutzer die sich in der “Branch Site” aufhalten sollen weiterhin telefonieren können, wenn die WAN Verbindung (und dadurch der Lync Pool) nicht verfügbar ist. Features wie Konferenzen, Response Groups oder die Buddy List sind bei einem Ausfall der WAN Verbindung trotz SBS nicht verfügbar, es geht hier nur um Telefonie.\n\nQuelle: http://technet.microsoft.com/en-us/library/gg398095.aspx\nDie Grundvoraussetzung ist natürlich eine Verbindung in das Telefonnetz, die von der WAN Verbindung unabhängig ist. Üblicherweise hat man dafür einen Amtsanschluss und ein passendes Media Gateway in der Außenstelle. \nAppliance oder Server?\nEine Survivable Branch Appliance ist, wie der Name schon sagt, eine Hardware Appliance. Diese kommt entweder direkt mit dem PSTN Gateway oder wird nachträglich eingebaut. Auf der Appliance läuft ein Windows Server, bei der Einrichtung werden die benötigten Lync Rollen installiert.\nEin Survivable Branch Server ist ein “normaler Server” (auch virtuell) auf dem die benötigten Lync Rollen installiert werden.\n\nBei beiden varianten, SBA und SBS, wird kein vollständiger Lync Front End Server, sondern “nur” die Rollen Mediation Server und Registrar, installiert. So erklärt sich auch, warum ein SBS zwar die Telefonie aufrechterhalten, aber z.B. keine Konferenzen hosten kann.\nEine SBA kann für Außenstellen mit bis zu 1000 Benutzern verwendet werden, während ein SBS bis zu 5000 Benutzer bedienen kann.\nBeide Varianten benötigen keine Lync Server Lizenz, Windows muss natürlich entsprechend lizenziert werden.\nVorbereitung\nWie immer bei Lync, muss man die Konfiguration erst mal im Topology Builder planen, bevor es an die Installation geht.\nWir erstellen also eine neue “Branch Site” in der Topologie, dabei vergeben wir einen Namen und weitere Eigenschaften wie City, State und Country. Die Branch Site wird immer einer Central Site zugewiesen:\n\nDie Checkbox für “Open the new SBA wizard…” ist Standardmäßig aktiv. Für die Lync Topologie gibt es den Unterschied zwischen SBS und SBA nicht, wir legen also im nächsten Schritt den FQDN für unseren SBS fest:\n \nClients in der Branch Site benötigen Zugriff auf einen Front End und Edge Pool für die meisten Funktionen, diese Pools werden im Wizard angegeben:\n \nIm letzten Schritt wird das Gateway angegeben, welches in der Außenstelle für Telefonie verwendet wird:\n&#160;\nDie Topologie muss veröffentlich werden, bevor der Survivable Branch Server installiert werden kann, auch dieser holt sich die Informationen über die zu installierenden Rollen aus dem Central Management Store. \nAchtung: Das Computerkonto für den SBS sollte vor dem veröffentlichen der Topologie existieren, da einige Active Directory Berechtigungen gesetzt werden. Gibt es das Konto noch nicht, protokolliert der Topology Builder eine Fehlermeldung. Sobald der SBS Mitglied der Domain ist, muss die Topologie erneut veröffentlicht werden.\nIm nächsten Beitrag installieren wir die Lync Rollen auf dem Survivable Branch Server und schauen uns die Funktionalität der Clients an.\n   Schönes Wochenende!    Tom"
        },
        {
          "id": "post-lync-private-line",
          "title": "Lync Private Line",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/lync-private-line/",
          "content": "I was at a customer’s site the other day when we he received the following request.\nProblem\nUser A (the Boss) forwards his phone to User B (the Assistant). As someone calls the Boss, obviously the Assistants phone rings and she picks it up, it turns out the caller is important and needs to talk to the Boss. The Assistant transfers the call to the Boss… and that’s it. Since the Bosses phone is forwarded, nobody will be able to reach him.\nInterestingly, in the ancient PBX world there was a “feature” (I’d call it bug) where the Assistant could “break through” the forwarding setting and therefore transfer calls to the Boss.\nAfter bouncing some ideas we came up with a pretty simple solution. As the title implies, it makes use of Private Line feature in Lync 2013.\nSolution\nAfter some testing we configured a Private Line on the Bosses account and again, set up call forwarding to the Assistant in his Lync client.\nNow, if someone calls the Boss, the Assistants phone would ring. If the caller wants to talk to the Boss, the Assistant can now simply forward the call to the Bosses private line. Call forwarding settings are not applied to this line, so his client would ring and he would be able to take the call. \nAlternative solutions\nSure enough, there is no “one” solution, other possibilities would be the use of the Delegate or even Team Call features. In this particular case, though, we decided to use the Private Line.\nUpdate: Another solution for this particular problem would be to have the Boss configure the Assistant as his delegate, and the configure “Forward to Delegate” in her Lync Client. This enables User B to put calls through to User A, even though User A’s client is configured to forward calls.\n \nYou can use my wrapper script for SEFAUtil to configure this, too.\n.\\Invoke-SefaUtil.ps1 –Server ly15.tomt.local –UserName boss@tomt.it –AddDelegate assistant@tomt.it –FwdToDelegates \nThanks to @jpborth for pointing this out!\nConfiguration\nThe Private Line feature requires Lync Server 2013, and is not exposed in the Lync Control Panel. The Set-CsUser cmdlet is used to configure a private line for a user:\nSet-CsUser –Identity boss@uclab.eu –PrivateLine “tel:+39123123”\nNote: TechNet says, private line is new in Lync 2013, next time I’m in a pure 2010 environment, I’ll check if this feature can be configured on Lync 2010, too.\n&#160;\nso long,    tom"
        },
        {
          "id": "post-updated-invoke-sefautil",
          "title": "date_modified: Invoke-SEFAUtil",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, PowerShell, Lync, Skype4B",
          "url": "/post/updated-invoke-sefautil/",
          "content": "Some weeks ago, I’ve written about my PowerShell wrapper function for SEFAUtil.exe, the original post can be found here: /post/Invoke-SEFAUtil-a-PowerShell-wrapper-function.aspx\nGUI\nFirst of all, in case you haven’t seen it yet, MVP Johan Veldhuis created an AWESOME GUI wrapper. Check it out: http://johanveldhuis.nl/en/sefautil-gui/\nIf you still want to run it via PowerShell, keep on reading ;)\n\nUpdated Script\nAfter playing around with my script I figured it would be cool if it would return more “PowerShell like” objects instead of the plain text returned by sefautil.exe. I also wanted it to take pipeline input and updated the related links to point to a help page instead of the blog article. \n\nTurning a bunch of strings into a PowerShell object\nLooking at the text output of the tool, we can see it has a format of “description : value”. \nSample output:\nUser Aor: sip:ttorggler@uclab.eu      Display Name: Thomas Torggler       UM Enabled: True       Simulring enabled: False       User Ring time: 00:00:30       Call Forward No Answer to: voicemail\nAs they have the same structure, this does immediately bring PowerShell dictionaries (hashtables) to mind. I simply used the –split method to split the strings at “: “ (colon space) and saved the result to a new array.\n$SEFAResultSplit = $SEFAResult -split ': '\nThis worked as expected, so I went ahead and created my custom object like this:\n$data =&#160; @{$SEFAResultSplit[0] = $SEFAResultSplit[1];      $SEFAResultSplit[2] = $SEFAResultSplit[3];       }\nAfter testing it in the lab, I realized, even though this worked, it was less then ideal. Sefautil returns a dynamic amount of strings depending on which features are configured for the given user. So while it was reasonably sure that ”$SEFAResultSplit[0]” would always be “User Aor”, I would have no way of knowing the value of the next strings. And, more importantly, I would not know how many strings to expect, a more dynamic approach was needed.\nThis is what I came up with after some serious head scratching:\nfor ($i = 0; $i -lt $SEFAResultSplit.Count; $i++) {      &#160;&#160;&#160; if ([bool]!($i%2)) {       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $j = $i + 1       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $outData += @{$SEFAResultSplit[$i] = $SEFAResultSplit[$j]}       &#160;&#160;&#160; }       }\nAnd here is what it does: The array that contains the split strings would always contain the “description” at an even number while the actual values would be found at odd numbers. So, the script loops through the array, and for each even number it creates a new “Key : Value” pair that is saved to a hash table. \nWhatever object in the array is at the even index number would be used as key, and that even number +1 would be used as value. Sweet.\n\nWhy?\nWell, first of all, because it’s cool ;)\nThen, think about this:\nGet-CsUser –OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\Invoke-SEFAUtil.ps1 –Server ly15.tomt.local | Where-Object {‘Simulring enabled’ –eq $true}\nFirst the Get-CsUser cmdlet is used to get all users within a specified organizational unit, the user objects are then piped into my wrapper script and the output can be filtered just like any other PowerShell output. Of course it could also be converted to html or exported to csv, the point is returning objects instead of text.\nSure enough, we can now also take advantage of pipeline input processing to set call forwarding settings for multiple users:\nGet-CsUser -OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate user1@tomt.it\nAgain, we use Get-CsUser to get some Lync Users and pipe them to the script, which adds user1@tomt.it as a delegate to the every one of the users. \nDownload\nI’ve updated the script on my Sky Drive, find a link at the new help page.\nCheers,    tom"
        },
        {
          "id": "post-exchange-unified-messaging-sprachauswahl",
          "title": "Exchange Unified Messaging Sprachauswahl",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Lync, Exchange, Skype4B",
          "url": "/post/exchange-unified-messaging-sprachauswahl/",
          "content": "Seit Exchange 2007 integriert die Unified Messaging Rolle klassische Anrufbeantworter in Exchange und schafft so eine neue, “unified” Mailbox für Benutzer.\nSeit es die Exchange Unified Messaging Rolle gibt, kann man diese durch die Installation von Sprachpaketen anpassen. In diesem Post beschreibe ich eine Änderung in der Funktionsweise die mir in den vergangen Tagen einiges an Kopfzerbrechen bereitet hat.\nSzenario\nAnhand folgender Test Benutzer versuche ich das Verhalten in den jeweiligen Exchange Versionen zu erklären. “Bekannt” und “Unbekannt” bezieht sich hier auf die Exchange Umgebung, “bekannt” heißt der Benutzer hat eine Mailbox, die für UM aktiviert wurde, in der Exchange Umgebung, “unbekannt” heißt er hat keine Mailbox.\nIn dem Beispiel wurde das Sprachpaket für Deutsch auf dem Exchange UM Server installiert, außerdem gibt es einen Exchange Dial Plan, die Standardsprache des Dial Plans ist Deutsch.\nBenutzer A = bekannt, Regionaleinstellung: Deutsch    Benutzer B = bekannt, Regionaleinstellung: Englisch     Benutzer C = Unbekannt, z.B. Partner, Kunde\nSubscriber Access: Ein bekannter Benutzer ruft eine in Exchange konfigurierte Nummer an, um auf seine Mailbox zuzugreifen.\nCall Answering: Ein bekannter oder unbekannter Benutzer wird auf ein UM Postfach weitergeleitet, da der ursprünglich Angerufene Teilnhemer das Gesrpäch nicht annehmen konnte.\nExchange 2010 SP2 und neuer\nRuft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.\nRuft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.\nWenn Benutzer B oder C auf die UM Mailbox von Benutzer A weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)\nWenn Benutzer A oder C auf die UM Mailbox von Benutzer B weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)\nExchange 2007 bis 2010 SP1\nRuft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.\nRuft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.\nWenn Benutzer B auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)\nWenn Benutzer A auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)\nWenn Benutzer C auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)\nWenn Benutzer C auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)\n\nUnterschiede\nDas mag in Textform etwas verwirrend wirken, der Unterschied ist für mich jedoch beträchtlich:\nBis Exchange 2010 SP1 benötigt man einen Dial Plan um alle Sprachen abzudecken, da Exchange rücksichft auf die Sprache der Mailbox nimmt.\nAb Exchange 2010 SP2 benötigt man für jede Sprache die unterstützt werden soll einen eigenen Dial Plan, da die Sprache der Mailbox ausschließlich für Subscriber Access berücksichtigt wird.\n&#160;\nTom"
        },
        {
          "id": "post-lync-server-backup",
          "title": "Lync Server Backup",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Lync, Skype4B",
          "url": "/post/lync-server-backup/",
          "content": "As with all systems a sound backup and recovery strategy is key when deploying Lync. This post will cover some basic ideas about what (and how) to backup in a Lync Topology. \nLync, being essentially a SIP proxy, does not store a lot of data. It cannot be compared to the likes of Exchange or SQL, systems that are all about storing stuff. With Lync, we need availability, the rest is real time traffic/ presence information, only interesting in the moment when it happens.\nWhat?\nSo what does Lync store then?\nTopology, Policies, Configuration \nThe topology contains all relevant information about Lync Servers and applications. Once the servers are set up, administrators start configuring voice and client policies, trunk settings and all the other good stuff.\nWe can export all of this configuration settings using the cmdlet: Export-CsConfiguration.\nUser Settings, Buddy Lists \nAfter configuring the server side of things it’s time to enable some users for Lync, as the admin does so, configuration about the users, like their RegistrarPool ,SipAddress and LineUri are saved within the Lync system. Once the user logs on and starts to add contacts to their buddy list, those get stored on the Lync Servers as well.\nWe can export all of this information using the cmdlet: Export-CsUserData\nResponse Group\nIf Lync Response Groups are configured there is some configuration information to store for them as well. This can be exported using the cmdlet: Export-CsRGSConfiguration\nLocation Service\nThe same idea applies to the Location Services, if configured, the configuration can be exported using the cmdlet: Export-CsLisConfiguration\nLync File Store\nSure enough, the Lync file store needs to be included in the backup plan as well. This is not stored inside Lync, it typically resides on a highly available fileserver.\nNow if that external fileserver is backed up regularly, just make sure it is included in your backup/recovery documentation and try to restore it regularly. If it is not included in existing backup strategies consider using robocopy.\nMonitoring and Archiving Data\nMonitoring and Archiving data are not really stored inside Lync, either. Data is stored within the LcsCDR, QoEMetrics and LcsLog databases on a SQL server. There are no Lync tools available to backup this data, it is typically backed up using existing backup software for SQL or through SQL Management Studio.\nAs with the Lync file store, make sure to include backup/restore dependencies and scenarios in the Lync documentation.\nPersistent Chat Data\nLync 2013 introduced the persistent chat feature, now for the first time we really do store instant messages and attachments sent by users.\nData is stored within the Persistent Chat Database and can be exported using the cmdlet: Export-CsPersistentChatData. If existing backup software for SQL is available, the persistent chat database is typically backed up like any other application database.\n\nHow?\n\nNow that we know what there is to backup, let’s have a look at how. I did point out the Export-* cmdlets and they’re the tool of choice for backing up Lync configuration information and settings.\n\n\n  Note: The account used to run the Export-* cmdlets needs to be member of the RTCUniversalServerAdmins group.\n\n\nI’ve come up with a quick script that invokes the mentioned Export-* cmdlets. The script can be found on my Github.\n\nFind more information about the script on the help page.\n\nTom"
        },
        {
          "id": "post-outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013",
          "title": "Outlook Autodiscover and what to do when migrating from Exchange 2010 to 2013",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013/",
          "content": "Outlook Clients &gt;= 2007 use Autodiscover to detect the connection settings to connect to the Exchange Server.\nWhen a CAS Server is installed, the server hosts a virtual directory in IIS named &ldquo;Autodiscover&rdquo;.\n\nOutlook and mobile phones contact this virtual directory and download the autodiscover.xml file if one of the following condition occurs:\n- When you configure a mailbox - When the mailbox is already configured but Outlook or the mobile phones is unable to connect to the Exchange server - Outlook contacts periodically the Autodiscover service to update the connection settings if needed\nThe client discovers and connects to the Autodiscover service in a different way if located internal and external.\nIf Outlook is external\nWhen the Outlook Client is outside the cooperate network it uses DNS to discover the Autodiscover URL by searching an A Record with autodiscover.domain.com or an SRV record that points to the public name.\nIf Outlook is internal\nWhen the Outlook Client is inside the cooperate network it searches in AD for a SCP (service connection point) object. The SCP object is an entry for each CAS server in ActiveDirectory that contains the Autodiscover URL. You can check the SCP object by using the cmdlet Get-ClientAccessServer or ADSIedit. If you want to update the SCP records, use the cmdlet instead of ADSIedit.\nWhat do I have to do if I&rsquo;m upgrading from Exchange 2010 to 2013?\nWhen you upgrade from Exchange 2010 to 2013 one of the first steps is to make the CAS 2013 internet facing. So clients get the autodiscover.xml file and settings via the Exchange 2013 servers. The CAS knows if the mailbox is hosted on an Exchange 2013 server, then the CAS sends you the settings to connect to the 2013 environment, or on the old 2010, then the CAS sends you the settings to connect to Exchange 2010 (CAS 2013 proxies the requests to 2010).\nThis is OK for external Clients. But for internal clients connections you have to update the SCP object from the old 2010 Exchange CAS server to point to the new 2013 CAS server. This is necessary because Exchange 2013 servers provide additional AutoDiscover information to clients to improve the discovery process. From this time when internal clients connect to the Autodiscover service they contact every time the 2013 CAS and get the connection settings. You can update the SCP object and so updating the URL by using the cmdlet Set-ClientAccessServer like in the following example:\nSet-ClientAccessServer CAS2010SERVER -AutoDiscoverServiceInternalUri https://cas2013server.domain.local/Autodiscover/Autodiscover.xml\nGreetings dn"
        },
        {
          "id": "post-troubleshooting-sharepoint-error-messages",
          "title": "Troubleshooting Sharepoint Error Messages",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Sharepoint",
          "url": "/post/troubleshooting-sharepoint-error-messages/",
          "content": "When you get a Sharepoint error message, they are sometimes not very helpful and it can be tricky to figure out what’s going wrong.\n\nAt this point the Sharepoint EventLog can help you getting more details. With the Powershell commandlet get-splogevent you can search the corresponding exception message. The correlation ID is the key.\nIf I’m searching the corresponding exception message from the error shown on the printscreen above, I execute following command:\nget-splogevent | where-object {$_.Correlation -eq &quot;88ab369c-71dd-108f-df09-ea6c74999562&quot;} | fl\nGreetings    dn"
        },
        {
          "id": "post-lync-music-on-hold-wartemusik",
          "title": "Lync: Music on Hold / Wartemusik",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Lync, Skype4B",
          "url": "/post/lync-music-on-hold-wartemusik/",
          "content": "Nach einiger Zeit mal wieder ein Artikel in deutscher Sprache :)\nHeute wollen wir uns die Music On Hold Thematik in einer Lync Enterprise Voice Umgebung anschauen. In diesem Artikel betrachten wir nur den Lync Client, MoH Konfiguration für IP Phones und Gateways werden in einem eigenen Artikel beschrieben.\nWas ist Music on Hold?\nDas kennt eigentlich jeder, trotzdem zur Erklärung: Teilnehmer A spricht mit Teilnehmer B, B möchte A weiterleiten und ruft C an. Bevor B ein neues Gespräch aufbauen kann, muss das aktuelle Gespräch gehalten werden. Damit A sich gut aufgehoben fühlt bekommt er Musik oder einen Text (“Sie werden mit dem gewünschten Teilnehmer verbunden…”) vorgespielt.\nWer spielt die Musik?\nJetzt wird das Thema interessant: Woher kommt die Musik? In der klassischen Telefonie wird für gewöhnlich ein “Medienserver” dafür verwendet, dieser hängt zentral an der TK Anlage und stellt Music on Hold für alle Gegenstellen zur Verfügung.\nIn einer End-to-End Infrastruktur wie Lync ist das nicht mehr so einfach, der Medien Datenstrom (Sprache) zwischen Teilnehmer A und B ist direkt, auch für die Signalisierung sind die User Agenten zuständig. Will also Teilnehmer B das aktuelle Gespräch halten, muss er dies Teilnehmer A irgendwie mitteilen und diesem dann, wenn gewünscht, Musik vorspielen.\nIn einer Lync Umgebung ist also der Lync Client von Teilnehmer B für die Musik zuständig.\n\nWelche Musik?\nIn den Einstellungen des Lync Clients kann eine Audio Datei, die als Music on Hold gespielt wird, ausgewählt werden. \n \nMöchte man sich für diese Aufgabe nicht auf seine Benutzer verlassen, kann man dies in einer CsClientPolicy vorgeben.\nNew-CsClientPolicy &quot;MusicOnHold&quot; -EnableClientMusicOnHold:$true –MusicOnHoldAudioFile:&quot;C:\\Program Files (x86)\\Microsoft Office\\Office15\\MEDIA\\DefaultHold.wma&quot;&lt;/p&gt;    Grant-CsClientPolicy –Identity “Username” –PolicyName “MusicOnHold”&lt;/code&gt;  Diesen Pfad bekommt der Lync Client per in-band provisioning mit, das sieht im Log so aus:     Achtung: Das setzen von EnableClientMusicOnHold:$true alleine ist nich ausreichend, der Benutzer muss hier nach wie vor die Datei selbst auswählen.  Dateipfad  Der aufmerksame Leser hat das Problem in der obigen Konfiguration sicher bereits gesehen, der Dateipfad für die Musik liegt im Installationsverzeichnis des Lync Clients. Dies unterscheidet sich allerdings von Lync 2010 zu Lync 2013 sowie bei 32 und 64 Bit Installationen.  Standardpfad Lync 2013: &quot;C:\\Program Files (x86)\\Microsoft Office\\Office15\\MEDIA\\DefaultHold.wma&quot;   Standardpfad Lync 2010: &quot;C:\\Program Files (x86)\\Microsoft Lync\\MEDIA\\DefaultHold.wma&quot;  Dies kann problematisch werden, wenn Benutzer sich an mehreren Geräten mit unterschiedlichen OS oder Lync Client Versionen anmelden. In diesem Fall empfiehlt es sich einen “allgemein gültigen“ Pfad in die CsClientPolicy zu schreiben. Dies kann wiederum problematisch werden wenn Benutzer sich von Unternehmensfremden Endpunkten anmelden, diese finden dann am personalisierten Pfad keine Datei, oder können nicht auf eine Freigabe zugreifen… Die aktuell Verfügbaren Konfigurationsmöglichkeiten erlauben es nicht wirklich alle Szenarien abzudecken.  Ausnahme: Response Group Service  Natürlich gibt es eine Ausnahme in der die Musik vom Lync Server kommt, ruft Teilnehmer A eine RGS Nummer an, kommt die Wartemusik vom Lync Server, allerdings nur bis zu dem Zeitpunkt an dem ein Agent das Gespräch entgegen nimmt. Jetzt liegt die Verantwortung beim Lync Client des Agenten, wird das Gespräch vom Agenten gehalten, kommt die Musik vom Client desselben.  Hintergrund: Auf folgender Seite habe ich die SIP Kommunikation zwischen Teilnehmer A und B aus diesem Artikel genauer beschrieben. SIP: Anruf halten     Schönes Wochenende!     Tom"
        },
        {
          "id": "post-sip-anruf-halten",
          "title": "SIP: Anruf halten",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/sip-anruf-halten/",
          "content": "An dieser Stelle möchte ich einen Blick auf die SIP Kommunikation in einem Anruf halten Szenario werfen. Die Informationen aus der SIP Kommunikation die ich im folgenden zeige sind auf das absolute Minimum beschränkt, ein wirkliches SIP Paket enthält viel mehr Informationen. \nIm folgenden Beispiel ruft Teilnehmer A (+49151xxxxxxxx) Teilnehmer B (+39047xxxxx) an, Teilnehmer B nimmt das Gespräch an. Anschließend hält Teilnehmer B das Gespräch. Die Frage die sich stellt ist natürlich wie signalisiert ein Teilnehmer (B) dem anderen (A) dass er das Gespräch halten möchte?\nINVITE / OK\nBevor ein Gespräch gehalten werden kann, muss dieses aufgebaut werden. Dazu sendet Teilnehmer A eine INVITE Anfrage an Teilnehmer B. Der Header beschreibt die SIP Sitzung, im Body wird mit SDP die Medien Sitzung beschrieben. Die interessanten Felder fasse ich hier zusammen:\nInvite Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37     CSeq: 24467 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4\nInvite Body:      c=IN IP4 192.168.1.100     m=audio 54720 RTP/AVP 0 8 115 13 118 97 101\nDer Lync Client des angerufenen Teilnehmers (B) muss die empfangene Anfrage beantworten und macht dies mit einem 200 OK. In diesem schickt er SDP Informationen mit, welche die RTP Sitzung aus seiner Sicht beschreiben:\nOk Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 24467 INVITE\nOk Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101\nre-INVITE / OK\nUm eine existierende SIP Sitzung (Dialog) zu ändern, schickt Teilnehmer B ein INVITE bei dem die Werte für Call-ID sowie From und To Tag identisch mit denen aus der bestehenden Sitzung sind. Man spricht in diesem Fall von einem re-Invite. Das Ziel dieses erneuten Invites ist es die RTP Sitzung zu ändern, also schickt der User Agent des Teilnehmer B neue SDP Informationen an Teilnehmer A, diese enthalten die Beschreibung der RTP Sitzung aus sicht von Teilnhemer B.\nre-Invite Header:     From: &quot;&quot; &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     To: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 1 INVITE\nre-Invite Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101     a=sendonly\nAuch diese Anfrage muss der Lync Client beantworten, in diesem Fall erhält Teilnehmer A die Invite Nachricht, Teilnehmer B möchte das Gespräch halten.\nOk Header:      From: &quot;&quot;&lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;tag=4f75d0c634;epid=ea6d933f37     To: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     CSeq: 1 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4\nOk Body:      c=IN IP4 192.168.1.100     m=audio 6190 RTP/AVP 8 13 101     a=recvonly"
        },
        {
          "id": "post-invoke-sefautil-a-powershell-wrapper-function",
          "title": "Invoke-SEFAUtil – a PowerShell wrapper function",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "PowerShell",
          "tags": "en, Lync, PowerShell, Skype4B",
          "url": "/post/invoke-sefautil-a-powershell-wrapper-function/",
          "content": "I had to use SEFAUtil to get some tasks done the other day. As I prefer using PowerShell over just another command line tool, I decided to come up with a quick wrapper function that is intended to make my life a little easier.\n\n\n\nIf you don’t know what SEFAUtil is and how to configure it, check out this great post or this one if you prefer German ;) In a nutshell, it’s a command line tool to configure Skype for Business (Lync) Voice Features (like call forwarding, team call) on behalf of end-users.\n\nWarning: I do not recommend using this in production without understanding what it does, although I did test it in my lab, it may break something!\n\nOk, having that said, how do I use thins thing? First of all you will need a copy of this script on the computer where you have been running SEFAUtil until now. As the computer is authenticated using a certificate (it must be configured as a trusted application), you will not be able to run this from anywhere. Once you’ve downloaded the script, start a Skype for Business Management Shell and use like in the following examples:\n\nEXAMPLE 1\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it \n\n\nThis example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.\n\nEXAMPLE 2\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567\n\n\nThis example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.\n\nEXAMPLE 3\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.it\n\n\nThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.\n\nEXAMPLE 4\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 \n\n\nThis example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.it\n\nEXAMPLE 5\n\n.\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCall\n\n\nThis example disables Team Call for thomas@tomt.it\n\nEXAMPLE 6\n\nGet-CsUser -OU \"OU=users,OU=tomt,DC=tomt,DC=local\" | .\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.it\n\n\nThe complete online help can be found here\n\nWhat I did in this script, is basically wrap PowerShell around SEFAUtil.exe, I did add some parameter validation, it can only run against Lync users for example. It does write a logfile to the $temp directory and supports PowerShells common parameters like Verbose and WhatIf.\n\nDownload &amp; Source for Invoke-SEFAUtil – a PowerShell wrapper function\n\nThe  is available on the PowerShell Gallery, you can install or download it using the following commands:\n\nInstall-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Scope CurrentUser\n\nSave-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Path &lt;Path&gt;\n\nAnd you can find the source on GitHub: \n    \n        tomtorggler/PowerShell\n    \n\n\n  Note: The script requires the Lync Module to be available on the Computer where it will be run, it does also require PowerShell version 3.\n\n\n\n  Note: Changing the CallAnswerTime only does not work, a limitation of the SEFAUtil.exe does not allow this setting to be changed without also configuring CallForwarding\n\n\nso long,\n\nTom"
        },
        {
          "id": "post-your-windows-phone-does-not-support-this-server-version",
          "title": "Your Windows phone does not support this server version…",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/your-windows-phone-does-not-support-this-server-version/",
          "content": "This is just a a quick post about an interesting issue I&rsquo;ve seen today, interesting it was, at least to me. I was at a customer&rsquo;s site publishing Exchange 2010 using a Sophos &ldquo;Unified Threat Management&rdquo; box. Well, we all have to live in a post TMG world, don&rsquo;t we?\nAfter installing the certificate on the box we configured the &ldquo;virtual web servers&rdquo; and the corresponding &ldquo;real web servers&rdquo;. Outlook Web App worked straight away so we went ahead and tried to connect a Windows Phone 8 using ActiveSync.\nThat didn&rsquo;t go so well, the Phone would not connect and instead give a strange error message saying:\nError 85002028: Your Windows phone does not support this server version.\nOk, that&rsquo;s where the interesting begins. I quickly fired up Remote Connectivity Analyzer which provided a much clearer error description along with a link to this KB article.\nIt turned out that we had not installed the intermediate CA certificate on the Sophos box. As the Winodws Phone requires the Reverse Proxy to send the whole chain down for verification, this simply didn&rsquo;t work. Here comes a quote from the above KB article.\nWindows Mobile-based devices do not generally contain intermediate CA certificates in their certificate store. Internet Information Services (IIS) sends the whole certificate chain to the device. However, IIS does this only if it can verify the whole chain. By default, the device does not contain these certificates. Therefore, the server must send them. The device must contain only the root certificate in its certificate store.\nMakes sense, finally.\nuntil next time, tom"
        },
        {
          "id": "post-migrating-from-exchange-2010-to-2013-part-5",
          "title": "Migrating from Exchange 2010 to 2013 – part 5",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/migrating-from-exchange-2010-to-2013-part-5/",
          "content": "Welcome to the last post in this series, we did migrate all mailboxes in part 4, the only thing that is still missing is public folder. So let&rsquo;s go ahead and migrate legacy public folders over to modern public folders.\nModern Public Folders, huh?\nPublic folders have been around for quite a while now, and for some time they have been written off, even by Microsoft. Exchange 2007 RTM&rsquo;d without management features, 2010 came along with no real improvements to replication and high availability.\nEverything changed, Exchange 2013 introduces the shiny, new &ldquo;Modern Public Folders&rdquo;. This shows that the Exchange Team is actually listening to customers, this, and the availability of public folders in Exchange Online (Exchange Team Blog) tells us that modern public folders are here to stay. So what&rsquo;s changed?\nNo more public folder databases, modern public folders are stored in the mailbox database, within special public folder mailboxes. This gives the administrator more flexibility (think DAG) and reduces a lot of the additional complexity that came with managing PF replication. Other nice side effects are that clients do not need to connect to the mailbox servers anymore, CAS is now able to handle ALL incoming connections.\nThe hierarchy is stored within a root public folder mailbox but every public folder mailbox has a read-only copy, so all clients get quick access to it. The root mailbox can be shown using the following cmdlet:\n\nGet-OrganizationConfig | select RootPublicFolderMailbox\n\nMigration\nOnce you are ready to migrate public folder to Exchange 2013, head over to Microsoft&rsquo;s Download Center and download the Public Folder Migration Scripts. I downloaded these scripts to the Exchange 2010 server, as they will be run there. The first script to run is Export-PublicFolderStatistics.ps1, it takes to parameters as input, the first one is a filename the second one is your Exchange 2010 mailbox server.\n.\\Export-PublicFolderStatistics.ps1 sizemap.csv EX14.tomt.local\nThis script creates a file called sizemap.csv in the current directory, this file contains public folder statistics gathered from the server EX14.tomt.local. It&rsquo;s actually a simple list of public folder names and their respective sizes in bytes.\n\nThe second script, PublicFolderToMailboxMapGenerator.ps1 reads the output file generated by the first one, and takes two additional parameters. The first parameter is the maximum mailbox size in bytes, then comes the sizemap.csv generated by the first script, the last parameter specifies a new file, which will contain a public folder to mailbox mapping based on the maximum mailbox size parameter.\n.\\PublicFolderToMailboxMapGenerator.ps1 1073741824 sizemap.csv mailboxes.csv\nThis example specifies a 1GB mailbox limit, it reads the sizemap.csv from the previous script, and creates a new mailbox to home public folders every time the mailbox size will reach 1GB.\n\nAs my little lab does not have a huge public folder structure, everything will be placed into the first mailbox. Note that I changed the name of the first &ldquo;TargetMailbox&rdquo; as the default was something like &ldquo;Mailbox1&rdquo;.\nSo now that we have created the mailboxes.csv file, we need to copy it over to the Exchange 2013 mailbox server. In the next step we are going to import the mailboxes.csv file and create the target public folder mailboxes with a little bit of PowerShell:\nImport-Csv .\\mailboxes.csv | select -expand TargetMailbox | foreach {New-Mailbox -Name $_ -PublicFolder -HoldForMigration:$True -IsExcludedFromServingHierarchy:$true}\nThe two parameters HoldForMigration and IsExcludedFromServingHierarchy are used to prevent users from accessing the public folder mailbox for now. To verify that the mailboxes have actually been created use the following cmdlet:\nGet-Mailbox &ndash;PublicFolder\n\nOk, so now that we have created the target mailboxes we can go ahead and start moving data. Again, we will need the mailboxes.csv file, as the New-PublicFolderMigrationRequest cmdlet takes it as input:\nNew-PublicFolderMigrationRequest -SourceDatabase (Get-PublicFolderDatabase -Server ex14.tomt.local) -CSVData (Get-Content .\\mailboxes.csv -Encoding Byte)\nIn this example I am getting public folder database information from the server EX14.tomt.local and then reading the content of mailboxes.csv, which has to be in the current location. As the name implies, a new Public Folder Migration Request is generated, it copies data at about two to three GB per hour. The request is created with the PreventCompletion parameter set to $true, that means, once the data has been copied, the request will be AutoSuspended.\nUsers should not have noticed anything about this public folder migration until now, they continue working on the 2010 public folder as usual. Before we can complete the public folder migration request, though, we will need to block user access to the legacy public folders. We will need some time to synchronize the already moved data with latest changes during this window of downtime.\nSo once you&rsquo;ve informed your users, we are going to prevent access to legacy public folders, remember that because of HoldForMigration:$true, we are also preventing access to the modern public folders!\nSet-OrganizationConfig -PublicFoldersLockedForMigration:$true\nThis setting prevents users to access public folders, be sure to allow some time for it to replicate if you have more than one public folder database. Now that no one is able to make changes to the legacy public folders, we can go ahead and set the PreventCompletion flag to $false, and then resume the public folder migration request to finally move all data.\nSet-PublicFolderMigrationRequest -Identity \\PublicFolderMigration -PreventCompletion:$false Resume-PublicFolderMigrationRequest -Identity \\PublicFolderMigration\nOnce this is done, it is recommended to test access to modern public folders with a few users, before allowing everybody to make changes again. This is the last point in time where you do have a way back without data loss!\nTo test access to the modern public folders, we use the following cmdlet:\nSet-Mailbox &ndash;Identity user1 &ndash;DefaultPublicFolderMailbox PFMailbox001\nThis overrides the IsExcludedFromServingHierarchy and allows the user user1 to access public folders on the new Exchange 2013 server. Outlook Connection Status will show something like this:\n\nIf everything is fine, we can finally remove the IsExcludedFromServingHierarchy flag and set the PublicFolderMigrationComplete property to $true.\nGet-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy:$false Set-OrganizationConfig -PublicFolderMigrationComplete:$true\nOk, one last thing: You may have noticed that the Proxy Server in the screenshot above shows the external server name for the connection to Exchange Public Folders. This is due to a bug in Outlook, before a fix becomes available, make sure internal clients can access the external hostname by creating a split DNS record. There is a KB article available, here.\nNice, that completes this series on migrating Exchange 2010 to Exchange 2013. Thanks for following along :)\n&nbsp;\nso long, see you next time!\ntom"
        },
        {
          "id": "post-web-application-proxy-in-windows-2012-r2-preview",
          "title": "Web Application Proxy in Windows 2012 R2 preview",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server",
          "url": "/post/web-application-proxy-in-windows-2012-r2-preview/",
          "content": "The preview of the next version of Windows Server 2012 has been released very recently. Let&rsquo;s have a quick look at some of the features.\nThe taskbar properties feature a new &ldquo;Navigation&rdquo; pane, we can configure stuff like &ldquo;Boot to Desktop&rdquo;, yay :)\n\nWeb Application Proxy and ADFS\nAnother desperately needed feature is the new Web Application Proxy server role, many people (including me) think this is going to be the replacement for TMG. So, very keen to play with the new toy I went ahead and added the server role, found underneath &ldquo;Remote Access&rdquo;.\n&nbsp;\n\nAdding &ldquo;Web Application Proxy&rdquo; as a role service.\n\nLike in Windows 2012 the server manager kindly reminds me to configure the newly added role:\n\nJust in case you want to run this wizard again but can&rsquo;t find it anymore, it can be started from the Remote Access Management Console.\nThe first step in the Wizard asks for a federation service name, now until this moment I didn&rsquo;t really bother researching anything about this new server role. Not the smartest move&hellip; As documentation is still pretty thin for Windows Server 2012 R2 I decided to simply set up an ADFS server in my lab and try to connect the Web Application Proxy to that federation service.\nActive Directory Federation Services\nThe first step is to add the Active Directory Federation Services server role to an machine in the domain.\n\nAgain, the Server Manager reminds me to configure the new role, the first thing I do is supplying credentials which are used to perform the configuration:\n\nIn the next step I select a certificate for the federation service and set a name for it. Obviously I do have to create a DNS record that resolves the federation service name to the IP address of the server that&rsquo;s actually hosting it.\n\nNow I have to select a service account for the federation service, note that the federation service name must be added as Service Principal Name to the account. This can be done using &ldquo;setspn &ndash;F &ndash;S host/adfs.tomt.local adfssvc&rdquo;\n\nIn the last step I select the database to use for the federation service, as I am using only one server I&rsquo;ll give the Windows Internal Database a go.\n\nOk, no we do have a federation service running, so we can go ahead and configure the Web Application Proxy.\nWeb Application Proxy\nOk, picking up where we left for a quick excursion to ADFS, we are now back on the Web Application Proxy machine and specify the newly created federation service name.\n&nbsp;\n&nbsp;\n\nA certificate is required on the proxy, too. So after requesting a certificate from my internal CA, I can go ahead and select it here. Make sure that the certificate&rsquo;s subject alternative names include the federation service name!\n\nOk, the last step shows the PowerShell code that get&rsquo;s executed and if everything works out, you&rsquo;ll see a message that the Proxy was configured successfully.\nA few caveats: Make sure DNS resolution is ok, the proxy must be able to resolve the federation service, and the ADFS server must me able to resolve the proxy. The certificate on both servers must include the federation service name.\n\nPublishing a service\nAfter having configured ADFS and the Web Application Proxy, which also acts as ADFS Proxy, we can finally proceed and publish a server. This is done using the Remote Access Management Console.\n\nI hit publish in the tasks pane and in the wizard that comes up, I am asked to select if I want to use pre-authentication or simply pass-trough the requests. After all that pain with installing and configuring ADFS I do definitely want to use pre-authentication :)\nOk, so I have to select the ADFS relying party, whatever that is:\n\nAfter that I am prompted to enter a name for the publishing rule, an external and internal URL as well as a certificate.\n\nAgain, we get to see the actual PowerShell code just before the publishing rule is created. Niiice, we have just successfully configured our first \"post TMG&rdquo; publishing rule.\nTesting\nNow to make sure that this is really working, let&rsquo;s fire up a client and browse to the published URL, owa.tomt.it in my case. Browsing to a published web site that requires pre-authentication, redirects the client to the AD FS Proxy service.\n\nAfter successfully authenticating against the Web Application Proxy the client gets redirected back to it&rsquo;s intended destination web site.\nNote: Make sure the client actually behaves like an external client, it must resolve the federation service name to the Web Application Proxy for this to work!\nPort mapping\nAnother application that I do publish using TMG frequently is Lync, sure enough I have to map the external web services port from 443 to 4443. This can be done using Web Application Proxy, too. For Lync we don&rsquo;t use pre-authentication:\n\nThe internal URL contains the port to use:\n\nAwesome, that gives us a new possibility to publish web services, obviously we are not yet able to use it in production and time will tell if it get&rsquo;s a few additional features in RTM, all in all, for no additional cost, I think it is already a nice tool to use.\nWish list,or: What would be nice to have in the RTM Version of Windows Server 2012 R2:\nPublish multiple servers for a particular external URL (think load balancing) Health checking of internal servers Maybe some additional authentication possibilities \nThat&rsquo;s it for today, so long tom"
        },
        {
          "id": "post-lync-and-exchange-2013-owa-integration",
          "title": "Lync and Exchange 2013 OWA integration",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange, Lync, Skype4B",
          "url": "/post/lync-and-exchange-2013-owa-integration/",
          "content": "I configured Lync 2013 to work with Exchange 2013 these days, as it took me a while to get the &lsquo;Online Meeting request&rsquo; up and running, I thought I&rsquo;d post a quick post here.\nCertificates\nThe first thing to consider when thinking about integration between Exchange 2013 and Lync is certificates. The servers use OAuth and TLS connections and we need the certificate common names to match the names that the servers use to access the resource. In my simple environment I do have the CN ly14.ntsystems.local on my Lync server&rsquo;s certificate, the Exchange server&rsquo;s certificate has a CN of ex14.ntsystems.local.\nExchange 2013 - Enterprise Partner Application\nThe first thing we configure, if it&rsquo;s not already set up, is Exchange Autodiscover service. What we actually care about is the internal URI used:\nGet-ClientAccessServer | fl AutoDiscoverServiceInternalUri\nIf it looks good, we go ahead and use the following script shipped with Exchange to set up an Enterprise Partner Application.\n&amp; $exInstall\\Scripts\\Configure-EnterprisePartnerApplication.ps1 &ndash;AuthMetaDataUrl https://ly15.ntsystems.local/metadata/json/1 -ApplicationType Lync\nThe &ldquo;&amp;&rdquo; sign tells PowerShell to start the script located at the Scripts folder in the Exchange 2013 installation directory. With the AuthMetaDataUrl we specify the Lync 2013 Pool&rsquo;s Auth Metadata document, this includes public key information for the Partner Application.\nLync 2013 - Trusted Application Pool\nSo next up we have to configure Lync to trust the Exchange Server 2013.\nNew-CsTrustedApplicationPool -Identity ex15.ntsystems.local -Registrar ly15.network.local -Site Bolzano -RequiresReplication $False\nNew-CsTrustedApplication -ApplicationId OutlookWebApp -TrustedApplicationPoolFqdn ex15.ntsystems.local -Port 5199&lt;/p&gt;\nNew-CsPartnerApplication -Identity Exchange -ApplicationTrustLevel Full -MetadataUrl https://autodiscover.ntsystems.local/autodiscover/metadata/json/1\nSet-CsOAuthConfiguration &ndash;Realm ntsystems.local\nEnable-CsTopology&lt;/code&gt;\nOk, so first we create a new Trusted Application Pool withing Lync, the Identity of the application pool is the Exchange 2013 server, the registrar is the Lync standard edition server. Then we create a Trusted Application and assign it to the trusted application pool configured before. The third thing we configure is a Partner Application and set the OAuth configuration, we need those last steps for the Online Meeting request in OWA, make sure that you actually use the Autodiscover URL, this didn&rsquo;t work if I used the server name instead.\nOk, once the configuration is done, publish the topology.\nExchange 2013 - Enable Instant Messaging\nBack on the Exchange side of things we need to configure the OwaVirtualDirectory to enable Instant Messaging.\nGet-OwaVirtualDirectory | Set-OwaVirtualDirectory &ndash;InstantMessagingEnabled $True -InstantMessagingType OCS\nNow comes the nasty part, we have to update OWA&rsquo;s web.config file to include the Exchange Servers certificate thumbprint. So first, we use the following cmdlet to get the certificate&rsquo;s thumbprint:\nGet-ExchangeCertificate\nCopy the thumbprint of the certificate that is assigned to the IIS service and fire up notepad to open the web.config file of the Owa virtual directory, located here:\nC:\\Program Files\\Microsoft\\Exchange Server\\V15\\ClientAccess\\OWA\\web.config\nNo we need to Include the following Lines underneath the &lt;AppSettings&gt; node:\n&lt;add key=\"IMCertificateThumbprint\" value=\"Exchange Cert Thumbprint\"/&gt; &lt;add key=\"IMServerName\" value=\"ly15.tomt.local\"/&gt;\nSo, after updating that web.config file, there is one step left, we need to actually allow users to use instant messaging in OWA. This is controlled in the Owa mailbox policy, to keep it simple I&rsquo;ll just update the default policy which will enable IM for everybody.&nbsp;\nSet-OwaMailboxPolicy -Identity \"Default\" -InstantMessagingEnabled $True -InstantMessagingType \"OCS\"\nWow, now that all configuration is done, I like to do a quick iisreset to make sure all the configuration changes are picked up, obviously this should not be done on production machines&hellip;\nIf users sign in to webmail, they will be able to sign into Lync, set their state and participate in IM chats.\n\nAnd, as a nice little addon, we can now also create Online Meeting requests from OWA:\n\nNote, Exchange 2013 CU1 is required for Online Meeting requests and Lyncdiscover has to be set up, too.\n&nbsp;\nEnjoy,\ntom"
        },
        {
          "id": "post-migrating-from-exchange-2010-to-2013-part-4",
          "title": "Migrating from Exchange 2010 to 2013 – part 4",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/migrating-from-exchange-2010-to-2013-part-4/",
          "content": "Hello everybody, after thinking about installation, client access and mail routing, we are getting ready to move some mailboxes.\nSo, we talked about Exchange 2013 CAS being a pretty smart proxy, that&rsquo;s why we had to append ?ExchClientVer=15 to the ECP URL in order to get to the new Admin Center while the Mailbox was still on Exchange 2010. Obviously, once the mailbox gets moved to Exchange 2013 this is no longer required. Another thing that will change as we move mailboxes from Exchange 2010 to 2013 is the Outlook Profile, it does no longer show the RPCClientAccess endpoint as Server, instead it gets updated to show the &lt;Mailbox GIUD&gt;@&lt;Primary SMTP domain&gt;.\nMoving mailboxes\n&nbsp;\nThere are a couple of things to take into consideration before moving mailboxes to the 2013 server. As we learned in part two of this series, it is essential to move the namespaces used by Exchange to the new CAS prior to moving mailboxes, users would not be able to access mailboxes if the names would still point to an Exchange 2010 CAS. Another important check is whether new mailbox servers have been provisioned with enough disk space to accommodate the moved users, and if the properties of the mailbox database, such as ProhibitSendReceiveQuota and OfflineAddressBook have been set to desired values. Assuming that everything is fine, we go ahead and create some move requests, very much the same way as we did in Exchange 2010.\nNew-MoveRequest &ndash;Identity user3@tomt.it &ndash;TargetDatabase mbd01\n\nThis command moves the mailbox of user3 to the target mailbox database mdb01 which is hosted on Exchange 2013. Like in 2010, the move is performed online, so the user is able to work in his mailbox until the move request is finished. Once the move request completes, the user will be prompted to restart Outlook, this is when the Profile gets updated to show the GUID instead of the server name or RPCClientAccessServer property.\n\nNote that this is the users mailbox GUID, as that is the user&rsquo;s unique identifier within the Exchange Organization, it will be different for every user. This GUID is used to locate the active mailbox database copy, in Exchange 2013 all protocols are provided to the user by the server that is hosting the active mailbox database copy.\nBatch moves\nIn Exchange 2010 we had the ability to do batch move requests, but it was more like creating many move requests and assigning the same BatchName to them, Get-MoveRequest was used to retrieve information about the move requests. Now Exchange 2013 comes with some new cmdlets that are dealing with batch migrations: *-MigrationBach.\nHonestly I do think those new cmdlets are a little complicated, I guess they were primarily introduced to make hybrid or cloud move requests easier, in an on-premises world they might not be that useful. I created a New-MigrationBatch and then started the migration. The first thing we need is a CSV file with a column called EmailAddress, so let&rsquo;s get all users homed on the Exchange 2010 server, and export them to CSV:\nGet-Mailbox -Server ex14 | select @{n=\"EmailAddress\";e={$_.PrimarySmtpAddress}} | Export-Csv -NoTypeInformation -Path .\\BatchMove.csv\nNow we can use this CSV file to create a new MigrationBatch, you see what I mean with a little complicated&hellip;\nNew-MigrationBatch -Local -Name BatchMove -CSVData ([System.IO.File]::ReadAllBytes(\".\\BatchMove.csv\")) -TargetDatabases mdb01\nIt&rsquo;s looking like that in PowerShell:\n\nOk, once we have created the MigrationBatch, we can go ahead and start the migration to actually move data over to the new Exchange.\nGet-MigrationBatch | Start-MigrationBatch\nThe Get-MigrationStatistics cmdlet can be used to get information about the ongoing migrations, once all mailboxes are moved, TotalCount and SyncedCount should show the same value. Get-MigrationUser can be used to get information about the individual mailboxes being moved. The Get-MigrationBatch cmdlet includes a Report property containing links to CSV reports about the MigrationBatch.\nNote that the Start-MigrationBatch does not complete the move requests, use the Get-MoveRequest cmdlet to show the individual move requests and their state, it will be AutoSuspended. The Complete-MigrationBatch cmdlet is used to complete the move requests:\nGet-MigrationBatch | Complete-MigrationBatch\n\nIf we run the Get-MoveRequest cmdlet again, we will finally see that mailboxes have been moved to Exchange 2013.\n\nSince there is not much documentation available, yet, I will stick with the &ldquo;old&rdquo; way and just use New-MoveRequest to move mailboxes for now.\n&nbsp;\n&nbsp;\n&nbsp;\nOutlook Profile\nOk so now that we have migrated our users over to the new Exchange it&rsquo;s time to have a look at Outlook, as mentioned above, the profiles will be updated and no longer show a server name, but it will also be using RPC over HTTP on the internal network:\n\nThe proxy settings of the Outlook profile is updated, too, it will now select &ldquo;On fast networks, connect using HTTP first&hellip;&rdquo; by default.\n\nThe AutoDiscover.xml file now contains more information for clients, while Exchange 2010 had the following three Type nodes &lt;EXCH&gt;,&lt;EXPR&gt; and &lt;WEB&gt; the new AutoDiscover.xml contains two &lt;EXHTTP&gt; nodes for internal and external OutlookAnywhere settings.\nIt is very important to update Outlook to the minimum required version by Exchange 2013 before moving mailboxes, as older Outlook versions will not be able to interpret the new xml file.\nWell, and that&rsquo;s it for part four. We do have one big thing left for part five, public folders.\n&nbsp;\nStay tuned,\ntom"
        },
        {
          "id": "post-exchange-2013-open-public-folder-on-exchange-2010",
          "title": "Exchange 2013, Open Public Folder on Exchange 2010",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/exchange-2013-open-public-folder-on-exchange-2010/",
          "content": "You may notice that with the Exchange 2013 defualt settings on Outlook Anywhere you are unable to open public folders located on you &ldquo;old&rdquo; Exchange 2010 server. You get an authentication pop up and the following error:\n\nMicrosoft has released a KB (http://support.microsoft.com/kb/2834139/en-us) article how to get that work.\nSimply change your Outlook Anywhere settings to use internal and external NTLM with requirement of SSL:\nGet-OutlookAnywhere &ndash;server ex01 | Set-OutlookAnywhere -ExternalClientAuthenticationMethod NTLM -InternalClientAuthenticationMethod NTLM -ExternalClientsRequireSsl $true -InternalClientsRequireSsl $true\n\nThe next time the client gets the Autodiscover File, it sets the Logon Network Security Settings of the Outlook Profile from &ldquo;Anonymous Authentication&rdquo; to &ldquo;Negotiate Authentication&rdquo; and you can open the public folders located on Exchange 2010.\n\nGreetings dn"
        },
        {
          "id": "post-configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa",
          "title": "Configure Exchange 2013 CAS Array with WNLB and enable Kerberos support for OA",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa/",
          "content": "Like Tom described in his Post Migrating from Exchange 2010 to 2013 &ndash; part 2 the major changes in the Exchange 2013 CAS role, I explain in this post how to configure high available CAS Array with WNLB.\nFirst you have to install WLNB on both CAS nodes and create the Cluster and VIP. The CAS Servers need only one NIC, we use the Multicast operation mode.\n\nNext we create the Port Rules. In this example I create a port rule for the whole port range. Because there is not need of Affinity we can safely disable the the feature:\n\nNow create the Host A Record for the Cluster name excararray01 to point to the VIP.\nRemember to change the internal URL&rsquo;s of the virtual directories of both CAS servers to use the Cluster name and not the CAS computername.\nKerberos support\nI have 2 UAG servers that are publishing the Exchange 2013 CAS servers. On the UAG servers I don&rsquo;t want to publish both CAS servers and use the UAG load balancing. I want to publish the CAS Cluster Name and let the WNLB do the load balancing. If you don&rsquo;t configure an alternate service account for the CAS Cluster Name you will no be able to use NTLM authentication for Outlook Anywhere.\nTo use Kerberos authentication you have to create a computer account in AD (the name don&rsquo;t have to match the array FQDN):\n\nThen run the following script that is located in C:\\Program Files\\Microsoft\\Exchange Server\\V15\\Scripts to configure the Alternative Service Account\n.\\RollAlternateServiceAccountPassword.ps1 -ToArrayMembers excasarray01.domain.local -GenerateNewPasswordFor \"domain\\EXCASARRAY01ASA$\" &ndash;Verbose\nexcasarray01.domain.local stands for the FQDN of the CAS array domain\\EXCASARRAY01ASA$ stands for the created computer account\n\nAfter the script has finished configuring we have to register some spn&rsquo;s with the CAS Array FQDN\nsetspn -s exchangeMDB/excasarray01.domain.local domain\\EXCASARRAY01ASA$ setspn -s exchangeRFR/excasarray01.domain.local domain\\EXCASARRAY01ASA$ setspn -s exchangeAB/excasarray01.domain.local domain\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\EXCASARRAY01ASA$\nNow we can publish the CAS Array FQDN with uag and use NTLM as authentication method for Outlook Anywhere.\nGreetings dn"
        },
        {
          "id": "post-migrating-from-exchange-2010-to-2013-part-3",
          "title": "Migrating from Exchange 2010 to 2013 – part 3",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/migrating-from-exchange-2010-to-2013-part-3/",
          "content": "Hello again and welcome back to the third part of our journey to Exchange 2013. In the previous two posts (part 1, part 2) we covered preparing and installing Exchange 2013, as well as some news with the Client Access Server role and some design considerations. Now in this part we will try to cover some key aspects of transport in the new Exchange.\nHub Transport Role\nAs you already know, there is no Hub Transport server role in Exchange 2013, the transport pipeline has been split into three services, one of which is running on the CAS, the other two on the MBX role.\nFront End Transport service\nThis service is running on the CAS role, like all other CAS services, it is nothing more than a stateless (but smart) proxy for inbound and outbound SMTP connections. Neither message queuing, nor message filtering happens here. The front end transport service talks to the transport service on the MBX server role.\nTransport service\nThis service runs on the Mailbox server role, like the hub transport role in Exchange 2010, this service performs message queuing, inspection, categorization and so on. Very much NOT like in Exchange 2010, though, this service never talks to a mailbox database. This service routes messages between the front end transport service, the transport service and the mailbox transport service.\nMailbox Transport service\nThis service runs on the Mailbox server role, too. It receives messages via SMTP from the transport service and connects via RPC to the mailbox database to deliver the message. It also connects to mailbox databases via RPC to retrieve messages and forward them to the transport service, again using SMTP.\nThis shows one thing very clearly, through the use of SMTP, Exchange 2013 is able to break the close relationship between server roles that existed in previous versions. The front end transport role in CAS does no longer use RPC, an thus, could be running a different software version than the mailbox server, communication between mailbox servers, specifically between the mailbox transport service and the transport service, also uses SMTP and has no requirement to be on the same software version.\nI used Wireshark to capture an incoming mail proxied through the CAS:\n\nThe Client (10.1.1.10) connects to the CAS (10.1.1.21) using TCP 25, all SMTP messages are exchanged between those two nodes. Note, that the CAS does only send the &ldquo;250 Queued Mail for delivery&rdquo; after connecting to the transport service on the Mailbox Server (10.1.1.25), since the Front End Transport service does not queue mails locally, this &ldquo;smart proxy&rdquo; functionality ensures that the message gets stored in the mailbox servers queue, before sending an OK to the client. The connection between CAS and MBX uses TCP 2525 and is encrypted using TLS, this is why Wireshark is not able to encode it as SMTP.\nThere is whole section on Transport on TechNet: http://technet.microsoft.com/en-us/library/aa996349.aspx\nMigration Send and Receive connectors\nNow that we know (a little bit) how transport works in Exchange 2013, we can start to include Exchange 2013 servers to the send connectors and configure the appropriate receive connectors.\nTo add Exchange 2013 servers as sources to the existing send connectors, use the Exchange Admin Center and navigate to &ldquo;mail flow, send connectors&rdquo;. Then select the send connector to edit and add the new source server under &ldquo;scoping&rdquo;\n\nWe could also use PowerShell to add additional SourceTransportServers to the connector, be aware though, that the existing servers have to be included in the command.\nSet-SendConnector &ndash;Id ToInternet &ndash;SourceTransportServers ex14,ex15\nAnother interesting flag sits under the &ldquo;general&rdquo; node of the send connector&rsquo;s properties: Proxy though client access server&rdquo;\n\nSo what&rsquo;s that all about? If this flag is checked, outbound mails are not sent directly by the mailbox server&rsquo;s transport role, but are proxied through a Client Access Server. This could be interesting if only a subset of Exchange Servers (CAS) were allowed to connect to the internet via SMTP. With multi role servers, which are recommended for many environments, this flag will have no effect.\nOk, so now we have got our outbound mail flow configured, what about incoming mails? Receive connectors are per-server settings, so we have to check the configuration of existing connectors and configure the new server accordingly.\nGet-ReceiveConnector &ndash;Server ex14 | ft Identity,Enabled,Bindings,RemoteIpRanges\nThis command shows all receive connectors on the 2010 server, along with the Ports used and the remote IP addresses that are allowed to use this connector. Obviously, if there are custom AD permissions or authentication methods defined, those have to be configured on the new server, too.\nNice, now we have got client access and transport covered, the next post will finally include moving some mailboxes to the new Exchange server.\n&nbsp;\nso long, tom"
        },
        {
          "id": "post-exchange-2013-clean-install-but-many-msexchange-common-106-errors",
          "title": "Exchange 2013 clean install but many MSExchange Common 106 errors",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/exchange-2013-clean-install-but-many-msexchange-common-106-errors/",
          "content": "Update: 09.06.2013 Updated the PowerShell script and some additional information about event logs. /tom\nToday I installed 4 Exchange 2013 servers. All of them have many &ldquo;MSExchange Common&rdquo; 106 errors in the Application Log indicating&nbsp;that Performance Counters could not be updated:\nPerformance counter updating error. Counter name is LDAP Queries Issued by Expanded Groups., category name is Expanded Groups Cache. Optional code: 3. Exception: The exception thrown is : System.InvalidOperationException: The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly\nThe problem is that the performance counters are not registered correctly. I wrote a simple script to re-register all the Exchange 2013&nbsp;performance counters. Now the Application log looks much better \nFirst open Powershell in Admin Mode, then execute the following code:\n\n\nNote that New-PerfCounters actually deletes and re-creates the performance counter, there is no need to use Remove-PerfCounters first. The script might throw some errors if performance counters cannot be created or files are invalid, other than that no information is displayed, no news is good news, I guess ;) For more information check the Application Log of the server, two events are logged for every performance counter. Event ID 1001 indicates that the counter has been removed, while Event ID 1000 is logged as soon as the counter has been loaded again.\nIf an antivirus software is running on the server, it could be disabled temporarily to improve performance.\nSpecial thanks to @msxfaq&nbsp;:)\n&nbsp;\nGreetings nd"
        },
        {
          "id": "post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-1",
          "title": "How to build an UAG 2010 Array for Exchange publishing–Part 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange, Lync, Skype4B",
          "url": "/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-1/",
          "content": "As TMG is not &ldquo;available&rdquo; anymore, I decided to use UAG 2010 with SP3 for the Exchange / Lync 2013 publishing. UAG SP3 supports Exchange 2013 and Lync 2013. In Part 1 of the Post I&rsquo;m going to explain how to build the UAG 2010 Array.\nFirst we have to prepare 2 Windows Server 2008 R2 Server each of them with 2 NIC&rsquo;s and at least 4GB RAM. The NIC&rsquo;s should be configured in this way:\nINTERNAL\n\n\n\nDefault Gateway\nshould not be defined\n\n\nDNS Servers\nshould be defined\n\n\nRegister this connection&rsquo;s address in DNS\nEnabled\n\n\nFile and Printer Sharing for Microsoft Networks\nEnabled\n\n\nClient for Microsoft Networks\nEnabled\n\n\nNetBIOS over TCP/IP\nEnabled\n\n\nLMHOSTS lookup\nEnabled\n\n\n\n&nbsp;EXTERNAL&nbsp;\n&nbsp;\n\n\n\nDefault Gateway\nshould be defined\n\n\nDNS Servers\nshould not be defined\n\n\nRegister this connection&rsquo;s address in DNS\nDisabled\n\n\nFile and Printer Sharing for Microsoft Networks\nDisabled\n\n\nClient for Microsoft Networks\nDisabled\n\n\nNetBIOS over TCP/IP\nDisabled\n\n\nLMHOSTS lookup\nDisabled\n\n\n\nThe order should modified that NIC INTERNAL becomes the first NIC used:\n\nThe Next steps are to install NLB (without configuring it) and UAG on both nodes. Install UAG in the following order:\n\nUAG 2010 SP1 Update 1\nIf Update 1 fails, download and install it manually\nUAG 2010 SP1 Updat 1\nTMG 2010 SP2\nUAG 2010 SP2\nUAG 2010 SP3\n\nWhen UAG is fully installed, we have to configure it. Lets start on the node that becomes the Array Manager.\nOpen UAG and select the Network Settings\n\nThen we have to define the Topology: Select the node as Array Member and specify credentials\n\nBefore you join the 2nd node as the array member, open the TMG console and add the 2nd server to the &ldquo;Managed Server Computers&rdquo; group. Install the Policy.\n\nOpen the UAG console on the 2nd server and join him to the array\n\nTIP: If the UAG services on the 2nd node don&rsquo;t start, copy the content of folder C:\\Program Files\\Microsoft Forefront Unified Access Gateway\\von\\Conf from the manager to the member server. Then start the services.\nNow we have to configure the NLB from the UAG console. Open Network Load Balancing from the Admin menu and add the first VIP IP:\n\nNext you have to save and activate the configuration. UAG is now building the NLB cluster with both nodes. You can check the activity with the UAG Activation Monitor:\n\nFinally we have to open the WebMonitor and navigate to the Array Monitor section. There we have to start the NLB nodes:\n\nAfter you have started the nodes, the NLB status changes to &ldquo;Converged&rdquo;\n\nINFO: When you open the NLB manager, you will get RPC errors. The reason is that DCOM does not work with TMG/UAG. But don&rsquo;t worry, the cluster is OK if the Web Monitor doesn&rsquo;t show errors.\nIn Part 2 I will explain how to publish Exchange 2013 OWA / OA and ActiveSync.\nGreetings dn"
        },
        {
          "id": "post-migrating-from-exchange-2010-to-2013-part-2",
          "title": "Migrating from Exchange 2010 to 2013 – part 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/migrating-from-exchange-2010-to-2013-part-2/",
          "content": "Updated: 08.06.2013: The original post had some errors regarding RPC over TCP and the RPCClientAccessServer namespace. You would never want to move this namespace&#160; to CAS 2013 as the new CAS does not understand RPC over TCP.\nWelcome back, this is the second part of my series on migration to Exchange 2013. I covered prerequisites, installation and a little bit of management in the first post, now we’ll have a look at namespaces and certificates.\nNamespaces in Exchange 2013\nAfter installing Exchange, it’s time to start getting into the planning phase :) Ok, just kidding, I’ll use the newly installed Exchange server to walk through some planning steps, though.\nFirst of all, let’s make some assumptions. We do have an Exchange 2010 server and a CAS array with the RpcClientAccessServer endpoint configured to outlook.tomt.local. For OWA, EWS, OAB, EAS and Outlook Anywhere there is only one namespace, mail.tomt.it. Outlook Anywhere is configured with NTLM authentication, more on that later. Internal Outlook clients would connect (via MAPI) to outlook.tomt.local, external clients would use Outlook Anywhere (HTTPS) and connect to mail.tomt.it. The certificate on Exchange 2010 has a Subject of CN=ex14.tomt.local and the following SANs: ex14.tomt.local, mail.tomt.it.\n \nOk, so far so good. Now when migrating to Exchange 2013, it is recommended that the new server takes over the namespace and deals with all incoming client connections. For incoming connections with a mailbox homed on Exchange 2013, our new CAS would simply proxy the request to the mailbox server hosting the mailbox. For mailboxes hosted on Exchange 2010, though, the 2013 CAS would act as HTTP proxy and connect the client with the Outlook Anywhere endpoint (/rpc) of the Exchange 2010 CAS. So what does that mean? First of all, this does not apply for internal, RPC over HTTP clients, the RPCClientAccessServer namespace is not moved to CAS 2013. If you are in the unfortunate situation to have the RPCClientAccessServer namespace match your OutlookAnywhere namespace, there is a very good post over at the Exchange Team Blog.\nFor RPC over HTTP connections, OutlookAnywhere must be enabled on the Exchange 2010 CAS before Exchange 2013 CAS can take over the namespace, and the IIS Authentication methods must include the NTLM. The Exchange 2013 CAS is authenticated by Exchange 2010, this does not work with basic authentication. To make sure Outlook Anywhere is configured, and the IIS Authentication method includes NTLM use the following cmdlet on Exchange 2010.\nGet-OutlookAnywhere –Server ex14 | fl ExternalHostname, ClientAuthenticationMethod, IISAuthenticationMethods\nTo add NTLM as an IIS Authentication method, use the following cmdlet. Note that the ClientAuthenticationMethod does not matter in this case.\nSet-OutlookAnywhere –Identity ex14\\rpc* –IISAuthenticationMethods Basic,NTLM\nNice, now Exchange 2010 CAS is ready and we can start thinking about the certificate request for Exchange 2013. We want the new CAS to take over the namespace, so we do already know which name to include: mail.tomt.it, but is that enough? Well, the answer is, it depends ;)\nProtocol specific names\nExchange 2013 introduces some radical changes, including how client connections are handled. In 2010, client affinity was everything. Clients would always need to be redirected to the same CAS for a specific session, if that CAS would become unresponsive or if the client would connect to another CAS, re-authentication would occur. When talking about load-balancing, an expensive Layer 7 capable load-balancer was required. The load-balancer would intercept the traffic and make sure client A would always reach server A for a particular session. This had one clear advantage, though, because the load-balancer was L7 aware (knows which endpoint the client asked for), it could check if a particular endpoint was reachable on a CAS, and if not redirect the client to a CAS where it was reachable. \nThis is not the case in 2013 anymore, client to CAS sessions are stateless and a less-expensive Layer 4 load-balancer (or DNS round-robin) could be used with 2013. A L4 load-balancer, on the other hand, would have no idea of what endpoint the client was looking for, it would only see and forward encrypted (https) packets. Protocol specific namespaces are here to solve that problem. If we created a virtual IP and a distinct name for each endpoint on the CAS (OWA, EWS, EAS…) the L4 load-balancer would be aware of what endpoint the client was looking for.\nSo, long story short, we are going to include more names in that certificate. The subject is CN=ex15.tomt.local and the SANs are: ex15.tomt.local, oa.tomt.local, mail.tomt.it, owa.tomt.it, eas.tomt.it, ews.tomt.it, oab.tomt.it. In the DNS configuration we need a CName for all of these names pointing to our new CAS, or an A record pointing to the load-balancers virtual IP. Next, we’ll use the Exchange Management Shell to update the ExternalUrl properties of the virtual directories.\nSet-OwaVirtualDirectory –Identity ‘ex15\\owa (Default Web site)’ –ExternalURL https://owa.tomt.it/owa      Set-EcpVirtualDirectory –Identity ‘ex15\\ecp (Default Web site)’ –ExternalURL https://owa.tomt.it/ecp       Set-OabVirtualDirectory –Identity ‘ex15\\oab (Default Web site)’ –ExternalURL https://oab.tomt.it/oab       Set-WebServicesVirtualDirectory –Identity ‘ex15\\ews (Default Web site)’ –ExternalURL https://ews.tomt.it/ews/exchange.asmx       Set-ActiveSyncVirtualDirectory –Identity ‘ex15\\microsoft-server-activesync (Default Web site)’ –ExternalURL https://eas.tomt.it/Microsoft-Server-ActiveSync\nAnd last, but not least we configure Outlook Anywhere on the new Exchange 2013 CAS.\nSet-OutlookAnywhere –Identity ‘ex15\\rpc (Default Web site)’ –InternalHostname oa.tomt.local –InternalClientAuthenticationMethod NTLM –InternalClientsRequireSsl:$true –ExternalHostname mail.tomt.it –ExternalClientAuthenticationMethod NTLM –ExternalClientsRequireSsl:$true –IISAuthenticationMethods Basic, NTLM, Negotiate\nNow that Outlook Anywhere command was pretty long, let’s break it into smaller pieces. First we are setting the InternalHostname, as Exchange 2013 uses Outlook Anywhere for all client connectivity (internal and external) we don’t use the RpcClientAccessServer anymore. Along with that we set the authentication method for internal clients as well as the requirement for SSL. Next we set that same pieces of information for external clients, and the last property is configuring the supported authentication methods by IIS.\nWow, now we should finally be able to take over that namespace with our brand new Exchange 2013 CAS. I updated the DNS records for mail.tomt.it to point to the new CAS and created a new CName oa.tomt.local for the internal OutlookAnywhere used in Exchange 2013. \nNothing really changes for Outlook when it connects to an Exchange 2010 mailbox from inside the network, it will still use the RPCClientAccessServer endpoint to connect to the mailbox using RPC over TCP.\nIf the mailbox is on Exchange 2013, though, Outlook will use RPC over HTTP and connect to the internal OutlookAnywhere endpoint:\n \nFrom a OWA point of view, all users do log on using the new CAS now:\n\nExchange 2010 mailboxes get proxied to the Exchange 2010 CAS for OWA.\n \nAfter this text heavy post we have a nice little overview of CAS in Exchange 2013, I wanted to cover mail routing in this post, given the length I reckon it be better to save that for the next one.\n\nI hope this has been informative for you as the reader, at least it was extremely so for me :)\nso long,    tom"
        },
        {
          "id": "post-migrating-from-exchange-2010-to-2013-part-1",
          "title": "Migrating from Exchange 2010 to 2013 – part 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange, Server",
          "url": "/post/migrating-from-exchange-2010-to-2013-part-1/",
          "content": "This is my first post about migrating from an existing Exchange 2010 environment to Exchange 2013. I&rsquo;ll try do cover everything that seems important to me, if I miss something that you think should be covered&hellip; well, that&rsquo;s what comments are for :)\nPreparing for Exchange 2013\nAll servers in the Exchange 2010 organization must be running service pack 3, if you haven&rsquo;t already installed SP3, as always it&rsquo;s a very good idea to start with reading the release notes. On the Exchange 2013 side of things, we need Cumulative Update 1, there is a very good post at the Exchange Team Blog about that.\nOk, so assuming we are running Exchange 2010 SP3 and have downloaded CU1, let&rsquo;s get started with preparing the first Exchange 2013 server. All the required Windows Features can be installed with the InstallWindowsComponent.ps1 script located in the Setup\\ServerRoles\\Common directory of the CU1 install files. The script takes several parameters, in this case I&rsquo;ll be installing a multirole server, I want the AdminTools to be installed as well as the Remote Server Admin Tools for Active Directory.\n.\\InstallWindowsComponent.ps1 AdminTools, MailBox, ClientAccess -ADToolsNeeded:$True\nNote that the script has no parameter for source files, the server needs internet access to download the required files. That&rsquo;s not always practical, so I edited the script and simply added &ldquo;&ndash;Source wim:d:\\sources\\install.wim:4&rdquo; to the Add-WindowsFeature cmdlet within the script.\nAfter the required reboot, we need to install Unified Communications Managed API 4.0 Runtimethe Office Filter Pack is not mandatory and can be installed later on, it still produces a warning during setup, though.\nNow that we have the new, designated Exchange 2013 server ready, we need to prepare Active Directory. Obviously, if you don&rsquo;t know what all this is about, don&rsquo;t do it! So, that said, from an elevated command prompt change to the directory containing the Exchange 2013 installation files. You&rsquo;ll need Schema, Enterprise and Domain Admin rights to run the following tasks.\nIn the first step, setup will extend the schema, this is done using:\n.\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareSchema\nThe next step is to prepare the Active Directory Forest, this creates the Microsoft Exchange container (if it doesn&rsquo;t already exist) and universal groups used by Exchange.\n.\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareAD /OrganizationName tomt\nAnd the last step is to prepare the Domain, this needs to be done for every Domain that will contain Exchange servers or Mail-Enabled users, alternatively use /PrepareAllDomains:\n.\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareDomain\nEach step relies on Active Directory to replicate changes throughout the topology, you should absolutely wait for the changes of each step to be replicated before continuing with the next step. In a distributed environment such a change needs to be properly planned and would typically take place during a maintenance window.\n&nbsp;\nInstalling Exchange 2013\nWith all prerequisites checked, we can now continue with the installation of our first Exchange 2013 server. Easy as it is, I&rsquo;m not going to walk through graphical setup screens, you basically just select the server roles to be installed and click next. There is a command line version of the setup, too. Try setup.exe /help:Install for a list of parameters that can be used to customize the installation. The Exchange setup is pretty smart, meaning that it keeps track of the installation and if errors occur, you will be able to continue right from where the error happened, no need to click through all the windows again. It also provides a lot of information in the ExchangeSetupsLogs folder, located at the root of the drive on which Exchange is installed.\nSomething new with setup is that you cannot remove server roles anymore, the only way to do that would be to completely uninstall Exchange and re-install the role of choice.\nSo, installing Exchange 2013 was pretty easy, let&rsquo;s move on the the more interesting stuff.\nManaging Exchange 2013\nThe first thing I wanted to see after the setup completed, was the shiny new Exchange Admin Center, so I went straight to IE and typed https://localhost/ecp, I entered my credentials on the neat, new login screen only to see the good, old Exchange Control Panel from 2010. It took some time, but then I realized that that was exactly correct behavior. The Exchange 2013 Client Access Role is a stateless proxy and no longer responsible for rendering OWA (or anything for that matter) and my mailbox was still on Exchange 2010, so my request got proxied to 2010. There are two solutions for this, move your admin mailbox to 2013, or less troublesome, simply add ?ExchClientVer=15 to the URL. https://localhost/ecp?ExchClientVer=15 takes you right to the Admin Center. This is also the only way (I found) to access the Admin Center with a user that has no mailbox.\nFrom an Exchange Management Shell point of view, everything is very similar to the way we are used from Exchange 2010, a new remoting session can simply be created using:\n$Session = New-PsSession &ndash;ConnectionURI &lsquo;http://ex15.tomt.local/PowerShell&rsquo; &ndash;ConfigurationName 'Microsoft.Exchange&rsquo; Import-PsSession $Session\nThat&rsquo;s it for the first part, in the second part I&rsquo;ll try to cover the basics of namespace planning, mail routing and maybe move some mailboxes.\nI see some real world projects coming closer and I know Daniel is working hard on the topic, I&rsquo;m sure there is more content coming&hellip; :)\nso long, enjoy your weekend!\ntom"
        },
        {
          "id": "post-whats-happening-these-days",
          "title": "What’s happening these days…",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/whats-happening-these-days/",
          "content": "It has been quiet around here for some time, so what have I been up to?\nWell, on one side, I’m having fun at the Scripting Games (http://scriptinggames.org/) where I learn quite a bit (more from reviewing other entries, than from my own coding) and try to to improve my PowerShell skills. I’ll point out some of the things I’ve learned later on.\nOn the other side, I’ve decided to quit my job in the heart of the Italian Alps and accepted a role in Germany, in the nice city of Paderborn. So the last few weeks have been pretty busy for me, moving my stuff from northern Italy way up to northern (at least for me) Germany. Right now I am trying to get used to my new surroundings and I do learn something every day :)\nSo, what are my key takeaways from the Scripting Games so far?\n   Standard cmdlet parameter names: While I did know that there was a list of allowed Verbs (Get-Verb), I wasn’t aware that there was something similar for parameter names and types, too. Check out MSDN for more information.    Help and comments should be nested under the function, so if you are used to just press “Ctrl+J” to insert a new “empty” function and start from there, remember to move the help inside the function { } block.    ConvertTo-HTML has some really neat parameters like –Head, –PreContent and –PostContent so you can enhance and customize the HTML report generated by the cmdlet.    I started to use splatting to set parameter values and think this is really useful, basically you assign common values for parameters to a hash table and pass it to the cmdlet. I’ll post quick example later.    Filter, I tend to get every possible bit of information and then use Where-Object to select the few properties I really need, that’s not really efficient as most cmdlets provide a way to filter or just ask for the properties you need. \nAnd here comes the example for splatting:\nif ($Credential) {     &#160;&#160;&#160; $wmiParam = @{'Credential'=$Credential; 'ErrorAction'=&quot;Stop&quot;}      } else {      &#160;&#160;&#160; $wmiParam = @{'ErrorAction'=&quot;Stop&quot;}      }       Get-WmiObject @wmiParam –ComputerName “myComputer” –Class “Win32_Processor”\nThis passes a hash table (wmiParam) to the Get-WmiObject cmdlet, so I don’t have to set the ErrorAction every time and the Credential parameter is only used when a $Credential object exists.\n&#160;\nYeah, and that’s what’s new with me :)\ntom"
        },
        {
          "id": "post-joining-wifi-before-login-on-mac-os-x-108",
          "title": "Joining WiFi before login on Mac OS X 10.8",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Network",
          "url": "/post/joining-wifi-before-login-on-mac-os-x-108/",
          "content": "We had an interesting problem at work recently, as the solution was a little complex I decided to write about it here. So, as the title suggests, we are talking Wireless networking, authentication and Mac OS X today. It’ll be fun, trust me :)\nSome prerequisites: We use EAP-TLS as the authentication protocol for WiFi and SCEP for certificate enrollment. I’ve written about SCEP before, in a different context, though. We also use the iPhone Configuration Utility to deploy configurations to devices, more on that later. \nThe Problem\nWe join our MACs to the Active Directory domain and want our users to be able to login using their domain credentials. Obviously you need some sort of connectivity to the AD in order to login, we used to configure Wireless Networks as “System Profile” in OS X in the past. Unfortunately, that GUI went away in more recent versions of that operating system.\n\nThis is a screenshot of 10.5, simple enough. As we tried to configure that same thing on 10.8, though, we realized that this little option was gone. All Wi-Fi networks would be started AFTER the used login, no AD login was possible. Oops.\nAfter scratching our heads for a while, we found a workaround other than installing Windows ;)\nThe Solution\niPhone Configuration Utility was used ever since we had the requirement to connect iOS devices to the wireless network, it can be used to create configuration files that can be deployed to iOS devices. It has been possible for some time to deploy these same configuration files to OS X, too. As they are simple XML files, we took a deeper look into them. Wwith some help from Google we found that we could change the Wi-Fi payload to be a “System Profile” instead of a “User Profile”, and thus be started BEFORE user login.\nSo, first thing is to create a configuration profile using iPhone Configuration Utility.\n \nChoose a name, identifier and description for the profile.\n \nAdd the certification authorities certificate, so we trust certificates issued by our internal CA. \n \nConfigure SCEP, the iPhone or MAC is going to connect to the SCEP URL to enroll a certificate using the specified subject.\n \nAdd the Wi-Fi payload, specifying the SSID and authentication protocol. As we use EAP-TLS we use the SCEP certificate to authenticate.\nOnce the profiles is configured, export it:\n \nWe get a .mobileconfig file from the export, it can be edited using a simple text editor. Here comes the fun part, we have to add the following lines to the configuration file:\n&lt;key&gt;SetupModes&lt;/key&gt;      &lt;array&gt;       &lt;string&gt;System&lt;/string&gt;       &lt;/array&gt;       &lt;key&gt;PayloadScope&lt;/key&gt;       &lt;string&gt;System&lt;/string&gt;\nThis part goes just underneath the PayloadOrganization in the AutoJoin section.\nAnd we have to change “Configuration” at the very end of the file from:\n&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;Configuration&lt;/string&gt;\nto “SystemConfiguration”:\n&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;SystemConfiguration&lt;/string&gt;\nAs it is quite important where you change/add the lines, I’ll paste a complete file for reference.\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      &lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;       &lt;plist version=&quot;1.0&quot;&gt;       &lt;dict&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AutoJoin&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPClientConfiguration&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AcceptEAPTypes&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;13&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPACAnonymously&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTUsePAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateAnchorUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EncryptionType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WPA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;HIDDEN_NETWORK&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures wireless connectivity settings.&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WiFi (MYSSID)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.wifi1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SetupModes&lt;/key&gt;        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadScope&lt;/key&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.wifi.managed&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;2CD56B1A-068C-4F3C-AC43-9D4E2115260F&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServer&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;proxy.ntsystems.it&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServerPort&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;8080&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Manual&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SSID_STR&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;MYSSID&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateFileName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MIIDYzCCAkugAwIBAgIQL1CM7d+PQrhAgO7UcdHbyDANBgkqhkiG&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bnBODc20wZMRDAhWuA==       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Provides device authentication (certificate or identity).&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.credential2&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.root&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Challenge&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;4F20EACEDE479165&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Type&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;RSA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Usage&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;0&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Keysize&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;2048&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Name&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Retries&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;3&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;RetryDelay&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;10&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Subject&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;CN&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;macbookair$&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;URL&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;https://scep.tomt.it/certsrv/mscep/mscep.dll&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures SCEP&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;SCEP (tomt-DC01-CA)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.scep3&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.scep&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt-wlan&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadRemovalDisallowed&lt;/key&gt;       &#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160; &#160; &lt;string&gt;SystemConfiguration&lt;/string&gt;        &#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;B58A2BCB-7617-421B-B0C8-12DE22B5A2B1&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &lt;/dict&gt;       &lt;/plist&gt;\nNow, if we copy that file to the MAC OS X machine, we can import the wireless configuration and it will be a system profile. Phew.\n(In this case we need some sort of connectivity in order to enroll for a certificate over SCEP, this could be via LAN or an open guest Wi-Fi)\n\nSummary\nIt might be though to get your head around this if EAP-TLS and SCEP are new, yet the same idea holds through for a Username/Password or even pre-shared key authentication protocol. The problem remains the same, Wi-Fi user profiles are started after the user logs on, rendering Active Directory logins impossible. We couldn’t find a solution to change that behavior without the iPhone Configuration Utility.\nWould be happy to hear about others experiences with this stuff.\nSpecial thanks to my mate @eduriz :)\n&#160;\ntom"
        },
        {
          "id": "post-patching-office-web-apps-server",
          "title": "Patching Office Web Apps Server",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/patching-office-web-apps-server/",
          "content": "Today I started my day with an Office Web Apps Farm that was not working anymore. After reviewing the Event Log I figured something strange happened… :)\n\n\n\nThe Event Log was basically full with .Net Runtime and Application Errors, I’ll paste some for reference:\n\nLog Name: Application\nSource: .NET Runtime\nEvent ID: 1026\nApplication: ppteditingbackendwatchdog.exe\nFramework Version: v4.0.30319\nDescription: The process was terminated due to an unhandled exception.\nException Info: System.TypeInitializationException\nStack:\n&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.ServiceInstanceFinder.GetLocalAgentInstance(Microsoft.Office.Web.Common.OfficeServiceType)\n&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.PrepareRegistrations(Microsoft.Office.Web.Common.OfficeServiceType)\n&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.WatchMachines(Microsoft.Office.Web.Common.OfficeServiceType, CheckServiceInstance, Microsoft.Office.Web.Common.OfficeServiceType, System.String)\n&amp;#160;&amp;#160; at Microsoft.Office.Server.Powerpoint.Watchdog.EditingBackend.Program.Main(System.String[])\n...\nLog Name: Application\nSource: Application Error\nEvent ID: 1000\nFaulting application name: ppteditingbackendwatchdog.exe, version: 15.0.4481.1000, time stamp: 0x50ee5a9e\nFaulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988aa6\nException code: 0xe0434352\nFault offset: 0x000000000003811c\nFaulting process id: 0x94c\nFaulting application start time: 0x01ce2b83409e789a\nFaulting application path: C:\\Program Files\\Microsoft Office Web Apps\\PowerPointEditingServicesWatchdog_App\\ppteditingbackendwatchdog.exe\nFaulting module path: C:\\Windows\\system32\\KERNELBASE.dll\nReport Id: 7e88e5ec-9776-11e2-93f3-0050569e79e3\nFaulting package full name:\nFaulting package-relative application ID: \n\n\nThere would be the same errors for all of the Web Apps (Excel, Word…) Needless to say, neither SharePoint 2013 nor Lync 2013 would be able to leverage features that required Web Apps Server. So, what’s next?\n\nWell I continued digging through the Event Log and realized that the Server was patched and restarted very recently, as part of the patching someone applied KB2760445. Sweet.\n\nSo I started searching TechNet for information on that Update for Office Web Apps and found a nice article on how to Apply software updates to Office Web Apps Server. Basically it goes like this: After patching the Server, you will have to re-create the Office Web Apps Farm. In my case, I simply removed the farm using\n\nRemove-OfficeWebAppsMachine\n\n\nand then re-used the same cmdlet I used to create the Web Apps Farm initially.\n\nNew-OfficeWebAppsFarm -InternalUrl \"https://myOWAserver.tomt.local\" -ExternalUrl \"https://office.ntsystems.it\" –CertificateName \"ntSystems OfficeWebApps\" –EditingEnabled\n\n\nAll set.\n\nIf there is one take-away from this, it is very likely: Read that documentation, oh, and please, do test!\n\nTom"
        },
        {
          "id": "post-prepare-windows-server-2012-for-lync-2013",
          "title": "Prepare Windows Server 2012 for Lync 2013",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, Skype4B",
          "url": "/post/prepare-windows-server-2012-for-lync-2013/",
          "content": "To prepare a Windows Server 2012 for a Lync 2013 installation, install the following features manually before you run the Lync setup:\n.Net Framework 3.5\nWindows Identity Foundation 3.5   Media Foundation    HTTP Activation    \nUse the Powershell to speed up the installation:\nInstall-WindowsFeature –name NET-Framework-Core –source D:\\sources\\sxs (the Windows 2012 Disk is mounted on D: )\nInstall-WindowsFeature –name Windows-Identity-Foundation,Server-Media-Foundation,NET-HTTP-Activation\nIf you have to prepare the AD schema, install also the AD DS Administration Tools."
        },
        {
          "id": "post-installing-lync-2013-updates",
          "title": "Installing Lync 2013 Updates",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, Server, Skype4B",
          "url": "/post/installing-lync-2013-updates/",
          "content": "A few days ago, Microsoft released a bunch of updates for Lync 2013. I will walk through the required steps to upgrade a Lync 2013 Standard Edition server in this post. The February updates for Lync 2013 enable some new features including Lync 2013 mobile Clients, Group Call pick-up and many more…\nGet Files and read documentation\nHead over to the download center and download the update files: http://www.microsoft.com/en-us/download/details.aspx?id=36820\nMake sure you read the corresponding KB article as there are some manual steps required after the update: http://support.microsoft.com/kb/2809243\nInstall\nPrior to installing the updates stop the Lync Services, you can use the –Graceful parameter:\nStop-CsWindowsService –Graceful\nYou can use Get-CsPoolUpgradeReadinessState to check if the pool you are going to update is ready.\nCopy all the files from the download to a local folder on the Lync Server, open LyncServerUpdateInstaller.exe and install the updates by clicking “Install Updates”\n&#160;\nAfter installing the updates, check the folder with the update files for logs. If everything installed correctly, reboot the server.\nUpdate Databases\nAfter the reboot, the databases need to be updated, too. On a standard edition front end server, the databases are installed locally, so you can update them using the following cmdlets:\nInstall-CsDatabase -ConfiguredDatabases -SqlServerFqdn lyncfe.ntsystems.local –Verbose\nThe Central Management Store needs an update too, it is also co-located on the standard edition server:\nInstall-CsDatabase -CentralManagementDatabase -SqlServerFqdn lyncfe.ntsystems.local -SqlInstanceName rtc –Verbose\nAfter that, the newly published topology needs to be enabled, this can be done using the Enable-CsTopology cmdlet.\nEnable-CsTopology\nNow the last step is to run the Bootstrapper on the updated front end servers, it can be found on the Lync Server in the following path:\n&quot;%ProgramFiles%\\Microsoft Lync Server 2013\\Deployment\\Bootstrapper.exe&quot;\nThat should be it and the Lync 2013 February updates have been installed.\nso long,   tom"
        },
        {
          "id": "post-activesync-forefront-tmg-and-accountlockoutthreshold",
          "title": "ActiveSync, ForeFront TMG and AccountLockoutThreshold",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Server, Security",
          "url": "/post/activesync-forefront-tmg-and-accountlockoutthreshold/",
          "content": "The use of smartphones and other mobile email clients has been increasing for quite some time. With ActiveSync being one of the widest-used protocols comes the need to manage another set of devices. As users are forced to change their domain account&rsquo;s passwords from time to time, some might forget to update their smartphones as well.\nThe Problem\nSo, as a user changes their password, the mobile device will continuously try to sync with a wrong set of credentials. Now depending on the rate at which it tries to sync, this might very well lock-out the users AD account, depending on the Domains Password Policy.\nAnother possibility to consider is an attacker who could create quite a disturbance by locking out accounts intentionally, using any published Web Site with Forms Base Authentication.\nThe Solution\nForefront TMG 2010 SP2 comes with a new feature, called AccountLockoutThreshold. Forefront TMG keeps track of failed logons and locks the account locally, after a specified amount of failures. After that, any other attempt to authenticate via TMG is not forwarded to Active Directory/LDAP, so that the users account does not get locked-out continuously .\nThe AccountLockoutThreshold feature is local to the Forefront TMG server, so if there is an array of publishing servers, it has to be configured on each of them. It can only be configured for Web Listeners using Forms Based Authentication.\nTo configure AccountLockoutThreshold we need to use PowerShell, there is no GUI that exposes this setting. A great script to control the settings is available in the Script Center. So, we copy the script and save it to a *.ps1 file on the Desktop of the TMG Server, then we use dot-sourcing to load it into an administrative PowerShell session.\nExample: I saved the script to AccountLockout.ps1 on the Desktop. Use &ldquo;. .\\Desktop\\AccountLockout.ps1&rdquo; to import the script.\nThe Get-AccountLockoutSetting cmdlet is used to retrieve the current settings.\n&nbsp;\nThe Set-AccountLockoutSetting cmdlet is used to configure the feature.\nExample: I use &ldquo;Set-AccountLockoutSetting -WebListener OWA -EnableAccountLockout $true -AccountLockoutThreshold 5 -AccountLockoutResetTime 300&rdquo; to enable the AccountLockout feature, accounts will get locked out for 300 seconds if there are 5 consecutive failed attempts.\n\nOnce configured, the following event will be logged to the Application Log of the TMG server if an account gets locked out locally:\nSource: Microsoft Forefront TMG Web Proxy Event ID: 32581 Level: Error Text: limit for consecutive logon failures has been reached. Additional logon attempts by domain.local\\user.name will be automatically rejected for the next 300 seconds\n\nUnfortunately TMG has been discontinued and is no longer available for customers, but for anyone already using it, this should help you dealing with Account Lockout Policies and ActiveSync devices.\n&nbsp;\nso long, tom"
        },
        {
          "id": "post-lync-2013-(client)-and-lyncdiscoverinternal",
          "title": "Lync 2013 (Client) and LyncDiscoverInternal",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, Client, Skype4B",
          "url": "/post/lync-2013-(client)-and-lyncdiscoverinternal/",
          "content": "Daniel and I have been quite busy implementing Lync 2013 these days. One interesting gotcha thing we knew, but didn’t give a lot attention about the Lync 2013 client is, that it makes use of the LyncDiscover and LyncDiscoverInternal DNS records. These records were introduced with Lync 2010 Mobility and were used by the mobile clients to locate a sign-in server. Lync 2010 Clients don’t look for them, they use _sipinternaltls._tcp and _sip._tls records for auto sign-in.\nWith the Lync 2013 Client that changed. The new client now queries for the following DNS records in order to sign-in automatically:\n   LyncDiscoverInternal.ntsystems.it    LyncDiscover.ntsystems.it    _sipinternaltls._tcp.ntsystems.it    _sip._tls.ntsystems.it    sipinternal.ntsystems.it    sip.ntsystems.it    sipexternal.ntsystems.it \n \nSo, as you can see, even before trying to locate the SRV records, the 2013 Client tries to connect to the AutoDiscover Web Service. That works just fine, in most situations.\nBut… in a configuration like the following you might run into this bug get a certificate warning when signing into Lync for the first time from the internal network.\n   You have a disparate namespace (like ntsystems.local for your Lync Servers while ntsystems.it is your SIP domain) AND    You use internal certificates on the Front End Servers AND    You have Split DNS configured (ntsystems.it on the internal DNS servers) AND    You set LyncDiscoverInternal.ntsystems.it DNS record (for public zone on internal DNS server) \nThe certificate warning shows the server name to which Lync is attempting to connect, it also shows the certificate subject and you can view the certificate. You double (triple) check the certificate, subject alternate names, dates, DNS, basically everything and it seems to be just fine. Still, you continue to get the warning.\nWorkaround\nFirst of all, I have to say that I do not fully understand why this happens. The way I see it, is that Lync 2013 connects to the internal Web Service (using LyncDiscoverInternal) and all certificate parameters are fine… As you are probably not going to get a certificate for ntsystems.local from a public CA I wonder what the right solution looks like…\nThe good news: There is a workaround for this, you can use Group Policy to configure Lync 2013 to configure the Trusted Domain List. According to TechNet, this “Lists the trusted domains that do not match the prefix of the customer SIP domain.” – nice. So, I added ntsystems.local to the Trusted Domain List that can be found in User and Computer Configuration under: \nAdministrative Templates/Microsoft Lync 2013/Microsoft Lync Feature Policies\nYou can download the admx/adml files for Office 2013 here. The Group Policy adds the domain to the either “HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Office\\15.0\\Lync\\TrustModelData” or “HKEY_CURRENT_USER\\SOFTWARE\\Policies\\Microsoft\\Office\\15.0\\Lync\\TrustModelData” depending on what you choose in the Group Policy Object.\n \nAnother workaround would be to simply remove the LyncDiscoverInternal record from the internal DNS zone, which breaks mobile clients (including Lync Windows Store App) on the internal network (Wireless). Not really a solution…\nAgain, I don’t fully understand the problem, this is what I found during my research. If you have a better solution, please drop me a line :)\n&#160;\nHappy New Year and have a nice weekend,    tom"
        },
        {
          "id": "post-lync-2013-installation-and-certificates",
          "title": "Lync 2013 – Installation and Certificates",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, Server-2012, Skype4B",
          "url": "/post/lync-2013-installation-and-certificates/",
          "content": "This post is the follow-up to the one about AD and topology preparation and I will again use screenshots to walk through the Installation and Certificate request and assignment processes.\nDNS Records\nThe last post ended with publishing the Topology, after that, the wizard provides a simple To-Do list, summarizing the next steps. Creating the DNS records for our Simple URLs was one of them. So, using DNSmgmt.msc I created CNames for the meet, dialin and lyncadmin URLs, all pointing to the Lync Front End Server.\nThe DNS Records used for automatic sign-in are not mentioned in said To-Do list, though. I created the sip.tomt.local record as just another alias pointing to the Lync FE Server. Automatic Sign-in also needs the following Service Location Record (SRV)\n_sipinternaltls._tcp.tomt.local SRV service location:     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; port&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 5061      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; svr hostname&#160;&#160; = lyfe01.tomt.local\nAll in all, I do now have the following DNS Records:\n            HostName        RecordType        RecordData                  _sipinternaltls._tcp        SRV        [0][0][5061][lyfe01.tomt.local.]                  lyfe01        A        10.1.1.11                  dialin        CNAME        lyfe01.tomt.local.                  meet        CNAME        lyfe01.tomt.local.                  sip        CNAME        lyfe01.tomt.local.                  lyncadmin        CNAME        lyfe01.tomt.local.        \nServer Prerequisites\nThe next step is to install the prerequisites on the Lync Server, for more information check TechNet. I use the following PowerShell cmdlet to install Lync Server prerequisites, make sure you specify a “–Source”.\n   Add-WindowsFeature NET-Framework-Core, NET-Framework-45-Features, RSAT-ADDS, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Redirect, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Http-Tracing, Web-Windows-Auth, Web-Client-Auth, Web-Basic-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, Web-Mgmt-Console, Web-Scripting-Tools, Web-Request-Monitor, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Mgmt-Compat, Desktop-Experience, Telnet-Client, BITS, Windows-Identity-Foundation –Source ‘D:\\sources\\sxs’ –Restart&lt;/code&gt;  Now after the reboot open Lync Deployment Wizard again and click &quot;Install or Update Lync Server System&quot;    After installing Local Configuration Store and Lync Server Components, we need to request and assign Certificates for Lync to use.    If you use an online (enterprise) CA, select send request immediately, if you intend to send the request to a public CA, select the offline certificate request option. As I have ADCS installed in my test forest, I use the enterprise CA for this.    Optionally specify credentials and a certificate template, if your current user has permissions to request a certificate using the “WebServer” template, click next. Then specify the friendly name for and the key length for the certificate.    Lync automatically includes the required Alternative Names along with Simple URLs and external pool name. Other details (such as City, Country, Region) typically used in certificate requests can be specified too.    Select the SIP Domains, so that they are included, too. You can optionally add additional SANs, I didn’t need any more than the ones included by the wizard.  Request the Certificate and tick the “Assign this certificate…” checkbox.    If you plan to use Server-to-Server authentication (Office Web Apps, Exchange, SharePoint) also request an OAuth Certificate. The procedure is the same as for the Server certificate.    The OAuth Certificate is a &quot;Global&quot; Certificate, that means that Lync Central Management Store replicates it to all Lync Servers, and all Lync Servers will use the same Certificate for OAuth.  Starting the Services  Phew, now after all those steps, we can finally go ahead and start the services. Give it some time, and check if all services are started using services.msc.  Now, we can use Lync Server Control Panel to check out our work. I prefer to use the Control Panel on my client PC, as it requires Silverlight to be installed. So, on a Computer sporting Silverlight, open the Simple Administration URL specified before.     I will continue to test some features of Lync 2013, stay tuned for more!  &#160;  so long, have a nice weekend!   tom"
        },
        {
          "id": "post-lync-2013-prepare-ad-and-build-topology",
          "title": "Lync 2013 – Prepare AD and build Topology",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Lync, Server-2012, Skype4B",
          "url": "/post/lync-2013-prepare-ad-and-build-topology/",
          "content": "In this post I use the screenshots taken in my test environment to walk through the steps of setting up a Lync 2013 Standard Edition Front End Server in a test environment.\nInstall Deployment Tools\nFirst of all we need to install the Lync Deployment Wizard on a server, this doesn’t necessarily have to be the Lync Server, although it’s a good idea to use this server. So, start Setup and select a location for the installation files.\n&#160;\nAfter that installation finishes, we we start the Deployment Wizard and install the administrative tools.\n \nPreparing Active Directory\nWarning: This is going to update the AD schema, make sure you are in test environment.\nFrom the Lync Server Deployment Wizard click “Prepare Active Directory” and update schema, prepare the forest as well as the current domain.\n \nThe following cmdlets can be used to check domain/forest readiness.\nGet-CsAdDomain: If Domain is ready: LC_DOMAINSETTINGS_STATE_READY    Get-CsAdForest: If Forest is ready: LC_FORESTSETTINGS_STATE_READY\nNow preparing the current domain created some AD groups used by Lync. Add the account used to administer Lync to the CSAdministrator group.\nDefine Topology\nAfter preparing Active Directory we are ready to create a new Topology using the Topology Builder. So we start Topology Builder and create a new Topology\n\nSpecify a primary SIP domain, additional SIP domains can be specified in the next step.\n\nThe first thing we need to create is a new Site within our new topology, specify a name and some details for the first Lync Site\n\nStart the New Front End Pool wizard after finishing the New Topology wizard and enter the FQDN of your Lync Standard Edition Server.\n \nSpecify the Lync Server Features to be installed on this server\n\nAs we add Enterprise Voice and Conferencing we need a Mediation Server, tick the check box to Collocate the Mediation Server\n\nDefine the SQL Store for the front end pool, as we install a Standard Edition Server we cannot change this\n \nSelect a File Share that has already been added to the Topology builder or create a new one\n \nSpecify the external URL, this URL will be used by external clients\n\nAssociate an Office Web Apps Server that has already been added to the Topology or add a new one, if you have one\n\nIf you selected the Monitoring on the features page, specify a SQL instance with Reporting Services. This can be installed locally or on a remote SQL server\n \nAfter finishing the new Front End Pool wizard, configure Simple URLs and Associate Central Management Server by right clicking “Lync Server” and selecting Edit Properties in the Topology Builder\n\nCheck the Configured Settings and publish the Topology by selecting Action from the menu and clicking “Publish Topology”\n\nOk, nice work. We have just created and published our Lync 2013 Topology. Time to get the Server ready.\nIn the next post I will walk through the actual installation of the Lync 2013 Standard Edition Front End Server.\nso long,    tom"
        },
        {
          "id": "post-lync-2013-voicemail-escape",
          "title": "Lync 2013 – Voicemail Escape",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Lync, Skype4B",
          "url": "/post/lync-2013-voicemail-escape/",
          "content": "With the availability of all Office Wave 15 products, Lync 2013 piloting has begun. Exciting times :)\nSo, this is a quick post about a new feature in Lync Server 2013, voicemail escape. What this does is, essentially providing a &ldquo;too soon&rdquo; timer for PSTN calls. Ok, you might say, why do I need such a thing?\nWell, if an enterprise voice user configures simultaneous ringing on her mobile phone, and that phones battery died or she wandered into an area with no network coverage, her provider&rsquo;s voicemail would answer. Now, even if she was sitting on her desk, she might never get the call, as the caller would always go to her voicemail. Voicemail escape defines a timer using the &ldquo;Set-CsVoicePolicy&rdquo; cmdlet, if a call is answered before that timer elapsed, Lync would ignore that answer and keep the call on premises.\nEnable the VoicemailEscapeTimer:\nSet-CsVoicePolicy -EnableVoicemailEscapeTimer:$true -PSTNVoicemailEscapeTimer:5000\nEnableVoicemailEscapeTimer enabled the timer. PSTNVoicemailEscapeTimer sets the timer (in ms) used to determine whether or not a call has been answered &ldquo;too soon&rdquo;.\nMonitoring\nThe Lync Monitoring server shows those ignored answers with a SIP Response Code of 480 and a Reason of: &rsquo;Terminating call as it is answered earlier than the specified voicemail escape timer&rsquo;\n\nThe Lync Server Logging tool (Component: S4, Level: All) shows the timer in the SIP INVITE packet as:\nms-vm-escape-timer: 5000\nYou may have to tune the timer depending on your setup and the providers you are using. I had to set it pretty high to actually see an effect.\nso long, tom"
        },
        {
          "id": "post-windows-server-2012-virtualized-domain-controller",
          "title": "Windows Server 2012 – Virtualized Domain Controller",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2012",
          "url": "/post/windows-server-2012-virtualized-domain-controller/",
          "content": "Hello, welcome and a very happy new year!\nDuring Windows Server 8 Beta times, I wrote about virtualizing Domain Controllers and the VM-GenerationID attribute, since the old post was in German and about the beta version, this will be an updated translation.\nProblem\nThe problem in Active Directory versions before 2012 was, that the restore of a snapshot would introduce a condition known as USN-Rollback, breaking replication between Domain Controllers. For that reason, DCs could not leverage all features of a modern, virtualized environment. Cloning a DC was pretty much unthinkable. Until now!\nVDC Safe Restore\nThe Active Directory replication model assigns an ongoing number to every transaction (Update Sequence Number). DCs keep track of these numbers, along with a unique identifier (Invocation ID) for each replication partner. If a DC was rolled back in time (applying a snapshot), that DC would start reusing aged USNs and, therefore, replication partners would refuse the updates and terminate the replication partnership. The only resolution for this problem was to manually remove the DC from the Active Directory.\nNow, Windows 2012 introduces a feature to tackle that problem. The Hypervisor exposes a VM-Generation ID through the ACPI table, this ID is saved in the Domain Controllers memory. If the VM-Generation ID changes (e.g. when a snapshot is applied), the restored DC knows that something happened and resets it’s invocation ID.\n&#160;\nAs replication partners have never heard of the new Invocation ID before, they don’t care about USN reuse and replicate like it was a new relationship. Apart from resetting the Invocation ID, the DC also, non-authoritatively restores SYSVOL and logs the following Event to the “Directory Services” Event Log.\n\nThe new Active Directory attribute used to store the VM-Generation ID is ms-DS-Generation-Id, find more information about that attribute on MDSN.\n\nThere is no need (and no way) to configure VDC Safe Restore, as long as the Hypervisor supports VM-Generation ID, it automatically works. In a recent blog post VMware announced support for VM-Generation ID for it’s vSphere platform, so now you can choose Hyper-V 2012 and VMware’s ESXi as Hypervisor for your Domain Controllers.\nA word of caution at the end, never, and I mean NEVER, stop taking regular (AD aware) backups! The feature discussed in this post is meant just to solve the USN-Rollback issue, it is in no way a replacement for a backup as the DC is restored in a non-authoritative way.\nStay tuned for DC cloning :)\n&#160;\nso long, have a nice weekend!   tom"
        },
        {
          "id": "post-powershell-v3-invoke-webrequest",
          "title": "PowerShell v3 Invoke-WebRequest",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/powershell-v3-invoke-webrequest/",
          "content": "Today I have a quick function to download the current Sysinternals Suite from http://live.sysinternals.com. I created this mainly to learn/try some concepts of PowerShell, if you have any hints/ideas feel free to drop me a mail.\nThis function leverages the new &lsquo;Invoke-WebRequest&rsquo; cmdlet, available in PowerShell v3, so, obviously V3 is required.\nExample use:\nUpdate-SysinternalsSuite -Path C:\\tools\\sysinterals &ndash;AsJob\nThis downloads the Sysinternals Tools to C:\\tools\\sysinternals. If the specified folder does not exist, the script creates it. It also makes use of background jobs, so you can keep using PowerShell during the download.\nI&rsquo;ve posted the Function to PoshCode:\n&nbsp;\nenjoy, tom"
        },
        {
          "id": "post-microsoft-ndes-and-cisco-ios-part-2",
          "title": "Microsoft NDES and Cisco IOS – part 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012, Network",
          "url": "/post/microsoft-ndes-and-cisco-ios-part-2/",
          "content": "This is part two of my article about NDES and Cisco. In the first article, I configured the Windows 2012 NDES role, in this part I will walk you through the enrollment process on a Cisco IOS router.\nRSA key\nSo what are we going to do here? We will be leveraging SCEP to obtain a digital certificate from a CA. As a prerequisite to this, the router needs a key-pair, that is, private and public keys. The public key will be sent to the CA (using SCEP), the CA will sign that public key and send the certificate (signed public key) back to the router.\nIf you are already using services like “ssh” or “ip http secure-server” you can use the existing keys. If no keys exist, the router will create a new set of keys as we enroll for a certificate. This auto generated key-pair is only using a 512 bit key, that is not considered secure anymore.\nTo create a new key-pair, using a reasonable secure key length:\n&#160;\n\n\nTrustpoint\nHaving the keys in place, we need to get the CA certificate. The router will use the CAs public key to authenticate the CA and other digital certificates issued by that same CA.\nTo download the CA certificate we define a new trustpoint and set to enrollment URL to the SCEP URL, if you have no name resolution configured, be sure to use the IP address of the SCEP server instead of the name.\nThe SCEP URL defaults to: http://servername:80/CertSrv/mscep/mscep.dll\n \nAfter configuring the trustpoint, we tell the router to download the CA certificate:\n ´\nIOS shows the Thumbprint (fingerprint) of the digital certificate, so one could verify that this is the correct certificate using an out-of-band method.\nA quick look at the running-config shows that the key was received.\nEnroll\nNow that the router does trust our CA we can go ahead and request a digital certificate:\n \nIOS prompts for a password that would be used to revoke the certificate, and you can choose to add the IP address or serial number to the certificate. \nThe request gets signed by the CA and the certificate is sent back to the router, you should see the following messages in the log or on “terminal monitor”\nCRYPTO_PKI:&#160; Certificate Request Fingerprint MD5: 4C9C472F 605AA33F 869EB167 9F097C56    CRYPTO_PKI:&#160; Certificate Request Fingerprint SHA1: E943141D 19A5C4EB 6B5EE5D2 B87AAF57 B829FFED     %PKI-6-CERTRET: Certificate received from Certificate Authority\nThe IIS Log on the SCEP server shows the successful transaction like this:\n2012-11-30 18:58:19 192.168.1.21 GET /CertSrv/mscep/mscep.dll/pkiclient.exe operation=PKIOperation&amp;message=MIIJUgYJKoZIhvcNAQcCoIIJQzCCCT8CAQExDjAMBggqhkiG…   …2Bw6Q1AJGzQs4wl7jA4GvWvikdP1wnPzAkVP7KZ%2FZ1%2Fz4hCYNpP4%3D%0A 80 - 192.168.1.1 - - 200 0 0 277\nIn the “Certificate Authority” MMC Snap-In you see the certificates that have been issued:\n \n \n&#160;\nThat was the second, and final part on NDES and IOS routers.\nso long,\ntom"
        },
        {
          "id": "post-microsoft-ndes-and-cisco-ios-part-1",
          "title": "Microsoft NDES and Cisco IOS – part 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Network, Cisco, Security",
          "url": "/post/microsoft-ndes-and-cisco-ios-part-1/",
          "content": "With digital certificates being the de-facto standard for authentication, a handy enrollment model is key (pun intended). Microsoft included it’s NDES or Network Device Enrollment Service as a Role in Windows 2008, it has been available as add-on for Windows 2003, too. \n\nNDES\n\nSo, NDES sounds pretty cool, but what is it, you may wonder. It’s Microsoft’s implementation of SCEP or Simple Certificate Enrollment Protocol, which is a PKI communication protocol that leverages existing PKCS#10 and #7 technology over HTTP. It provides a simple means of requesting and issuing digital certificates across different devices and vendors.&lt;/p&gt;\n\nInstalling NDES on Windows Server 2012\n\nTo use SCEP with your existing ADCS based PKI simply add the Role to the Server that provides CA Web Enrollment. I’m not going through the details of setting up a ADCS based PKI here, that might very well be a topic for a future post, though.\n\nAdd the Role using ServerManager or Windows PowerShell:\n\n\nInstall-WindowsFeature –Name ADCS-Device-Enrollment\n\n\nConfiguring NDES\n\nAfter successful installation of the Role, ServerManager informs you that there is some sort of configuration required for the newly added feature.\n\nAn AD user account is required for the NDES service to use. That account must be member of the local IIS_IUSRS group on the NDES Server. I created a user with the name of scep and added it to the group before starting the configuration wizard.\n\nSelect the Service Account:\n\nFill in information required for the RA certificate. What happens here, is that the NDES Server is issued two Registration Authority certificates, which are then used for SCEP:\n\n\nConfigure cryptographic settings for the RA keys:\n\n\nAfter reviewing the settings, and clicking Configure you will see the RA certificates in the personal store of the NDES Server:\n &lt;/p&gt;\n\nConfigure NDES CA settings\n\nThe certificate template used by NDES defaults to IPSECIntermediateOffline, that can be changed by modifying the following registry keys:\n\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MSCEP\nEncryptionTemplate\nGeneralPurposeTemplate\nSignatureTemplate\n\n\nI decide to go with the WebServer template, so I update the registry and restart the certsvc service. Keep in mind, that the service-user account (TOMT\\scep, in my lab) needs permissions to enroll for the selected certificate template. This can be configured using the Certificate Templates MMC Snap-In:\n\n\nNDES requires a challenge for every certificate transaction, unfortunately there seems to be no such setting in Cisco’s SCEP implementation. That default can be changed by setting the following registry key to 0:\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MSCEP\\EnforcePassword\\EnforcePassword\n\n\nWarning: This disables the need for a challenge, so that essentially anyone with knowledge of your NDES server can enroll for certificates.\n\nRestart the certsvc service after modifying the registry:\n\nGet-Service certsvc | Restart-Service\n\n\nConfigure NDES IIS settings\n\nIIS request filtering sets the value for MaxQueryString to 2048 by default, a reasonable key length is at least 1024, more often 2048. You see the problem, that value needs to be changed in order to support strong keys.\n\nUse appcmd to change the value for MaxQueryString:\n\n%systemroot%\\system32\\inetsrv\\appcmd.exe set config /section:system.webServer/security/requestFiltering /requestLimits.maxQueryString:\"4096\" /commit:apphost\n\n\nIf you don’t update MaxQueryString you will see error 404.14 Query string too long in the IIS log.\n\nThere is a really good guide to NDES on TechNet Wiki.\n\nThat’s it for the first part, our NDES on Windows Server 2012 is configured and ready to go. Stay tuned for part 2.\n\n— Tom"
        },
        {
          "id": "post-get-access-to-a-windows-2012-server-without-a-password",
          "title": "Get access to a Windows 2012 Server without a password",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012",
          "url": "/post/get-access-to-a-windows-2012-server-without-a-password/",
          "content": "In this article, I will explain how you get access to a Windows Server without a password.\nWhen the server boots up you have a nice feature “Easy access” on the logon screen. \n\nIn the next steps, we change the “Easy Access” function with a cmd command prompt:\n1. Boot with the Server 2012 CD and select “Repair your computer”\n\n2. Select “Troubleshooting” and “Command prompt”       3. Get the drive letter of your System Volume with diskpart\n\n4. Rename the utilman.exe file to utilman.old and copy cmd.exe to utilman.exe\n\n5. Reboot the server and start the “Easy Access” feature. You will get a command prompt. Now type whoami and you will see that you can run commands under the local system account\n\nND"
        },
        {
          "id": "post-sharepoint-2013-change-default-settings-of-upload-image-pop-up",
          "title": "Sharepoint 2013 change default settings of “Upload Image” Pop-Up",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-2013-change-default-settings-of-upload-image-pop-up/",
          "content": "When you upload files or images in Sharepoint you have get a pop-up that asks you about the file, destination library and an option to overwrite extsting files.\n\nWhen the pop-up appears the checkbox “Overwrite existing files” is checked. To change the default setting we have to change 2 aspx files:\n   Navigate to C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\14\\TEMPLATE\\Layouts    Make a backup of the following files: upload.aspx and uploadex.aspx    Edit the upload.aspx file    Locate the line which contains: &lt;asp:CheckBox id=”OverwriteSingle” Checked=”true” Text=&lt;%$Resources:wss,upload_document_Overwrite_file%&gt;” runat=”server” /&gt;    Change the Checked=”true” to Checked=”false“    Edit the uploadex.aspx file and make the same changes on the same lines    Save the files    Perform an IISRESET \nThe checkbox is now not selected default anymore.\nGreetings   nd"
        },
        {
          "id": "post-exchang-2013-offline-owa",
          "title": "Exchang 2013, Offline OWA",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "en, Exchange",
          "url": "/post/exchang-2013-offline-owa/",
          "content": "In the last time I worked a lot on my Exchange 2013, SQL 2012 and Sharepoint 2012 lab. A really nice feature is the Exchange 2013 Offline OWA.\nYou can start using OWA offline from the OWA Website:\n\nOWA informs you to that it will save some content of your mailbox on the computer.\n\nWhat you can see now is that OWA safes mailbox content on your local disk under C:\\Users\\user\\AppData\\Local\\Microsoft\\Internet Explorer\\Indexed DB\n&nbsp;\n\nLike Exchange also the offline files are some edb an log files.\nThere is a full list of all offline OWA features: http://technet.microsoft.com/en-us/library/aa997437(v=exchg.80).aspx\nGreetings nd"
        },
        {
          "id": "post-windows-server-2012-directaccess",
          "title": "Windows Server 2012 – DirectAccess",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012, Server",
          "url": "/post/windows-server-2012-directaccess/",
          "content": "DirectAccess is a feature that has been introduced in Windows Server 2008R2 and Windows 7. It allows secure access to enterprise resources, without requiring a manual VPN connection. A DirectAccess enabled computer establishes a secure connection to the DirectAccess server every time the computer is connected to the internet.\nWindows Server 2012 and Windows 8 really simplify the configuration required for DA, making it much easier to deploy a remote access solution.\nRequirements\nThe only requirement is the installation of a Windows Server 2012 member server, providing the “head end” of the connection. No Active Directory, schema, forest, domain-level updates are required.\nThe DA Server needs two network adapters, one connected to the internal LAN, the other one connected to a DMZ or public network.\n&#160;\nIf the DA Server is located behind a firewall, https (tcp/443) has do be allowed from the internet to the “public” network adapter.\nDirectAccess relies on IPv6 technology, the only hosts that require an IPv6 address are the DirectAccess Server and clients, though. The DA server performs NAT64 and DNS64 in order to enable the DA client to access IPv4 only servers.\n\nInstallation\nUse ServerManager or PowerShell to install the Remote Access server role on the designated DirectAccess server.\n \nOnce installed, use the “Getting started” wizard to configure DirectAccess. The wizard can be started from ServerManager or from within the “Remote Access Management Console”.\nSelect “Deploy DirectAccess only” in the wizard.\n \nSelect the network topology to be used, in this example I am using a server with two network adapters, one connected to a DMZ and one connected to my LAN. Specify the name (or public IP) that clients will be using to connect. \n \n\nAnd that’s all there is about it, it’s called “simplified deployment”. The Wizard goes ahead and creates Group Policies for DA Servers and Clients, creates DNS records for Network Location. Pretty cool, eh?\nTo modify the settings, click the “here” link on the last page of the wizard, for my test environment I go with the defaults.\n\n\n\n\nAs the wizard finishes, it shows some information about what it did.\n\nDirectAccess Server \nThe DirectAccess Configuration can be shown and changed in the Remote Access Management Console.\n \nThe Dashboard and Operations Status panels do provide information about the servers status, required services and connected clients.\n \n\nDirectAccess Clients\nThe wizard created a Group Policy Object, named “DirectAccess Client Settings” and a WMI Filter, to apply that GPO to Notebooks running Windows 7 or 8 Enterprise editions. So all I had to do was to update the group policies on the notebook (gpupdate). \nAs long as it was connected to the LAN nothing changed, if I connected the notebook to the internet, the DA (Workplace Connection) was established automatically and I was able to access internal resources as if I was on the LAN.\n \nI think this “simplified deployment” really does make it easier to get started with DirectAccess, to deploy it in an enterprise network, one should be a little more familiar with the technology :) \nSo this post was meant to be a quick-and-dirty intro, stay tuned for more in-depth information.\nso long,   tom"
        },
        {
          "id": "post-windows-8-windows-to-go",
          "title": "Windows 8 – Windows To Go",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, en",
          "url": "/post/windows-8-windows-to-go/",
          "content": "Windows to Go (WTG) is a new feature available in the Windows 8 Enterprise Edition. It enables the deployment of Windows 8 to USB thumb drives so that an End User can really plug in their USB drive and boot their Enterprise environment on any machine. Now, for security reasons the thumb drive can be encrypted using BitLocker and the User has no access to local hard disks of the &ldquo;host&rdquo;.\nHardware\nWTG requires a &ldquo;fixed drive&rdquo;, that is, you cannot use any USB drive, it must be &ldquo;Certified&rdquo;. I am using a Kingston DataTraveler Workspace (www.kingston.com/wtg) other supported devices are listed on TechNet: Windows To Go: Feature Overview\nEven though its not required USB 3 is highly recommended to speed things up. If you have no WTG certified drive handy, try using a USB hard disk.\nDeploy\nDeployment is really simple, simply open &ldquo;Windows To Go&rdquo; from Control Panel. The WTG Wizard starts, and the first thing you have to select is which drive to use.\n\nIn the next step you select the Windows 8 Image, for testing I mounted a Windows 8 Enterprise DVD. In a real-world scenario you would use your customized Image for deployment.\n\nSet a password to BitLocker the device (highly recommended).\n\nObviously all data on the drive is lost, so if that is not a problem, click &ldquo;Create&rdquo;.\n\nYeah, that&rsquo;s it. In the last step you can choose to reboot the machine or just finish and close.\n\nBoot and Work\nSo now you have created a new WTG Workspace that can be used to boot Windows from almost any PC. If the PC can run Windows 7 or 8, it almost certainly will run Windows to Go. The first time you boot WTG it takes some time, just as every new Windows installation takes some time. After the quick, first steps you can start working, you&rsquo;ll notice that there is no access to the hard drives of the host computer. If local access is needed, simply open &ldquo;Disk Management&rdquo; and make the disks available (Requires Administrative permissions).\nIf you shut down Windows To Go and remove your USB drive, the local Computer starts, absolutely unaffected by WTG. BYOD just got a lot simpler, IT just needs to hand out USB drives and doesn&rsquo;t need to be supporting all kind of different environments Users might have on their devices.\nOn the other hand, Users do not have to worry about IT enforcing policies on there private-owned devices.\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\n&nbsp;\nIf you ask me, that&rsquo;s pretty cool :) tom"
        },
        {
          "id": "post-sharepoint-2013-search-center-windows-8",
          "title": "SharePoint 2013 Search Center – Windows 8",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Sharepoint",
          "url": "/post/sharepoint-2013-search-center-windows-8/",
          "content": "SharePoint 2013 Enterprise Search Center provides powerful indexing and search, not only for the local SharePoint instance but for file shares and other SharePoint farms as well.\nMore info: What's new in search in SharePoint Server 2013\nFederated Search\nWindows 7 and later support the connection of external sources through OpenSearch, which essentially is a Web Service that receives search queries by the client and returns results in either RSS or Atom XML format. This allows users to search remote data and view search results within Windows Explorer.\nMore info: Federated Search in Windows\nCreate OSDX File\nNow to get SharePoint search into Windows Explorer you need to create an OSDX (OpenSearch Description) file and deploy it to your clients.\nHere is an example file that works for my SharePoint 2013 and Windows 8:\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; \n&lt;OpenSearchDescription xmlns=\"http://a9.com/-/spec/opensearch/1.1/\"&gt; \n&lt;ShortName&gt;SharePoint Search&lt;/ShortName&gt; \n&lt;Description&gt;Search the SharePoint Search Center&lt;/Description&gt; \n&lt;Url type=\"application/rss+xml\" template=\"http://intranet.ntsystems.local/sites/searchcenter/_layouts/srchrss.aspx?k={searchTerms}&amp;amp;web.count=50\"/&gt; \n&lt;Url type=\"text/html\" template=\"http://intranet.ntsystems.local/sites/searchcenter/Pages/results.aspx?k={searchTerms}\"/&gt; \n&lt;/OpenSearchDescription&gt; \n&nbsp;\nSimply create a new file using notepad, adjust the URLs to point to your SharePoint Enterprise Search Center and save it with the .osdx extension.There are many possibilities for customization within the OSDX specification, check out MSDN to learn more about Creating an OpenSearch Description File.\nTo test the OSDX files, double-click it and click \"Add\" to add the search connector to Windows Explorer.\n\nThis adds a link to \"Favorites\" so you can easily search SharePoint from there.\nDeploy OSDX\nNow, to deploy this to more than one client, you could publish a link to the OSDX file and have your users click on that link to add the search provider.\nAlternatively Group Policy Preferences can be used to deploy the search connector:\n\nCopy the .searchConnector-ms file from your Client (%UserProfile%\\Searches\\) to a share that is available to the clients\n\nCreate a GPO and use the 'Files' GPP to copy the searchConnector-ms file from the share to %UserProfile%\\Searches\n&nbsp;\n\n&nbsp;\n\n\nUse the 'Shortcuts' GPP to create a Shortcut in the \"User Profile, Links\" folder, remember to select a nice Icon&hellip; ;)\n&nbsp;\n\n&nbsp;\n\n\nSo that's how to get results from SharePoint into Windows Explorer.\n&nbsp;\nSo long, tom"
        },
        {
          "id": "post-office-2013-web-apps",
          "title": "Office 2013 Web Apps",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012, Sharepoint",
          "url": "/post/office-2013-web-apps/",
          "content": "So October has been pretty quiet around here, but I have some cool stuff to share with you today.\nOffice 2013 RTM'd some time ago and so did all the server products. So with SharePoint 2013 available on TechNet I decided to set up some demo sites to get a feel for the product, after looking for a new version of the Office Web Apps I realized that there was some change coming here.\nOffice Web Apps Server\nOffice 2013 Web Apps are no longer installed on SharePoint servers directly, it became a stand-alone product instead. Not only does that stand-alone product bring new design and scalability possibilities, it is also possible to share the Web Apps with Exchange and Lync 2013.\nPrerequisites\nTo install Office Web Apps Server on a Windows Server 2012 box the following roles and features must be installed as a prerequisite:\nAdd-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices \nIf you want to use https for the Web Apps a proper certificate must be available on the server, too. To display the certificates installed on a computer try the following command:Get-ChildItem Cert:\\LocalMachine\\my | select Subject,FriendlyName The Web Apps Server can also be installed on Windows Server 2008R2, find the prerequisites on TechNet.\nInstalling Office Web Apps Server and creating the farm\nThe actual installation of the Server is pretty straightforward, just download the ISO and double click it (love that&hellip;). The only thing you can choose during setup is the installation path.\nOnce done with the installation, you can go ahead and use PowerShell to create a new Web Apps Farm. Not surprisingly the cmdlet to be used is New-OfficeWebAppsFarm, the following parameters have to be used to create a farm:\n-InternalUrl: the URL used for internal Clients\n-ExternalUrl: the URL used for Clients on the Internet\n-CertificateName: set the FriendlyName of the certificate to be used for the farm\n-EditingEnabled: enable editing of files in the browser (SharePoint)\nThe following example creates a farm\nNew-OfficeWebAppsFarm -InternalUrl \"https://myOWAserver.tomt.local\" -ExternalUrl \"https://office.ntsystems.it\" &ndash;CertificateName \"ntSystems OfficeWebApps\" &ndash;EditingEnabled \nTo verify that the farm has been created successfully, open a browser and go to https://myowaserver.tomt.local/hosting/discovery you should see some XML information about your internal and external URLs.\nSharePoint 2013\nNow to connect your SharePoint 2013 farm to the brand new Web Apps farm, fire up an administrative SharePoint Management Shell and use the New-SPWOPIBinding cmdlet. Use the &ndash;ServerName parameter to specify the internal URL of the Web Apps farm:\nNew-SPWOPIBinding -ServerName https://myOWAserver.tomt.local \n&nbsp;\nAfter that you can have a look at the WOPI Zone, if users are accessing the SharePoint from internal and external clients you might want to change the zone from its default value of \"internal-https\" to \"external-https\":\nSet-SPWOPIZone &ndash;zone \"external-https\" \n&nbsp;\nAlmost done, if you are using https on your SharePoint web applications you should be ready to go. If you are using http for SharePoint you need to set AllowOAuthOverHttp to true. This needs to be done in the SharePoint Management Shell using the following commands:\n$config = (Get-SPSecurityTokenServiceConfig) \n$config.AllowOAuthOverHttp = $true \n$config.Update() \n&nbsp;\nTo check if it worked, use:(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp \nTry it&hellip;\nReady to see it? Open a browser, go to your SharePoint 2013 sites and create a new Document or open an existing one, should be looking like that:\n\n&nbsp;\nSo long,tom"
        },
        {
          "id": "post-exchange-2010-and-maxinboundconnectionpersource",
          "title": "Exchange 2010 and MaxInboundConnectionPerSource",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-and-maxinboundconnectionpersource/",
          "content": "Exchange receive connectors do have a setting of MaxInboundConnectionPerSource which limits the maximum number of connections from a single IP address at any moment. So with a default value of 20, there are no more than 20 connections from a specific IP address allowed. The following warning is logged in the transport server's application log if the limit is exceeded:\nEvent ID: 1021\nEvent Source: MSExchangeTransport\nMessage Text: Receive connector 'Connector Name' rejected an incoming connection from IP address '10.10.10.10'. The maximum number of connections per source ('20') for this connector has been reached by this source IP address.\nThe sender of a mail might receive the following message:\nDeferred: 421 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel\" Status 4.0.0, \"Transient failure\"\nAccording to RFC this is not a permanent error, so the sender's mail server should try to send the message again after some delay.\n\"The command was not accepted, and the requested action did not occur. However, the error condition is temporary, and the action may be requested again.\"\nSet-ReceiveConnector\nTo view the configured value of MaxInboundConnectionPerSource use the Get-ReceiveConnector cmdlet, to change the value use the Set-ReceiveConnector cmdlet with the &ndash;MaxInboundConnectionPerSource parameter. \n\nThe following example increases the value to 100 \nGet-ReceiveConnector default* | Select Name,MaxInbound*\nGet-ReceiveConnector default* | Set-ReceiveConnector -MaxInboundConnectionPerSource 100 \nMore info on: TechNet \n&nbsp;\nSo longtom"
        },
        {
          "id": "post-scheduled-jobs-in-powershell-v3",
          "title": "Scheduled Jobs in PowerShell v3",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/scheduled-jobs-in-powershell-v3/",
          "content": "I am really excited to write about that great feature of PowerShell I started using recently. It's all about scheduling administrative tasks, actually it's more like scheduling everything, to run when I am at home sleeping happily J\nSo as I have mentioned before I'm no PowerShell expert at all and I'm sure all that stuff can be done many other ways, but then this thing is working for me&hellip;\nSnippets\nIf you have been using PowerShell ISE you might know what Snippets are, if you don't, just open powershell_ise.exe and press 'ctrl+j'. Snippets are code samples that can be added to your script easily. You can create your own snippets like that:\n$code = @' \n# this is my sample code \n'@ \nNew-IseSnippet -Title 'Sample' -Description 'Just a sample' -CaretOffset $code.Length -Text $code -Force \n&nbsp;\nThis will create a 'Snippets' folder at your Documents\\WindowsPowerShell where your new snippet is saved for later use. Having that said let's move on to scheduled jobs.\nScheduled Jobs\nUntil now it was quite a pain in the butt to run PowerShell scripts as scheduled tasks, you had to specify the path to powershell.exe and then use some params to make it run the script you choose. You could even pass arguments to those scripts, but it was no real fun. So now we can do all that very easy and directly from within PowerShell.\nTrigger\nFor starters we need to create a job trigger, to tell PowerShell when to execute out script.\n$trigger = New-JobTrigger -At 22:00 &ndash;Once \n&nbsp;\nThis will create a variable containing our trigger, as you can see the script will be executed today, at 22:00 and it will be executed only once.\nJobOptions\nNext we can define some job options, it's not necessary though\n$option = New-ScheduledJobOption &ndash;RequireNetwork -StartIfOnBattery -ContinueIfGoingOnBattery \n&nbsp;\nUsing the New-ScheduledJobOption cmdlet we can specify all kinds of different options, you might already know them from Task Scheduler.\nScriptblock\nNow that we have a trigger and some options we need to define a scriptblock that is going to be executed by our scheduled job.\n$sb={ \n param([System.IO.FileInfo]$path,[string]$string) \n Add-Content -Path $path -Value $string -Force \n} \n&nbsp;\nThis, obviously, is just a simple example. It will simply append a string to a file, should be enough to demo what I mean though.\nCredential\nLast thing we need to specify is the account that should be used to run the task.\n$cred = Get-Credential\n\nThis will create a variable containing the credential you type in. We will pass this to the &ndash;Credential parameter of the next step.\nRegisterScheduledJob\nWe have defined everything we need so we can go ahead and register the job.\nRegister-ScheduledJob -Name \"test\" -Trigger $trigger -Credential $cred -ScheduledJobOption $options -ScriptBlock $sb -ArgumentList (\"c:\\temp\\test.txt\",\"abcde\") \n&nbsp;\nThis creates a scheduled task at \\Microsoft\\Windows\\PowerShell\\ScheduledJobs, it can be viewed using Task Scheduler or using the Get-ScheduledJob cmdlet.\nIf you want to specify a script file instead of a scriptblock, simply change the &ndash;ScriptBlock param and use &ndash;FilePath.\nUnregisterScheduledJob\nThe job can be deleted in Task Scheduler or by using the Unregister-ScheduledJob cmdlet.\n&nbsp;\n&nbsp;\nI hope you will find this feature as exciting as I do, I'll provide you with the code snipped so you can easily use 'crtl+j' to create a task the next time. Just copy the ps1xml file to your Documents\\WindowsPowerShell\\Snippets folder and enjoy. J\nScheduled Job.snippets.ps1xml (1.35 kb)&nbsp;\n&nbsp;\nSo long, have a nice weekend!\ntom\n&nbsp;"
        },
        {
          "id": "post-exchange-2010-attachments",
          "title": "Exchange 2010, Outlook doesn’t show attachments",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-attachments/",
          "content": "Last Week I had into the problem that Outlook 2010 didn’t show some attachments. After a research on technet I found out that this attachment was a not referenced inline-attachment.\nTo fix this behavior and make Outlook showing the attachment you have to do the following:\n- Stop the Exchange Transport service.    - Locate the EdgeTransport.exe.config file. This file is located in the following path:     C:\\Program Files\\Microsoft\\Exchange Server\\Bin\\ \nIn the EdgeTransport.exe.config file, add the following entry between the \n&lt;appSettings&gt; element and the &lt;/appSettings&gt; element: \n&lt;add key=&quot;TreatInlineDispositionAsAttachment&quot; value=&quot;true&quot; /&gt; \n- Start the Transport service\nGreetings    dn"
        },
        {
          "id": "post-gal-photos-reloaded-batch-import",
          "title": "GAL Photos reloaded–batch import",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/gal-photos-reloaded-batch-import/",
          "content": "About two years ago I&rsquo;ve posted an article about Exchange 2010 and GAL Photos. Now this is not great news anymore, there are two great articles on the Exchange Team Blog, that explain how to configure this, too. Find them here: aka.ms/galphotosand aka.ms/galphotosfaq\nKey points are the the minor schema change and the maximum file size of 10KB. Images can be max. 96x96 pixels in size.\nNow in the last couple of days I wrote a &ldquo;cmdlet&rdquo; to make batch importing images easier. For starters, the cmdlet gets all *.jpg files in folder, then it uses the files BaseName to find corresponding Exchange Mailboxes. After that the image&rsquo;s physical dimensions as well as file size are verified, if they are ok, the image is imported using Import-RecipientDataProperty.\nThe folder containing the images can be set using the cmdlet&rsquo;s &ndash;FilePath parameter, the cmdlet takes pipeline input from Get-ChildItem too.\nHere are two examples of how the cmdlet could be used:\nPS C:\\&gt; Import-GalPhoto -FilePath 'c:\\temp\\pics' &nbsp; PS C:\\&gt; dir 'c:\\temp\\pics' | Select-Object -First 2 | Import-GalPhoto\nI&rsquo;ve pasted the function to PoshCode, here it goes:\n\n\n\nenjoy, tom"
        },
        {
          "id": "post-server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten",
          "title": "Server 2008 R2, Disk Management und DiskPart lässt sich nicht starten",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2008-R2",
          "url": "/post/server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten/",
          "content": "Mit Windows Server 2008 R2 kommt es manchmal vor, dass ich Volumes nicht extenden konnte und der Wizard folgenden Fehler anzeigt: “Unable to connect to Virtual Disk Service”\n&#160;\n \nMit Diskpart sieht das dann so aus: “Diskpart encountered an error starting the COM service”&#160;\n \nIm EventLog ist folgender Fehler zu finden:\nUnable to start a DCOM Server: {9C38ED61-D565-4728-AEEE-C80952F0ECDE}. The error:        &quot;1260&quot;         Happened while starting this command:         C:\\Windows\\System32\\vdsldr.exe –Embedding\nWorkaround\nHierzu habe ich einen kleinen Workaround um die Disk schnell zu extenden: CMD öffnen und folgendes Kommando starten: C:\\Windows\\System32\\vdsldr.exe –Embedding \nNun funktioniert Diskpart und die Disk kann extended werden. \nGrüße    dn"
        },
        {
          "id": "post-my-powershell-profile",
          "title": "My PowerShell Profile",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/my-powershell-profile/",
          "content": "Today I am going to walk you through my PowerShell Profile and try to explain the basics of what a Profile is and how it can be used.\n\nSo what is a Profile, and where is it?\nWell, basically a profile is a PowerShell script file (.ps1) that is stored in a preconfigured location and that gets executed every time PowerShell starts. This script enables you to customize your PowerShell session and predefine settings as you find them useful. There is a built-in variable, $Profile, which stores the location of the script that is executed every time PowerShell starts. \nThe profile file is located in the WindowsPowerShell folder in every users “My Documents” folder. It has to be named Microsoft.PowerShell_profile.ps1.\n\nBy default there is no profile and everything is left to their defaults, to create the profile script you can create the WindowsPowerShell folder and then use notepad to save a file containing some PowerShell commands in that folder. You can also use the New-Item cmdlet to create the folder and an empty file by typing:\nNew-Item –Path $Profile -Type File –Force \nExample profile\nNow that we know what a profile is and where it is located we can go on and take a look at an example profile, it’s actually my profile so if you have any tips for me, feel free to leave a comment.\nI am starting my Profile with setting some variables, some are predefined and some are custom, I use them for the following settings:\n$MaximumHistoryCount is used to set the number of commands that are stored in History. Defaults to 64. Maximum 32767.    $Transcript is used to set the path for Start-Transcript     $env:PSModulePath is an environment variable (‘env:’) and it is used to customize the path where PowerShell will look for modules to import.     $cert is a variable I use to store my CodeSigningCert to sign scripts.\nAfter that I use Get-Host to figure out which version of PowerShell is running in the current session, if version 3 is detected, I set some DefaultParameterValues using $PSDefaultParameterValues. After that I check if the current session was started with “Run as administrator” if it was, the Update-Help cmdlet is run.\nSince I am writing a module I have a short function to just make my life a little easier, it signs the module file using Set-AuthenticodeSignature and then copies the file to some network share for my coworkers.\nAt the end I am creating a new PSDrive of the FileSystem PS provider, after creating the drive the current location is set to that drive. This is my working directory, it contains all the scripts and test files I need.\nI pasted the file to http://poshcode.org, I really like their “embed code” feature.\n\n&#160;\nNow again, this is my profile, I use it to simply show what can be done, since I am still a beginner I appreciate ideas and tips from anyone!\ntom"
        },
        {
          "id": "post-vbnet-powershell-script-starten",
          "title": "VB.Net PowerShell Script starten",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/vbnet-powershell-script-starten/",
          "content": "Vor einigen Tage habe ich versucht ein PowerShell Script über ein VB.Net Programm zu starten.    Hat mich ein wenig Zeit gekostet :)\nAnbei der Code:\nPublic Function RunCreatePasswordPowerShell(ByVal script As String) As Integer    &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim execProcess As New System.Diagnostics.Process     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim psScriptTextArg = &quot;-Command &quot;&quot;&amp; &quot; + script + &quot; &quot; + &quot;'&quot; + System.Environment.CurrentDirectory + &quot;'&quot; + &quot;&quot;&quot;&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.WorkingDirectory = Environment.SystemDirectory &amp; &quot;\\WindowsPowershell\\v1.0\\&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.FileName = &quot;powershell.exe&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.Arguments = psScriptTextArg     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.UseShellExecute = True     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Return execProcess.Start     &#160;&#160;&#160; End Function\nErklärung:\nDie Funktion RunCreatePasswordPowerShell wird mit einer String Variable als Argument aufgerufen (script). Diese String Variable beinhaltet den Pfad zu unserem PowerShell Script.    In meinen speziellen Fall geben ich beim zusammenstellen der Argumente noch die den aktuellen Pfad mit. \nEventuell noch interessant: Dieses PowerShell Script welches ich hier aufrufe erstellt verschlüsselte PasswordFiles, welche dann über die PowerShell weiter verwendet werden können. Anbei der Code dazu:\nparam(    &#160;&#160;&#160; [parameter(Mandatory = $true)]     &#160;&#160;&#160; [string]$CurrentDirectory     )     $PasswdFilename = read-host &quot;Filename&quot;     $Passwd = read-host &quot;Password&quot; -assecurestring | convertfrom-securestring     $PasswdPathFile = $CurrentDirectory + $PasswdFilename + &quot;-Pass.txt&quot;     $Passwd | Out-File $PasswdPathFile\nGrüße    dn"
        },
        {
          "id": "post-nps-migration-von-server-2003-nach-2008-r2",
          "title": "NPS Migration von Server 2003 nach 2008 R2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2008-R2",
          "url": "/post/nps-migration-von-server-2003-nach-2008-r2/",
          "content": "Den IAS Server von Server 2003 zu Server 2008 R2 zu migrieren ist eine sehr einfache Migration:\nZunächst muss das Migrationstool iasmigreader auf den Windows Server 2003 kopiert werden.\nDas Migrationstool befindet sich entweder auf der Server 2008 R2 CD unter D:\\sources\\dlmanifests\\microsoft-windows-iasserver-migplugin oder auf dem Server 2008 R2 unter C:\\Windows\\SysWow64\nÜber die Kommandozeile wird das Tool aufgerufen um auf dem 2003 Server die Konfiguration in das vordefinierte Textfile ias.txt zu exportieren.\nACHTUNG: Beim Import von 32BIT zu 64BIT Systemen muss folgendes vorher gemacht werden. Sonst gibt es Probleme mit der PEAP Authentifizierungsmethode:\nImport File öffnen den Wert 0 in SystemInfo auf 0000000009 ändern:\n \n \n\nNun kann das File auf dem 2008 Server importiert werden:    Netsh nps import filename=&quot;paht\\ias.txt&quot;\nGrüße    dn"
        },
        {
          "id": "post-automatic-ios-configuration-backup",
          "title": "Automatic IOS configuration backup",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Network",
          "url": "/post/automatic-ios-configuration-backup/",
          "content": "If you are like me you frequently forget to backup router and switch configurations before making changes. Ok, maybe not so frequently but it happens… There are some ways to prevent this from happening, we can make manual backups or use the automatic archiving feature which is built into IOS.\nManual backup\nA manual backup can always be taken using the ‘copy startup-config' command, typing a question mark ‘?’ after that command lists possible backup destinations:\nRT#copy startup-config ?      &#160; archive:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to archive: file system       &#160; flash:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to flash: file system       &#160; ftp:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to ftp: file system       &#160; http:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to http: file system\nSo to backup a routers current startup-config to a FTP server you would simply type something like this:\nRT#copy startup-config ftp://user:pass@10.10.10.1\nThe username and password can also be configured so that you don’t need to type them in every time you are performing a backup.\nRT(config)#ip ftp username tom      RT(config)#ip ftp password secret\nOk, that’s better but since the backup still has to be started manually chances are that one could forget it…\nAutomatic archive\nThe archive feature allows for automatic configuration backup that is triggered by a timer and the ‘write memory’ command. The following example configures the archive feature on router RT to create a backup once every 24 hours and additionally every time someone enters the ‘write-memory’ command, that is, every time someone makes a configuration change and decides to save that change:\nRT(config)#archive      path ftp://10.10.10.1/History/rt-config-       write-memory       time-period 1440\nThe time-period keyword simply configures how often a scheduled backup runs, if the write-memory command is configured a configuration backup is performed every time someone saves the config. The ‘show archive’ command displays the 10 latest configuration files:\nRT#show archive      The maximum archive configurations allowed is 10.       The next archive file will be named ftp://10.10.10.1/History/rt-config--&lt;timestamp&gt;-50       Archive #&#160; Name       &#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-51-57.153-47       &#160;&#160; 2&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48       &#160;&#160; 3&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-53-57.337-49\nObviously other backup destinations such as tftp or flash can be configured. IOS does not take care of the removal of old files, so even though only the 10 latest configuration versions are shown in the ‘show archive’ output, there might be more on the server.\nRestoring configuration\nIf a configuration change needs to be rolled back the ‘configure replace’ command can be used. So if a configuration change had unintended consequences the ‘configure replace ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48’ command could be used to restore the current running-config from a backup.\n&#160;\ntom"
        },
        {
          "id": "post-steve-ballmer-on-exciting-times-office-2013",
          "title": "Steve Ballmer on Exciting Times–Office 2013",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server",
          "url": "/post/steve-ballmer-on-exciting-times-office-2013/",
          "content": "Update: Beta versions of all Server Products are now available, check out the link on the bottom. Added a link to the webcast.\nMicrosoft hold a live webcast today where they kicked off the new Office 15 wave.\nBallmer gave a quick overview of the latest announcements, including Surface, Windows Phones 8, Windows 8 and some Server products, before he gets going with the introduction of Office 2013.\nHe calls the new version of Microsoft Office the “most ambitious release of office” ever. It’s was designed for cloud and touch enabled devices, a full featured version of Office 15 will also be available on ARM devices.\n\nView the recorded webcast: http://www.microsoft.com/en-us/news/presskits/office/liveevent.aspx\nBallmer talked about Microsoft’s recent acquisitions, namely Yammer and PPI. Yammer provides integration to all kind of social media for Office 15 client and Server products. PPI build huge, high definition displays which could be great for meetings and collaboration.\nOne of the most important points Ballmer makes is the ability of ink and touch support in every application, so that one can take digital annotations through the new generation of hardware. It seems like a big effort to finally move away from pen and paper.\n\nAfter that, Ballmer introduced Kirk Koenigsberger for some live demo of the product. Kirk is very excited too and shows some sneak peaks of what is to come with a focus on consumer usage. Office 15 is heavily integrated into Skydrive and stores all content in the cloud by default, if you install the Office preview you will soon notice that you can sign-in with you Windows Live ID directly into Office.\nOffice 15 features integration with social networking, multimedia, Skype and Lync offer presence information for the People Card (kind of an evolution from that thing we know from Outlook 2010).\nReally neat is the “last location” feature, where a toast notification brings you back to the section of the document that you have been editing when you left one device and switched to another.\n\nSharePoint 2013 comes with fully featured enterprise social networking, with mentions, #hashtags and like buttons all packed into a sleek, new design. A Newsfeed will provide the user with “Facebook” style updates from co-workers and friends, again using Yammer to aggregate news from different sources into one feed. Office documents and multimedia content can be previewed directly from the new timeline, the People Card quickly shows all contact information and presence status of the team members.\nTry it now\nThe next generation of Office can be downloaded from Office.com.\nServer Products\nWhat is at least as exciting as the new version of Office client products is that the Server products are already listed on the website. Can’t wait to get my hands dirty on that stuff… \n\nhttp://www.microsoft.com/office/preview/en/try-more-products\nso that’s it for now,    tom"
        },
        {
          "id": "post-why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too",
          "title": "Why am I learning PowerShell? And why do I think you should give it a try, too?",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too/",
          "content": "To be frank, I am kind of a beginner when it comes to PowerShell or scripting in general, I was working for really small businesses for some time and I didn’t really bother scripting. There were simply not too many repeating tasks and so I went and did most everything manually.\nSo obviously things have changed, for starters I’m not working for said small businesses any more. There are now a lot of tasks that would take hours to be completed manually. And there is this shiny, new toy out there, called Windows PowerShell. Ok, it’s not really new, but a lot of people still stick to there old tools as they knew how they worked for years, so why change something that got the job done in the past? Well, here are my key points:\nAutomation prevents errors\nThis is the most important point for me, think about some task where you have to repeat a configuration change for like 8 times. It’s not that scripting or automating is that much faster than making the change manually, that would be the case if it were 100 times or more, but 8, come on. The one key thing is, that by using automation the configuration is exactly the same every single time you have to do it. Sure, you have to spend a little more time in planning your steps (instead of just clicking your way through), you have to write a few lines of script, or just chain together some commands. Once your little tool is complete and tested, you can use it over and over again, it will produce the same result every time you run it. So we are getting to my second point.\nCreate reusable tools\nPowerShell enables you to create reusable tools very easily, if you are typing some commands into the command line interface, the exactly same commands can be saved to a ps1 file and executed by a co-worker, a scheduled task or... you get the point. The first point still applies here, if you create a tool and share it with your colleagues or co-workers not only are you simplifying certain tasks, you are again eliminating a common source of error.\nDocumentation\nThe transcript feature simply writes anything you type and all output of the current command line window to a file, this file can easily be used to document configuration changes.\nResources\nSo where do I start? First of all, remember one key command: Get-Help. It’s simple, it comes with PowerShell and the help content is very, very well written! Try this: ‘Get-Command | Get-Random | Get-Help –Full’\nA good place to start is the Windows PowerShell Survival Guide on the TechNet Wiki.\nThere are some good books on the topic available, I’m looking forward to PowerShell in Depth by three of the most well-known PowerShell gurus: Don Jones, Richard Siddaway, and Jeffery Hicks.\n&#160;\nHave fun!   tom"
        },
        {
          "id": "post-activesync-organization-settings-mobile-device-management",
          "title": "ActiveSync Organization Settings–Mobile Device Management",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/activesync-organization-settings-mobile-device-management/",
          "content": "The growing number of mobile devices requires some sort of mobile device management policy to be in place. Now there are different approaches to enforce such a policy, there are some software vendors offering more or less sophisticated tools and there is Exchange 2010 which comes with basic device management capabilities built-in.\nIf a mobile device connects to an Exchange Server the following sequence evaluates the access state of the device (from TechNet: http://technet.microsoft.com/en-us/library/ff959225.aspx)\n   Is the mobile device authenticated?&#160;&#160; If not, challenge the mobile device for the correct credentials. Otherwise, go on to the next step.     Is Exchange ActiveSync enabled for the current user?&#160;&#160; If not, return an &quot;access restricted&quot; error to the device. Otherwise, go on to the next step.     Are the mobile policy enforcement criteria met by the current mobile device?&#160;&#160; If not, block access. Otherwise, go on to the next step.     Is this mobile device blocked by a personal exemption for the user?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device allowed by a personal exemption for the user?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Is this mobile device blocked by a device access rule?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device quarantined by a device access rule?&#160;&#160; If so, quarantine the device. Otherwise, go on to the next step.     Is this mobile device allowed by a device access rule?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Apply the default access state per the Exchange ActiveSync organizational settings.&#160;&#160; This grants access, blocks access, or quarantines the current device, depending on the organizational settings.  \n\nDefault Access State\nThe last step in the above list determines the ‘default access level’ organizational setting. This setting defaults to ‘Allow’ so if no other device access rules are configured, all ActiveSync devices (which meet enforcement criteria) are allowed. That means, any user with an ActiveSync enabled mailbox (another default) is able to connect up to 10 devices using ActiveSync.\nTo change this behavior the ‘default access level’ setting can be modified using the ‘Set-ActiveSyncOrganizationSettings’ cmdlet. Other than ‘Allow’ this can be set to ‘Quarantine’ or ‘Block’. \nQuarantine: Enables devices to connect to the Server but grants only limited access to the device. Users will be able to add content to their calendar, tasks and notes folders, however no content can be retrieved from the server. The user will receive an email stating that the mobile device has been quarantined, that email can be retrieved by the mobile device and will be available in the users mailbox through Outlook and OWA. If a device is quarantined an administrative email address is notified too, so that they can decide to allow or block the device.\n\nAn admin (or any user with the required privileges) who receives the notification can use the Exchange Control Panel to allow or block the device:\n\nDevices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.\nBlock: Simply blocks all new or unknown devices. Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.\nIf users are already using ActiveSync to access their mailboxes the Exchange Management Shell can be used to add the DeviceID of currently used ActiveSync devices to the ActiveSyncAllowedDeviceIDs property.\n\nSet-ActiveSyncOrganizationSettings \nThe following command sets the recipient of the admin notification to support@ntsystems.local. Every time a device is quarantined that email address is notified.\nSet-ActiveSyncOrganizationSettings –AdminMailRecipients support@ntsystems.local\nThe following command sets the ‘default access state’ to quarantine.\nSet-ActiveSyncOrganizationSettings –DefaultAccessLevel Quarantine\nNeed to scale? Try Device Access Rules!\nManual approval might not work for environments with many users or when users change their mobile devices frequently. Device Access Rules can be used to allow or block devices based on Family or Model so that users can connect approved device types without the need to be manually allowed by an admin:\n\nUsing Device Access Rules allows for some amount of scalability, even though it’s not perfect – it comes with Exchange.\n&#160;\nso long,    tom"
        },
        {
          "id": "post-passing-an-array-to-a-scriptblock",
          "title": "Passing an array to a {scriptblock}",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/passing-an-array-to-a-scriptblock/",
          "content": "Some Friday PowerShell fun today.\nI created a PowerShell script the other day where I was passing a variable to a scriptblock. As long as the variable was a simple string everything was just fine, but when the variable was of the type System.Array only the first item would have been passed to the scriptblock.\n[more]\nExample 1 shows what I mean.\n\n$myArray = \"a\",\"b\",\"c\"\n$myBlock = { param($p1) write $p1 }\nInvoke-Command -ScriptBlock $myBlock -ArgumentList $myArray\n\nThis example would produce an output of &ldquo;a&rdquo; even though I assumed it would output &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.\nSo I was scratching my head for a while and then tried to do it that way:\n\n\n$myArray = \"a\",\"b\",\"c\"\n$myBlock = { param($p1) write $p1 }\nInvoke-Command -ScriptBlock $myBlock &ndash;ArgumentList (,$myArray)\n\n\nThis one works as expected, so it produces an output of &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.\n&nbsp;\nhave a nice weekend!\ntom\n&nbsp;\n&nbsp;"
        },
        {
          "id": "post-we-are-still-out-there-somewhere",
          "title": "We are still out there, somewhere…",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/we-are-still-out-there-somewhere/",
          "content": "It has been a while since our last post, but then we are both really busy getting our work done and studying for some certification and other stuff. I’d like to promise that we will publish cool stuff on a more regular basis, not sure if we can keep it though. What I DO promise is that I am going to try!\n&quot;One must have a good memory to be able to keep the promises that one makes&quot; - F. Nietzsche\nSo, having that said, what was going on that we have not been blogging about:\nWindows 8 and Windows Server 2012 Release Previews are out!\nGo, give it a try. And check out all the cool content over at Windows Server Blog and Building Windows 8. Really.\nWindows Phone 8 has been announced.\nI’m personally looking forward to that, I came to love my Windows Phone 7 and I think this is going to be even better. Read more on the Windows Phone Blog.\n        Device encryption: To help keep everything from documents to passwords safe, Windows Phone 8 includes built-in technology to encrypt the entire device, including the operating system and data files.       Better security: Windows Phone 8 supports the United Extensible Firmware Interface (UEFI) secure boot protocol and features improved app “sandboxing,” so the phone is better protected from malware with multiple layers of security.       Remote management: With Windows Phone 8, IT departments can manage apps and phones remotely, with tools similar to ones they now employ for Windows PCs.       Company Hub and apps: Companies can create their own Windows Phone 8 Hub for custom employee apps and other critical business info.    \nMicrosoft Surface has been announced.\nHm, looks nice… but we will see.\nGet more (well, not too much more) at surface.com\nMoving away from MD5 and keys under 1024 bits.\nSome efforts are made to put more trust into the struggling SSL Certificate business and I guess it also gives us more security. Personally I think that education is the key point when it comes to “trust” and SSL and IT security in general. People should really be aware of what it means to just ignore Certificate warnings… \n\nIts up to us IT Pros to make (our) internal servers trustworthy and sort of train users to rely on SSL and watch out for it.\nLets get back to MD5. So, recently there has been a some media coverage of the so called “Flame” malware which used phony certificates to make a man-in-the-middle attack against Windows Update possible. Whoever created the malware used a flaw in Microsoft's Terminal Server Licensing certificate infrastructure to create a code signing certificate that chained up to Microsoft's Root CA. In essence this was possible because of the TS Licensing certs using MD5 hashes which are prone to collision attacks.\nMore information about Flame on: NakedSecurity; Remote Desktop Services Blog; Security Research &amp; Defense; the Security Advisory can be found here.\nSome days after that I (and other customers) received an email from RapidSSL stating that MD5 is to be abandoned by June 1, that is all (RapidSSL) certificates that have been using the MD5 hashing scheme have been revoked. They did also revoke any certificate using a key size under 1024 bits.\nMicrosoft is also going to release an update that blocks certificates with keys less than 1024 bits. More information on this on the Windows PKI Blog.\nExchange 15 rumors\nExchange 2010 has been available for little more than two years when Microsoft kicked off the “Office 15” technical preview (for few, select people) back in January 2012. Not much information has been published since then, although a beta is expected for “late summer”. Since the Exchange Conference happens to take place by the end of September I suppose we all will know more by then.\n&#160;\nThat’s it for now. Have a nice weekend!\ntom"
        },
        {
          "id": "post-wireless-sniffing-mit-netmon-34",
          "title": "Wireless Sniffing mit NetMon 3.4",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Network",
          "url": "/post/wireless-sniffing-mit-netmon-34/",
          "content": "Damit mit Wireshark unter Windows Wlan Traffic analysiert werden kann benötigt man einen speziellen Adapter (AirPcap), der auch im Promiscuous Mode (oder Monitor Mode) betrieben werden kann.\nMit Microsoft Network Monitor 3.4 und Windows 7 kann man jetzt auch “normale” Adapter im Monitor Mode betreiben um Wireless Frames zu sniffen.\nNetMon\nDazu die entsprechende Version von NetMon herunterladen (x86 oder x64) und installieren.\nNetMon öffnen und unter “Select Networks” den Wireless Adapter auswählen. Alle anderen Adapter deaktivieren.\n\nDann auf “Properties” klicken und die “Scanning Options” konfigurieren.\n\n\nDer “Monitor Mode” muss aktiviert werden, außerdem kann man den Frequenzbereich sowie den Kanal auswählen. Wählt man keinen Kanal aus, scannt NetMon alle Kanäle.\nMit “Apply” werden die Einstellungen übernommen, das Fenster “Scanning Options” muss man offen lassen, der “Network Interface Configuration” Dialog kann mit “OK” geschlossen werden.\nJetzt kann man auf “New Capture” klicken und mit “Start” einen neuen Trace starten.\nAnalyse\nDie Analyse des Traffics ist mit NetMon etwas ungewohnt, es hilft allerdings sehr wenn man sich von&#160; http://nmparsers.codeplex.com/ die aktuellsten Parser installiert.\n\nAlternativ kann man das Ergebnis aus NetMon als “.cap” Datei speichern und mit Wireshark öffnen.\n\n&#160;\nbtw. das funktioniert genauso mit Windows 8 Beta \n&#160;\nhave fun!\ntom"
        },
        {
          "id": "post-windows-server-8-virtualized-domain-controller",
          "title": "Windows Server 8–Virtualized Domain Controller",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012",
          "url": "/post/windows-server-8-virtualized-domain-controller/",
          "content": "In bisherigen Version von Windows Server und Active Directory hatte das Betreiben von virtuellen DCs einige Nachteile im Vergleich zu anderen virtuellen Servern. So konnten Domain Controller z.B. nicht von der Snapshot F&auml;higkeit des Hypervisors profitieren, das zur&uuml;cksetzen eines DCs auf einen Snapshot hatte fatale Auswirkungen auf die Gesamtstruktur.\nVDC Safe Restore\nIm Active Direcotry Replikationsmodell wird jede Transaktion mit einer fortlaufenden Nummer (Update Sequence Number) versehen. Domain Controller &ldquo;merken&rdquo; sich diese Nummern sowie eine eindeutige ID des Replikationspartners (Invocation ID) von dem sie die jeweilige &Auml;nderung erhalten haben. Wird ein DC auf einen fr&uuml;heren Zeitpunkt zur&uuml;ckgesetzt (Snapshot) k&ouml;nnte er bereits verwendete USNs wiederverwenden, seine Replikationspartner akzeptieren diese Transaktionen nicht mehr, sie haben diese bereits erhalten. Der wiederhergestellte DC kann nicht mehr replizieren und wird in den sogenannten &ldquo;USN Rollback Protection&rdquo; Status gesetzt. Der DC muss jetzt manuell aus dem AD entfernt werden.\nIn Windows Server 8 Active Directory gibt es ein Feature das dieses Problem verhindern soll. &Uuml;ber die ACPI Table stellt der Hypervisor die VM-Generation ID zur Verf&uuml;gung, diese wird im RAM des jeweiligen Domain Controllers gespeichert.\nWird ein Snapshot angewandt, wird diese VM-Generation ID zur&uuml;ckgesetzt, so merkt der Domain Controller dass er wiederhergestellt wurde.\n&nbsp;\nDer wiederhergestellte DC setzt seine Invocation ID zur&uuml;ck und da seine Replikationspartner diese ID noch nicht kennen kann die Replikation wieder aufgenommen werden. Au&szlig;erdem wird der SYSVOL Ordner &ldquo;nicht autorisierend&rdquo; wiederhergestellt und folgendes Ereignis wird im &ldquo;Directory Service&rdquo; Event Log protokolliert.\n\nFolgendes Active Directory Attribut wird f&uuml;r die VM-Generation ID verwendet. Hier geht&rsquo;s zum entsprechenden Eintrag im MSDN.\nms-DS-Generation-Id\n\nVDC Safe Restore muss (und kann) nicht konfiguriert werden, sofern der Hypervisor das VM-Generation ID Feature unterst&uuml;tzt ist es automatisch aktiv. Aktuell unterst&uuml;tzt nur Windows Server 8 Hyper-V dieses Feature, andere Herstellen werden hoffentlich bald nachziehen.\nAchtung, dieses Feature soll die USN Rollback Problematik l&ouml;sen, es ist auf keinem Fall ein Ersatz f&uuml;r ein konsistentes Backup! Der DC wird &ldquo;nicht autorisierend&rdquo; wiederhergestellt.\n&nbsp;\nso long,\ntom"
        },
        {
          "id": "post-exchange-2010-send-on-behalf-for-distribution-groups",
          "title": "Exchange 2010 Send on behalf for distribution Groups",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-send-on-behalf-for-distribution-groups/",
          "content": "Tipp: Damit man die “send on behalf” Berechtigung einem Benutzer für eine Verteilergruppe geben kann, ist ein einfacher Powershell Befehl nötig:\nSet-DistributionGroup GroupName -GrantSendOnBehalfTo UserName\n&#160;\nGrüße\ndn"
        },
        {
          "id": "post-windows-8-to-go",
          "title": "Windows 8 to Go",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, de",
          "url": "/post/windows-8-to-go/",
          "content": "Mit Windows 8 kommt ein neues Feature \"Windows 8 to Go\", welches bereits in der CP verf&uuml;gbar ist. Damit ist es m&ouml;glich die Windows Umgebung per USB-Stick oder anderen Datentr&auml;ger mitzunehmen.\nAls erstes muss der USB Stick bootf&auml;hig gemacht werden. Diese Prozedur ist dieselbe, die Thomas bereits in folgenden Post erkl&auml;rt um Windows 7/8 vom USB Stick zu installieren.\nAnbei nochmal kurz die Befehle:\n- diskpart\n- list disk\n- select disk X (USB Datentr&auml;ger ausw&auml;hlen)\n- create partition primary\n- format fs=ntfs quick\n- active\n&nbsp;\nJetzt muss noch der PC neu gestartet werden und Windows 8 installiert werden. Als Datentr&auml;ger empfiehlt sich hier ein USB 3.0 Speichermedium.\n&nbsp;\nGr&uuml;&szlig;e\ndn"
        },
        {
          "id": "post-forefront-tmg-2010-sp2-nlb-kerberos",
          "title": "Forefront TMG 2010 SP2–NLB Kerberos",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Server, Security",
          "url": "/post/forefront-tmg-2010-sp2-nlb-kerberos/",
          "content": "Seit kurzem ist das Service Pack 2 f&uuml;r den Nachfolger von ISA 2006 verf&uuml;gbar. Neben Bugfixes und verbesserten Fehlerseiten ist vor allem die M&ouml;glichkeit den Firewall Service als Domain User zu starten interessant. Dadurch erh&auml;lt man die M&ouml;glichkeit den SPN f&uuml;r die virtuelle IP Adresse des NLB Custer auf eine Benutzerkonto zu binden, wenn der Firewall Service dann mit diesem Konto gestartet wird, funktioniert Kerberos Authentifizierung auch im NLB.\n&nbsp;\n&nbsp;\nNLB und Kerberos\nF&uuml;r ein erfolgreiche Kerberos Authentifizierung muss der Service Principal Name den der Client verwendet um sich mit dem Server zu verbinden im Active Directory Account des Servers registriert sein. Der SPN muss im gesamten Forest eindeutig sein, d.h. nur ein Account kann den SPN f&uuml;r die NBL IP Adresse verwenden. Verbinden sich Clients mit anderen Knoten im Cluster schl&auml;gt die Kerberos Authentifizierung fehl, da der SPN nicht stimmt.\nBisher konnte der &ldquo;Microsoft Forefront TMG Firewall Service&rdquo; nur als Network Service laufen, d.h. f&uuml;r Kerberos Authentifizierungen wurde das Computerkonto jedes TMG Servers verwendet.\n\nMit Service Pack 2 kann man den Firewall Dienst als Dom&auml;nenbenutzer starten, registriert man auf diesen Dom&auml;nenbenutzer die ben&ouml;tigten SPNs funktioniert die Kerberos Authentifizierung im Clusterbetrieb.\nService Account Sicherheit\nAus Sicherheitsgr&uuml;nden sollte man ein eigenes Benutzerkonto f&uuml;r den TMG Service anlegen, dieses Benutzerkonto sollte ausschlie&szlig;lich f&uuml;r TMG verwendet werden und keine weiteren Berechtigungen in der Domain haben. Au&szlig;erdem sollte man das Konto aus der Gruppe &ldquo;Domain Users&rdquo; entfernen, und eine andere Gruppe als prim&auml;re Gruppe definieren. Auch dieses Gruppe sollte kein Berechtigungen in der Domain oder auf einem anderen System haben.\nForefront TMG erteilt dem Benutzerkonto automatisch die minimal ben&ouml;tigten Berechtigungen wenn man den Firewall Service f&uuml;r dieses Konto konfiguriert. Auch auf dem TMG ist somit keine Konfiguration von Berechtigungen f&uuml;r das Service Account notwendig.\nKonfiguration\nNach der Installation von Service Pack 2 kann man in den Eigenschaften des Arrays, im Reiter &ldquo;Credentials&rdquo; das Konto ausw&auml;hlen unter dem der Firewall Service in Zukunft laufen soll.\n\nSPN hinzuf&uuml;gen\nUm einen Serivce Principal Name zum Service Account hinzuzuf&uuml;gen, kann man z.B. das Tool &ldquo;setspn&rdquo; verwenden.\nRegistrierte SPNs anzeigen:\nsetspn &ndash;L benutzername&lt;/p&gt;\nsetspn &ndash;L computername&lt;/code&gt;\nNeuen SPN registrieren:\nsetspn -S http/myArray.ntsystems.local tmgSvcUsr\nDer Parameter &ndash;S &uuml;berpr&uuml;ft zuerst ob der SPN nicht bereits von einem anderen Konto verwendet wird, anschlie&szlig;end wird er zum Konto hinzugef&uuml;gt.\nVerify Kerberos Authentication\nMit einem Netzwerk Analyse Tool sieht man dass vor der Registrierung des SPN NTLM f&uuml;r Proxy Authentifizierung verwendet wird.\n\nWurde der Firewall Service als Domain User gestartet und der ben&ouml;tigte SPN registriert, wird Kerberos verwendet.\n\nDer Client verwendet jetzt GSS-API, also Kerberos, um sich zu authentifizieren. Mit &ldquo;klist&rdquo; kann man sehen dass der Client jetzt ein Ticket f&uuml;r den Array Namen hat.\n\nAchtung: Es m&uuml;ssen alle Mitglieder im Array aktualisiert werden, bevor der Firewall Service als Domain User gestartet werden kann. Au&szlig;erdem sollte man den SPN erst dann hinzuf&uuml;gen, wenn der Firewall Service als Domain User l&auml;uft da es sonst zu Authentifizierungsproblemen kommt.\n&nbsp;\nWeitere Informationen zu &ldquo;Kerberos authentication on an NLB array&rdquo; im TechNet: http://technet.microsoft.com/en-us/library/hh454304.aspx\nUm Forefront TMG SP2 installieren zu k&ouml;nnen muss Forefront TMG SP1 Update 1 installiert sein, Download: http://www.microsoft.com/download/en/details.aspx?id=11445\n&nbsp;\nso long, tom"
        },
        {
          "id": "post-windows-server-8-cp-dhcp-server-failover",
          "title": "Windows Server 8 CP–DHCP Server Failover",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2012",
          "url": "/post/windows-server-8-cp-dhcp-server-failover/",
          "content": "In Windows Server Versionen bis 2008R2 gab es f&uuml;r eine ausfallsichere DHCP Umgebung zwei M&ouml;glichkeiten, ein sogenanntes Split Scope Deployment oder ein Windows Failover Cluster. Beide Varianten haben Nachteile, im Split Scope Deployment teilen sich mehrere DHCP Server einen Bereich. F&auml;llt ein Server aus, gibt es auf den verbleibenden Servern unter Umst&auml;nden nicht genug freie Adressen, auch Leases bzw. Reservierungen sind nicht konsistent. Ein Failover Cluster hat einen gewissen administrativen Aufwand (Shared Storage) und erfordert Windows Server Enterprise Lizenzen f&uuml;r alle Knoten im Cluster.\nWindows Server 8 DHCP Server Failover\nDHCP Server Failover bietet die M&ouml;glichkeit zwei DHCP Server f&uuml;r einen Bereich zu konfigurieren. Es muss sich dabei um Windows 8 DHCP Server handeln, andere Hersteller oder &auml;ltere Server Betriebssysteme werden nicht unterst&uuml;tzt. Im Load Sharing Modus bedienen beide Server Client Anfragen und replizieren die Lease Informationen. F&auml;llt ein Server aus kann der zweite Server bereits bestehende Leases verl&auml;ngern. Au&szlig;erdem verf&uuml;gen beide Server &uuml;ber den gesamten Bereich, Reservierungen und Optionen werden ebenfalls zwischen den Servern repliziert und sind so konsistent.\nLoad Sharing Mode\nIm Standard Modus wird ein Failover Relationship im Load Sharing betrieben, das bedeuted Clientanfragen werden gleichm&auml;&szlig;ig auf die beiden DHCP Server verteilt. Die Verteilung der Anfragen kann &uuml;ber den Wert load-balancing ratio konfiguriert werden. Der Load Sharing Mode eignet sich f&uuml;r Server im selben Standort.\nHot Standby Mode\nAlternativ k&ouml;nnen die DHCP Server im Hot Standby Mode betrieben werden, dabei ist ein Server &ldquo;aktiv&rdquo; und bedient Clientanfragen. Der zweite Server &uuml;bernimmt diese Aufgabe sobald er erste nicht mehr verf&uuml;gbar ist. Die Entscheidung ob ein Server &ldquo;aktiv&rdquo; oder &ldquo;standby&rdquo; ist, kann f&uuml;r jeden DHCP Bereich getroffen werden, ein Server kann also standby f&uuml;r einen Bereich sein und gleichzeitig aktiv f&uuml;r einen andern. Der Hot Standby Mode eignet sich f&uuml;r Au&szlig;enstellen oder kleinere Standorte an denen kein zweiter Server vor Ort ist und ein Server im entfernten Rechenzentrum nur im Problemfall &uuml;bernehmen soll.\nDHCP Rolle installieren\nDie DHCP Server Rolle wird &uuml;ber den Server Manager hinzugef&uuml;gt, dazu verwendet man den Add Roles and Features Wizard.\n\nDie entsprechende Rolle ausw&auml;hlen, und entscheiden ob der Server automatisch neustarten soll, das ist f&uuml;r DHCP nicht notwendig.\n\nNach der Installation wei&szlig;t der Post-Install configuration Wizard darauf hin, dass man den Server noch im Active Directory autorisieren muss.\n\nNat&uuml;rlich kann man die Rolle auch mit der PowerShell hinzuf&uuml;gen, verwendet wird dazu das Modul ServerManager (PowerShell v3 importiert Module automatisch, also kein Import-Module):\n\nAuch nach dieser Insatllation wei&szlig;t der ServerManager auf notwendige Post-Install Schritte hin\n\nEs sind jetzt zwei DHCP Server verf&uuml;gbar, nun geht es an die Failover Konfiguration.\nDHCP Server Failover Konfiguration\n&Uuml;ber einen Rechtsklick auf einen DHCP Server im Server Manager &ouml;ffnet man die bekannte dhcpmgmt Konsole (doch nicht &uuml;berall Metro).\nEin neuer Bereich wird, wie immer, mit einem Rechtsklick auf den IPv4 Knoten erstellt. Dabei hat sich mit WS8 nichts ge&auml;ndert, man w&auml;hlt einen Namen, das Subnet bzw. den IP Range sowie Optionen wie Gateway und DNS Server.\n\nJetzt kann man entscheiden ob man DHCP Failover f&uuml;r den gesamten Server oder f&uuml;r jeden einzelnen Bereich konfigurieren will. Je nach dem f&uuml;r welche Konfiguration man sich entscheidet, beginnt man mit der Konfiguration auf dem IPv4 Knoten oder auf dem jeweiligen Bereich.\n\nMit &ldquo;Configure Failover&rdquo; wird die Konfiguration gestartet, als ersten Schritt muss man den Partner-Server angeben.\n\nNach der Auswahl des Partner-Servers werden einige Voraussetzungen f&uuml;r eine erfolgreiche Failover Beziehung &uuml;berpr&uuml;ft, unter anderem wird &uuml;berpr&uuml;ft ob der Server erreichbar ist, ob mindestens Windows Server 8 Beta installiert ist, ob der angemeldete Benutzer &uuml;ber ausreichende Rechte verf&uuml;gt (Mitglied der Gruppe DHCP Administrators) und ob auf dem Partner &uuml;berhaupt ein DHCP Server l&auml;uft. Sind die Vorrausetzungen ok, wird ein Dialog f&uuml;r die Konfiguration des Failover Relationships angezeigt.\n\nIn diesem Dialog wird der Failover Mode konfiguriert. Au&szlig;erdem kann die Load Sharing ratio hier festgelegt werden. Maximum Client Lead Time gibt die tempor&auml;re Lease Zeit f&uuml;r neue Clients an, deren Anfragen der Failover Server bedient. Auch die Zeit nach der ein Server im Partner-Down-State den gesamten Bereich &uuml;bernimmt wird durch die MCLT gesetzt.\n\nWird der Hot Standby Mode gew&auml;hlt, kann anstelle der Load Sharing ratio die Menge an Adressen Konfiguriert werden, welche f&uuml;r den Standby Server reserviert werden. Sollten keine Adressen reserviert werden, kann der Standby Server erst dann neue Clients bedienen, wenn er den gesamten Bereich &uuml;bernommen hat, das dauert standardm&auml;&szlig;ig eine Stunde (MCTLT).\nDas Auto State Switchover interval gibt an nach welcher Zeit ein Server vom communication interrupted in den partner down state wechselt. Standardm&auml;&szlig;ig passiert das nach 10 Minuten.\n\nHat man die Optionen konfiguriert wird die Partnerschaft konfiguriert. F&uuml;r die Failover Konfiguration wird TCP Port 647 verwendet.\nIn den Eigenschaften des Bereiches gibt es den neuen Reiter Failover, dort kann man den Status der Failover Partnerschaft und die konfigurierten Optionen sehen.\n\nKonfiguration &auml;ndern oder l&ouml;schen\nUm die Konfiguration zu &auml;ndern, &ouml;ffnet man die Eigenschaften des IPv4 Konten und w&auml;hlt dort unter Failover die entsprechende Partnerschaft aus.\n\nMit Edit kann man die ausgew&auml;hlte Partnerschaft &auml;ndern, mit delete wird diese gel&ouml;scht.\n\nVerify Failover\nMit einem Netzwerk Analyse Tool sieht man die DHCP Kommunikation, hier ist zu beobachten dass der Client zwei DHCP Offers bekommt. Eine von jedem Server in der Failover Konfiguration.\n\nBeide DHCP Offers sind bis auf die angebotene Lease Time identisch, der &ldquo;aktive&rdquo; Server bietet eine Adresse mit der im Bereich konfigurierten Lease Time an (8 Tage).\n\nW&auml;hrend die Lease Time im Offer des &ldquo;standby&rdquo; Servers der Maximum Client Lead Time entspricht.\n\n&nbsp;\nso long, tom"
        },
        {
          "id": "post-wireshark-und-windows-8",
          "title": "Wireshark und Windows 8",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, de, Server-2012",
          "url": "/post/wireshark-und-windows-8/",
          "content": "Eines der ersten Tools das auf meinen Ger&auml;ten installiert wird ist das Analysetool Wireshark.\nNach der Installation auf Windows 8 konnte ich keine neuen Captures starten, es war kein Interface verf&uuml;gbar.\n\nDas Problem scheint am WinPCAP Treiber zu liegen, die L&ouml;sung war einfach. Ich habe den WinPCAP im &ldquo;Kompatibilit&auml;tsmodus&rdquo; Windows 7 neu installiert.\n\n&nbsp;\nDownload WinPCAP: www.winpcap.org\nhave fun!"
        },
        {
          "id": "post-windows-server-8-cp-ad-administrative-center",
          "title": "Windows Server 8 CP–AD Administrative Center",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2012, Server",
          "url": "/post/windows-server-8-cp-ad-administrative-center/",
          "content": "Mit Windows Server 2008R2 wurde das Active Directory Verwaltungscenter oder Administrative Center eingeführt. Es sollte das seit Windows 2000 bekannte Active Directory Users and Computers Snap-in ersetzen. \nDas Verwaltungscenter in Windows 8 Server Beta kommt im Metro Style daher und ist Teil der ADDS Simplified Administration. Es bietet einige sehr nützliche Funktionen, unter anderem endlich eine grafische Oberfläche für PSO und den AD Papierkorb. Außerdem werden die neuen Dynamischen ACLs über das Verwaltungscenter konfiguriert.\nDa es auf PowerShell aufsetzt, ist ein PowerShell History Viewer integriert.\nMetro Style\nGeöffnet wird das Administrative Center über “Tools” im Server Manager oder man führt “dsac.exe” aus.\n\n“Reset Password” und “Global Search” sind schon aus dem ADAC von 2008R2 bekannt, neu ist die PowerShell History im unteren Bereich. Öffnet man diesen sieht man die PowerShell Befehle welche das ADAC zuletzt ausgeführte. \nActive Directory Recycle Bin\nAuch der AD Papierkorb wurde mit Windows Server 2008R2 eingeführt, die Verwendung war zwar etwas kompliziert (keine grafische Oberfläche), trotzdem war es eine nützliche Erweiterung. Mit Windows Server 8 gibt es ein GUI um gelöschte Objekte einfach zu finden und wiederherzustellen.\nSollte der AD Recycle Bin noch nicht aktiv sein, kann man ihn im ADAC gleich aktivieren. Dafür muss sich der Forest im “Windows Server 2008R2” Functional Level befinden.\n\nEinfach auf “Enable Recycle Bin…” klicken und den Dialog bestätigen, schon ist der Recycle Bin aktiv. Natürlich muss die Änderung auf alle DCs repliziert werden, erst wenn dieser Vorgang abgeschlossen ist funktioniert er zuverlässig.\nIm der PowerShell Histroy sieht man sofort welcher Befehl ausgeführt wurde: \nEnable-ADOptionalFeature -Confirm:$false -Identity:&quot;766ddcd8-acd0-445e-f3b9-a7f9b6744f2a&quot; -Scope:&quot;ForestOrConfigurationSet&quot; -Target:&quot;tomt.local&quot;\nLöscht man jetzt ein Objetk aus dem AD wird es in den neu erstellten Container “Deleted Objects” verschoben. Dort bleibt es (mit all seinen Attributen und Links) bis die Deleted Objects Lifetime (msDS-DeletedObjectLifetome)abgelaufen ist, dann wird es zum recycled Object. Nach Ablauf der Recylced Object Lifetime (tombstoneLifetime) wird es vom Garbage Collection Process endgültig aus der AD Datenbank gelöscht.\n\nIm “Deleted Obejects” Container findet man gelöschte Objekte die nach aktiveren des Recylce Bin Features gelöscht wurden und deren Deleted Objects Lifetime noch nicht abgelaufen ist. Man kann in dem Container suchen und die Ansicht filtern um die gewünschten Objekte zu finden.\nHat man die Objekte gefunden kann man diese einzeln oder mehrere zusammen wiederherstellen. Einfach rechts auf das Objekt klicken und “Restore” oder “Restore To…” auswählen.\n“Restore” stellt die Objekte an ihrem Ursprünglichen Ort wieder her (lastKnownParent), mit “Restore To…” erhält man folgenden Dialog und kann das Ziel auswählen.\n\nAuch hier werden in der PowerShell History die ausgeführten Befehle angezeigt:\nRestore-ADObject -Confirm:$false -Identity:&quot;bb127a94-277f-4a7d-a09b-5893906cb16b&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot;\nFine-Grained Password Policy\nFine-Grained Password Policies wurden mit Windows Server 2008 eingeführt, sie waren eine wichtige Neuerung und auch sie waren in der Verwendung nicht ganz einfach.\nMit dem neuen ADAC gibt es eine GUII für die sogenannten PSOs oder Password Setting Objects. Um ein neues PSO zu erstellen öffnet man den Container Password Settings (“CN=Password Settings Container,CN=System,DC=tomt,DC=local”) und klickt auf New, Password Settings.\n\n\nIm Dialog “Create Password Settings” kann man die Fine-Grained Password Policy konfigurieren und diese gleich einer Gruppe oder einem Benutzer zuweisen. Ist ein Benutzer Mitglied in mehreren Gruppen auf die ein PSO angewendet wird, hat jenes mit dem niedrigerem Precedence Wert (msDS-PasswordSettingsPrecedence) Vorrang.\nUnd auch hier wieder die entsprechenden PowerShell Befehle:\nAdd-ADFineGrainedPasswordPolicySubject -Identity:&quot;CN=pso_group1,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot; -Subjects:&quot;CN=group1,OU=groups,OU=tomt,DC=tomt,DC=local&quot;      &lt;/p&gt;    New-ADFineGrainedPasswordPolicy -ComplexityEnabled:$true -LockoutDuration:&quot;00:30:00&quot; -LockoutObservationWindow:&quot;00:30:00&quot; -LockoutThreshold:&quot;0&quot; -MaxPasswordAge:&quot;42.00:00:00&quot; -MinPasswordAge:&quot;1.00:00:00&quot; -MinPasswordLength:&quot;7&quot; -Name:&quot;pso_group2&quot; -PasswordHistoryCount:&quot;24&quot; -Precedence:&quot;20&quot; -ReversibleEncryptionEnabled:$false -Server:&quot;WIN8CP-DC1.tomt.local&quot;          Set-ADObject -Identity:&quot;CN=pso_group2,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -ProtectedFromAccidentalDeletion:$true -Server:&quot;WIN8CP-DC1.tomt.local&quot;&lt;/code&gt;  Durch diese neuen grafischen Oberflächen wird das ADAC wahrscheinlich mehr Verwendung finden als sein Vorgänger. Auch an den Metro Style wird man sich gewöhnen (müssen).  &#160;  so long,   tom"
        },
        {
          "id": "post-windows-server-8-cp-remote-group-policy-refresh",
          "title": "Windows Server 8 CP–Remote Group Policy refresh",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2012",
          "url": "/post/windows-server-8-cp-remote-group-policy-refresh/",
          "content": "Mit Windows Server 8 kann man einen Group Policy refresh auf remote Computern initiieren. Verwendet wird dazu die GPMC oder natürlich PowerShell.\nGroup Policy Management Console\n\nMan wählt die OU aus in der sich die Computerkonten befinden auf denen man das Update ausführen möchte. Achtung: Man kann das GP Update nur auf Computerkonten initiieren, es werden aber Computer und Benutzerrichtlinien aktualisiert.\nMit einem Rechtsklick auf die OU kann man “Group Policy Update…” auswählen. Der Dialog um das Update zu bestätigen zeigt an um wie viele Computer es sich handelt.\n\nKlickt man auf “Yes” wird “gpupdate /force” auf den erreichbaren Computern ausgeführt.\n\nEin kurzer Report wird angezeigt, in dem evtl. Fehler sichtbar sind.\nPowerShell\nMit dem cmdlet “Invoke-GPUpdate” aus dem Modul “GroupPolicy” kann man das GP Update auch per PowerShell starten.\nInvoke-GPUpdate –Computer “win8cp-dc1”\nFirewall\nDamit das Remote GP Update funktioniert müssen folgende Windows Firewall Regeln aktiviert sein (Verbindungen akzeptieren)\n   Remote Scheduled Tasks Management (RPC)    Remote Scheduled Tasks Management (RPC-EPMAP)    Windows Management Instrumentation (WMI-IN) \n&#160;\ntom"
        },
        {
          "id": "post-windows-server-8-cp-servermanager",
          "title": "Windows Server 8 CP –ServerManager",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2012",
          "url": "/post/windows-server-8-cp-servermanager/",
          "content": "Seit kurzem die Beta des neuen Servers verfügbar, natürlich musste mal wieder ein neuer Name her: Windows Server “8” Consumer Preview.\nDer neue Server Manager ist natürlich im Metro Style und ist über die RSAT (Remote Server Administration Tools) auch für das neue Client OS (Windows 8 Consumer Preview) verfügbar.\nDownload RSAT (Beta/CP): http://www.microsoft.com/download/en/details.aspx?id=28972\nDashboard\n\nÜber das Dashboard sieht man eine Zusammenfassung der verwalteten Server und Rollen. Der Status wird automatisch aktualisiert, standardmäßig alle 10 Minuten. Man wird so auf evtl. Probleme hingewiesen.\nÜber “Manage” kann man Server hinzufügen oder Rollen und Features auf bereits verwalteten Server installieren.\n\nFügt man einen Server hinzu, kann man diese aus dem Active Directory suchen oder den DNS Namen angeben, außerdem kann man Textdateien die Servernamen enthalten importieren.\nDamit man einen Server hinzufügen kann muss die Remoteverwaltung (WinRM) dort aktiviert werden, DCOM wird nicht mehr benötigt.\nServer Groups\nMit Server Gruppen können mehrere Server die z.B. dieselbe Aufgabe erfüllen zu einer Gruppe hinzugefügt werden.\n&#160;\n&lt;h1&gt;Add Roles and Features&lt;/h1&gt;  &lt;p&gt;Über den Server Manager können Rollen und Features auf allen verwalteten Server hinzugefügt oder entfernt werden. In folgendem Beispiel füge ich einen weiteren Domain Controller hinzu. Alle Schritte führe ich auf meinem Windows 8 CP Client mit RSAT aus.&lt;/p&gt;  &lt;p&gt;Unter “Manage” klicke ich auf “Add Roles and Features” um den Wizard zu starten.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_377.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_375.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle die Art der Installation und den Zielserver aus.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_378.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_376.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle Active Directory Domain Services aus und bestätige dass ich die nötigen Rollen sowie die Management Tools installieren möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_379.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_377.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_380.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_378.png\" width=\"234\" height=\"244\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wurden die ADDS Binaries auf dem Zielserver installiert erhält man eine Notification im Server Manager, hier wird auch gleich der “Task” angezeigt um den Server zum Donain Controller zu machen (zu promoten)&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_381.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_379.png\" width=\"244\" height=\"132\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich klicke also auf “Promote this server to a domain controller” und komme so zu folgendem Wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_382.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_380.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wie bereits mit “dcpromo” kann man auch hier auswählen ob man den DC zu einer bestehenden Domain, eine neue Domain in einem bestehenden Forest hinzufügen, oder gleich einen neuen Forest erstellen möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_383.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_381.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Im nächsten Schritt werden die DC Options konfiguriert. Der DC soll DNS sowie Global Catalog sein, außerdem wird hier die Site ausgewählt und das DSRM Passwort gesetzt.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_384.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_382.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Man kann noch die Pfade für die ADDS Datenbank und Log Files sowie den SYSVOL Share setzen.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_385.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_383.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ist die Konfiguration abgeschlossen kommt man zur “Review Options” Seite, man kann die ausgewählten Optionen nochmal überprüfen. Das eigentlich interessante an dieser Seite ist jedoch der Button “View Script” er zeigt das PowerShell Script an, welches auf dem Remote Server ausgeführt wird.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_386.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_384.png\" width=\"244\" height=\"211\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der Server Manager erledigt alle Tasks mit PowerShell Befehlen, dcpromo kann noch für “unattended” Insatllationen verwendet werden, die Empfehlung von Microsoft ist es allerdings “dcpromo” nicht mehr zu verwenden.&lt;/p&gt;  &lt;p&gt;Server Manager führt einen prerequisite Check auf dem Zielserver durch, dabei wird überprüft ob der Server zum DC promoted werden kann.&lt;/p&gt;  &lt;p&gt;&lt;a href=\"/assets/archive/image_387.png\"&gt;&lt;img style=\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"/assets/archive/image_thumb_385.png\" width=\"244\" height=\"180\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nach dem Klick auf “Install” gehts los, der Server wird hochgestuft, und DNS sowie die AD Tools werden installiert. Anschließend wird der Server neu gestartet und ich habe einen neuen DC.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;tom&lt;/p&gt;"
        },
        {
          "id": "post-powershell-loves-wmi-os-info",
          "title": "PowerShell loves WMI – OS Info",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/powershell-loves-wmi-os-info/",
          "content": "Mit dem cmdlet Get-WmiObject kann Windows PowerShell auf WMI Objekte zugreifen. Man kann also z.B. die Eigenschaften der Klasse “Win32_OperatingSystem” anzeigen und daraus Informationen über das Betriebssystem erhalten.\nDie vollständige Liste der Eigenschaften (und Methoden) gibt es im MSDN. Oder natürlich mit folgendem Befehl:\nGet-WmiObject -Class win32_OperatingSystem -Property * | select *\nInteressante Eigenschaften\nOperatingSystemSKU: Enthält die installierte Version des Betriebssystems, z.B. Ultimate, Enterprise, Datacenter Server Edition\nProductType: Workstation, Domain Controller, Server\nBuildNumber: Enthält die Build Nummer des Betriebssystems\nOSArchitecture: 32-Bit oder 64-Bit\nFilter\nMan kann aufgrund dieser Eigenschaften einfache Filter für Scripts erstellen und so z.B. sicherstellen dass ein bestimmtes Script nur auf einem bestimmten Betriebssystem ausgeführt wird.\n#Variable OS erstellen, enthält alle Informationen der angegebenen Klasse&lt;/p&gt;    $OS = Get-WMIObject –Class Win32_OperatingSystem    if($OS.OperatingSystemSKU -eq &quot;4&quot; -and $OS.Caption -like &quot;*Windows 7*&quot;) {    #Code für Windows 7 Enterprise    } else {    #Code für jedes andere OS    }    if ($os.OSArchitecture -eq &quot;64-bit&quot;){    #Code für x64     } else {    #Code für x86    }&lt;/code&gt;  Das sind natürlich sehr einfache Beispiele, wie mächtig WMI ist kann man sich am besten in der WMI Reference ansehen. Außerdem enthält das Beispiel keine Fehlerüberprüfung, läuft irgendwas schief, wars das.  Remote  Natürlich kann man auch Informationen über einen oder mehrere remote Computer auswerten. Das cmdlet Get-WmiObject hat den Parameter Computername über den man einen oder mehrere Computernamen (getrennt mit Komma) abfragen kann. Über Pipline Input kann man dem cmdlet Computernamen aus einem Textfile oder dem ActiveDirectory übergeben.  Get-WmiObject –Class win32_OperatingSystem –Computer mypc1,mypc2&lt;/p&gt;    Get-ADComputer -Filter 'Name -like &quot;*Server*&quot;'| Get-WmiObject –Class win32_OperatingSystem&lt;/code&gt;  &#160;  so long,  tom"
        },
        {
          "id": "post-powershell-implicit-remoting",
          "title": "PowerShell Implicit Remoting",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/powershell-implicit-remoting/",
          "content": "Eine der wichtigsten Funktionen der PowerShell ist die M&ouml;glichkeit cmdlet&rsquo;s (ScriptBlocks) auf remoten System auszuf&uuml;hren. Dazu wird eine PowerShell Sesion mit dem Remote Computer erstellt, die Befehle werden remote ausgef&uuml;hrt und das Ergebnis lokal angezeigt.\nNun gibt es verschiedene Module f&uuml;r das Verwalten von Serverrollen wie z.B. Active Directory, Exchange 2010 oder Lync 2010. Will ich von meinem Client aus diese cmdlet&rsquo;s verwenden muss ich die Module installieren. Oder?\nSession erstellen und Modul Laden\nMan erstellt eine neue PSSessoin mit einem Computer auf dem das entsprechende Modul installiert ist.\n$ADSession = New-PSSession &ndash;ComputerName dc01.domain.local\nDann wird das Modul in der gerade erstellten Session geladen:\nInvoke-Command {Import-Module ActiveDirectory}&nbsp; -Session $ADSession\nImport-PSSession\nBefehle aus einer Session k&ouml;nnen mit Import-PSSession in die aktuelle PowerShell Sitzung &uuml;bernommen werden, man kann entweder alle Verf&uuml;gbaren cmdlet&rsquo;s importieren oder nur einen Teil. In diesem Beispiel interessieren mich die cmdlets aus dem ActiveDirectory Modul, die entsprechenden Nouns beginnen mit AD, ich kann also auf *-AD* Filtern und so nur ActiveDirectory cmdlet&rsquo;s &uuml;bernehmen.\nImport-PSSession -Session $ADSession-CommandName *-AD*\nSo kann ich in meiner aktuellen PS Sitzung die AD cmdlet&rsquo;s wie Get-ADUser verwenden. Schlie&szlig;e ich das aktuelle PS Fenster wars das mit den AD cmdlet&rsquo;s.\nExport-PSSession\nDamit man sich diese Befehle nicht merken muss und die cmdlet&rsquo;s einfach wiederverwendet kann, erstellt Export-PSSession automatisch ein Modul mit den gew&uuml;nschten remote cmdlet&rsquo;s.\nExport-PSSession $ADSession -OutputModule AD -CommandName *-AD* &ndash;AllowClobber\nJetzt kann man das aktuelle PowerShell Fenster schlie&szlig;en, ein Modul wurde erstellt das wie gewohnt geladen werden kann.\nImport-Module AD\nDie Befehle aus dem Modul sind jetzt verf&uuml;gbar, allerdings gibt es noch keine PSSession. Diese muss jedoch nicht manuell erstellt werden, f&uuml;hrt man den ersten Befehl aus dem Modul aus (Get-ADUser username) wird automatisch eine PS Session mit dem remote Computer erstellt und das cmdlet ausgef&uuml;hrt.\nSo kann man also auf jedem beliebigen Client (auf dem nur PowerShell v2 installiert ist) cmdlet&rsquo;s ausf&uuml;hren die auf dem Server laufen.\nExchange und Lync\nExchange und Lync bieten einen eigenen Endpoint f&uuml;r PowerShell Verbindungen, man gibt diesen bei der Erstellung der PSSession als ConnectionURI an.\n$exSession = New-PSSession -ConnectionUri 'http://ex14.domain.local/powershell/&rsquo; -ConfigurationName Microsoft.Exchange -Authentication Kerberos&lt;/p&gt;\n$lyncSession = New-PSSession &ndash;ConnectionUri &lsquo;https://lync.domain.local/ocspowershell&rsquo;&lt;/code&gt;\nHat man die gew&uuml;nschte Session erstellt kann man sie wie gehabt mit Import-PSSession gleich verwenden oder mit Export-PSSession ein Modul erstellen.\nPrefix\nDamit man die lokalen und remoten cmdlet&rsquo;s unterscheiden kann, gibt es den Parameter &ndash;Prefix f&uuml;r die cmdlet&rsquo;s Import-Module und Import-PSSession.\nImport-Module AD &ndash;Prefix &lsquo;r&rsquo;\nSo wird jedem Noun ein &lsquo;r&rsquo; vorgestellt, ich verwende also z.B. Get-rMailbox, Get-rADUser usw.\n&nbsp;\nIch denke diese wenig bekannte Funktionalit&auml;t zeigt wie genial das Konzept der PowerShell ist, mit Windows 8 sollen jede Menge weitere cmdlet&rsquo;s dazukommen. PowerShell wird das ultimative Admin Werkzeug werden.\n&nbsp;\nso long, happy hacking!\ntom"
        },
        {
          "id": "post-exchange-2010-sp2-installation",
          "title": "Exchange 2010 SP2 Installation",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-sp2-installation/",
          "content": "Service Pack 2 für Exchange 2010 ist seit über zwei Monaten verfügbar,langsam Zeit sich ernsthaft gedanken über ein Update zu machen. Dabei gibt es ein paar Dinge zu berücksichtigen, hier eine kurze Zusammenfassung.\n\n\nActive Directory Schema\nEs gibt ein neues Active Directory Schema, ein paar Infos dazu hier: http://blogs.technet.com/b/exchange/archive/2012/01/17/custom-aka-extension-attributes-in-exchange-2010-sp2-and-their-use.aspx\nUm das AD Schema zu aktualisieren benötigt man “Schema Admin” Berechtigungen, installiert man Exchange 2010 SP2 mit einem Benutzer der diese Rechte hat wird das Schema automatisch erweitert. Alternativ kann man die Setup Files von SP2 auf den Schema-Master kopieren und mit setup.com /prepareAD das Update durchführen.\nDie aktuelle Schema Version findet man folgendermaßen:\nActive Directory Schema:\nGet-ADObject &quot;cn=schema,cn=configuration,dc=ath,dc=int&quot; -Properties ObjectVersion\nExchange Schema:\nGet-ADObject &quot;cn=ms-Exch-Schema-Version-Pt,cn=schema,cn=configuration,dc=domain,dc=local&quot; -Properties RangeUpper\nGenauere Infos und die genauen Schema Versionsnummern gibt es im TechNet Wiki.\nClient Access Sever Prerequisite\nDie Systemvoraussetzungen für die Client Access Rolle wurden geändert, hinzugefügt wurde IIS 6 Wmi Compatibility oder “web-wmi”. \nDas Feature kann automatisch installiert werden wenn die entsprechende Option beim Setup aktiviert wird, alternativ kann man es im Servermanager oder per Powershell installieren.\nImport-Module Servermanager&lt;/p&gt;    Add-WindowsFeature Web-WMI&lt;/code&gt;  Execution Policy GPO  In vielen Umgebungen werden Einstellungen wie z.B. die PowerShell Execution Policy über Gruppenrichtlinien gesteuert. Diese Gruppenrichtlinie führt zu einem Problem bei der Installation des Service Packs das den Server in einem Status zurücklässt in dem Exchange nicht mehr läuft und die Installation nicht fortgesetzt werden kann. Der Fehler “AuthorizationManager check failed” wird angezeigt. Klingt nach Restore.  Um das zu verhindern muss man die Gruppenrichtlinie vor dem Update deaktivieren, überprüft werden kann das so:  Get-ExecutionPolicy –List    Wichtig ist hierbei dass MachinePolicy und UserPolicy auf “Undefined” stehen.  Genaueres gibt es in der Knowledge Base.  Release Notes  Wie vor jedem Update empfehle ich hier auf jeden Fall einen Blick auf die Release Notes zu werfen.  &#160;  so long,   tom"
        },
        {
          "id": "post-windows-powershell-v30",
          "title": "Windows PowerShell v3.0 (CTP 2)",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/windows-powershell-v30/",
          "content": "Schon seit einiger Zeit ist das Community Technology Preview 2 vom Windows Management Framework 3.0 verfügbar, unter anderem enthält es die Windows PowerShell v3.\nUm in den Genuss der neue Features wie “automatic module loading” und “robust sessions” zu kommen benötigt man ein englisches Windows 7 und das .NET Framework 4. Ist das Betriebssystem in einer anderen Sprache installiert muss man vor der Installation des Management Frameworks das englische Sprachpaket installieren.\nDownload\nAchtung: Es handelt sich um pre-release Code, sollte natürlich nur in Testumgebungen verwendet werden!\n.NET Framework 4 - http://go.microsoft.com/fwlink/?LinkID=212547\nWindows Management Framework 3.0 - Community Technology Preview (CTP) #2 - http://www.microsoft.com/download/en/details.aspx?id=27548\nInstallation\nDie Installation ist denkbar einfach, zuerst wird das .NET Framework installiert, anschließend je nach Platform WINDOWS6.1-KB2506143-x64.msu oder WINDOWS6.1-KB2506143-x86.msu. Nach einem neustart ist die neue PS verfügbar.\n\nEinige Features\nWie bereits erwähnt enthält die neue PowerShell eineige neue Features sowie jede Menge neue cmdlets. Besonders gut gefallen mir die “Robusten Sessions”, verliert man die Netzwerkverbindung ist eine PowerShell Session mit einem remoten Host für gewöhnlich weg. Mit PS v3 wird die Session automatisch wieder hergestellt.\nAußerdem angenehm ist das autmatische Laden von Modulen, wer z.B. diverse Admin-Tools (Active Directory, Exchange) installiert hat muss in einer neuen PowerShell Session immer Module nachladen (oder ein entsprechendes Profil erstellen). Mit v3 wird ein Modul automatisch geladen wenn ein cmdlet aus dem Modul verwendet wird.\nPowerShell v2\nMan kann natürlich auch mit installierter PS v3 die Version 2 verwenden, da es sich um pre-release Code handelt kann es durchaus zu Problemen kommen. Um v2 zu starten wird die powershel.exe mit dem Parameter “-version 2” gestartet.\n\nWeitere Informationen\nEin guter Start ist das TechNet Wiki: http://social.technet.microsoft.com/wiki/contents/articles/4741.powershell-v3-featured-articles-en-us.aspx\n&#160;\ntom"
        },
        {
          "id": "post-exchange-2010-recovery",
          "title": "Exchange 2010–Restore Mailbox Content",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-recovery/",
          "content": "Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.\nMan kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber ein anderes mal mehr.\nRestore Files\nDie Datenbank wird von der Sicherung zurück geholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.\n&#160;\nNun kann ich wählen was ich Wiederherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die .edb Datei (Datenbank) und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.\nRecovery Database\nIst die Wiederherstellung abgeschlossen wird mit der Exchange Management Shell eine Recovery Database erstellt, diese verwendet die wiederhergestellte .edb Date sowie die wiederhergestellten Log Files. \nDieses Beispiel erstellt die Recovery Database RDB01 auf dem Server MBX01, X:\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner wiederhergestellt wurden.\nNew-MailboxDatabase RDB01 –Recovery –Server MBX01 –EdbFilePath x:\\restore\\db.edb –LogFolderPath x:\\restore \n\nDie Datenbank wurde also erstellt, allerdings wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.\n\nEseutil\nUm die Datenbank in einen sauberen Status zu bringen wird eseutil.exe verwendet. Dabei ist es wichtig die richtigen Parameter zu verwenden.\nAls erstes kann man überprüfen in welchen Zustand sich die Datenbank befindet:\nEseutil /mh x:\\restore\\db.edb\n\nDie Datenbank ist also im “Dirty Shutdown” State und kann so nicht gemounted werden, mit “eseutil /r” wird die DB ohne Datenverlust in einen “Clean Shutdown” State gebracht. Mit dem Parameter /r wird der Präfix der Logs angegeben, also am besten zuerst den Dateinamen den Logs überprüfen. Die Parameter /l und /d geben den Pfad zu den Logs&#160; bzw. zur Datenbank an.\nEseutil /r “E01” /l x:\\restore\\ /d x:\\resotre\nAchtung: Sollte das nicht funktionieren kann mit eseutil /p ein Hard Repair durchgeführt werden, dabei wird die Datenbank ohne Rücksicht auf Verluste in den “Clean Shutdown” State gebracht. Datenverlust ist möglich!\nNachdem Eseutil durchgelaufen ist und sich die Datenbank im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick auf die RDB oder mit der Management Shell und folgendem Befehl:\nMount-Database RDB01\nMailbox Restore Request\nWenn die Recovery Database online ist kann man beginnen Mailbox Inhalte wiederherzustellen, dazu verwendet man das cmdlet New-MailboxResotreRequest. Folgendes Beispiel stellt den Inhalt der Mailbox “Test User” in den Ordner Restore derselben Mailbox wieder her.\nNew-MailboxRestoreRequest –SourceDatabase ‘RDB01’ –SourceStoreMailbox ‘test user’ –TargetMailbox ‘test.user@ntsystems.it’ –TargetRootFolder ‘Restore’\nFolgendes Beispiel stellt den Inhalt aller Mailboxen der Datenbank DB01 wieder her. Es wird für jede Mailbox ein Restore Request erstellt, auch hier wird der Inhalt in den Ordner Restore der jeweiligen Mailbox wiederhergestellt.\nGet-Mailbox –Database ‘DB01’ |foreach { New-MailboxRestoreRequest -SourceStoreMailbox $_.Guid –SourceDatabase ‘RDB01’ -TargetMailbox $_.Guid –TargetRootFolder ‘Restore’}\nBei diesem cmdlet ist zu beachten dass die Parameter –SourceStoreMailbox und -TargetMailbox verschiedene Eingaben unterstützen, am Besten die Mailbox GUID verwenden, diese wird von beiden unterstützt.\nWeitere Infos zu New-MailboxRestoreRequest gibt es im TechNet: http://technet.microsoft.com/en-us/library/ff829875.aspx&#160;\nCleanup\nWenn der Restore Vorgang abgeschlossen ist kann man die Recovery Database wieder entfernen, dazu muss sie zuerst mit folgendem Befehl dismounted werden:\nDismount-Database RDB01\nAnschließend kann man die RDB löschen, dazu verwendet man folgenden Befehl:\nRemove-MailboxDatabase RDB01\nDie Datenbank ist jetzt aus der Konfiguration entfernt, die Files sind jedoch nach wie vor auf dem Server. Diese müssen manuell gelöscht werden.\n&#160;\nso long,   tom"
        },
        {
          "id": "post-exchange-2010-unified-messaging-cisco-call-manager-86",
          "title": "Exchange 2010 Unified Messaging–Cisco Call Manager 8.6",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-unified-messaging-cisco-call-manager-86/",
          "content": "Unified Messaging in Exchange 2010 verbindet E-Mail mit Voice Messaging in einer Messaging Infrastruktur. E-Mail und Voice Mail Nachrichten werden in einer “unified” Mailbox verwaltet und der Benutzer erhält neben Outlook und OWA auch über das Telefon (OVA – Outlook Voice Access) Zugriff auf seine Mailbox.\nUm die Unified Messaging Rolle mit der “traditionellen” Telefonwelt zu verbinden braucht man ein IP Gateway oder eine IP Telefonzentrale wie den Cisco Call Manager.\nExchange Unified Messaging\nDie Unified Messaging Server Rolle kann auf einem bestehenden Exchange Server hinzugefügt werden, alternativ kann man einen separaten UM Server installieren.\nPrerequisites\nDie notwendigen Voraussetzungen müssen auf einem Windows Server installiert werden, dazu verwendet man am besten die Powershell. Folgendes Beispiel installiert die Voraussetzungen für einen Server der nur die UM Rolle betreibt.\nAdd-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Desktop-Experience –Restart\nAchtung: Neustart erfolgt automatisch, sollte das nicht gewünscht sein den Parameter –Restart entfernen.\nUM Rolle Installieren\nUm die Exchange UM Rolle zu installieren wird Setup.exe von einer aktuellen Version der Installationsmedien ausgeführt. Auf einem neuen Server wird dann nur die Unified Messaging Rolle installiert, ein bestehender Server wird über den “Maintenance Mode” um diese Rolle erweitert.\nWie nach jeder Installation sollte man auch hier Windows Update ausführen und evtl. Updates installieren.\nUM Konfiguration\nNach der Installation der Rolle muss diese konfiguriert werden.\nOrganization Configuration\nEin UM Dial Plan muss erstellt werden, dazu unter Organization Configuration auf Unified Messaging klicken und “New UM Dial Plan” wählen, hier wird der URI Type “Telephone Extension” ausgewählt sowie die länge der internen Telefonnummern (Extension) angegeben.\nDer UM Dial Plan ist die zentrale Komponente der UM Konfiguration und entspricht der Telefonzentrale bzw. Gruppen von Benutzern mit gleichen Telefonnummern (4 stellig) und dem selben URI Type (Telephone Extension).\nDer Dial Plan wird im Active Directory unter “CN=My 4 Digit DP, CN=UM DialPlan Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” gespeichert.\n\nGleichzeitig mit dem Dial Plan wird eine UM Mailbox Policy erstellt, auch diese wird im AD unter “CN=My 4 Digit DP Default Policy, CN=UM Mailbox Policies, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain,DC=Local” gespeichert.\nÜber die UM Mailbox Policy werden Einstellungen für UM aktivierte Postfächer konfiguriert.\n&#160;\nAls nächstes wird ein UM IP Gateway angelegt, das Gateway ist die SIP Gegenstelle. In diesem Fall gebe ich den Cisco Call Manager an. Um ein UM IP Gateway anzulegen klickt man unter Organization Configuration, Unified Messaging auf “New UM IP Gateway”.\nFür jedes IP Gateway wird im AD unter “CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” ein neuer Container angelegt.\n\nEine Hunt Group verbindet das IP Gateway mit dem Dial Plan, wird beim erstellen des UM IP Gateways ein Dial Plan angegeben wird automatisch die “Default Hunt Group” erstellt. Dieser Default Hunt Group wird kein Pilot Identifier zugewiesen, d.h. alle eingehenden Calls (SIP Invites) werden angenommen.\nWird die Hunt Group manuell erstellt kann ein Pilot Identifier angegeben werden, dadurch antwortet Exchange UM nur mehr auf Calls die eine konfigurierte Nummer anrufen. Ich verwende hier 9999 als Pilot Identifier, d.h. der Call Manager muss Anrufe an 9999 über den SIP Trunk routen.\nUm eine neue Hunt Group zu erstellen wählt man unter Organization Configuration, Unified Messaging das IP Gateway aus und klickt dann auf “New UM Hunt Group”.\n\nDie Hunt Group wird im Container des entsprechenden IP Gateways gespeichert, in diesem Fall unter: “CN=MY_CUCM_HuntGroup, CN=CUCM1, CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local”\nDie Verbindung zum Dial Plan wird im Attribut msExchUMHuntGroupDialPlanLink gespeichert.\nDie Exchange Unified Messaging Organisationskonfiguration ist somit abgeschlossen.\nServer Configuration\nIn der Server Configuration wird der Dial Plan mit einem oder mehreren Exchange UM Servern verbunden. Dazu unter Server Configuration auf Unified Messaging klicken und den entsprechenden Server auswählen. In den Eigenschaften “UM Settings” wählen und den Dial Plan hinzufügen.\n\nDie Exchange Unified Messaging Serverkonfiguration ist damit abgeschlossen und die Exchange Umgebung ist bereit für die erste “unified” Mailbox.\nRecipient Configuration\nUm eine Mailbox für UM zu aktivieren wählt man die Mailbox unter Recipient Configuration, Mailboxes aus und klickt auf Enable Unified Messaging.\n\nJedem Benutzer muss eine UM Mailbox Policy zugewiesen werden, außerdem muss er eine eindeutige “Extension” erhalten. Die Extension ist die Telefonnummer unter der die Voice Mailbox antwortet, also die Interne Telefonnummer des Benutzers.\n\nDer Benutzer erhält ein Willkommens-E-mail von Unified Messaging in dem sein PIN und seine Extension mitgeteilt werden.\nDie Extension wird dem Benutzer als “E-Mail Adresse” vom Typ EUM zugewiesen:\nProxyAddressString: EUM:1000;phone-context=CUCM1.domain.local\nSoll ein Benutzer mehrere Extension erhalten kann man diese einfach als zusätzliche “E-Mail Adressen” hinzufügen.\n&#160;\nCisco Call Manager\nDamit der Call Manager mit dem Exchange Server verbunden werden kann wird ein SIP Trunk benötigt. Außerdem muss eine Route erstellt werden über die der Call Manager weiß welche Nummern hinter dem SIP Trunk zu finden sind.\nSIP Trunk\nDer SIP Trunk wird unter Device, Trunk “Add New” erstellt.\n\nMan muss dem Trunk einen Namen geben, den Device Pool auswählen, die IP Adresse des Exchange UM Servers als Destination angeben und ein SIP Profile sowie das SIP Trunk Security Profile auswählen. Sind mehrere Exchange UM Server vorhanden muss ein Trunk pro Server angelegt werden.\n\nWichtig: Für Outbound Calls muss “Redirecting Diversion Header Delivery – Outbound” aktiviert werden, durch die Informationen im Diversion Header kann der Exchange Server das Postfach aufgrund der Extension zuweisen.\n\nFür alle anderen Einstellungen sind die Defaults des Call Managers ok. Je nach Umgebung kann es sein dass man “Media Termination Point Required” aktivieren muss.\nRoute Pattern\nDamit der Call Manager Anrufe an 9999 routen kann muss man eine Route Pattern erstellen, dazu unter Call Routing, Route/Hunt auf Route Pattern klicken. Mit Add New kann eine neue Pattern hinzugefügt werden. Auch hier muss ein Device Pool sowie der SIP Trunk als Gateway angegeben werden. In Umgebungen mit mehrere Exchange UM Servern empfiehlt es sich eine Route List für die SIP Trunks anzulegen und die Pattern auf die Route List zu binden.\n\nDie minimale Konfiguration ist dadurch abgeschlossen, wenn der UM aktivierte Benutzer mit der Nummer 1000 jetzt die Nummer 9999 anruft erhält er Zugriff auf sein Postfach über OVA. Wenn derselbe Benutzer eine Umleitung auf 9999 einrichtet werden alle eingehenden Calls auf sein Voicemail Postfach umgeleitet.\nMWI - Message Waiting Indicator\nWenn jemand eine Nachricht hinterlässt wird diese in der Inbox angezeigt, zusätzlich kann am Phone ein MWI Status angezeigt werden (rotes LED). Der Benutzer sieht so sofort dass er eine neue Voicemail hat. Um dieses Feature zu aktivieren muss das “SIP Trunk Security Profile” geändert werden. Dazu unter System, Security auf SIP Trunk Security Profile klicken und das Profil auswählen das dem Trunk zugewiesen wurde. Bei diesem Profil muss die Option “Accept Unsolicited Notification” aktiviert werden.\n\nVoice Mail Profile\nUm den Voice Mail Button am Phone zu konfigurieren muss ein Voice Mail Pilot sowie ein Voice Mail Profile konfiguriert werden.\nDazu unter Advanced Features, Voice Mail auf Voice Mail Pilot klicken und mit Add New einen neuen Voice Mail Pilot erstellen.\n\nUnter Advanced Features, Voice Mail, Voice Mail Profile kann ein neues Profil angelegt werden.\n\nAchtung: Wird “Make this the default…” ausgewählt wird das Profil automatisch auf allen Phones konfiguriert die keine diesbezügliche Konfiguration haben.\nNun kann man unter Device, Phone in der entsprechenden Direct Number Configuration ein Voice Mail Profile konfigurieren.\n&#160;\nspecial thanks to pk :)\n&#160;\ntom"
        },
        {
          "id": "post-citrix-sprache-des-ica-client-andern",
          "title": "Citrix, Sprache des ICA Client ändern",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Citrix",
          "url": "/post/citrix-sprache-des-ica-client-andern/",
          "content": "Kleiner Tipp: Das Citrix Online Plug-In (ICA Client) wird standardgemäß in der Betriebssystemsprache ausgeführt. Will man die Sprache manuell ändern, lässt sich das über folgenden Befehl unter C:\\Program Files (x86)\\Citrix\\ICA Client realisieren: WFICA32.EXE /UserUILocale\n&#160;\n\n&#160;\nGrüße   dn"
        },
        {
          "id": "post-windows-8-installation-in-vhd",
          "title": "Windows 8 - Installation in VHD",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Client",
          "url": "/post/windows-8-installation-in-vhd/",
          "content": "In diesem Post (Windows 7 - Nativer VHD Support) habe ich vor einiger Zeit beschrieben wie man Windows 7 in eine VHD installieren kann.\nNun, das funktioniert genau gleich f&uuml;r das&nbsp;Windows 8 Developer Preview! Hier nochmal eine kuze Zusammenfassung:\n\nVHD erstellen: Diskpart; create vdisk file=\"E:\\VHD\\win8-1.vhd\" type=fixed maximum=20480 erstellt eine 20GB VHD vom Typ \"Fixed\", die Datei belegt also den vollen Speicher auf der Festplatte\nVon Windows 8 Installationsmedium booten\nmit \"Shift\"+\"F10\" eine Eingabeaufforderung &ouml;ffnen\nVHD ausw&auml;hlen: Diskpart; select vdisk file=\"E:\\VHD\\win8-1.vhd\"\nattach vhd\nDiskpart und Eingabeaufforderung schlie&szlig;en, Windows 8 installieren.\n\nDer neue Bootmanager ist &uuml;brigens auch im Metrostyle ;)\nWie Windows 7 kann man auch Windows 8 vom USB Stick installieren, auch diese Anleitung funtioniert weiterhin!\nenjoy!!"
        },
        {
          "id": "post-windows-8-developer-preview",
          "title": "Windows 8–Developer Preview",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-8-developer-preview/",
          "content": "In Anaheim, Ca findet zurzeit die BUILD Konferenz statt. Diese mehrtätige Veranstaltung richtet sich vor allem an Entwickler und stellt das neue Betriebssystem Windows 8 vor.\nSeit dem frühen Morgen kann man sich ein “Developer Preview” Build von Windows 8 herunterladen. Verfügbar sind 32 und 64 Bit Images mit oder ohne Entwicklungstools. Hier der Link zur Seite: http://dev.windows.com\nEinige Neuerungen im Überblick\nDas neue Startmenü im Metro Style\n\nWindows Explorer mit Ribbon, und den neuen Copy/Cut/Paste Dialogen\n\nAußerdem kann man jetzt ISO und VHD Files direkt im Windows Explorer mounten/öffnen.\nAuch der Task Manager wurde erneuert\n\nHyper-V Support, der Hammer! Hyper-V für den Client mit 64 Bit Guest Support. Außerdem Support für Standby Mode und WLAN\n\nPowerShell 3\n&#160;\nDas ist nur ein schneller Überblick, in den nächsten Tagen gibt es Details. Sehr Empfehlenswert sind folgenden Links:\nhttp://www.buildwindows.com\nhttp://blogs.msdn.com/b/b8\nenjoy!   tom"
        },
        {
          "id": "post-outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender",
          "title": "Outlook 2003 / Exchange 2010 Probleme beim Öffnen freigegebener Kalender",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender/",
          "content": "In einer Umgebung mit Exchange 2010 und Outlook 2003 als Mail Client kann es beim &Ouml;ffnen freigegebener Kalender zu Problemen kommen. Dabei erscheint folgende Fehlermeldung:\n\n&nbsp;\nAnders als &lt; Office 2007 &ouml;ffnet Outlook 2003 die Verbindung direkt zu den Mailboxserver und nicht &uuml;ber den Address-Book Service. Um dieses Problem zu beheben, muss das Verbindungslimit, welches standardgem&auml;&szlig; 20 betr&auml;gt, angehoben werden. Hierzu erstellen wir eine neue ThrottlingPolicy und weisen diese dem Benutzer zu:\n&nbsp;\nNew-ThrottlingPolicy &ndash;name Outlook2003Calendar\nSet-ThrottlingPolicy &ndash;identity Outlook2003Calendar &ndash;RCAMaxConcurrency 100\nSet-Mailbox &ndash;Identity &ldquo;MAILBOX-USER&rdquo; &ndash;ThrottlingPolicy Outlook2003Calendar\n&nbsp;\nGr&uuml;&szlig;e   dn"
        },
        {
          "id": "post-powershell-rekursiv-nach-anderungsdatum-sortieren",
          "title": "PowerShell–Rekursiv nach Änderungsdatum sortieren",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/powershell-rekursiv-nach-anderungsdatum-sortieren/",
          "content": "Ganze Ordnerstrukturen oder Laufwerke nach Dateien zu durchsuchen die zuletzt ge&auml;ndert worden sind kann ganz sch&ouml;n m&uuml;hsam sein. Mit der PowerShell geht das in einem Oneliner.\nPS X:\\&gt; Get-ChildItem C:\\Windows\\Logs -Recurse | Sort-Object -Property LastWriteTime &ndash;Descending | Where-Object {$_.Mode -notlike \"d*\"} | Select-Object -First 10 | Format-Table -Property LastWriteTime,FullName &ndash;AutoSize\nDieses Beispiel durchsucht C:\\Windows\\Logs rekursiv und sortiert Absteigend nach &ldquo;LastWriteTime&rdquo;. Ordner werden standardm&auml;&szlig;ig auch zur&uuml;ckgegeben, diese werden mit &ldquo;Where-Object&rdquo; gefiltert. Da mich nur die 10 Dateien interessieren die zuletzt ge&auml;ndert wurden verwende ich &ldquo;Select-Object&rdquo;. Anschlie&szlig;end wird die Ausgabe noch Formatiert. Das Ganze sieht dann so aus:\n\nM&ouml;chte man das Ergebnis in eine Datei schreiben, bietet sich das cmdlet &ldquo;Export-CSV&rdquo; an, daf&uuml;r &auml;ndert man die &ldquo;Select-Object&rdquo; Abfrage z.B. folgenderma&szlig;en:\nPS X:\\&gt; Get-ChildItem C:\\Windows\\Logs -Recurse | Sort-Object -Property LastWriteTime -Descending | Where-Object {$_.Mode -notlike \"d*\"} | Select-Object &ndash;Property FullName,CreationTime,LastWriteTime,LastAccessTime,Length,Attributes | Export-Csv Report.csv\nDas Ergebnis sieht dann so aus:\n\nDurch &Auml;nderungen der Where, Select, Format cmdlets bzw. Parameter l&auml;sst sich eine Vielzahl von Ausgaben erzeugen, f&uuml;r weitere Informationen und Hilfe zu den einzelnen cmdlets:\nGet-Help cmdlet &ndash;Online\nAchtung: Der Parameter &ldquo;Recurse&rdquo; geht durch alle untergeordneten Verzeichnisse, das kann je nach Struktur ziemlich lange dauern. Au&szlig;erdem gelten Berechtigungen nat&uuml;rlich auch f&uuml;r die PowerShell, man kann also nicht Ordner durchsuchen auf die man keine Rechte hat, das sieht dann so aus:\n\nhave fun!    tom"
        },
        {
          "id": "post-diginotar-nur-ein-zufall!",
          "title": "DigiNotar–nur ein Zufall!?",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Client, Server",
          "url": "/post/diginotar-nur-ein-zufall!/",
          "content": "Vor einigen Tagen wurde bekannt das bereits Anfang Juni(!!) bei einem Hack der niederl&auml;ndischen Zertifizierungsstelle &ldquo;DigiNotar&rdquo; mehr als 500 &ldquo;gef&auml;lschte&rdquo; Zertifikate ausgestellt wurden.\nUnter den Zertifikaten befinden sich folgende Wildcard Zertifikate:\n\n*.*.com *.*.org *.10million.org *.android.com *.aol.com *.azadegi.com *.balatarin.com *.comodo.com *.digicert.com *.globalsign.com *.google.com *.JanamFadayeRahbar.com *.logmein.com *.microsoft.com *.mossad.gov.il *.mozilla.org *.RamzShekaneBozorg.com *.SahebeDonyayeDigital.com *.skype.com *.startssl.com *.thawte.com *.torproject.org *.walla.co.il *.windowsupdate.com\n\nEine vollst&auml;ndige Liste der Zertifikate gibt es hier.\n&nbsp;\nDer Angriff wurde entdeckt weil in Googles Chrome Browser die g&uuml;ltigen Zertifikate fix hinterlegt sind, der Browser also beim Anzeigen vermeintlich authentischer Google Inhalte gemeckert hat. Wenn die &ldquo;T&auml;ter&rdquo; den &ldquo;User Agent String&rdquo; von Chrome gefiltert h&auml;tten, wer wei&szlig; wann (und ob) dieser Hack &ouml;ffentlich geworden w&auml;re&hellip;\nVermutungen wie viele derartige Angriffe bisher unerkannt geblieben sind und wer dahinter steckt &uuml;berlasse ich anderen. Ich hoffe allerdings dass die Debatte um Sicherheit und das &ldquo;Web of Trust&rdquo; weitergef&uuml;hrt wird und durch solche krassen Vorf&auml;lle mehr Aufmerksamkeit bekommt.\n&nbsp;\n&nbsp;\nBetroffene CAs\nFolgende Zertifizierungsstellen m&uuml;ssen aus allen Browsern, Applikationen und Betriebssystemen verschwinden, sie gelten als NICHT mehr Vertrauensw&uuml;rdig:\n\n\n\nCertificate\nIssued by\nThumbprint\n\n\nDigiNotar Root CA\nDigiNotar Root CA\nc0 60 ed 44 cb d8 81 bd 0e f8 6c 0b a2 87 dd cf 81 67 47 8c\n\n\nRoot CA G2\nDigiNotar Root CA G2\n43 d9 bc b5 68 e0 39 d0 73 a7 4a 71 d8 51 1f 74 76 08 9c c3\n\n\nPKIoverheid CA Overheid\nStaat der Nederlanden Overheid CA\nb5 33 34 5d 06 f6 45 16 40 3c 00 da 03 18 7d 3b fe f5 91 56\n\n\nPKIoverheid CA Organisatie - G2\nStaat der Nederlanden Organisatie CA - G2\n5d e8 3e e8 2a c5 09 0a ea 9d 6a c4 e7 a6 e2 13 f9 46 e1 79\n\n\nPKIoverheid CA Overheid en Bedrijven\nStaat der Nederlanden Overheid CA\n40 aa 38 73 1b d1 89 f9 cd b5 b9 dc 35 e2 13 6f 38 77 7a f4\n\n\n\nWindows Update\nMicrosoft hat inzwischen reagiert und ein Windows Update zur Verf&uuml;gung gestellt, genauere Informationen findet man im Microsoft Security Advisory (2607712).\nWie an vielen Stellen zu lesen ist soll es mit diesen Zertifikaten m&ouml;glich sein gef&auml;lschte Windows Updates zu verteilen, das ist laut Microsoft NICHT der Fall. Der Windows Update Client installiert ausschlie&szlig;lich Pakete die mit dem &ldquo;Microsoft Root Certificate&rdquo; signiert sind.\n&nbsp;\nFirefox\nF&uuml;r Mozilla Firefox wir ein Update in k&uuml;rze erwartet, hier empfiehlt es sich die genannten CAs manuell zu entfernen!\nUnter Einstellungen, Erweitert, Verschl&uuml;sselung klickt man auf &ldquo;Zertifikate anzeigen&rdquo;. Jetzt bekommt man eine Liste der Zertifizierungsstellen und kann das Vertrauen entziehen.\nWeitere Infos im Mozilla Security Blog.\n&nbsp;\n&nbsp;\nApple\nApple hat wohl zur Zeit andere Priorit&auml;ten, MAC Benutzer sollten auf jeden Fall manuell die oben genannten Zertifikate entfernen. Chester Wisniewski von Sophos beschreibt das Ganze so:\nWhat about Apple users? Well, apparently they are too busy playing Angry Birds and making pictures in Photoshop to worry about pesky certificate issues.&lt;/p&gt;\nMy advice if you run a Mac? Use BootCamp and Windows 7 until Apple decides to provide a patch. Or I guess you could use Firefox (not Chome, it also uses Apple's KeyChain)...&lt;/code&gt;\nEin erster Bericht der Security Consultants Fox-IT zum Thema ist verf&uuml;gbar:\nhttp://www.rijksoverheid.nl/ministeries/bzk/documenten-en-publicaties/rapporten/2011/09/05/diginotar-public-report-version-1.html\nstay secure  tom"
        },
        {
          "id": "post-esxi-persistent-scratch-location",
          "title": "ESXi–Persistent Scratch Location",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "VMware, Server",
          "url": "/post/esxi-persistent-scratch-location/",
          "content": "In diesem Artikel habe ich beschrieben wie man den ESXi Hypervisor auf einem USB Stick installieren kann. Ein Nachteil dieser Installation ist das Fehlen der Scratch Partition, sie wird nicht automatisch erstellt da Flash Medien eine beschränkte Anzahl von schreib/lese Zyklen haben und sich so nicht besonders als Speicherort für Logfiles eignen.\n&#160;\nESXi Scratch Partition\nDie Scratch Partition ist optional und wird standardmäßig während der Installation von ESXi auf lokalem Storage angelegt. Wenn lokaler Storage verfügbar ist wird die Scratch Partition mit 4GB angelegt, sie wird verwendet um den Output von “vm-support” zu speichern, gibt es keine Scratch Partition wird dieser wird dieser Output in den RAM geschrieben.\nWird die Scratch Partition automatisch erstellt ist es nicht empfohlen die bestehende Konfiguration zu ändern, wird die Scratch Partition nicht automatisch angelegt (z.B. bei Installation auf USB) ist es empfohlen manuell einen Speicherort für “Scratch” zu konfigurieren.\nConfigure Scratch Location – vSphere Client\nUm die Scratch Location manuell zu konfigurieren muss man zuerst einen Ordner auf einem Datastore anlegen, der ESXi Host muss natürlich Zugriff auf diesen Datastore haben. Dazu wechselt man im vSphere Client auf “Configuration” und wählt unter “Storage” einen Datastore aus, mit rechtsklick “Browse Datastore” öffnet man den Datastore Browser und legt einen Ordner an. \nAchtung: Es muss einen eindeutigen Ordner pro ESXi Host geben, man kann nicht einen Scratch Ordner für mehrere Hosts verwenden!\nDie Scratch Location wird in den “Advanced Settings” unter “Configuration”, “Software” konfiguriert. Dort gibt es einen Abschnitt “ScratchConfig” welcher ein Textfeld für die Einstellung “ScratchConfig.ConfiguredScratchLocation” anzeigt. In dieses Textfeld muss der vollständige Pfad zum Order eingegeben werden, also z.B: /vmfs/volumes/&lt;myDatastore&gt;/.scratch-esx1\n\nAchtung: diese Einstellung wird erst nach einem Neustart des ESXi Hosts wirksam.\nvSphere Client Login– A general system error occured\nWird eine Active Directory Domain zur Authentifizierung angegeben und es ist keine Scratch Partition Konfiguriert kann man sich am vSphere Client nicht anmelden und bekommt eine (sehr vielsagende) Fehlermeldung, entweder: “A general system error occured” oder “gss_acquire_cred failed”\n\nDer Grund für den Fehler ist offensichtlich dass ESXi versucht Informationen über die Anmeldung in ein Logfile unter /scratch/var/tmp zu schreiben.\nGenauere Infos zum Thema gibts hier:\nhttp://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=1033696\nhttp://blogs.vmware.com/esxi/2011/04/scratch-partition-best-practices-for-usbsd-booted-esxi.html\nhttp://blogs.vmware.com/esxi/2011/03/ops-changes-part-5-scratch-partition.html\nso long,   tom"
        },
        {
          "id": "post-citrix-ima-dienst-startet-nicht-mehr",
          "title": "Citrix IMA Dienst startet nicht mehr",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Citrix",
          "url": "/post/citrix-ima-dienst-startet-nicht-mehr/",
          "content": "Lässt sich der Citrix IMA Dienst nicht mehr starten, können keine eingehende Verbindung zum Citrix Server mehr initiiert werden. Versucht man den IMA Dienst zu starten und erhält folgende Fehlermeldung: \nWindows could not start Citrix Independent Management Architecture on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code –2147483647\n&#160;\n\n&#160;\nOpening the Event Viewer of the affected server shows this event on the System Log:&lt;/p&gt;    “Failed to load plugin C:\\Prgoram Files (x86)\\Citrix\\System32\\Citrix\\IMA\\Subsystems\\RADESessionsSs.dll with error IMA_RESULT_FAILURE”&lt;/code&gt;  &#160;    &#160;  In den meisten Fällen ist die lokale Streaming Offline Datenbank korrupt. Dies lässt sich meist durch den Befehl dsmaint recreaterade beheben.   Lässt sich der IMA Dienst immer noch nicht starten, sind wahrscheinlich die Verbindungseinstellungen im File C:\\Program Files (x86)\\Citrix\\Independent Management Architecture\\RadeOffline.dsn korrupt:  Fehlerhafte Konfiguration:    Diese muss durch eine gültige Konfiguration ersetzt werden:    Nun ist es noch notwendig die Streaming Offline Datenbank neu zu erstellen:  dsmaint recreaterade   Der Citrix IMA Dienst sollte sich jetzt normal starten lassen.  &#160;  Grüße   dn"
        },
        {
          "id": "post-citrix-xenapp6-fehler-beim-starten-des-webservice",
          "title": "Citrix XenApp6 Fehler beim starten des Webservice",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Citrix",
          "url": "/post/citrix-xenapp6-fehler-beim-starten-des-webservice/",
          "content": "Letztens bin ich auf ein seltsamen Problem in XenApp6 gestoßen:\nSobald man den Webservice startet und einen Verbindungsversuch unternimmt, beendet sich der ApplicationPool und Verbindungen werden terminiert.\nIm EventLog wird folgender Fehler protokolliert:\n&#160;\nLog Name: Application&lt;/p&gt;    Source: Microsoft-Windows-IIS-W3SVC-WP    Date: 17/06/2011 09:37:36    Event ID: 2307    Task Category: None    Level: Error    Keywords: Classic    User: N/A    Computer: ts1.ntsystems.it    Description:    The worker process for application pool 'CitrixWebInterface5.3.0AppPool' encountered an error 'Failed to decrypt attribute 'password'    ' trying to read configuration data from file '\\\\?\\C:\\inetpub\\temp\\apppools\\CitrixWebInterface5.3.0AppPool.config', line number '150'. The data field contains the error code.&lt;/code&gt;  &#160;  Lösung  Um den Fehler zu beheben und das Webinterface richtig starten zu können, müssen in der Datei C:\\Windows\\System32\\inetsrv\\config\\applicationHost.config die Zeilen zwischen  &lt;configProtectedData&gt; gelöscht werden. Wichtig ist dabei, dass IIS vorher beendet wurde. Danach muss der Service wieder gestartet, der ApplicationPool lässt sich nun auch normal starten. Eingehende Verbindungen zum Webinterface werden nun auch richtig verarbeitet.  &#160;  Grüße   dn"
        },
        {
          "id": "post-ex2k10-pst-in-archive-importieren",
          "title": "EX2k10 PST in Archive importieren",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/ex2k10-pst-in-archive-importieren/",
          "content": "Um PST Files in ein Exchange 2010 SP1 Archive-Mailbox zu verschieben muss zunächst sichergestellt werden, dass der Microsoft Exchange Mailbox Replication Dienst gestartet ist. Zudem muss der Gruppe “Exchange Trusted Subsystem Security Group” NTFS und Freigabeberechtigungen für das PST File gegeben werden.\n&#160;\nUm den Import durchzuführen muss jetzt das entsprechende Benutzerkonto der neuen Gruppe “Mailbox Import Export Group” hinzugefügt werden:\nNew-RoleGroup &quot;Mailbox Import Export Group&quot; -Roles &quot;Mailbox Import Export&quot;\nAdd-RoleGroupMember &quot;Mailbox Import Export Group&quot; -Member &quot;Administrator&quot;\n&#160;\nNun kann das PST File über den Befehl New-MailboxImportRequest in das Archiv importiert werden. \nAnbei ein Script, wo man im File Users.csv PST Files den jeweiligen Benutzern zuweisen und den Import Request generieren kann:\nimport-csv &quot;Users.csv&quot;|ForEach{&lt;/p&gt;    New-MailboxImportRequest -Mailbox $_.user -FilePath $_.Path -BadItemLimit 50 -IsArchive    }&lt;/code&gt;  Bsp für Users.csv:  User,Path   daniel.nitz,\\\\share\\daniel-PST.PST  &#160;  Grüße   dn&lt;/td&gt;&lt;/tr&gt;"
        },
        {
          "id": "post-lync-integration-in-outlook-web-app-2010",
          "title": "Lync Integration in Outlook Web App 2010",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/lync-integration-in-outlook-web-app-2010/",
          "content": "Seit einiger Zeit ist der Nachfolger des Office Communication Servers verf&uuml;gbar, Lync 2010 vereint Enterprise Voice, Instant Messaging, Presence sowie Live Meeting, weitere Details gibts hier: http://lync.microsoft.com/en-us/Pages/default.aspx\nAuch Outlook Web App kann als Lync Client konfiguriert werden, folgende Features werden direkt von OWA unterst&uuml;tzt, es wird daf&uuml;r kein Client auf dem PC ben&ouml;tigt:\n\nPresence, der Status anderer wird angezeigt, au&szlig;erdem kann man seinen Status &auml;ndern bzw. sich an- und abmelden \nDie Lync Kontaktliste wird angezeigt \nInstant Messaging mit einem Web Client \n\nPrerequisites\n\nAuf dem Client Access Server m&uuml;ssen die Komponenten f&uuml;r Microsoft Office Communications Server 2007 R2 Web Service Provider installiert werden. \nDer Common Name im Zertifikat des Client Access Servers muss der FQDN des Client Access Servers sein. Wenn es sich um ein CAS Array handelt muss der Common Name dem FQDN des CAS Array entsprechen. \nInstant Messaging muss auf dem Client Access Server aktiviert werden \nIn der Lync Umgebung muss ein Trusted Application Pool und eine Trusted Application erstellt und aktiviert werden. \n\nExchange Client Access Server/Array Konfiguration\nFolgende Pakete herunterladen:\n\nOffice Communication Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=2310 \nHotfix f&uuml;r den OC Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=797 \nHotfix f&uuml;r Unified Communication API:      http://www.microsoft.com/download/en/details.aspx?id=7557 \n\nAls erstes wird jetzt CWAOWASSPMain.msi installiert, dieses Paket erstellt einen Ordner (Standard: C:\\Web Service Provider Installer Package\\) und kopiert die ben&ouml;tigten Installationsdateien f&uuml;r den OC Web Service Provider in diesen Ordner. Jetzt in diesen Ordner wechseln und die Pakete in folgender Reihenfolge installieren\n\nvcredist_x64.exe \nUcmaRedist.msi \nCWAOWASSP.msi \n\nJetzt fehlen noch die Hotfixes aus den Downloads 2 und 3, auch diese Pakete installieren\n\nUcmaRedist.msp \nCWAOWASSP.msp \n\nDie ben&ouml;tigte Software ist somit installiert, jetzt muss Instant Messaging noch aktiviert werden. Die Konfiguration daf&uuml;r wird am OWA Virtual Directory gemacht. Der InstantMessagingType wird auf OCS ge&auml;ndert, als InstantMessagingServerName wird der Lync Server angegeben. Au&szlig;erdem muss der Thumbprint des Zertifikates das f&uuml;r TLS verwendet werden soll angegeben werden und InstantMessaging aktiviert werden. Folgende PowerShell Befehl erledigt dieses Schritte:\n$iiscert = (Get-ExchangeCertificate | Where {$_.Services -like \"*IIS*\"}).Thumbprint\nGet-OWAVirtualDirectory -Server ex14.ntsystems.local | Set-OWAVirtualDirectory -InstantMessagingType OCS -InstantMessagingEnabled:$true -InstantMessagingCertificateThumbprint $iiscert -InstantMessagingServerName lync.ntsystems.local\nAchtung: Wenn bei Get-OWAVirtualDirectory der Parameter Server weggelassen wird werden alle Virtual Directories der Exchange Umgebung konfiguriert. Bei InstantMessagingServerName muss der FQDN des Lync Servers angegeben werden.\nIn einem CAS Array m&uuml;ssen diese Schritte auf allen Servern wiederholt werden.\nLync Server Konfiguration\nMit dem Lync Server Topology Builder wird jetzt unter &ldquo;Trusted Application Servers&rdquo; ein neuer Application Pool angelegt. Dieser Pool wird als Single Computer Pool angelegt, der FQDN muss dabei entweder dem Namen des Client Access Server oder dem Namen des CAS Arrays entsprechen.\n\nJetzt wird der Lync Server Frontend Pool ausgew&auml;hlt, welcher f&uuml;r diese Applikation verwendet werden soll.\n\nDer Server ist jetzt erstellt, Standardm&auml;&szlig;ig ist &ldquo;Enable replication of configuration data to this pool&rdquo; aktiviert, das wird nicht ben&ouml;tigt und kann in den Eigenschaften des soeben erstellten Objektes deaktiviert werden.\n\nJetzt kann die &Auml;nderung der Topologie ver&ouml;ffentlicht werden, dazu klickt auf Action, Topology und Publish.\nEs fehlt noch die CSTrustedApplication, diese wird &uuml;ber die Lync Server Management Shell angelegt. Auch dabei muss wieder der FQDN des Client Access Servers oder des CAS Arrays angegeben werden, au&szlig;erdem wird ein Port f&uuml;r die Applikation angegeben, nat&uuml;rlich muss ein Port verwendet werden der frei ist. (netstat &ndash;an zeigt verwendete Ports an). Mit folgendem PowerShell Befehl wird die Applikation erstellt:\nNew-CsTrustedApplication -ApplicationID OWA -TrustedApplicationPoolFqdn ex14.ntsystems.local -Port 4999\nDiese Konfiguration muss noch aktiviert werden, das wird mit folgendem PowerShell cmdlet gemacht:\nEnable-CsTopology\nEnjoy\nDie Konfiguration ist jetzt abgeschlossen, ab jetzt sind die neuen Features in Outlook Web App aktiv&hellip;\n\nTroubleshooting\n\nFQDN &ndash; Der CN im Zertifikat des Client Access Servers (oder Arrays) muss passen. Mit Get-CsTrustedApplication bzw. Get-CsTrustedApplicationComputer kann man die Lync Konfiguration nochmal &uuml;berpr&uuml;fen \nLync Server Logging Tool &ndash; bei vielen Problemen hilft das Log des SIPStack \n\n&nbsp;\nviel Spa&szlig;    tom"
        },
        {
          "id": "post-cisco-aaa",
          "title": "Cisco AAA",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Network, Server",
          "url": "/post/cisco-aaa/",
          "content": "Nachdem der RADIUS Server konfiguriert ist geht es an die Konfiguration des Clients.\nBei Cisco muss dazu das “neue” AAA Model aktiviert werden. Das geht einfach mit folgendem Befehl:\naaa new-model      \n\nLokale Authentifizierung\nAchtung: nach absetzen dieses Befehls ist das neue Model aktiv, d.h. man kann sich nur mehr mit Benutzername und Passwort anmelden. Man sollte jetzt einen lokalen Benutzer angelegen, dieser kann auch im Fallback Fall, also wenn der RADIUS Server nicht erreichbar ist, verwendet werden. Mit folgendem Befehl legt man einen lokalen User cisco mit Passwort cisco an:\nusername cisco secret cisco \nRadius Server\nBevor man RADIUS als Authentifizierung verwenden kann muss ein RADIUS Server konfiguriert werden. Mit folgenden Befehlen konfiguriert man den RADIUS Server 10.1.1.100 und den entsprechendem Pre-Shared Key. RADIUS verwendet standardmäßig die UDP Ports 1812 und 1813 für Authentifizierung und Accounting, Cisco Geräte verwenden die Ports 1645 und 1646, das kann man evtl. mit “auth-port 1812 acct-port 1813” ändern. Der NPS RADIUS Server antwortet auf beide Varianten, man muss das also nicht definieren.\nradius-server host 10.1.1.100 key PRE_SHARED_KEY\nMit “radius-server retransmit x” kann man angeben wie oft eine Anfrage gesendet wird wenn innerhalb des Timeouts keine Antwort kommt. Das Zeitfenster für das Timeout kann mit “radius-server timeout x” auf x Sekunden erhöht werden. Das Interface über welches der Cisco Switch die RADIUS Anfrage schickt kann mit “ip radius source-interface x” angegeben werden.\nAAA Listen\nDas AAA Authentication Model arbeitet mit Listen, man definiert eine Liste und weißt diese Liste einem Interface zu. Die Liste “default” gilt für alle Interfaces auf denen keine andere Liste gebunden ist. Folgender Befehl setzt die Standardauthentifizierung auf RADIUS, Fallback (RADIUS nicht erreichbar) ist local:\naaa authentication login default group radius local      \nAb diesem Zeitpunkt muss man sich an allen Interfaces mit Benutzername und Passwort vom RADIUS Server anmelden.\nWenn die Netzwerkgeräte in sicheren Serverräumen untergebracht sind kann man sich überlegen die Authentifizierung für den Console Port zu deaktivieren, damit man im Desaster Fall noch eine letzte Hoffnung auf Zugriff hat. Dazu legt man eine Liste an und setzt die Authentifizierung auf “none”, danach bindet man die Liste auf “line con 0”:\naaa authentication login liste1 none&lt;/p&gt;    line con 0      &#160; login authentication liste1&lt;/code&gt;  Authorization  Am RADIUS Server habe ich in den Settings das Attribut Service-Type auf “Administrative” gesetzt. Dadurch müsste ich eigentlich im “enable” Mode landen. Das funktionier jedoch erst nachdem auch die Authorization auf RADIUS gesetzt wurde. Folder Befehl legt fest dass RADIUS für alle Interfaces verwendet wird, die Console ist dabei ausgeschlossen:  aaa authorization exec default group radius local  Um Authorization auf der Console über RADIUS zu aktivieren wird folgender Befehl verwendet:  aaa authorization console  Wenn ich mich erneut anmelden lande ich direkt im “Enable” Mode des Switches.  Logging  Am NPS wird im Event Log Security ein Event 6272 aufgezeichnet, außerdem wird im Logfile (D:\\NPS\\LogFiles) ein Eintrag hinzugefügt.  Sniffing  Mit Wireshark o.ä. sieht man ein RADIUS Access-Request Paket vom Switch zum NPS Server und ein RADIUS Access-Accept Paket vom NPS Server zum Switch.  Das Access-Request Paket enthält unter anderem folgende Informationen:  User-Name: Der Benutzer der sich am RADIUS Client anmeldet  Calling-Station-Id: IP Adresse des Clients (der z.B. die Telnet Session öffnet)  NAS-IP-Address: IP Adresse des RADIUS Clients  Das Access-Accept Paket enthält die AV-Pair Informationen:  AVP: Attribute Value Pair das am NPS konfiguriert wurde (Service-Type: Administrative)    &#160;  tom"
        },
        {
          "id": "post-cisco-aaa-nps-radius-server",
          "title": "Cisco AAA–NPS RADIUS Server",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Network",
          "url": "/post/cisco-aaa-nps-radius-server/",
          "content": "In größeren Netzwerken kann es aufgrund der Firmenrichtlinie oder der Gesetzgebung notwendig sein sich an den Netzwerkgeräten mit persönlichen User Accounts anmelden zu müssen. Man kann dafür natürlich für jeden Netzwerkadministrator ein persönliches Account auf allen Geräten anlegen, oder man authentifiziert gegen einen RADIUS Server. Dieser RADIUS Server kann z.B. ein Network Policy Server sein, der seit Windows Server 2008 den IAS abgelöst hat. Der Vorteil so einer Implementierung liegt auf der Hand, die Authentifizierung wird über das Zentrale Active Directory gesteuert und Benutzerkonten müssen nur an einem Ort gepflegt werden.\nNPS\nDie NPS Serverrolle muss auf einem Server hinzugefügt werden, ob das ein dedizierter Server ist oder ob man die Rolle auf einem andern mitlaufen lässt hängt von der Größe der Umgebung ab. Die Rolle kann wie jede andere über den Servermanager oder das PowerShell cmdlet Add-WindosFeature hinzugefügt werden. Damit das cmdlet verfügbar ist muss das Modul ServerManager geladen werden.\n\n\nFür RADIUS reicht der NPAS-Policy-Server. Wen die Rolle hinzugefügt wurde kann NPS konfiguriert werden, der erste Schritt ist es den NPS Server im Active Directory zu registrieren. Rechtsklick auf NPS (local) und “Register Server in Active Directory” wählen&quot;\n\nDer zweite Schritt ist die Konfiguration des Accounting, bzw. Logging, dafür gibt es in der NPS Konsole unter dem Punkt “Accounting” drei Einstellungsmöglichkeiten.\nDer “Configure Accounting Wizard” erleichtert einem Konfiguration:\n\nIch entscheide mich für das Logging in ein Textdokument, je nach Umgebung kann man auch einen zentralen SQL Server angeben.\nDen Ordner für die Log Files lege ich auf eine zweite Partition. \nDer NPS Server ist nun konfiguriert, es fehlen noch die RADIUS Clients sowie das Regelwerk das definiert wer sich anmelden darf.\n\nRadius Clients\nJedes Netzwerkgerät das über NPS authentifizieren will muss dort als RADIUS Client angelegt werden, in diesem Schritt werden der Name, die IP Adresse und der Pre-Shared Key für jeden Client festgelegt. Der Pre-Shared Key wird verwendet um den RADIUS Client zu authentifizieren, der Benutzer meldet sich mit seinem Benutzernamen und Passwort an.\nUm einen RADIUS Client anzulegen erweitert man den Ordner “RADIUS Clients and Servers” in der NPS Konsole, Rechtslick auf “RADIUS Clients” und “New” öffnet den Dialog “New RADIUS Client”.\nUnter dem Reiter “Settings” wird der Friendly name konfiguriert, dieser ist später wichtig für die Konfiguration der Regeln. Außerdem gibt man hier die IP Adresse des Clients an, der Pre-Shared Key kann manuell eingegeben werden, ich empfehle jedoch ihn automatisch zu generieren. (Achtung: einige alte Geräte unterstützen nur Keys bis zu einer bestimmten Länge)\n\nUnter Advanced könnte man noch ein bestimmtes RADIUS Feature Set auswählen, normalerweise reicht aber der Standard aus. \n\nConnection Request Policy\nÜber die Connection Request Policy wird definiert welcher RADIUS Client wie authentifiziert wird. NPS kann auch als RADIUS Proxy arbeiten und könnte daher anfragen eines Clients selbst authentifizieren und die eines andern an einen Remote RADIUS Server weiterleiten, dieser Server muss zuerst unter “RADIUS Clients and Servers” angelegt werden.\nDie Standardregel ist so konfiguriert dass alle anfragen Lokal, also gegenüber Active Directory, authentifiziert werden.\nNetwork Policy\nDie Network Policy definiert wer sich unter welchen Umständen authentifizieren darf. Da beide Standardregeln keinen Zugriff zulassen müssen wir eine neue Network Policy anlegen, Rechtsklick auf “Network Policy” und “New” öffnet den Dialog “New Network Policy”.\n\nAuf der ersten Seite wird eine Name für die neue Richtlinie konfiguriert, der Rest bleibt Standard.\n\nAuf dieser Seite werden die Konditionen definiert unter welchen die Authentifizierung erfolgreich ist. Man kann z.B. den RADIUS Client und eine bestimmt AD Gruppe hinzufügen, die beiden Kriterien sind “AND” verknüpft, müssen also beide zutreffen. Der Benutzer der sich am Client “cisco_1” anmeldet muss also Mitglied der Gruppe NetworkAdmins sein damit er sich authentifizieren darf.\n\nIm nächsten Schritt wird festgelegt ob diese Regel den Zugriff erlaubt oder verweigert.\n\nPAP muss als Authentifizierungsmethode hinzugefügt werden, man wird darauf hingewiesen dass diese Methode nicht sicher ist da das Passwort in Clear-Text über die Leitung geht, das muss man wohl oder übel in kauf nehmen.\n\nHier könnte man weitere verbindungsspezifische Einstellungen machen, für die Authentifizierung an Netzwerkgeräte wird das allerdings nicht benötigt.\n&#160;\nIm letzten Schritt werden die Einstellungen konfiguriert die der RADIUS Server in der Antwort mitschickt, hier kann man sogenannte Attribute-Value (AV)-Pairs konfigurieren. Diese AV-Pairs sind Herstellerabhängig, bei Cisco z.B. kann man mit Attribut 6 den Service-Type definieren, gibt man “Administrative” an landet ein authentifiziert User direkt im “enable” Mode. Framed-Protcol PPP kann gelöscht werden, Service-Type ändere ich auf “Administrative”\n&#160;\nSomit ist der NPS Server fertig konfiguriert und bereit Anfragen von einem RADIUS Client mit der IP 10.1.1.254 und dem richtigen Pre-Shared Key zu beantworten. Nur Benutzer die Mitglied der Gruppe NetworkAdmins sind dürfen sich am RADIUS Client anmelden, ist die Authentifizierung erfolgreich sollte der Benutzer gleich im “enable” Mode sein.\n&#160;\nIm nächsten Artikel konfiguriere ich einen Cisco Switch für RADIUS Authentifizierung.\ntom"
        },
        {
          "id": "post-one-note-kleiner-tipp",
          "title": "One Note–Kleiner Tipp",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Client",
          "url": "/post/one-note-kleiner-tipp/",
          "content": "Ich werde von Tag zu Tag ein gr&ouml;&szlig;erer Fan von Microsoft OneNote. Dokumentationen und Notizen lassen sich perfekt mit diesen starken Tool verwalten und pflegen. (Ich liebe die eingebaute Funktion &ldquo;Bildschirmausschnitt&rdquo;)\nVor ein paar Tagen ist mir aufgefallen, dass die Suche in OneNote ein tolles Feature beinhaltet: Es kann Screenshots nach Text durchsuchen!!\nTestet es einfach aus, erstellt einen Screenshot und sucht im Suchfeld nach Text, welcher sich im Screenshot befindet. Ihr werdet &uuml;berrascht sein \n&nbsp;\n\n&nbsp;\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-subdomain-certificate-enrollment",
          "title": "Subdomain Certificate Enrollment",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Client, Server",
          "url": "/post/subdomain-certificate-enrollment/",
          "content": "Wenn man f&uuml;r einen Server aus einer Subdomain ein Zertifikat aus der Zertifizierungsstelle in der Root-Domain ausstellen m&ouml;chte, wird das aufgrund fehlender Berechtigungen nicht funktionieren. Um das Zertifikat erfolgreich ausstellen zu k&ouml;nnen muss der Computer bzw. die Dom&auml;nencomputer Mitglieder der Gruppe CERTSVC_DCOM_ACCESS der Root-Domain sein:\n\nDanach ist es notwendig den Server neu zu starten, welcher das Zertifikat erhalten soll.\nNun kann das Zertifikat ausgestellt werden.\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-installing-vsphere-powercli",
          "title": "Installing vSphere PowerCLI",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, VMware",
          "url": "/post/installing-vsphere-powercli/",
          "content": "Mit vSphere PowerCLI bietet VMware ein PowerShell Snapin das mit &uuml;ber 250 cmdlets die Verwaltung der vSphere Umgebung vereinfacht bzw. Automatisierung&nbsp; erm&ouml;glicht.\nDie aktuelle Version kann unter http://vmware.com/go/powercli heruntergeladen werden.\n&nbsp;\nDie Installationsroutine installiert au&szlig;er den PowerShell Snapins die VMware VIX API, die das Management von virtuellen Maschinen erm&ouml;glicht. Diese API erlaubt es Programme direkt im Gastsystem der VM ausf&uuml;hren bzw. Dateien zu manipulieren.\nNachdem das License Agreement akzeptiert wurde, kann man den Pfad f&uuml;r die Installation festlegen, jetzt noch auf installieren klicken und das wars.\n\nAuf dem Desktop wurde eine Verkn&uuml;pfung zu PowerCLI angelegt, sonst findet man sie unter Start, Programme, VMware, VMware vSphere PowerCLI.\nWenn man die PowerCLI startet wird das PSSnapin &ldquo;VMware.VimAutomation.Core&rdquo; geladen, dieses kann nat&uuml;rlich auch in einer &ldquo;normalen&rdquo; PowerShell Session mit Add-PSSnapin hinzugef&uuml;gt werden.\n\nWie in der Titelleist zu erkennen ist, ist die PowerCLI standardm&auml;&szlig;ig &ldquo;not connected&rdquo;, um auf die Virtuelle Umgebung zugreifen zu k&ouml;nnen muss man eine Verbindung mit dem vCenter Server herstellen. Dazu verwendet man das Connect-VIServer cmdlet, z.B.:\nConnect-VIServer vcenter.ntsystems.local &ndash;credential (Get-Credential)\nMit diesem Befehl verbindet man die PowerCLI mit dem vCenter Server und kann alternative Anmeldeinformationen mitgeben, wenn der Benutzer mit dem die PowerCLI gestartet wurde ausreichende Rechte im vCenter hat kann man &ndash;credential nat&uuml;rlich weglassen.\nWenn die Verbindung hergestellt wurde kann man mit PowerCLI arbeiten und sich z.B. eine Liste der VMs ausgeben lassen die nicht eingeschaltet sind:\nGet-VM | ?{$_.PowerState -notlike \"*On*\"}\nAlternativ kann man PowerCLI auch direkt mit einem ESX/ESXi Host verbinden, das ist z.B n&ouml;tig um mit Get-ESXTop Performance Informationen &uuml;ber einen Host zu sammeln.\n&nbsp;\nDie Hilfe zur PowerCLI kann einfach mit dem cmdlet Get-PowerCLIHelp aufgerufen werden, empfehlenswert ist auch Get-PowerCLICommunity.\n&nbsp;\nHier noch ein kleiner Tipp: Wer die PowerShell ISE verwendet kann eigene Add-Ons hinzuf&uuml;gen. Ich habe ein einfaches Add-On gebastelt um das PowerCLI Snapin in die ISE Session zu laden. Dazu einfach folgendes Script in das ISE Profil kopieren. Um die ISE Profil Datei zu &ouml;ffnen &ldquo;notepad $profile.CurrentUserCurrentHost&rdquo; in der ISE ausf&uuml;hren.\n&nbsp;\n$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add(     &nbsp; \"Connect to vCenter\",      &nbsp;&nbsp;&nbsp; {      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add-PSSnapin VMware.VimAutomation.Core      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $VIServer = Read-Host -Prompt \"ESX/ESXi Host or vCenter Server FQDN\"      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Test-Connection $VIServer -Quiet) {Connect-VIServer $VIServer}      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {Write-Output \"Server not reachable\"}      &nbsp;&nbsp;&nbsp; },      &nbsp; \"Control+Alt+V\"      )\nDie Profildatei sollte signiert sein, wie man das macht habe ich hier beschrieben.\n&nbsp;\nso long   tom"
        },
        {
          "id": "post-upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht",
          "title": "Upgrade Windows Server 2008R2 Sp1 - BlackBerry Monitoring Service startet nicht",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht/",
          "content": "Nach dem Update auf Windows Server 2008R2 Sp1 starten die Monitoring Services des BlackBerry Enterprise Servers nicht mehr. Betroffen sind folgende Dienste:\nBBMonitoringService_APP - BlackBerry Monitoring Service - Application Core&lt;/p&gt;    BBMonitoringService_DCS - BlackBerry Monitoring Service - Data Collection Subsystem    BBMonitoringService_ENG - BlackBerry Monitoring Service - Polling Engine&lt;/code&gt;  Im Eventlog (Application) werden folgende Fehler protokolliert:  Source: BBMonitoringService_ENG Event ID: 3&lt;/p&gt;    Source: BBMonitoringService_DCS Event ID: 3    Source: BBMonitoringService_APP Event ID: 3&lt;/code&gt;  Die Lösung: Im %temp% Verzeichnis gibt es einen Ordner “gen_py”, die Inhalte dieses Ordners müssen gelöscht werden, dann starten die Dienste wieder.  Achtung: Der Ordner “gen_py” muss in allen Temp Verzeichnissen gelöscht werden, also C:\\Windows\\Temp und im User Verzeichnis des BesAdmin Accounts.  Hier ein Link zum Artikel in der RIM KB.  tom"
        },
        {
          "id": "post-forefront-tmg-console-error",
          "title": "Forefront TMG Console – Script Error",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, de, Security",
          "url": "/post/forefront-tmg-console-error/",
          "content": "Seit der Installation von Internet Explorer 9 bekomme ich auf meinem Windows 7 Client folgende Fehlermeldungen beim &Ouml;ffnen der Forefront TMG Management Console:\nScript Error: An Error has occurred in the script on this page.\n\nForefront TMG Error: Refresh failed Error 0x80020003: Member not found\n\nDieses Problem kann man einfach l&ouml;sen, man schnappt sich ein Notepad (Achtung: mit administrativen Rechten) und &ouml;ffnet die Datei &ldquo;TabsHandler.htc&rdquo;. Diese befindet sich standardm&auml;&szlig;ig unter folgendem Pfad: &ldquo;C:\\Program Files\\Microsoft Forefront Threat Management Gateway\\UI_HTMLs\\TabsHandler&rdquo;\nIn dieser Datei gibt es drei Zeilen die mit &ldquo;m_aPages [niPage].m_tdMain.style.paddingTop&rdquo; beginnen. Diese drei Zeilen m&uuml;ssen mit &ldquo;//&rdquo; auskommentiert werden und schon l&auml;uft die Konsole wieder normal. Hier noch ein Beispiel:\n// m_aPages [niPage].m_tdMain.style.paddingTop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((m_nBoostUp &lt; 0) ? -m_nBoostUp : 0) ;\n&nbsp;\nso long, tom"
        },
        {
          "id": "post-remotefx",
          "title": "RemoteFX",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Hyper-V",
          "url": "/post/remotefx/",
          "content": "Windows Server 2008 R2 bringt mit dem SP1 ein neues Feature für Remote Desktop mit: RemoteFX. RemoteFX verwendet die Hardware des Servers um die Grafikverarbeitung zu beschleunigen.\nFür RemoteFX gibt es 2 Verwendungsbereiche:\n&#160;\n1) RemoteDesktop Virtualization Host\nAuf dem Host ist dafür folgendes notwendig:\n   SLAT-enabled CPU     Zertifizierte Grafikkarte      RemoteFX encoder      Hyper-V \nINFO: Wenn Live-Migration verwendet wird, müssen alle Server dieselbe Grafikkarte haben.\nRemoteFX benötigt für die Grafikkarte einen WDDM Treiber, ist dieser nicht verfügbar (z.B. ILO), muss entweder die Grafikkarte im BIOS deaktiviert, oder der RemoteFX CAP-Treiber installiert werden. Bevor aber der RemoteFX CAP Treiber installiert wird, sollte der WDDM Treiber installiert und RemoteFX aktiviert sein. Danach kann der CAP Treiber über folgenden Befehl installiert werden:\ndism /online /enable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-Package\nUm den CAP Treiber zu deinstallieren reicht folgender Befehl: dism /online /disable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-Package\nVerwendet der Client mehrere Monitore, so muss folgende Tabelle bezüglich der RAM Benutzung auf der Grafikkarte beachtet werden:\n&#160;\n            Maximun resolution        1 monitor        2 monitor        3 monitor        4 monitor                  1024 x 768        75 MB        105 MB        135 MB        165 MB                  1280 x 1024        125 MB        175 MB        225 MB        275 MB                  1600 x 1200        184 MB        257 MB        330 MB        N/A                  1920 x 1200        220 MB        308 MB        N/A        N/A                  &nbsp;        &nbsp;        &nbsp;        &nbsp;        &nbsp;        \n&#160;\n2) Remote Desktop Session Host\nDamit RemoteFX für Remote Desktop Session läuft, muss der Prozessor zwingend das Feature SSE2 unterstützen. Zusätzlich kann noch ein sog. „Remote FX Hardware Decoder“ eingebaut werden um die Leistung zu erhöhen.\n&#160;\nGrüße   dn"
        },
        {
          "id": "post-softap-windows-7-wireless-access-point",
          "title": "SoftAP - Windows 7 Wireless Access Point",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, de",
          "url": "/post/softap-windows-7-wireless-access-point/",
          "content": "Hinter dem Namen SoftAp oder Virtual WIFI verbirgt sich ein tolles Feature von Windows 7, es erm&ouml;glicht durch das Erstellen eines virtuellen Netzwerkadapters das Betreiben eines Access Point mit Windows 7. Damit man einen virtuellen Wlan Adapter erstellen kann muss nat&uuml;rlich ein Wlan Adapter installiert und aktiviert sein.\nMan erstellt den Virtual WIFI Adapter mit Hilfe des Command-Line Tools \"netsh\", dazu ben&ouml;tigt man eine Administrative Eingabeaufforderung in die man dann folgenden Befehl eintippt:\nnetsh wlan set hostednetwork mode=allow ssid=* key=* keyUsage=persistent\nAn der Stelle der \"*\" kommt die SSID (ohne Leerzeichen) und der WPA2 Key, wurde dieser Befehl abgesetzt wird der virtuelle Adapter erstellt.&nbsp;Jetzt muss das Hostednetwork gestartet werden, damit sich Clients verbinden k&ouml;nnen:\nnetsh wlan start hostednetwork\nInternet Connection Sharing\nWenn man auf dem Windows 7 Rechner eine Internetverbindung hat kann man diese dem Hostednetwork zur Verf&uuml;gung stellen. Dazu &ouml;ffnet man die Eigenschaften des Adapters der die Internetverbindung herstellt und w&auml;hlt \"Freigabe\". Hier muss man die Checkbox bei \"Anderen Benutzern im Netzwerk gestatten....\" setzen und darunter den Virtual WIFI Adapter ausw&auml;hlen.\nBei einem Neustart des Rechners startet das Wlan nicht automatisch mit. Ohne neustart kann das Hostednetwork mit folgendem Befehl gestoppt werden:\nnetsh wlan stop hostednetwork\nUm den Status des Hostednetwork zu sehen verwendet man folgenden Befehl:\nnetsh wlan show hostednetwork\nDaniel Melanchthon beschreibt in diesem Artikel weitere Details zu Virtual WIFI.\n&nbsp;\nUpdate\nDas Ganze funktioniert nat&uuml;rlich auch unter Windows 8 :)\nGut zu wissen: Das \"hostednetwork\" unterst&uuml;tzt leider&nbsp;nur das v&ouml;llig &uuml;berf&uuml;llte 2,4 GHz Band: \"Radio types supported (Direct Sequence Spread Spectrum [DSSS], 802.11g, 802.11b)\"\nHier der Link zur entsprechenden TechNet Seite: http://technet.microsoft.com/en-us/library/cc755301(v=WS.10).aspx\n&nbsp;\nTom"
        },
        {
          "id": "post-appv-streaming-server",
          "title": "AppV Streaming Server",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "AppV, Client, Server",
          "url": "/post/appv-streaming-server/",
          "content": "Verwendet man AppV für Applikationsvirtualisierung mit Clients in Standorten mit langsamer Anbindung (WAN) kann ein Updates eines Paketes ziemlich lange dauern, außerdem wird es von jedem Client einzeln heruntergeladen.\nDer AppV Streaming Server könnte die Lösung für dieses Problem sein. Mit dem Desktop Optimization Pack kommen neben den Installationsdateien für den AppV Management (Full) Server auch die Dateien für den Streaming Server. Die Installation gestaltet sich einfach, man wählt das Streaming Protokoll, sollte natürlich jenes sein das der Management Server verwendet. Außerdem muss man den Pfad für den “Content” Ordner angeben, diesen muss man manuell anlegen und freigeben (\\\\servername\\Content, Leseberechtigungen für Benutzer reichen aus).\nDie Installation ist abgeschlossen und der Dienst “Application Virtualization Streaming Server” (AppVirtServer) sollte gestartet sein.\nIm Application Event Log wird bei jedem Start des AppVirtServer Dienstes folgender Fehler Protokolliert:\nError:&lt;/p&gt;    Source: Application Virtualization Server    Event ID: 44937    Empty package map for package content root: [D:\\Content\\].&lt;/code&gt;  Dieser Fehler wird für jedes Packet das auf dem AppV Management Server verfügbar ist einmal Protokolliert, und zwar so lange bis man die Daten aus dem Content Share des AppV Management Servers auf den Streaming Server kopiert. Es reicht aus die .sft Files zu kopieren, wichtig ist dabei dass eventuelle Unterordner auch angelegt werden.  Sind die Daten kopiert (d.h. beide Content Shares gleich) kann ist der Streaming Server bereit.  &#160;  Die Clients im Remote Netzwerk wissen allerdings nichts von diesem Server, d.h. Updates werden immer noch vom Management Server heruntergeladen. Über folgenden Registry Key gibt man den Clients die Information, in diesem Fall verwendet der Streaming Server RTSP:  HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\SoftGrid\\4.5\\Client\\Configuration&lt;/p&gt;    REG_SZ ApplicationSourceRoot    rtsp://servername:554/&lt;/code&gt;  Ab jetzt ist es nur mehr Wichtig bei Paket Updates daran zu denken alle Content Shares zu aktualisieren.   &#160;  tomt"
        },
        {
          "id": "post-create-vmware-esxi-flash-drive",
          "title": "Create VMWare ESXi Flash Drive",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, VMware",
          "url": "/post/create-vmware-esxi-flash-drive/",
          "content": "Der Hypervisor von VMWare kann auf einem USB Stick installiert werden, so kann man die vorhandenen Festplatten des Servers als Datastore f&uuml;r Virtuelle Maschinen verwenden oder Server ohne interne Festplatten als ESXi Hosts verwenden.\nDazu braucht man:\n\neinen USB Stick (min. 2GB)\nVMWare Workstation (oder Player)\nVMWare ESXi Installationsimage (VMWare ESXi)\n\nDann kanns losgehen, mit VMWare Workstation (oder Player) wird eine neue Virtuelle Maschine erstellt.\n\nAls Pfad f&uuml;r das Installationsimage wird das Image von ESXi 4.1 angegeben.\n\nAls Gastbetriebssystem wird VMware ESX ausgew&auml;hlt.\n\nEin Ordner f&uuml;r die Konfigurationsdateien und die virtuelle Festplatte muss angegeben werden, hier kann einfach ein Ordner auf der Lokalen Festplatte verwende werden.\n\nDie Gr&ouml;&szlig;e der virtuellen Festplatte kann man so akzeptieren, diese wird nicht verwendet.\n\nDie virtuelle Maschine ist eigentlich erstellt, allerdings muss noch ein USB Controller hinzugef&uuml;gt werden, dazu auf &ldquo;Customize Hardware&rdquo; klicken\n\nund den USB Controller hinzuf&uuml;gen.\n\n\n\nJetzt kann man die virtuelle Maschine starten, und auch gleich &uuml;ber &ldquo;VM&rdquo; und &ldquo;Removable Devices&rdquo; den USB Stick verbinden (muss nat&uuml;rlich am PC angeschlossen sein&hellip;)\n\nBei der Installation des ESXi Servers wird der USB Stick als Ziel angegeben, ACHTUNG: Alle Daten auf dem USB Stick werden gel&ouml;scht, der Stick wird neu formatiert.\n\nSobald die Installation abgeschlossen ist, kann man die VM herunterfahren, auf dem USB Stick ist jetzt VMWare ESXi installiert. Von diesem Stick kann man jeden (unterst&uuml;tzten) Server booten und als ESXi Host verwenden.\n&nbsp;\nAchtung: bei der Installation auf USB wird keine Scratch Partition erstellt, Infos dazu hier: /post/ESXi&ndash;Persistent-Scratch-Location.aspx\n&nbsp;\nso long,   tom"
        },
        {
          "id": "post-sharepoint-dienstkonto-wechseln",
          "title": "SharePoint–Dienstkonto wechseln, Probleme mit Kerberos",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-dienstkonto-wechseln/",
          "content": "Wird das Dienstkonto f&uuml;r die SharePoint-Webseite vom Netzwerk-Konto auf ein Dom&auml;nen-Konto ge&auml;ndert, und Kerberos in Kombination mit Windows-Authentifizierung verwendet wird, k&ouml;nnen sich die Clients nicht mehr an der Webseite authentifizieren.\nDer Dialog zum Eingeben der Credentials wird immer wieder angezeigt, die Authentifizierung kann jedoch nicht richtig verarbeitet werden.\nUm das Problem zu beheben, muss im IIS die Kernelmodus-Authentifizierung aktiviert werden, die standardm&auml;&szlig;ig nach der Installation von SharePoint deaktiviert ist:\n\nNun k&ouml;nnen sich die Clients wieder ganz normal an der SharePoint-Webseite authentifizieren.\n&nbsp;\nGr&uuml;&szlig;e   dn"
        },
        {
          "id": "post-outlook-gesendete-objekte-shared-mailbox",
          "title": "Outlook–gesendete Objekte–Shared Mailbox",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Client",
          "url": "/post/outlook-gesendete-objekte-shared-mailbox/",
          "content": "Wie in diesem Post beschrieben kann man mit Exchange 2010 einfach Shared Mailboxen verbinden. Wenn ein User Send-As Berechtigungen auf eine solche Mailbox hat und ein Mail schickt, wird das Mail im Ordner “Sent Items” des jeweiligen Users gespeichert. Damit die gesendete Nachricht in den Sent Items der shared Mailbox gespeichert wird muss man folgenden Eintrag in der Registry erstellen (auf den Clients).\nUnter dem Schlüssel: “HKEY_CURRENT_USER\\Software\\Microsoft\\Office\\14.0\\Outlook\\Preferences” wird ein REG_DWORD mit dem Namen “DelegateSentItemsStyle” und dem Wert “1” erstellt.\n\nIn einer Active Directory Umgebung bieten sich natürlich die Group Policy Preferences dafür an."
        },
        {
          "id": "post-tmge28093fehler-beim-ausfuhren-von-abfragen-im-log",
          "title": "TMG–Fehler beim Ausführen von Abfragen im Log",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Security, SQL",
          "url": "/post/tmge28093fehler-beim-ausfuhren-von-abfragen-im-log/",
          "content": "Letztens hatte ich ein seltsames Problem auf meinen TMG 2010 Server. Ich logge auf die lokale SQL Express Datenbank und konnte keine Abfragen im Log aus der TMG Konsole mehr machen. Nach dem Start einer Abfrage erscheint der folgende Fehler:\n&nbsp;\n\nDaraufhin habe ich den SQL Server &uuml;berpr&uuml;ft, konnte aber keine Probleme feststellen. Im Management Studio lie&szlig;en sich die Logs durch SELECT Anweisung abfragen.\nDas Problem liegt an der Formatierung des Datums und taucht durch das Service Pack 1 (KB2288910) auf TMG&rsquo;s in deutscher Sprache auf.\nDas Problem l&auml;sst sich aber relativ einfach beheben: Man verbindet sich mit dem Management Studio auf die SQL Instanz und &auml;ndert die Standard-Sprache des Benutzerkontos &ldquo;NT Authority\\NetworkService&rdquo; auf Schwedisch um. Nachdem man nun die SQL Dienste neu startet kann man problemlos wieder das Abfragen im LOG starten.\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-zertifizierungsstelle-verschiebene28093neuer-servername",
          "title": "Zertifizierungsstelle verschieben–neuer Servername",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/zertifizierungsstelle-verschiebene28093neuer-servername/",
          "content": "In diesem Beitrag habe ich beschrieben wie man eine Zertifizierungstele sichert, den alten Server abbaut und die CA auf einem neuen Server mit dem selben Namen wiederherstellt. \nWill man allerdings die CA umziehen und den aktuellen Server nicht abbauen sind ein paar zusätzliche Schritte nötig. Wichtig ist hier zu sagen dass man zwar den Servernamen ändern kann, allerdings nicht den Namen der Zertifizierungsstelle!\nTipp: Auch wenn die Microsoft Dokumentation das nicht wirklich bestätigt funktioniert eine Migration von 32Bit auf 64Bit. Also Backup auf x86 Restore auf x64 ist Möglich.\nBackup\n   Auf jeden Fall eine komplette Sicherung des Servers erstellen!     CA Datenbank und Key sichern     CA Konfiguration (Registry) sichern             Mit dem Registrierungseditor zu folgendem Schlüssel navigieren, rechtsklick und “Export”         HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\CertSvc\\Configuration         reg export HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\CertSvc\\Configuration RegBackup.reg             CA Templates notieren oder mit certutil.exe –catemplates &gt; templates.txt exportieren     CA Deinstallieren             Im Server Manager mit Remove Role die Active Directory Certificate Services deinstallieren         Achtung: wie bereits im alten Beitrag erwähnt bleiben gewisse Daten auf dem Server          \nRestore\n   alle Dateien (und Ordner) die von der Sicherung erstellt wurden auf den neuen Server kopieren             Achtung: caname.p12 enthält den private Key der CA!             Private Key importieren             certutil –importpfx caname.p12             CA Dienste installieren             Server Manager                     Im Servermanager mit Add Roles die Active Directory Certificate Services hinzufügen             Bei der Installation den richtigen CA Typ auswählen und das Richtige Zertifikat mit vorhandenem private Key wählen                         setupca.vbs                     auf einem Core Server wird die CA am besten mit diesem Script installiert             Bei der Installation muss der Wert im “Key Container” des installierten private Key angegeben werden, diesen kann man so herausfinden: certutil.exe -store my | find &quot;Key Container&quot;             setupca.vbs hat verschiedene Parameter um den entsprechenden CA Typ auszuwählen, folgendes Beispiel installiert eine Subordinate Enterprise CA: cscript setupca.vbs /IF /RC /SN WertKeyContainer             hier die Wichtigsten Parameter              /IE – Enterprise Root CA Service               /IS – Standalone Root CA Service               /IF – Enterprise Subordinate CA Service               /IT – Standalone Subordinate CA Service               /RC – Reuse Certificate and Key               /SN – CA Name                             CA Datenbank wiederherstellen             dazu muss der Dienst certsvc gestoppt werden, net stop certsvc         Im Server Manager mit rechtsklick, Restore CA kann die Datenbank wiederhergestellt werden         mit certutil –f –restoreDB PfadZumDataBaseOrdner kann man dasselbe erreichen             Konfiguration wiederherstellen: die Sicherung der Registry muss wieder importiert werden, dabei gilt es allerdings einiges zu beachten:             Backup der Registry auf dem neuen Server vor dem Import!         CAServerName anpassen, muss den neuen Servernamen enthalten         Die Pfade für folgende Werte kontrollieren, wenn sie auf dem alten Server nicht geändert wurden sollten kein Anpassungen nötig sein:                     DBDirectory, DBLogDirectory, DBSystemDirectory, DBTempDirectory                         Den Inhalt für folgende Werte zu kontrollieren um sicherzustellen dass CDP und AIA Informationen richtig veröffentlicht werden                     CACertPublicationURLs. CRLPublicationURLs                         Den Wert von CACertHash kontrollieren, wenn das CA Zertifikat erneuert wurde beinhaltet dieser Wert mehrere Thumbprints der CA Zertifikate. Wenn ein Thumbprint importiert wird und das zugehörige Zertifikat nicht installiert ist startet der Zertifikatsdienst (certsvc) nicht und protokollieret folgenden Fehler im Application Log:                     Active Directory Certificate Services did not start: Could not load or verify the current CA certificate.&#160; CAName The system cannot find the file specified. 0x80070002 (WIN32: 2).                             Berechtigungen auf CDP und AIA Container             Das Computerkonto des neuen Servers muss FullControl für die AIA und CDP Objekte des alten Server haben um CRLs und neue Root Zertifikate veröffentlichen zu können.         Berechtigungen werden mit ADSI Edit gesetzt, die Objekte finden sich unter CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local          \nCheck\nUm zu überprüfen ob alles läuft kann man ein Zertifikat anfordern. Funktioniert das ausstellen der Zertifikate sollte man noch überprüfen ob der Zugriff auf die Sperrlisten funktioniert. Dazu Exportiert man das Zertifikat (in eine .cer Datei) und führt “certutil –url datei.cer” aus.\n&#160;\ntom"
        },
        {
          "id": "post-signing-powershell-scripts",
          "title": "Signing PowerShell Scripts",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "PowerShell",
          "url": "/post/signing-powershell-scripts/",
          "content": "Damit ein PowerShell Script signiert werden kann muss man im besitz eines Zertifikates mit dem “Intended Purpose” Code Signing sein. So ein Zertifikat kann man sich selbst ausstellen, oder von einer Enterprise CA anfordern. Natürlich kann man es auch kaufen…\nWie man ein SelfSigned Zertifikat erstellt ist ausführlich in der Hilfe beschrieben, einfach “Get-Help about_signing” ausführen.\nUm ein Code Signing Zertifikat von Enterprise Zertifizierungsstelle anzufordern muss man “Enroll” Berechtigungen auf die Zertifikatsvorlage haben, oder man kopiert die Vorlage und erstellt eine eigene, z.B. mit längerer Gültigkeit.\nHat man also ein Zertifikat erhalten findet man es mit folgendem cmdlet:\nGet-ChildItem cert:\\CurrentUser\\My –codesigning\nMit Set-AuthenticodeSignature wird ein Script signiert, dieses cmdlet benötigt zwei Parameter, das zu Signierende Script und das Zertifikat.\nIm Folgenden Beispiel signiere ich die Datei C:\\scripts\\my-test.ps1 mit dem einzigen Zertifikat das in meinem Zertifikatsstore ist.\n$cert = Get-ChildItem cert:\\CurrentUser\\My –codesigning&lt;/p&gt;    Set-AuthenticodeSignature C:\\scripts\\my-test.ps1 $cert&lt;/code&gt;  Erscheint folgender Fehler, hat man das Script mit PowerShell ISE erstellt. Diese verwendet eine Codierung mit der Set-AuthenticodeSignature nicht zurechtkommt. Man erhält den vielsagenden Fehler: UnknonError.    Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab.    Und schon ist das Script signiert.  Wenn man das Script jetzt auf einem Host ausführt auf dem die ExecutionPolicy auf AllSigned gesetzt ist wird man informiert dass der Herausgeber unbekannt ist. Das Zertifikat welches zum Signieren verwendet wurde muss im TrustedPublisher Zertifikatstore sein.    Um das Zertifikat zu exportieren kann man die MMC Certficates verwenden, das Code Signing Zertifikat auswählen und auf Export klicken. Den Privat Key kann man nicht exportieren, dieser wird auch nicht benötigt um die Signatur zu bestätigen.  Die .cer Datei die man nach dem Export erhält kann man mit Gruppenrichtlinien auf alle Clients/Server verteilen oder manuell in den Store für Vertrauenswürdige Herausgeber importieren.  Gruppenrichtlinie:    Nach dem nächsten GP Refresh läuft das Script ohne Fehlermeldung.      Wird ein Script verändert nachdem es signiert wurde, wird die Ausführung verhindert. Folgende Fehlermeldung erscheint.    &#160;  tom"
        },
        {
          "id": "post-powershell-scripts",
          "title": "PowerShell Scripts",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/powershell-scripts/",
          "content": "Achtung: Diese Scripts sind Beispiele, sie sind nicht f&uuml;r die Verwendung in Produktivsystemen gedacht! Die Autoren von ntSystems.it k&ouml;nnen keine Haftung f&uuml;r eventuelle Sch&auml;den durch diese Scripts &uuml;bernehmen.\n&nbsp;\nExchange: Set SimpleDisplayName on all Mailboxes where this Attribute is empty; change characters like &ouml; to oe; send E-Mail if script fails\n\n\n   1: Import-Module 'C:\\Users\\daniel nitz\\AppData\\Roaming\\Microsoft\\Exchange\\RemotePowerShell\\ex2k10.domain.local\\ex2k10.domain.local.psm1'\n\n   2:&nbsp; \n\n   3: $Mailboxes = get-Mailbox | where {$_.SimpleDisplayName -eq \"\"}\n\n   4: if($Mailboxes -ne $null)\n\n   5: {\n\n   6:     try {\n\n   7:         ForEach ($Mailbox in $Mailboxes)\n\n   8:         {\n\n   9:             $NameString = $Mailbox.Name\n\n  10:             if($NameString -match \"&uuml;\")\n\n  11:                 {\n\n  12:                 $NameString = ($NameString -replace \"&uuml;\",\"ue\")\n\n  13:                 }\n\n  14:             if($NameString -match \"&auml;\")\n\n  15:                 {\n\n  16:                 $NameString = ($NameString -replace \"&auml;\",\"ae\")\n\n  17:                 }\n\n  18:             if($NameString -match \"&ouml;\")\n\n  19:                 {\n\n  20:                 $NameString = ($NameString -replace \"&ouml;\",\"oe\")\n\n  21:                 }\n\n  22:             Set-Mailbox -Identity $Mailbox.Name -SimpleDisplayName ($NameString + \" - COMPANY\")\n\n  23:         }\n\n  24:     } Catch {\n\n  25:         Send-MailMessage -to daniel.nitz@domain.local -Subject \"Exchange Shell Script Error\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local\n\n  26:     }               \n\n  27: }\n\n  28:     \n\n\n&nbsp;\nExchange: Set Out of Office Assistent on Mailboxes where the &ldquo;Office&rdquo; property isn&acute;t empty\n\n\n   1: Import-Module 'C:\\Users\\daniel nitz\\AppData\\Roaming\\Microsoft\\Exchange\\RemotePowerShell\\ex2k10.domain.local\\ex2k10.domain.local.psm1'\n\n   2:&nbsp; \n\n   3: $Mailboxes = get-Mailbox | where {$_.Office -ne \"\"}\n\n   4: try {\n\n   5:     $OOFTextExternal = ${E:\\OOF-Text\\External-Text.txt}\n\n   6:     $OOFTextInternal = ${E:\\OOF-Text\\Internal-Text.txt}\n\n   7:     \n\n   8:     ForEach ($Mailbox in $Mailboxes)\n\n   9:     {\n\n  10:         Set-MailboxAutoReplyConfiguration -Identity $Mailbox.Name -AutoReplyState scheduled -StartTime \"2011.01.21T07:00\" -EndTime \"2011.01.21T19:00\" -ExternalAudience All -ExternalMessage $OOFTextExternal -InternalMessage $OOFTextInternal   \n\n  11:     }\n\n  12: } Catch { Send-MailMessage -to daniel.nitz@domain.local -Subject \"Exchange Shell Script Error\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local\n\n  13: }"
        },
        {
          "id": "post-tmg-2010-unable-to-authenticate-users",
          "title": "TMG 2010 unable to authenticate users after reboot",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Server, Security",
          "url": "/post/tmg-2010-unable-to-authenticate-users/",
          "content": "Nach dem Upgrade von ISA Server 2006 auf TMG 2010 musste ich eine Reihe von Probleme bez&uuml;glich der Authentifizierung feststellen. Nach jedem Neustart des Servers dauerte es zwischen einer halben und 2 Stunden bis der TMG Clients gegen AD erfolgreich authentifizierte. In der Zwischenzeit wurden die Verbindung aufgrund fehlender Authentifizierung abgelehnt.\nAuch das EventLog protokollierte folgende Fehler:\n\n\nIm ADAM Log wurde folgender Fehler protokolliert:\n\n&nbsp;\nMein Problem habe ich dadurch gel&ouml;st, indem ich ein Computer-Zertifikat f&uuml;r den FQDN des TMG von meiner Zertifizierungsstelle angefragt und installiert habe. Anschlie&szlig;end habe ich den Netzwerkdienst Lesen-Berechtigungen f&uuml;r das Verzeichnis C:\\ProgramData\\Microsoft\\Crypto\\RSA\\MachineKeys gegeben (hier werden die Computerzertifikate gespeichert).\nINFO: Wenn der Request f&uuml;r das Zertifikat fehschl&auml;gt, muss in den Systemregeln der strikte RPC Filter deaktiviert werden:\n\n&nbsp;\nNachdem diese Schritte abgeschlossen wurden, konnte ich im EventLog sehen wie die SSL-Verbindungen erfolgreich hergestellt wurden:\n\n\n&nbsp;\nNach einem Neustart werden Verbindungen nun sofort authentifiziert.\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-exchange-2010-change-display-name-for-outgoing-mails",
          "title": "Exchange 2010, change Display Name for outgoing Mails",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-change-display-name-for-outgoing-mails/",
          "content": "Mit Exchange Server 2010 ist es sehr einfach den Display Name für ausgehende Mails zu ändern.\nZunächst muss das Feature für die Remote-Domänen aktiviert werden. Mit den folgenden Befehl wird das Feature für alle Remote-Domänen aktiviert:\nGet-RemoteDomain | Set-RemoteDomain –UseSimpleDisplayName $true\nIn den Einstellungen der Mailbox&#160; befindet sich die Eigenschaft Simple display name. Hier lässt sich der angepasste Display Name einfügen. \nACHTUNG: Befindet sich kein Wert im Feld Simple Display Name nachdem das Feature aktiviert wurde, sendet Exchange die Mail-Adresse.\n\n&#160;\nAlle Mails, die nun die Organisation verlassen, werden mit den angepassten Display Name versendet:\n\n&#160;\nAnbei noch ein Shell-Beispiel um schnell für eine Liste (CSV-Import Datei) von Benutzern den Simple Display Name mit&#160; Name + Firma GmbH zu setzen.\nImport-CVS &quot;C:\\Import-File.csv&quot; | Foreach {Set-Mailbox -Identity $_.Name -SimpleDisplayName ($_.Name + &quot; - Firma GmbH/Srl&quot;)}           Beispiel für CSV-Import Datei\nName     Daniel Nitz      Max Mustermann\nGrüße   dn"
        },
        {
          "id": "post-zertifizierung",
          "title": "Zertifizierung",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/zertifizierung/",
          "content": "Heute ist ein guter Tag f&uuml;r beide Autoren von ntSystems.it.\nNachdem wir &uuml;ber eine halbe Stunde vor dem Prometric Test Centre warten mussten weil es dort Probleme mit den PCs gab konnten wir unsere Examen in Angriff nehmen.\nDaniel hat erfolgreich das &ldquo;70-432 TS: Microsoft SQL Server 2008, Implementation and Maintenance&rdquo; Examen absolviert und erweitert so seinen MCITP: Enterprise Administrator mit dem&nbsp; MCTS: SQL Server 2008, Implementation and Maintenance.\nIch habe mit dem &ldquo;70-663 Pro: Designing and Deploying Messaging Solutions with Microsoft Exchange Server 2010&rdquo; nun den Status MCITP: Enterprise Messaging Administrator 2010 erreicht.\nIn diesem Sinne,    tom"
        },
        {
          "id": "post-mail-sensitivity-header-exchange-2010-sp1",
          "title": "Mail Sensitivity Header Exchange 2010 SP1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/mail-sensitivity-header-exchange-2010-sp1/",
          "content": "Wer Shared Mailboxes mit Exchange 2010 verwendet kann folgendes Verhalten beobachten:\n· wird eine Mailbox über das AD Attribut msExchDelegateListLink verbunden sehen Benutzer keine als „Privat“ markierten Mails\n· verbindet ein User die Mailbox über Datei -&gt; Konto hinzufügen sind alle Objekte sichtbar, auch die als „Privat“ markierten\n\nDie Vertraulichkeit einer Nachricht wird mit dem Sensitivity Header geregelt, dieser wird in dem Fall auf “private” gesetzt. Mit Transportregeln in Exchange kann man Message Header löschen oder bearbeiten. In diesem Fall reicht das Löschen des Headers nicht aus, man muss ihn auf “Normal” ändern. Man erstellt also eine neue Transportregel für alle eingehenden Nachrichten welche an die Shared Mailbox gesendet werden. Diese Regel soll der Wert des Headers “Sensitivity” von “private” auf “normal” ändern.\nTransportregeln kann man an drei verschiedenen Orten pflegen, EMS, EMC und ECP. Natürlich muss man die entsprechenden Berechtigungen besitzen. \nExchange Control Panel\nDas Exchange Control Panel ist über https://meinexchange/ecp erreichbar, dort muss unter Options “My Organization” ausgewählt werden. Dann kann man unter “Mail Control” Regeln mit Hilfe eines Wizards erstellen.\n\nExchange Management Console\nIn der Management Console sind die Regeln unter “Organization Configuration” – “Hub Transport” und “Transport Rules” zu finden, auch hier kann man Regeln einfach über einen Wizard erstellen.\n\nExchange Management Shell\nNatürlich kann man Transportregeln auch mit der Managment Shell erstellen. Dazu am Besten im TechNet vorbeischauen.\nHier ein Beispiel:\nNew-TransportRule -Name 'Remove Header' -Comments '' -Priority '0' -Enabled $true -SentTo 'shared.mailbox@domain.com' -HeaderMatchesMessageHeader 'Sensitivity' -HeaderMatchesPatterns 'private' -SetHeaderName 'Sensitivity' -SetHeaderValue 'normal'\n&#160;\nso long,    tom"
        },
        {
          "id": "post-sharepoint-2010-external-list-bcs-sql",
          "title": "Sharepoint 2010, external List, BCS, SQL",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint, SQL",
          "url": "/post/sharepoint-2010-external-list-bcs-sql/",
          "content": "In diesem Post werde ich die einzelnen Schritte erklären um in Sharepoint eine SQL Tabelle einzubinden. Dazu erforderlich ist:\n   Sharepoint 2010 Foundation / Server     SQL Server     Sharepoint Designer 2010  \nExternen Inhaltstyp definieren\nIn diesem Schritt definieren wir den Inhaltstyp und somit die Verbindung zu SQL Server. Dies kann alles mit dem Sharepoint Designer erledigt werden. Unter Externe Inhaltstypen definieren wir die Verbindung.\n\nNun kann ein Name und die Verbindung zu SQL Server angegeben werden, indem wir auf “Klicken Sie hier, um externe Datenquellen zu ermitteln und Vorgänge zu definieren” klicken\n\nWir erstellen eine neue Verbindung vom Typ SQL Server und geben die Datenbankinformationen an\n\nNun können wir die Tabellen auswählen, die für diesen Inhaltstyp zur Verfügung stehen. Dabei klicken wir auf die Tabelle und können verschiedene Vorgänge definieren:\n   Element lesen     Liste lesen     Erstellen     Aktualisieren     Löschen  \n\nNun ist der Inhaltstyp definiert und steht in Sharepoint zur Verfügung.\n&#160;\nBCS Berechtigungen definieren\nStandardmäßig haben wir keine Berechtigung um auf den Inhaltstyp zuzugreifen. Dies müssen wir erst in den BCS Einstellungen definieren. Am schnellsten kann dies über die Zentraladministration erledigt werden.\nZentraladministration / Anwendungsverwaltung / Dienstanwendungen verwalten\nNun wählen wir den Business Data Connectivity-Dienst und definieren die Berechtigungen für den Inhaltstyp.\n\nInfo: Mindestens 1 Account muss das Buntzerrecht “Berechtigungen festlegen” haben.\nJetzt können wir die externe Liste erstellen und hätten theoretisch Zugriff darauf, wäre da nicht das Double-Hop Problem. Beim Zugriff erhalten wir folgende Fehlermeldung:\n\n&#160;\nDouble-Hop Problem beheben\nUm das Double-Hop Problem zu lösen gehen wir folgendermaßen vor:\n1. Zunächst erstellen wir einen neuen SPN (Service Principal Name) für unseren SQL Server:\nsetspn –A MSSQLsvc/NETBIOSNAME.DOMAIN:1433 DOMAIN\\SQL-Service-Account\nDer SQL Service Account kann am schnellsten unter den Diensten ermittelt werden.\n2. Danach müssen wir in ActiveDirectory die Delegierungen für folgende Objekte aktivieren\n   Sharepoint Computer-Objekt     SQL-Service Account  \n\nIch empfehle den Sharepoint sowie den SQL Server neu zu starten um sicherzugehen, dass die Konfiguration aktiv ist.\nJetzt haben wir Zugriff auf die SQL Tabelle über Sharepoint.\n&#160;\nNähere Informationen zur Double-Hop Problematik unter folgenden Link\n&#160;\nGrüße    dn"
        },
        {
          "id": "post-sharepoint-foundation-2010-insufficient-sql-permissions",
          "title": "Sharepoint Foundation 2010, insufficient SQL permissions",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint, SQL",
          "url": "/post/sharepoint-foundation-2010-insufficient-sql-permissions/",
          "content": "Wenn man Sharepoint Foundation 2010 mit den integrierten SQL Server 2008 Express installiert, hat man recht wenig Möglichkeiten Eigenschaften für den SQL Server zu definieren (Benutzerkonten, Logs, Backup).\nWenn man nun über das Management Studio eine Verbindung mit SQL Server herstellen möchte, kann es vorkommen, dass man selbst mit dem Farm-Administratorkonto keine Änderungen an den entsprechenden Datenbanken vornehmen kann. Ein Blick auf die verbunden Gruppen des Farm-Administratorkontos verrät, dass sich das Benutzerkonto nur in der Gruppe public befindet und somit keine Einstellungen ändern darf.\n\nZudem ist kein Benutzerkonto ersichtlich mit dem man sich anmelden könnte um das Farm-Administratorkonto den entsprechen Gruppen zuzuweisen. Mit dem Benutzer SA kann man sich ebenfalls nicht anmelden, da der “SQL Server- und Windows-Authentifizerungsmodus” nicht aktiviert ist.\nDer Grund dafür liegt hier: Wenn man Sharepoint Foundation 2010 über den Rechtsklick auf das Setup-File und “Als Administrator ausführen” installiert, wird das Produkt über das lokale Administratorkonto mit logischerweise den entsprechenden Administratorrechten installiert. Das wäre eigentlich auch kein Problem, wäre nicht die folgende Änderung ab SQL Server 2008 fest implementiert:\nIn den Versionen vor SQL 2008 wurde der Gruppe lokale Administratoren (die enthält wiederum den Domain-Admin und geg. andere Benutzer) das SQL Benutzerrecht sysadmin zugewiesen. Folglich konnte jeder Admin,die Datenbanken verwalten. Ab SQL Server 2008 erhält diese Gruppe nicht mehr das sysadmin-Recht. Bei der manuellen Installation von SQL wird man danach gefragt welche Benutzer das sysadmin-Recht erhalten sollen. Als die Installation mit der Option “Als Administrator ausführen” durchgeführt wurde, hat der lokale Administrator die sysadmin-Rechte erhalten.\nLösung: Wir erhalten mit dem Farm-Administrator Konto keine Ändern-Rechte in SQL, bis wir uns mit dem lokalen Administrator anmelden, Management Studio öffnen und den Benutzerkonten die entsprechenden Rechte zuweisen.\nPS: Wenn die Datenbank in den Sinlge User Mode geschalten wird, erhält die Gruppe lokale Administratoren (folglich auch Domain-Admins) die sysadmin-Rechte.\nGrüße    dn"
        },
        {
          "id": "post-migration-isa-server-2k4-2k6-zu-tmg-wpad",
          "title": "Migration ISA Server 2k4, 2k6 zu TMG, WPAD",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, de, Server, Security",
          "url": "/post/migration-isa-server-2k4-2k6-zu-tmg-wpad/",
          "content": "Wenn der ISA Server zu TMG oder einem anderen physischen Server migriert wird und sich dadurch der Servername &auml;ndert, funktioniert unter Umst&auml;nden die automatische Browserkonfiguration &uuml;ber WPAD bei DHCP Clients nicht mehr.\nWPAD\nDas Web Proxy Autodiscovery Protocol (WPAD) ist ein Protokoll, mit dem Web-Clients automatisiert zu verwendende Web-Proxies innerhalb eines Computernetzwerkes finden k&ouml;nnen, indem eine Proxy autoconfiguration (PAC)-Datei unter einer erratbaren URL gespeichert wird, beispielsweise http://wpad.example.com/wpad.dat\nWPAD wird in den DHCP Einstellungen sowie in DNS konfiguriert um DHCP Clients und jene Ger&auml;te mit den automatischen Einstellungen zu versorgen, die eine statische IP Adresse besitzen.\nDas Problem nach Migrationen / Serverumzug des ISA / TMG Servers bei DHCP Clients erkl&auml;rt sich so:\nAm DHCP Server wird eine neue Option (252) konfiguriert, die den Pfad zur WPAD.dat Datei bereitstellt. Sobald ein neuer DHCP Client sich vom DHCP Server eine IP Adresse holt, bekommt er auch eine Lease-Zeit zugewiesen, wie lange er die Adresse verwenden darf. Die Lease wird standardm&auml;&szlig;ig nach der H&auml;lfte der Lease-Zeit verl&auml;ngert. Solange sich der Client in dieser Lease befindet und die IP Adresse dem DHCP Server anbietet, wird die WPAD Datei nicht aktualisiert.\n&Auml;ndert sich jetzt der Servername des ISA / TMG Servers und ist in der Option 252 vom DHCP Server der jeweilige Servername eingetragen, so erhalten die DHCP Clients nicht die neue Konfiguration. Man m&uuml;sste bei jedem Client, der sich in einer Lease befindet die Befehle ipconfig /release und ipconfig /renew ausf&uuml;hren um einen manuellen Refresh durchzuf&uuml;hren.\nEs gibt mehrere Methoden das Problem zu umgehen:\nMethode 1 &ndash; Option 252 von Anfang an mit dem CNAME WPAD konfigurieren\nWenn man in den DHCP Einstellungen nicht den FQDN des Servers verwendet, sondern den CNAME WPAD (so wie man es f&uuml;r DNS konfigurieren muss), so wird der CNAME WPAD immer auf den jeweiligen aktuellen Server zeigen. ACHTUNG: Dies muss nat&uuml;rlich von Anfang an so erfolgen!!\n\nMethode 2 &ndash; Clients daran hindern die WPAD Option von DHCP zu zeihen.\nDurch hinzuf&uuml;gen des Registry Keys: AutoProxyDetectType mit dem Wert 2 unter HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\nwerden die Clients angewiesen das WPAD File &uuml;ber DNS anzufragen.\n\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-exchange-2010-pfad-einer-mailboxdatenbank-andern",
          "title": "Exchange 2010 Pfad einer Mailboxdatenbank ändern",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-pfad-einer-mailboxdatenbank-andern/",
          "content": "Der Pfad zu einer Exchange 2010 Mailboxdatenbank kann geändert werden, die Datenbank muss dazu allerding “dismounted” also offline sein. Das heißt die Benutzer deren Mailbox sich in der betreffenden Datenbank befinden habe für die Zeit der Änderung keinen Zugriff auf ihre Mailbox.\nIch werde im Beispiel zwischen einer einzelnen Datenbank und einer Datenbank in einer DAG mit mehreren Kopien unterscheiden. \nEinzelne Datenbank\nDer Datenbankpfad kann mit der EMC sowie mit der EMS verschoben werden.\nExchange Management Console\n   Rechtsklick auf Datenbank, Dismount     Wenn die Datenbank offline ist, wieder Rechtsklick und Move Databse Path auswählen.  \n\n   Exchange Management Shell\n   Datenbank offline nehmen mit      Dismount-Database DB01     Pfad ändern      Move-DatabaseFilePath DB01 –EdbFilePath M:\\db01\\db01.edb –LogFolderPath L:\\     Datenbank wieder online nehmen      Mount-Database DB01  \nDatenbank in DAG\nAchtung:       Wenn Circular Logging für die Datenbank aktiviert ist muss das vor der Änderung deaktiviert werden!      Einstellungen wie ReplayLagTime und TruncationLagTime notieren, durch das entfernen und wieder erstellen der Datenbankkopien gehen diese Einstellungen verloren!\n   Alle Datenbankkopien entfernen, d.h. Datenbank wird nur auf einem Server belassen, auf diesem wird der Pfad geändert      Remove-MailboxDatabaseCopy     Datenbank offline nehmen (einzige verbleibende Kopie)      Dismount-Database     Datenbankpfad verschieben      Move-DatabasePath –EdbFilePath –LogFolderPath     Auf allen Servern die eine Kopie der Datenbank enthalten sollen muss der neue Pfad existieren, durch kopieren der alten Files an den neuen Pfad kann man zeit und Replikationstraffic sparen, die Datenbank muss so nicht neu geseedet werden     Datenbank wieder online nehmen      Mount-Database     Datenbankkopien wieder erstellen      Add-MailboxDatabaseCopy     Index und Search Dienste neu starten      net stop msftesql-Exchange        net start MSExchangeSearch     Replikation überprüfen      Test-ReplicationHealth        Get-MailboxDatabaseCopyStatus  \n&#160;\nFehler beim entfernen/hinzufügen von Kopien\nBeim entfernen einer Mailboxdatenbankkopie kann es zu einem Fehler mit folgender Meldung kommen: \nError:      Registry key has subkeys and recursive removes are not supported by this method.&lt;/p&gt;    Warning:      An unexpected error has occurred and a Watson dump is being generated: Registry key has subkeys and recursive removes are not supported by this method.&lt;/code&gt;  Obwohl der Fehler auftritt wird die Datenbankkopie gelöscht. Allerdings bekommt man beim wiedererstellen der Datenbankkopie den selben Fehler und die Kopie wird nicht erstellt. Es hilft folgender Workaround.     GUID der betreffenden Datenbank herausfinden     Get-MailboxDatabase db01 | fl name,guid     Auf dem Server, auf dem die Datenbankkopie erstellt werden soll muss folgender Registry Key gelöscht werden     HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\ExchangeServer\\v14\\Replay\\State\\{GUID}\\DumpsterInfo    Jetzt wird das Add-MailboxDatabaseCopy cmdlet erneut ausgeführt und die Kopie wird erstellt.  &#160;  tom"
        },
        {
          "id": "post-exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben",
          "title": "Exchange 2010 SP1 Online Archive in eigene Datenbank verschieben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben/",
          "content": "Mit Exchange 2010 wurden Online Archive eingeführt, mit SP1 hat man die Möglichkeit Archive in einer eigenen Datenbank zu verwalten. Die Vorteile liegen auf der Hand, man kann Archivdaten so auf billigeren, langsamen Storge legen, kann verschiedene Backup/Restore SLAs für Produktiv- und Archivdaten anbieten usw…\nWer Online Archive bereits mit Exchange 2010 RTM verwendet hat und diese jetzt auf eine andere Datenbank schieben muss kann wie folgt vorgehen.\n\nEMC\nIn der EMC wurden mit SP1 die Wizards für einen neuen Move Request angepasst, dort kann man das Archiv auswählen und nur dieses verschieben.\n\nEMS\nIn der EMS gibt es neue Parameter für das cmdlet New-MoveRequest, hier ein Beispiel in dem das Archiv des Benutzers test.user in die Datenbank adb01 verschoben wird.\nnew-MoveRequest test.user –ArchiveOnly –ArchiveTargetDatabase adb01\n\ntom"
        },
        {
          "id": "post-exchange-2010-zertifikat-anfordern",
          "title": "Exchange 2010 Zertifikat anfordern",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-zertifikat-anfordern/",
          "content": "Um OWA, Active Sync usw. betreiben zu können benötigt Exchange ein entsprechendes Zertifikat. Seit Exchange 2010 hat Microsoft hierfür einen komfortablen Wizard zur Verfügung gestellt.\nDer Wizard befindet sich unter der Serverkonfiguration und wird über den Menüpunkt “New Exchange Certificate” aufgerufen.\n\nSobald der Wizard startet, muss zunächst ein Namen vergeben werden. Auf der nächsten Seite kann das Zertifikat noch für alle Subdomains freigegeben werden.\nNun können die Einstellungen gesetzt werden, wie der Certificate-Request erstellt werden soll. Als Beispiel habe ich hier einige Parameter aufgelistet:\nOWA\n\nActiveSync\n\nOutlook Anywhere und Autodiscover\n\nAls Ergebnis werden dann die Domains angezeigt, die im Zertifikat registriert werden\n\nNachdem die Informationen zu Organisation und Standort ausgefüllt wurde, kann der Certficate-Request abgespeichert und bei der CA eingereicht werden. Bevor die CA das Zertifikat ausstellen kann, muss die CA noch für die Registrierung mehrere Subject Names aktiviert werden.\nNachdem die CA das Zertifikat ausgestellt hat, muss der Request noch abgeschlossen werden. Hier klickt man rechts auf das Zertifikat in der EMC und wählt die Option “Complete Pending Request”.\nSobald das Zertifikat installiert ist, muss es noch mit den jeweiligen Diensten verbunden werden. Hier ist uns wieder ein Wizard behilflich. Rechtslick auf das Zertifikat und “Assign Services to Certificate”\n\nNun kann man sämtliche Services auswählen, für die das Zertifikat zuständig ist.\n\nMit Assign wird das Zertifikat dann hinzugefügt.\nGrüße   dn\nlive vom ntSystems techDAY :)"
        },
        {
          "id": "post-exchange-2010-san-zertifikate28093server-2008-pki",
          "title": "Exchange 2010 SAN Zertifikat–Server 2008 PKI",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-san-zertifikate28093server-2008-pki/",
          "content": "Zertifikate f&uuml;r den Exchange 2010 Client Zugriff beinhalteten mehrere Subject Names. Standardm&auml;&szlig;ig werden sogenannte SAN Zertifikate von Server 2008 Certificate Authorities nicht unterst&uuml;tzt.\nDamit die CA ein SAN Zertifikat ausstellen kann muss folgender Befehl von einer Eingabeaufforderung mit administrativen Rechten ausgef&uuml;hrt werden:\ncertutil &ndash;setreg policy\\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2\n\nAnschlie&szlig;end m&uuml;ssen die CA Dienste neu gestartet werden. Am besten mit \"net stop certsvc &amp;&amp; net start certsvc&rdquo;.\nWill man jetzt einen Certificate Request &uuml;ber die MMC einreichen erscheint folgender Fehler:\n&ldquo;The request contains no Certificate template information. 0x80094801 (-2146875391) Denied by Policy Module 0x80094801, the request does not contain a Certificate template extension or the Certificate Template request attribute.&rdquo;\nMan muss den Request &uuml;ber die Certificate Web Services einreichen, standardm&auml;&szlig;ig l&auml;uft die auf der CA unter /certsrv, in unserem Fall also: http://dc01.ntsystems.local/certsrv. Dort w&auml;hlt man Request a Certificate, advanced certificate request und submit a certificate using a (&hellip;) file. In das Textfeld wird der gesamte Inhalt der .req Datei kopiert, bei Certificate Template wird Web Server ausgew&auml;hlt. Wenn der Request erfolgreich war, kann man die .cer Datei herunterladen und in Exchange den Request fertigstellen (Complete Pending Request).\nAlternativ kann der Request mit &ldquo;certutil&rdquo; eingereicht werden, wobei mit dem Parameter &ldquo;/attrib&rdquo; das Template gew&auml;hlt wird.\nBeispiel: certreq.exe -submit -attrib \"CertificateTemplate:WebServer\" c:\\certreq.req\n&nbsp;\ntomlive vom ntSystems techDAY :)"
        },
        {
          "id": "post-webdav-iis7-publishing-ober-isa-server-part-2",
          "title": "WebDav, IIS7 publishing over ISA Server Part 2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server",
          "url": "/post/webdav-iis7-publishing-ober-isa-server-part-2/",
          "content": "Wie versprochen hier der 2. Teil meiner WebDav Reihe. In diesem Post geht es darum das WebDav Verzeichnis mit dem ISA Server zu veröffentlichen.\nAls erstes erstellen wir eine neue Webveröffentlichungsregel:\n\nWir geben an, dass wir eine einzelne Webseite veröffentlichen und wählen bei Sicherheit SSL aus\n\nNun müssen wir den Sitenamen inkl. IP Adresse (sofern dieser nicht aufgelöst werden kann) vergeben\n\nDanach geben wir den Pfad an, für welchen die Veröffentlichungsregel wirken soll, bzw. auf welchen Ordner der externe Zugriff beschränkt werden soll.\n\nNun tragen wir noch den externen Namen ein\n\nINFO: Sollte euer Pfad Leerzeichen haben, ist das für den ISA Server kein Problem. Man muss die Leerzeichen nicht durch %20 ersetzen, sondern kann die URL ganz normal eingeben.\nAls nächstes erstellen wir einen neuen Listener und weisen ihn an, dass eine SSL Verbindung erforderlich ist\n\nJetzt wählen wir IP Adresse und das entsprechende Zertifikat aus. Sofern dies noch nicht auf dem ISA Server installiert wurde, muss es jetzt nachinstalliert werden.\nAls Authentifizierung wählen wir die HTTP Authentifizierung – Standard\n\nAls Authentifizierungsdelegierung nehmen wir NTLM\n\nZum Schluss kann man noch eine Gruppe angeben, auf welche die Veröffentlichungsregel beschränkt ist.\n&#160;\nDas Standardverhalten des Client ist es, den veröffentlichen Ordner selbst durch die HTTP Methode OPTIONS abzufragen. Damit die Verbindung nicht fehlschlägt, müssen wir dies zulassen und dürfen es nicht wie durch die bereits erstellte Regel mit den zugelassenen Pfaden blockieren. Wir kopieren die neu erstelle Regel und platzieren sie unter der ersten Regel. Danach werden die die HTTP Methode auf OPTIONS beschränken.\nNun geben wir der kopierten Regel einen neuen Namen (Bsp: WebDav – OPTIONS) um sie von der ersten Regel zu unterscheiden. Wir löschen zudem unter dem Reiter Pfade die Ordnerbeschränkung.\n\nAls nächstes wird die HTTP Methode auf OPTIONS beschränkt. Wir öffnen die HTTP Richtlinie und tragen die Methode ein:\n\n&#160;\nACHTUNG: Ordner mit Umlaute\nWenn ihr Ordner mit Umlaute verwendet, wird die Verbindung beim versuch die Ordner zu öffnen, immer zusammenbrechen. Der Grund hierfür liegt darin, dass das High Bit-Zeichen standardmäßig deaktiviert ist. Dieses High Bit-Zeichen lässt Umlaute in der URL zu. Ich empfehle auf beiden Veröffentlichungen WebDav und WebDav Options das High Bit-Zeichen zu erlauben.     Dies kann ebenfalls in der jeweiligen HTTP Richtlinie vorgenommen werden:\n\nNun kann der Client den Ordner via HTTPS von Extern mappen.\nGrüße   dn"
        },
        {
          "id": "post-webdav-iis7-publishing-over-isa-server-part-1",
          "title": "WebDav, IIS7 publishing over ISA Server Part 1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server",
          "url": "/post/webdav-iis7-publishing-over-isa-server-part-1/",
          "content": "Dies ist der erste aus 2 Teilen zum Thema WebDav. WebDav (Web-based Distributed Authoring and Versioning) ist ein offizieller Standard, Dateien im Internet bereitzustellen.&lt;/p&gt;\nDer Vorteil von WebDav ist, dass es nicht wie FTP oder SSH spezielle Ports verwendet, sondern &uuml;ber HTTP und HTTPS &uuml;bertragen wird und somit durch jede Firewall kommt, welche Port 80 und 443 ge&ouml;ffnet hat.\nIm ersten Teil werde ich zeigen wie ein Verzeichnis unter IIS7 erstellt und &uuml;ber WebDav freigegeben wird. Im 2. Teil werde ich beschreiben wie man das Ganze &uuml;ber den ISA Server ver&ouml;ffentlicht.\n&nbsp;\nServer\nSofern IIS nicht installiert ist, besteht der erste Schritt darin den Webserver zu installieren\nZus&auml;tzlich zum Webserver muss das Feature WebDav hinzugef&uuml;gt werden.\n\nDer n&auml;chste Schritt besteht darin, eine neue Webseite in IIS zu erstellen. Als physikalischen Pfad geben wir das Verzeichnis ein, welches &uuml;ber WebDav freigegeben werden soll.\n\nZus&auml;tzlich binden wir die Webseite auf Port 443 HTTPS und w&auml;hlen das jeweilige Zertifikat aus.\nAls n&auml;chstes m&uuml;ssen unter Authentifizierung die Anonyme Authentifizierung deaktivieren und Windows- und Standardauthentifizierung aktivieren.\n\nBei den Webseiteneinstellung befindet sich das Feature WebDav-Erstellungsregeln.\n\nIn den Einstellungen muss zun&auml;chst WebDav aktiviert werden und danach eine neue Erstellungsregel erstellt werden. Die Erstellungsregel definiert die jeweiligen Zugriffsrechte.\n\nDie Konfiguration ist nun abgeschlossen. Ich empfehle jedoch um Probleme mit&nbsp;Zielpfade auf &nbsp;entfernten Servern zu vermeiden, zus&auml;tzlich unter den Verbindungseinstellungen der Webseite, einen Benutzer anzugeben, der Zugriffsrechte auf die Webseite hat.\n\n&nbsp;\nClient\nUm das WebDav-Verzeichnis zu mappen, muss der Client ein neues Netzlaufwerk verbinden und die Option &ldquo;Verbindung mit einer Webseite herstellen, auf der Sie Dokumente und Bilder speichern k&ouml;nnen&rdquo; ausw&auml;hlen.\nAls Adresse geben wir https://Servername ein\n\nJetzt k&ouml;nnen wir auf das Verzeichnis &uuml;ber HTTPS zugreifen.\nGr&uuml;&szlig;e dn&lt;/code&gt;"
        },
        {
          "id": "post-rbac",
          "title": "Exchange 2010–Role Based Access Control",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/rbac/",
          "content": "In Exchange 2010 wurde ein neues Berechtigungsmodell eingef&uuml;hrt, Role Based Access Control. Es basiert auf sogenannten Rollen anstelle von ACLs, diese Rollen (eigentlich die Role Entries) steuern den Zugriff auf cmdlets. Um dieses neue Modell zu verstehen muss man die Grundbausteine verstehen aus denen es besteht. Vereinfacht gesagt wird festgelegt wer was wo machen darf.\n&nbsp;\nScope (wo)\n\nDefiniert die Objekte im Active Direcotry auf welchen die Rolle Berechtigungen hat. \nNew-ManagementScope \n\nRole/Role Entry (was)\n\nEine Rolle ist eine Sammlung von Role Entries, sie definiert welche cmdlets und welche Parameter ausgef&uuml;hrt werden d&uuml;rfen. \nNew-ManagementRole \nAdd-ManagementRoleEntry, Remove-ManagementRoleEntry \n\nRoleGroup (wer)\n\nUniverselle Sicherheitsgruppe deren Mitglieder die Rechte bekommen die in der Role definiert sind. \nVerkn&uuml;pft Rolle und Scope. \nNew-RoleGroup &ndash;Roles &ldquo;&rdquo; &ndash;CustomRecipientWriteScope &ldquo;&rdquo; \n\nRole Assignment\n\nVerbindet die oben genannten Elemente, legt fest wer was wo machen darf. \nDas cmlet New-RoleGroup erzeugt den ManagementRoleAssignmenteintrag \nGet-ManagementRoleAssignment \n\nEs gibt in Exchange 2010 65 vordefinierte Rollen die man sich mit Get-ManagementRole anzeigen lassen kann.\n\nWill man die Role Entries zu einer Rolle sehen f&uuml;hrt man folgendes cmdlet aus: Get-ManagementRoleEntry Rolle\\*\nBeispiel: Get-ManagementRoleEntry \"Move Mailboxes\\*\"\n\n&nbsp;\nBenutzerdefinierte Rolle erstellen\nSoll eine Benutzerdefinierte Rolle bzw. ein Scope erstellt werde, dann in dieser Reihenfolge:\n\nNew-ManagementScope \"Gruppe1Scope\" -RecipientRestrictionFilter {memberofgroup -eq \"CN=Gruppe1,OU=users,DC=domain,DC=local} \n\nDiese Rolle darf nur Mitglieder der Gruppe1 bearbeiten. \n\n\nNew-ManagementRole \"Create Move Request Gruppe1\" &ndash;Parent &ldquo;Move Mailboxes&rdquo; \n\nEine neue Rolle wird erstellt \n\n\nNew-RoleGroup \"Gruppe1 Movers\" -roles \"Create Move Request Gruppe1\" -CustomRecipientWriteScope \"Gruppe1Scope\" \n\nEine neue Gruppe wird erstellt (Universelle Sicherheitsgruppe im AD), die Rolle sowie der Scope werden dieser Gruppe zugewiesen \n\n\nAdd-RoleGroupMember \"Gruppe1 Movers\" -members \"username\" \n\nBenutzer werden der Gruppe hinzugef&uuml;gt, kann auch im AD gemacht werden \n\n\n\nSo sieht die soeben erstellte Rolle aus:\nGet-ManagementRoleEntry \"Create Move Request Gruppe1\\*\"\n\n&nbsp;\nBenutzerdefinierte Rolle anpassen\nMeine soeben erstellte Rolle soll nur Berechtigungen haben einen Move Request zu erstellen. Mitglieder sollen den Move Request nicht l&ouml;schen, anhalten oder weiterf&uuml;hren k&ouml;nnen. Also passe ich die RoleEntries entsprechend an.\n\nNicht gew&uuml;nschte cmdlets entfernen mit remove-ManagementRoleEntry \n\nremove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\Remove-MoveRequest&rdquo; \nremove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\Suspend-MoveRequest&rdquo; \nremove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\Resume-MoveRequest&rdquo; \n\n\nMit add-ManagmentRoleEntry &ldquo;Create Move Request Gruppe1\\RoleEntry&rdquo; kann man weitere Eintr&auml;ge erstellen und die Rolle weiter personalisieren. \n\nNachdem die nicht erw&uuml;nschten cmdlets entfernt wurden sieht das Ganze so aus:\nGet-ManagementRoleEntry \"Create Move Request Gruppe1\\*\"\n\n&nbsp;\nWichtig: RBAC Rollen sind nicht gleichzusetzen mit ACLs (Sicherheitsberechtigungen), das hei&szlig;t es wird nicht die restriktivste Rolle angewandt. Benutzer erhalten durch alle Rollen die ihnen zugewiesen sind Zugriff auf ein bestimmtes &ldquo;Set&rdquo; an Funktionen. Mehr Rollen = Mehr Funktionen.\nWenn man das Prinzip einmal verstanden hat, wird einem schnell bewusst wie m&auml;chtig dieses neue Berechtigungsmodell ist. Da die Exchange Management Konsole auch nichts anderes macht also PowerShell Befehle abzusetzen kann man so wirklich alles genau an seine Bed&uuml;rfnisse anpassen.\ntom"
        },
        {
          "id": "post-shared-mailboxes-und-auto-mapping-e14-sp1",
          "title": "Shared Mailboxes und Auto Mapping E14 Sp1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/shared-mailboxes-und-auto-mapping-e14-sp1/",
          "content": "Shared und Ressourcen Postf&auml;cher gibt es schon l&auml;nger. Mit Exchange 2010 SP1 kommt aber ein neues Feature das den Admins das leben um einiges erleichtert. Wie das Kind hei&szlig;t ist noch nicht zu erfahren, es wird in div. Blogs und Foren &ldquo;Auto Mapping&rdquo; genannt.\nUm dieses neue Feature zu verwenden muss man nur auf einem Exchange 2010 SP1 Server Berechtigungen auf eine Shared Mailbox setzen, existieren die Berechtigungen bereits m&uuml;ssen sie entfern und nochmal gesetzt werden.\n&nbsp; \nBeim setzen der Berechtigungen werden n&auml;mlich die Benutzer, die von der Berechtigung profitieren, in das ActiveDirectory Attribut msExchDelegatedListLink aufgenommen.\n\nOutlook sucht beim starten nach Mailboxen mit dem DN des Benutzers und verbindet diese automatisch. Ein weiterer Vorteil ist dass die Mailbox vom Benutzer nicht geschlossen oder entfernt werden kann, so werden die Helpdesk Calls weiter reduziert ;)\nDas Ganze funktioniert &uuml;brigens auch f&uuml;r Ressourcen (Room/Equipment) Mailboxen.\ntom\nspecial thanks to: Steve Goodman"
        },
        {
          "id": "post-e14-sp1-importexport-update",
          "title": "E14 SP1 Import/Export Update",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/e14-sp1-importexport-update/",
          "content": "Vor kurzem habe ich in diesem Post &uuml;ber die Import/Export-Mailbox cmdlets geschrieben.\nMit Exchange 2010 SP1 wurde die Import/Export Funktionalit&auml;t ge&auml;ndert und die cmdlets werden durch MailboxImportRequest und MailboxExportRequest ersetzt. Die Vorteile die daraus Resultieren sind folgende:\n\nImport/Export von Online Archiven\nVerwendet Exchange MAPI Provider, Outlook muss nicht mehr auf dem Server installiert werden\ncmdlets verwenden UNC Pfade (PST Files m&uuml;ssen nicht mehr auf den Server kopiert werden)\n\nBeispiel:\nNew-MailboxImportRequest-Mailbox&nbsp;test -IsArchive&nbsp;-FilePath \\\\server\\test.pst\nDieser Befehl Importiert den Inhalt der Datei test.pst in das Online Archiv der Mailbox \"test\"."
        },
        {
          "id": "post-sharepoint-2010-fehler-in-der-sql-datenbank-beheben",
          "title": "Sharepoint 2010, Fehler in der SQL Datenbank beheben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-2010-fehler-in-der-sql-datenbank-beheben/",
          "content": "Letztens wollte ich einen Test-Restore meiner Sharepoint Datenbank durchführen. Normalerweise hat das immer problemlos funktioniert, jedoch beim letzten Backup gab es große Probleme mit dem Sharepoint-Inhalt. Der Restore-Vorgang wurde erfolgreich beendet, jedoch war lediglich die halbe Sharepoint Struktur und keine Daten enthalten.\nNachdem ich das Eventlog des Quellservers durchforstet habe, bin ich auf folgende Fehler im Anwendungs-Log gestoßen:\n\nProtokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 18053    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Fehler: 7884, Schweregrad: 20, Status: 1. (Parameter: ). Der Fehler wird aufgrund eines Formatierungsfehlers im nicht ausführlichen Modus gedruckt. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden ausgelassen.    \n\nProtokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 7105    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Die Datenbank-ID '6', Seite '(0:0)', Slot '0' für den LOB-Datentypknoten ist nicht vorhanden. Dies ist gewöhnlich auf Transaktionen zurückzuführen, die Daten, für die kein Commit ausgeführt wurde, auf einer Datenseite lesen können. Führen Sie DBCC CHECKTABLE aus.    \nUm den Fehler zu analysieren muss man zunächst das SQL Server 2008 Management Studio Express installieren. Über das Management Studio erhält man Zugriff auf dem SQL Server und kann mit dem Troubleshooting beginnen.    Zunächst meldet man sich am SQL Server an. Als Servername verwenden wir SERVER\\Sharepoint\n\nNun ist die Verbindung zum Server hergestellt. Jetzt muss die Datenbank mit der ID ‘6’ (wie in der Fehlermeldung 2) gefunden werden. Als erstes öffnen wir ein Abfragefenster und gehen jede Datenbank mit \nuse NAME-DER-DATENBANK     select db_id()\n\ndurch, bis uns die entsprechende ID im Fenster “Meldungen” ausgegeben wird. In meinen Fall war das die Datenbank WSS_CONTENT.\nNun führen wir den Befehl DBCC CHECKDB (WSS_CONTENT) WITH NO_INFOMSGS, ALL_ERRORMSGS aus und bekommen eine Liste mit den entsprechenden Fehlern\n\nIn meinem Fall:\nMeldung 8965, Ebene 16, Status 1, Zeile 1     Tabellenfehler: Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594043760640 (LOB data-Typ). Auf den Datenknoten außerhalb von Zeilen auf Seite (0:0), Slot 0, Text-ID 1759772672 wird von Seite (1:4986), Slot 6 verwiesen, er wurde jedoch im Scan nicht betrachtet.     Meldung 8929, Ebene 16, Status 1, Zeile 1     Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594123255808 (In-row data-Typ): Es wurden Fehler in Daten außerhalb von Zeilen gefunden mit der ID 1759772672, im Besitz von data, Datensatz identifiziert durch RID = (1:4986:6).     Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'AllDocs'-Tabelle (Objekt-ID 69575286) gefunden.    Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'WSS_Content'-Datenbank gefunden.    repair_allow_data_loss ist die minimale Reparaturstufe für die Fehler, die mit DBCC CHECKDB (WSS_Content) gefunden wurden.\n&#160;\nDie Meldungen weisen darauf hin, dass eine Inkonsistenz in der Datenbank vorliegt. Höchstwahrscheinlich handelt es sich dabei um eine Datei, die auf dem Sharepoint Server upgeloaded wurde. Um die Inkonsistenz zu beheben muss DBCC CHECKDB mit dem Parameter repair_allow_data_loss ausgeführt werden. \nDafür müssen zunächst alle Sharepoint Dienste und der IIS Dienst beendet werden.   Danach müssen die folgenden Kommandos ausgeführt werden:\n\nMit dem Befehl ALTER DATABASE WSS_Content SET SINGLE_USER, wird die Datenbank in den Sinlge_Mode gesetzt, der Befehl DBCC CHECKDB (WSS_Content, REPAIR_ALLOW_DATA_LOSS) startet die Reparatur.\nNachdem die Reparatur abgeschlossen wurde und DBCC CHECKDB keine Fehler mehr protokolliert, kann der Modus wieder zu MULTI_USER geändert werden.\n\nJetzt können alle Dienste wieder gestartet werden. Die Datenbank sollte jetzt konsistent sein und die Sicherung vollständig durchlaufen.\nGrüße   dn"
        },
        {
          "id": "post-appv-46e28093sccm-2007r2-streaming-applications",
          "title": "AppV 4.6–SCCM 2007R2 Streaming Applications",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "AppV, Server",
          "url": "/post/appv-46e28093sccm-2007r2-streaming-applications/",
          "content": "Seit System Center Configuration Manager 2007 R2 kann man Virtuelle Applikationen verteilen. Daf&uuml;r m&uuml;ssen ein paar Einstellungen im SCCM gemacht werden, der SCCM Advanced Client sowie der AppV Client m&uuml;ssen auf den Clients installiert werden.\nEinstellungen SCCM 2007R2\n\nEigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Client Agents, Advertised Programs Client Agent&rdquo; &ouml;ffnen \n\nunter General muss &ldquo;Allow virtual application package advertisemet&rdquo; muss werden  \n\n\nEigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Site Systems, Servername, ConfigMgr distribution point&rdquo; &ouml;ffnen \n\nunter General muss &ldquo;Allow Clients to transfer content from this distribution Point using BITS, HTTP, and HTTPS&rdquo; aktiviert werden \nunter Virtual Application muss &ldquo;Enable virtual application streaming&rdquo; aktiviert werden &nbsp; \n\n\n\nAppV Client deployment\n\nUnter &ldquo;%ProgramFiles%\\Microsoft Configuration Manager\\Tools\\VirtualApp&rdquo; die Datei &ldquo;AppVirtMgmtClient.sms&rdquo; anpassen. \n\nVersion=4.6 (wenn AppV Client 4.6 verwendet wird) \nCommandline=setup.exe /s /v\"/quiet /norestart /qn\"0\\\"\\\" (Application Virtualization Client Installer Command-Line Parameters) \n\n\nEin neues Paket aus einer Definition erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Package From Definition&rdquo; w&auml;hlen. \nMit &ldquo;Browse&rdquo; die Datei AppVirtMgmtClient.sms ausw&auml;hlen  \nIm n&auml;chten Fenster &ldquo;Always obtain files from a source directory&rdquo; w&auml;hlen  \nAls Pfad wird ein Netzwerkfreigabe gew&auml;hlt auf welcher der AppV Client entpackt wurde, folgende Dateien und Ordner sollten vorhanden sein: \n\nsetup.exe \nsetup.msi \nSupport\\Watson\\dw20shared.msi \n\n\nAuf Finish klicken und das Paket wurde erstellt \n\nJetzt muss noch ein Advertisement f&uuml;r das Paket erstellt werden.\n\nRechtsklick auf &ldquo;Site Database, Computer Management, Software Distribution, Advertisements&rdquo; und New Advertisement w&auml;hlen. Einen Namen eingeben, das Paket ausw&auml;hlen welches im vorigen Schritt erstellt wurde und eine Collection ausw&auml;hlen welche den Client erhalten soll.  \nMandatory Assignment hinzuf&uuml;gen  \nArt der Verteilung w&auml;hlen, in dem Fall &ldquo;Download from distribution point and run locally&rdquo;  \nAn dieser Stelle kann auf Finish geklickt werden, f&uuml;r die &uuml;brigen Einstellungen akzeptiere ich die Standards. \n\nJetzt wurde das Paket und die Zuweisung erstellt, die Clients die in der Collection sind erhalten die Software.\nVirtuelle Applikation importieren\nNachdem die Virtuelle Applikation im Sequencer erstellt wurde (wie z.B. hier erkl&auml;rt) muss sie im System Center Configuration Manager importiert werden.\n\nEin neues virtuelles Paket erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Virtual Application Package&rdquo; w&auml;hlen. Im ersten Fenster muss die XML Datei des Pakets angegeben werden.  \nDas Fenster &ldquo;General&rdquo; ist eigentlich selbsterkl&auml;rend, Name, Hersteller usw. k&ouml;nnen eingegeben werden. \nIm Fenster &ldquo;Data Source&rdquo; wird eine Netzwerkfreigabe angegeben auf der das Paket erstellt wird, von dieser Freigabe wird das Paket dann auf die Distribution Points verteilt (Achtung: der Angegebene Order muss existieren und vorhandene Daten werden &uuml;berschrieben!)  \nJetzt kann wieder auf Finish geklickt werden, die Standards der restlichen Einstellungen sind ok. \n\nDas Virtuelle Paket wurde nun also auch erstellt. Jetzt fehlt noch ein Advertisement f&uuml;r dieses.\n\nDas Advertisement wird genau gleich erstellt wie jenes f&uuml;r den AppV Client, der einzige unterschied liegt in der Auswahl der Verteilungsmethode hier w&auml;hlt man &ldquo;Stream virtual applications from distribution point&rdquo; &nbsp; \n\nNach kurzer Zeit werden die Clients auch dieses Advertisement erhalten. Sind Desktopverkn&uuml;pfungen oder Dateizuordnungen konfiguriert werden diese auf dem Client bereits angewandt. Das hei&szlig;t ein .pdf File bekommt in diesem Beispiel bereits den virtuellen Adobe Reader zugewiesen. Beim ersten Starten des Programmes wird der Inhalt des Paketes heruntergeladen, d.h. der erste Start dauert ein bisschen, alle weiteren Starts verlaufen wesentlich schneller, dabei wird nur auf Updates &uuml;berpr&uuml;ft, alle anderen Files sind bereits lokal vorhanden.\ntom"
        },
        {
          "id": "post-sharepoint-web-apps-lassen-sich-nicht-installieren",
          "title": "Sharepoint Web Apps lassen sich nicht installieren",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-web-apps-lassen-sich-nicht-installieren/",
          "content": "Wenn man die Sharepoint Webseite nicht über den default Port 80 betreibt, bricht die Installation der Sharepoint Webservices bei der Erstellung der Beispieldaten ab.\n \n&#160;\nUm das Problem zu umgehen empfiehlt es sich die Sharepoint Webseite während der Installation auf Port 80 zu binden. Dazu sind folgende 2 Schritte notwendig:\n   In der Sharepoint Zentraladministration muss der alternative Zugriff auf Port 80 gebunden werden    Im IIS Manger muss ebenfalls die Bindung neu festgelegt werden \nDanach läuft die Installation vollständig durch und die Webseite kann wieder auf den ursprünglichen Port gebunden werden.\nGrüße   dn"
        },
        {
          "id": "post-appv-46e28093sccm-2007r2e28093streaming-issue",
          "title": "AppV 4.6–SCCM 2007R2–Streaming Issue",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server, AppV",
          "url": "/post/appv-46e28093sccm-2007r2e28093streaming-issue/",
          "content": "Hi, tom here again. Talking about AppV and System Center Configuration Manager 2007R2 today.\nI was stumbling upon this error while I was trying to stream virtual Applications with SCCM. If I set the advertisement to &ldquo;Stream virtual applications from distribution point&rdquo; the following error occurred, though if I set the advertisement to &ldquo;Download content from distribution point and run locally&rdquo; everything worked without any problem.\n\nThe problem was caused by the malware inspection feature of my ForeFront TMG Web Proxy Server.\nIf you see &ldquo;an unexpected error&rdquo; with the Error Code like: 0A-400000C8 try to disable the Proxy on the Clients for further research.\n\nIf you are using Forefront TMG be sure to add the SCCM (streaming enabled) Distribution Point to the Malware Destination Exceptions.\n\nYou wont see this error with Application Virtualization Management Server when using RTSP or RTSPS as streaming protocol. You wont see it even with SCCM&nbsp;if &ldquo;Download content from distribution point and run locally&rdquo; is selected because this uses BITS to transfer the whole package to the client and run it locally. Since SCCM uses HTTP/HTTPS for streaming the connection will go to the proxy server and will be killed by Malware Inspection.\ntom\nps. special thanks go to J.C. Hornbeck (http://blogs.technet.com/b/appvcallback/)"
        },
        {
          "id": "post-sharepoint-foundation-serach-14",
          "title": "Sharepoint Foundation Serach, 14",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-foundation-serach-14/",
          "content": "Wenn ihr auf folgende Fehlermeldung auf eurem Sharepoint 2010 Server stoßt:\n&#160;\nProtokollname: Application     Quelle: Microsoft-SharePoint Products-SharePoint Foundation Search      Datum: 09.08.2010 16:51:10      Ereignis-ID: 14      Aufgabenkategorie:Gatherer      Ebene: Warnung      Schlüsselwörter:      Benutzer: LOKALER DIENST      Computer: Miami.domain.local      Beschreibung:      Die Startadresse 'sts4://jobportal:8015/contentdbid={4cee0e9c-fee5-498f-86b7-9855d89539ff}' kann nicht durchforstet werden.\nKontext: Anwendung 'Suchabfragen_über_Hilfethemen_bedienen', Katalog 'Search'\nDetails:\nZugriff verweigert. Vergewissern Sie sich, dass das Standardkonto für den Inhaltszugriff Zugriff auf dieses Repository hat, oder fügen Sie eine Durchforstungsregel zum Durchforsten dieses Repositorys hinzu. Wenn es sich bei dem zu durchforstenden Repository um ein SharePoint-Repository handelt, vergewissern Sie sich, dass das verwendete Konto über die Berechtigung &quot;Alles lesen&quot; für die durchforstete SharePoint-Webanwendung verfügt. (0x80041205)\n   bedeutet das, dass ihr eine Webanwendung unter einer URL betreibt, die nicht dem Computername des Server entspricht. Dafür verantwortlich ist das sog. Loopback check security feature, welches ab Windows Server 2003 SP1 implementiert ist. Es lehnt die Authentifizierung ab, wenn die URL nicht mit dem Computernamen übereinstimmt und verhindert somit, dass die Sharepoint Suche die Webseite indiziert.\nHier ein Workaround um das Problem zu beheben:\nIn der Registry des Sharepoint Servers muss unter \nHKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Lsa\nder Schlüssel (DWORD) “DisableLoopbackCheck” mit Wert 1 erstellt werden. Nach einem Neustart ist das Security Feature deaktiviert und es werden keine Warnungen mehr ins EventLog geschrieben.\nGrüße   dn"
        },
        {
          "id": "post-exchange-2010e28093database-restore",
          "title": "Exchange 2010–Database Restore",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010e28093database-restore/",
          "content": "Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.\nMan kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber mehr in einem anderen Beitrag.\nDie Datenbank wird also von der Sicherung zurückgeholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.\n&#160;\nNun kann ich wählen was ich Widerherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die *.edb Datei der Datenbank und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.\nWurden die Files zurückgeholt, kann man die Recovery Database erstellen. Dazu brauchen wir mal wieder die dunkle Seite der Macht, also öffne ich die Exchange Management Shell. Dort wird mit dem cmdlet new-MailboxDatabase eine Recovery Database aus der widerhergestellten *.edb Datei erstellt.\nDieses Beispiel erstellt die Recovery Database RDB01 auf dem Server mbx01, X:\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner Widerhergestellt wurden.\n   New-MailboxDatabase –Recovery Rdb01 –Server mbx01 –EdbFilePath x:\\restore\\db.edb –LogFolderPath x:\\restore  \nDie Datenbank wurde erstellt, jedoch wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.\n\nUm die Recovery Datenbank in einen “Clean Shutdown State” zu bringen wird das Tool eseutil.exe verwendet. Dafür öffnet man eine Eingabeaufforderung (oder EMS) und lässt eseutil –p auf die edb Datei los. Der Parameter –p steht hier für Repair. In meinem Beispiel lautet der Befehl: \n   eseutil.exe –p x:\\restore\\db.edb  \n\nNachdem Eseutil durchgelaufen ist, die Datenbank sich also im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick oder in der Shell mit Mount-Database RDB01.\nDie Datenbank wurde erfolgreich gemounted und ich habe jetzt Zugriff auf die Daten.\nMit dem cmdlet Export-Mailbox können jetzt einzelne Mails oder ganze Mailboxen widerhergestellt werden, mehr zum cmdlet Export-Mailbox gibt es hier.\n&#160;\ntom"
        },
        {
          "id": "post-importexport-mailbox",
          "title": "Import/Export Mailbox",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/importexport-mailbox/",
          "content": "Mit den cmdlets import-Mailbox und export-Mailbox kann Inhalt von einer Mailbox exportiert oder in eine Mailbox importiert werden. Soviel sagt eigentlich der Name auch ;)\nDiese cmdlets sind standardm&auml;&szlig;ig aber nicht verf&uuml;gbar, bzw. hat ein &bdquo;normaler&ldquo; Exchange Organization Administrator keine Berechtigungen sie zu verwenden. Bevor diese Berechtigungen gesetzt werden sollte man RBAC (Role Based Access Control) verstehen.\nMan erstellt eine neue Universelle Gruppe im Active Directory, ich gebe ihr einen beschreibenden Namen &bdquo;Enterprise Import Export Users&ldquo;. Jetzt wei&szlig;e ich dieser Gruppe die Management Rolle &bdquo;Mailbox Import Export&ldquo; zu, dazu verwende ich folgendes cmdlet in der Exchange Management Shell:\nNew-ManagementRoleAssignment -Name \"Import Export Role\" -SecurityGroup \"Enterprise Import Export Users\" -Role \"Mailbox Import Export\"\nMitglieder dieser Gruppe haben jetzt die notwendigen Berechtigungen um die Import/Export cmdlets zu verwenden, die Exchange Management Shell bzw. Management Konsole m&uuml;ssen neu gestartet werden.\nImport-Mailbox\nWird verwendet um PST Daten in Mailboxen zu importieren. Wenn die PST Dateien im Format &lt;Exchange Alias&gt;.pst vorhanden sind kann man auch mehrere Imports gleichzeitig machen.\nMit diesem Befehlt werden alle Elemente aus c:\\pst\\test.pst in die Mailbox &ldquo;test&rdquo; importiert.\nImport-Mailbox &ndash;identity test &ndash;PstFolderPath c:\\pst\\test.pst\nMit diesem Befehl werden alle Dateien im Ordner c:\\pst in die entsprechenden Mailboxen importiert, wichtig ist dabei der Name der PST Files.\nDir c:\\pst |Import-Mailbox\nExport-Mailbox\nWird verwendet um Objekte von Mailboxen zu exportieren, als Ziel kann eine andere Mailbox oder eine PST Datei anagegeben werden. H&auml;ufig wird dieses cmdlet verwendet um Objekte aus einer Recovery Datenbank wieder in der urspr&uuml;nglichen Mailbox herzustellen.\nMit diesem Befehl werden alle Elemente aus der Mailbox &ldquo;test&rdquo; in den Ordner &ldquo;testdata&rdquo; der Mailbox &ldquo;export&rdquo; kopiert.\nExport-Mailbox -Identity test -TargetMailbox export -TargetFolder testdata\nMit diesem Befehl werden alle Element aus der Mailbox \"test\" in die PST Datei auf C:\\pst exportiert. Achtung: F&uuml;r diesen Befehl wird Outlook (x64)&nbsp;auf dem Exchange Server ben&ouml;tigt der den Export durchf&uuml;hren soll. Nach Best Practice sollte das ein separater Server sein der sonst keine Mailboxen h&auml;lt.\nExport-Mailbox -Identity test -PstFolderPath c:\\pst\\test.pst\nGenauere Informationen gibts im Technet: Export-Mailbox, Import-Mailbox\ntom"
        },
        {
          "id": "post-appve28093adobe-reader-sequencing-receipe",
          "title": "AppV–Adobe Reader Sequencing Receipe",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/appve28093adobe-reader-sequencing-receipe/",
          "content": "Anhand des Adobe Readers möchte ich hier zeigen wie man eine virtuelle Applikation erstellt.\nWie der&#160; Sequencer vorbereitet wird habe ich hier beschrieben.\n&#160;\nDer Sequencer wird gestartet und die AppV Sequencer Console wird geöffnet. Man wählt “Paket erstellen” um ein neues Paket zu erstellen.\n\nIm nächsten Dialog wird der Name und eventuell eine Beschreibung vergeben.\n\nNachdem man auf “Weiter” geklickt hat kann man mit dem Sequencing beginnen. Durch klicken auf “Überwachung starten” wird man aufgefordert einen Ordner auszuwählen den der Sequencer überwachen soll.\n\nEs wird ein Ordner auf dem Q-Drive erstellt, dieser sollte einen Namen im 8.3 Format haben, also maximal acht Zeichen vor dem Punkt und maximal drei danach.\n\nJetzt wird das Setup von Adobe Reader gestartet (nicht der Web Installer, sondern das offline Installationspaket). Wichtig ist dabei das man den eben erstellten Ordner auf dem Q-Drive als Zielordner angibt.\n\nWenn die Installation erfolgreich abgeschlossen ist kann man die Überwachung beenden.\n\nIm nächsten Schritt werden Dateizuordnungen und Verknüpfungen konfiguriert, man kann z.B. wählen ob eine Verknüpfung auf dem Desktop der Clients erstellt werden soll oder nicht.\n\nJetzt kann die Applikation personalisiert werden, durch klicken auf “Starten” wird Adobe Reader gestartet und man kann die EULA akzeptieren, dann muss das nicht der Benutzer machen. Außerdem empfiehlt es sich die Automatischen Updates des Readers zu deaktivieren. Wenn man alle Einstellungen gemacht hat wird die Applikation wieder beendet.\n\nNoch einmal auf “Weiter” klicken und das Paket ist vorerst fertig.\n\nIn den folgenden Fenstern können noch diverse Einstellungen getroffen werden, wichtig ist im Reiter “Bereitstellung” das richtige Protokoll zu wählen, für Testumgebungen wird das RTSP sein. Außerdem kann man hier die unterstützten Betriebssysteme und die “Ausgabeoptionen” wählen. Wird das Paket per Streaming verteilt sollte man die Komprimierung aktivieren. Wenn man die Applikation an “Standalone” Clients verteilt dann muss man auch ein MSI File generieren.\nEine weitere wichtigie Einstellung ist der Hostname des Servers, standardmäßig wird die Variable %SFT_SOFTGRIDSERVER% verwendet, diese muss auf den Clients als Umgebungsvariable mit dem Hostnamen des Servers konfiguriert werden.\n\nMan kann noch mehr personalisieren und sogar die virtuelle Registry bearbeiten, allerdings ist das für Adobe Reader nicht notwendig. Also kann das Paket gespeichert werden.\n\nWurde das Paket gespeichert erhält man folgende Dateien. Diese können mit einem Application Virtualization Management Server, mit System Center Configuration Manager oder direkt per MSI an die Clients verteilt werden.\n\nUm die Applikation mit dem AppV Management Server zu verteilen wird in der Management Console mit rechts auf Applications gecklickt, dort kann man die *.sprj Datei auswählen und so die virtuelle Applikation erstellen. Die Dateien die mit dem Sequencer erstellt wurden müssen dazu in den “Content” Ordner des AppV Management Servers kopiert werden. \n&#160;\ntom"
        },
        {
          "id": "post-appve28093sequencer",
          "title": "AppV–Sequencer",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/appve28093sequencer/",
          "content": "Der Microsoft Application Virtualization Sequencer ist ein Client oder Server der verwendet wird um virtuelle Applikationen zu erstellen.\nDer Sequencer ist im Idealfall eine virtuelle Maschine, vor jedem „Sequencing“ sollte der Ausgangszustand des Sequencers der Selbe sein.\nMan erstellt also eine neue virtuelle Maschine und installiert ein Betriebssystem seiner Wahl. Es müssen zwei Partitionen vorhanden sein, eine für das System und eine für das sogenannte Q-Drive.\nZu diesem Zeitpunkt sollte man so wenig Software wie möglich installieren, alles was auf dem Sequencer installiert wird muss auch auf den Clients installiert werden damit die virtuellen Applikationen laufen.\nEs wird also der AppV Sequencer installiert und die zweite Partition mit NTFS Formatiert, dieser Partition weist man den Laufwerksbuchstaben Q: zu. Der Client soll in der Domain hängen und folgende Dienste sollten gestoppt und deaktiviert werden:\n· Windows Update\n· Windows Search\nJetzt wird die virtuelle Maschine heruntergefahren und das Feature UnDo Disk (VMWare: Nonpersistent Disk) wird aktiviert. Ab jetzt ist die Maschine bei jedem Start auf dem gleichen Stand und bereit ein Paket zu erstellen.\nWie ein Paket erstellt wird erkläre ich in diesem Post.\ntom"
        },
        {
          "id": "post-keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)",
          "title": "Keine Mailzustellung auf Öffentliche Ordner nach Exchange 2010 Upgrade (von Exchange 2k3)",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)/",
          "content": "Nachdem der letzte Exchange 2003 Server aus der Struktur entfernt wird, bleiben dennoch die Administrative Gruppe und verschiedene Ordner-Strukturen in der AD Konfiguration zurück.\nDies kann unter Umständen den Mailfluss zu den Öffentlichen Ordnern stören. Man erhält dann folgende&#160; Unzustellbarkeitsberichte vom Exchange Server:\n \nUm das Problem zu beheben muss zunächst der ADSI Editor geöffnet werden. In der Unterstruktur\n&#160;\nConfiguration / CN=Configuration,DC=YOURDOMAIN / CN= Services / CN= YOUR ORGANISATION / CN= Administrative Groups / CN= First administrative Group /\n&#160;\nder Ordner CN=Servers gelöscht werden (sofern dieser auch leer ist)\n&#160;\nNun werden Mails den Öffentlichen Ordnern wieder zugestellt\nGrüße   dn"
        },
        {
          "id": "post-appv-46e28093fehler-beim-starten",
          "title": "AppV 4.6–Fehler beim Starten",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server",
          "url": "/post/appv-46e28093fehler-beim-starten/",
          "content": "Heute mal ein neues Thema auf ntSystems, Applikations Virtualisierung. Viele Hersteller setzen auf diese Technologie, unter anderem Microsoft mit SoftGrid bzw. AppV.\nErscheint beim Starten der Applikation der Fehler: &ldquo;Auf die Angegebene Instanz von Application Virtualization Server konnte nicht zugegriffen werden&rdquo; mit einem Fehlercode wie &ldquo;xxxxxxx-xxxxxx0A-10000002&rdquo; dann wurde die Umgebungsvariable SFT_SOFTGRIDSERVER am AppV Client nicht gesetzt.\n\nBeim Erstellen der virtuellen Applikation (sequencing) wird standardm&auml;&szlig;ig diese Variable verwendet, der Client kann damit allerdings nicht viel anfangen. Also einfach auf den AppV Clients die Variable setzen und als Wert den FQDN des AppV Management Servers eintragen.\nTipp: Daf&uuml;r bieten sich nat&uuml;rlich Group Policy Preferences an.\nErscheint der Fehler: &ldquo;Die angegeben Anwendung ist nicht vorhanden&rdquo; mit einem Fehlercode wie dem &ldquo;xxxxxxx-xxxxxxxx-00000A09&rdquo; deutet das auf einen falschen Namen hin. Der Fehler kann auch auftreten w&auml;hrend ein Programm l&auml;uft, z.B. wenn es sich bei der Anwendung um einen Proxy des Office Deplyment Kit for AppV handelt. Beim Ausf&uuml;hren von \"msiexec /i offvirt.msi\" muss auf die richtigen Namen geachtet werden. Mehr dazu in einem separaten Post.\n&nbsp;\nEin weiterer Fehler ist folgender:\nAm AppV Sequenzer wird standardm&auml;&szlig;ig das RTSPS (322) Protokoll verwendet, das muss allerdings erstmal konfiguriert werden (Zertifikat usw.). Zum Testen eignet sich auch RTSP das Port 554 verwendet. Das kann direkt beim Erstellen des Paketes ausgew&auml;hlt werden, alternativ kann man auch die .osd Datei bearbeiten und den Link anpassen.\nAnstelle von \"RTSPS://%SFT_SOFTGRIDSERVER%:322/DefaultApp.sft\" wird also \"RTSP://%SFT_SOFTGRIDSERVER%:554/DefaultApp.sft\" gesetzt.\n&nbsp;\nSoviel zum Thema Applikations Virtualisierung. Ich arbeite an weiteren Posts die den Vorgang des Sequencen und Verteilen von Applikationen beschreiben.\nstay tuned, tom"
        },
        {
          "id": "post-exchange-2010-w3wpexe-belegt-sehr-viel-ram",
          "title": "Exchange 2010, w3wp.exe belegt sehr viel RAM",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-w3wpexe-belegt-sehr-viel-ram/",
          "content": "Heute musste ich auf meinen Exchange Server 2010 feststellen, dass eine Instanz vom w3wp.exe Dienst läuft, die über 1 GB an RAM beansprucht.\nUm die RAM-Auslastung zu verringern müssen die Recycling Einstellungen für den entsprechenden Applikation Pool im IIS konfiguriert werden.\nAls erstes öffnet man den IIS Manager und wechselt zu den “Application Pools”\n&#160;\n \n   Um den verantwortlichen Application Pool zu finden kann jeder einzelne Pool durch Rechtsklick / Recycling zum Aufräumen gezwungen werden. Ist der verantwortliche Pool gefunden kann man die Recycling Vorgänge in den Eigenschaften automatisieren. Bsp: Alle 12 Stunden den Recycling-Vorgang starten.\n&#160;\n \n&#160;\nGrüße   dn"
        },
        {
          "id": "post-exchange-2010e28093gal-fotos",
          "title": "Exchange 2010–GAL Fotos",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Exchange, Server",
          "url": "/post/exchange-2010e28093gal-fotos/",
          "content": "Schon in fr&uuml;heren Exchange Versionen wurden Drittherstellertools eingesetzt um ein Foto in der Globalen Adressliste zu ver&ouml;ffentlichen und in diversen Clients anzuzeigen.\nExchange 2010 und Outlook 2010 k&ouml;nnen das mit Bordmitteln, das Bild wird dabei in der Active Directory gespeichert.\n&nbsp;&nbsp; \n\nFoto in Active Directory laden\nDas Foto wird &uuml;ber die Exchange Management Shell importiert und zwar mit folgendem cmdlet.\nImport-RecipientDataProperty -Identity user.name -Picture -FileData ([Byte[]]$(Get-Content -Path \"C:\\path\\to\\picture.jpg\" -Encoding Byte -ReadCount 0))\nDieses cmdlet enkodiert das Bild und speichert die Daten im Active Directory Attribute &ldquo;thumbnailPhoto&rdquo;. Wenn man sich dieses Attribut jetzt ansieht (AC Users and Computers, ADSI Edit) dann sieht man die &ldquo;Rohdaten&rdquo;.\n\n\nAchtung: Das Attribut &ldquo;thumbnailPhoto&rdquo; kann eine maximale Gr&ouml;&szlig;e von 10k haben, das Bild sollte 96x96 Pixel messen um in Outlook optimal dargestellt zu werden.\nDurch die Gr&ouml;&szlig;enbeschr&auml;nkung von 10k wird ein &ldquo;&uuml;berf&uuml;llen&rdquo; der Active Direcotry verhindert, man sollte allerdings die Zunahme des Replikationstraffic bedenken wenn man GAL Fotos einf&uuml;hrt, diese Zunahme ist tempor&auml;r schlie&szlig;lich &auml;ndert man das Foto nicht t&auml;glich.\nDamit ist das Foto zwar im Active Directory hinterlegt, allerdings ist in Outlook noch nichts davon zu sehen.\nSchema &Auml;nderung\nDaf&uuml;r muss man eine kleine Schema&auml;nderung durchf&uuml;hren, und zwar muss das Attribut &ldquo;thumbnailPhoto&rdquo; an den Globalen Catalog Server repliziert werden.\nDaf&uuml;r &ouml;ffnet man das Active Directory Schema Snap-In in einer MMC und navigiert zum Attribut, in den Eigenschaften wird die Checkbox bei &ldquo;Replicate this Attribute to the Global Catalog&rdquo; gesetzt.\n\nDie schmmgmt.dll muss Registriert werden damit das Schema Snap-In zur Verf&uuml;gung steht \n\nIn einer Administrativen CMD: &ldquo;regsvr32 schmmgmt.dll&rdquo; \n\n\nMMC &ouml;ffnen (Start, Ausf&uuml;hren, mmc) \n\nFile, Add/Remove Snap-in&hellip;, Active Directory Schema \n\n\nUnter &ldquo;Attributes&rdquo; rechtsklick auf &ldquo;thumbnailPhoto&rdquo; und die oben genannte Checkbox setzen\n\n\nOffline Address Book aktualisieren\nJetzt muss nur noch das Offline Adressbuch aktualisiert werden um das Ergebnis gleich zu sehen, alternativ kann man auch warten bis das automatisch geschieht (default: 5 Uhr). Das OAB kann einfach &uuml;ber folgendes cmdlet aktualisiert werden:&nbsp;\nGet-OfflineAddressBook | Update-OfflineAddressBook\nOutlook l&auml;dt aktualisiert das Offlineadressbuch nur einmal in 24h also muss auch dort noch ein Download durchgef&uuml;hrt werden, dann ist das Foto schlie&szlig;lich sichtbar.\n\nHinweis: Das Offline Adressbuch wird durch die Fotos nicht gr&ouml;&szlig;er, es wird nur ein Pointer auf das Foto im OAB gespeichert, nicht das Foto selbst. Das hei&szlig;t allerdings auch dass ein Offline Client das Foto nicht sieht.\ntom"
        },
        {
          "id": "post-sharepoint-foundation-2010",
          "title": "Sharepoint Foundation 2010, Fehler Web.config, requestFiltering",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-foundation-2010/",
          "content": "Wer im Eventlog des Sharepoint-Foundation-Servers auf folgende Fehlermeldung st&ouml;&szlig;t:\n\nTEXT:\nProtokollname: Application Quelle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft-SharePoint Products-SharePoint Foundation Datum:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20.07.2010 00:00:01 Ereignis-ID:&nbsp;&nbsp; 2137 Aufgabenkategorie:Integrit&auml;t Ebene:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fehler Schl&uuml;sselw&ouml;rter: Benutzer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NETZWERKDIENST Computer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miami.**** Beschreibung: SharePoint-Integrit&auml;tsanalyse: Fehler. Die Datei 'Web.config' weist falsche Einstellungen f&uuml;r das Element 'requestFiltering' auf. F&uuml;r das requestFiltering-Element in der Datei 'web.config' muss das Attribut 'allowDoubleEncoding ' auf 'true' festgelegt sein, damit Dateinamen, die das Zeichen + enthalten, unterst&uuml;tzt werden. Au&szlig;erdem muss es &uuml;ber ein untergeordnetes Element 'requestLimits' verf&uuml;gen, dessen Attribute 'maxAllowedContentLength' auf '2147483647' festgelegt ist, um Konflikte mit Dateiuploads zu vermeiden. Stellen Sie sicher, dass das Element 'requestFiltering' in der Datei 'web.config' vorhanden ist, dass das Attribut 'allowDoubleEncoding' auf 'true' festgelegt ist, dass ein untergeordnetes Element 'requestLimits' vorhanden ist und dass der Wert 'maxAllowedContentLength' auf '2147483647' festgelegt ist. Weitere Informationen zu dieser Regel finden Sie unter http://go.microsoft.com/fwlink/?LinkID=163442.\ndem wird dieser Fix helfen:\n\nIIS Manager &ouml;ffnen \nZur Sharepoint webseite wechseln \nDen Konfigurationseditor &ouml;ffnen \n\n\n\nAbschnitt &ldquo;requestFiltering&rdquo; w&auml;hlen \n\n\n\nZu &ldquo;requestLimits&rdquo; wechseln und den Wert maxAllowedContentLenght in 2147483647 &auml;ndern, danach Konfiguration &uuml;bernehmen \n\n\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-upgrade-exchange-2k3-2010",
          "title": "Upgrade Exchange 2k3 - 2010",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/upgrade-exchange-2k3-2010/",
          "content": "&#160;\nIn diesem Post werde ich das Upgrade von Exchange 2k3 zu 2010 beschreiben und einige bekannte Fehler und deren Lösung aufzeigen.\n&#160;\nUpgrade\n&#160;\nUm einen groben Überblick zu bekommen ob die Infrastruktur Exchange 2010 tauglich ist, empfehle ich den “Microsoft Exchange Pre-Deployment Ananlyzer” auszuführen. Dieses Tool führt einige Checks an der Struktur aus.\n&#160;\n   Exchange Organisation in native mode setzen \n&#160;\nSofern das nicht schon passiert ist, muss die Organisation im nativen Modus geschalten werden.\n&#160;\n \n&#160;\n   Active Directory Schema upgrade \n&#160;\nJetzt muss das Schema geupdatet werden. Dazu startet man vom Schema Master folgende Setup Kommandos von der Exchange CD aus:\n&#160;\nSetup /PrepareLegacyExchangePermissions\nSetup /PrepareSchema\nSetup /PrepareAD [/OrganizationName:YOUR_DOMAIN]\nSetup /PrepareDomain\n&#160;\n   Link state suppression deaktivieren \n&#160;\nIn Exchange Server 2003 wurde für einen Server, der keine Connectoren besitzt ein anderer Pfad für den Versand gesucht. Diese Option wird ab Exchange 2007 nicht mehr unterstützt. Um die Koexistenz zu gewährleisten muss dieses Feature auf allen Exchange 2003 Server deaktiviert werden\n&#160;\n   Open Registry Editor.    Locate HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\RESvc\\Parameters.    Right-click Parameters and select New | DWORD value. Name the new DWORD value SuppressStateChanges.    Double-click SuppressStateChanges.    In the Value data field, enter 1.    Close Registry Editor, and then restart the SMTP service, the Microsoft Exchange Routing Engine service, and the Microsoft Exchange MTA Stacks services for the change to take effect. \n&#160;\n   Exchange 2010 System Requirements \n&#160;\nMit folgendem Kommando werden die nötigen Requirements auf dem Exchange Server installiert\n&#160;\nAdd-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy –Restart\n&#160;\nZudem beim Dienst NetTCPPortSharing den Starttyp auf Automatisch setzen:\n&#160;\nSet-Service NetTcpPortSharing -StartupType Automatic\n&#160;\n&#160;\nInstallation Client Access Rolle\n&#160;\nAls erstes wird die Rolle “Client Access” installiert\n&#160;\n \n&#160;\n \n&#160;\nWenn der Server z.B. über OWA erreicht werden soll muss noch die externe Adresse angegeben werden (Bsp: mail.contoso.com)\n&#160;\n \n&#160;\nZertifikate installieren\n&#160;\nDer nächste Schritt besteht darin die Zertifikate einzufügen und zu registrieren. Über den Exchange Zertifikatwizzard kann ein neues Exchange Zertifikat erstellt werden:\n&#160;\n \n&#160;\nJetzt müssen noch alle erforderlichen Optionen angegeben werden bevor die Anforderung erstellt werden kann:\n&#160;\n \n&#160;\nDie Anforderung kann jetzt gespeichert werden. Diese muss dann über die Zertifizierungsstelle eingereicht werden und man erhält sein Zertifikat. Nachdem das Zertifikat ausgestellt wurde kann es über die Console der Anfrage hinzugefügt werden. Jetzt muss man dem Zertifikat noch die entsprechenden Dienste zuweisen:\n&#160;\n \n&#160;\nInstallation Hub Transport Rolle\n&#160;\nJetzt wird die Rolle “Hub Transport” installiert.\n&#160;\n \n&#160;\nDas Setup Programm weist darauf hin, dass es einen Connector benötigt um Mails von / zu den Exchange 2003 Servers zu senden. Es muss der Server ausgewählt werden, der zur gleichen Routinggruppe wie der Exchange Server 2010 zählt sofern mehrere 2003 Server in unterschiedlichen Standorten vorhanden sind.\n&#160;\nWenn das Microsoft Filter Pack nicht installiert wurde wird man darauf hingewiesen es nach zu installieren:\n&#160;\n \n&#160;\nDamit Active Sync in einer Exchange 2003 / 2010 Umgebung weiterhin funktioniert, muss die Authentifizierung für die Virtual Directory auf integrierte Windows Authentifizierung geändert werden.\nZuerst muss der Hotfix KB937031 auf den Exchange 2003 Servern installiert werden um die entsprechende Einstellung setzen zu können.\nNachdem der Hotfix auf dem Exchange Server 2003 installiert wurde, lassen sich die Einstellungen für das ActiveSync virtuelle Verzeichnis ändern. Die Authentifizierung kann jetzt auf &quot;Integrierte Windows-Authentifizierung&quot; geändert werden\n&#160;\n \n&#160;\n\n\n\n\n\n\n\n\n\nInstallation Mailbox Rolle\n&#160;\nJetzt wird die Mailbox Rolle installiert.\n&#160;\n \n&#160;\nJetzt verfügt man über ein vollwertige Exchange 2010 Installation. Für den Betrieb des Servers müssen noch einige Einstellungen vorgenommen werden.\n&#160;\nOffline Adressbuch\n&#160;\nDas offline Adressbuch muss auf den Exchange 2010 verschoben werden. Dies kann über die Console unter den Organisationseinstellungen gemacht werden. Zudem muss die Einstellung für den Webverteilung aktiviert werden. (Ab Outlook 2007 wird das Adressbuch über die Webservices geladen)\n&#160;\n \n&#160;\nSend Connector erstellen\n&#160;\nEs wird ein neuer Send Connector erstellt, der für Exchange 2010 fungiert. Danach wird der alte Exchange 2003 Connector gelöscht.\n&#160;\n \n&#160;\nReceive Connector konfigurieren\n&#160;\nDamit der Exchange Server Mails annimmt, muss ein neuer Connector erstellt werden, der für den anonymen Zugriff freigeschalten wird.\n&#160;\n \n&#160;\nKompatibilität Outlook 2003\n&#160;\nOutlook 2010, 2007 verwenden Standardmäßig die PRC Verschlüsselung, 2003 nicht. Bei Exchange Server 2010 werden per default nur verschlüsselte RPC Verbindungen angenommen. Dies kann jedoch mit folgendem Befehl über die Shell abgeschaltet werden:\n&#160;\nSet-RPCClientAccess – Server –YOURSERVER –EncryptionRequired $false\n&#160;\n\n&#160;\n Öffentliche Ordner, Free / Busy Informationen synchronisieren\n&#160;\nUm die Öffentlichen Ordner auf Exchange 2010 zu verschieben müssen diese repliziert werden. Diese Einstellungen werden auf dem Exchange 2003 vorgenommen. Hierzu wird der Exchange Server 2010 als Replikationspartner den Ordnern “Offline Address Book” und “Schedule + Free Busy” hinzugefügt.\n&#160;\n \n&#160;\nNachdem die Informationen repliziert wurden kann das Replikat von den Exchange 2003 Servern entfernt werden.\n&#160;\nAdresslisten konvertieren\n&#160;\nUm die Exchange 2003 Adresslisten in Exchange 2010 bearbeiten zu können müssen diese erst konvertiert werden (Exchange 2003 benutzte LDAP Filter). Dies wird über die Shell gemacht. \n&#160;\nDie Adresslisten können mit den folgenden Kommandos geupdatet werden:\n&#160;\nBsp: Adressliste Verwaltung die auf die Abteilung gefiltert wird\n&#160;\nSet-AddressList &quot;Verwaltung&quot; -IncludedRecpients MailboxUsers\nSet-AddressList &quot;Verwaltung&quot; -ConditionalDepartment Verwaltung\n&#160;\nAddresspolicy updaten\n&#160;\nAuch die Addresspolicy muss geupdatet werden, sonst erhält man folgende Meldung:\n&#160;\n \n&#160;\nDas Update kann über folgenden Befehl gemacht werden:\n&#160;\nSet-EmailAddressPolicy “Default Policy” –IncludedRecipients AllRecipients\n&#160;\n&#160;\nDie Exchange Installation ist nun komplett und man kann beginnen die Mailboxen zu verschieben.     \nWichtig: Nach der Installation sollte der Exchange BPA ausgeführt werden um sämtliche Einstellungen und Funktionen zu verifizieren.\n&#160;\n\n\nFehler\n&#160;\nWährend dem Upgrade bin ich auf mehrere Fehler gestoßen die ich hier kurz samt Lösung erläutere:\n&#160;\nFehler 1\n&#160;\nLog Name: Application\nSource: MSExchange MailTips\nDate: 12.07.2010 15:40:53\nEvent ID: 14003\nTask Category: MailTips\nLevel: Error\nKeywords: Classic\nUser: N/A\nComputer: EX2k10.***\nDescription:\nUnable to create Group Metrics distribution share.\nShare: GroupMetrics\nDirectory: C:\\Program Files\\Microsoft\\Exchange Server\\V14\\GroupMetrics\nMessage: 00000842\n&#160;\nUm diese Fehlermeldung zu beheben habe ich den Starttyp des Dienstes “Microsoft Echange Service Host” auf Automatic (Delayed Start) gesetzt\n&#160;\nFehler 2\n&#160;\nLog Name: Application\nSource: MSExchangeSA\nDate: 12.07.2010 16:07:45\nEvent ID: 9323\nTask Category: (13)\nLevel: Warning\nKeywords: Classic\nUser: N/A\nComputer: EX2k10.***\nDescription:\nEntry 'Benutzer1' has invalid or expired e-mail certificates. These certificates will not be included in the offline address list for '\\oGAL'. \n- \\Offline-EX2k10 \n&#160;\nDas bedeutet, dass Benutzer1 Fehlerhafte Zertifikate in AD besitzt. Diese müssen gelöscht werden (vorher in AD die erweiterten Eigenschaften einblenden).\n&#160;\n \n&#160;\nFehler 3\n&#160;\nLog Name: Application\nSource: MSExchangeSA\nDate: 12.07.2010 16:14:01\nEvent ID: 9359\nTask Category: (13)\nLevel: Warning\nKeywords: Classic\nUser: N/A\nComputer: EX2k10.***\nDescription:\nOALGen truncated or dropped properties for entry 'Discovery Search Mailbox' in address list '\\oGAL’ because they exceeded the configured size limits for the version 4 offline address list. The affected MAPI ids are: 8cd8. \n- \\Offline-EX2k10 \n&#160;\nDieser Fehler kann ignoriert werden, er ist ab Design so.\n&#160;\nFehler 4\n&#160;\nLog Name: Application\nSource: MSExchange ActiveSync\nDate: 15.07.2010 09:50:07\nEvent ID: 1053\nTask Category: Configuration\nLevel: Error\nKeywords: Classic\nUser: N/A\nComputer: EX2k10.***\nDescription:\nExchange ActiveSync doesn't have sufficient permissions to create the &quot;CN=Daniel Nitz,OU=***,OU=****,DC=***,DC=local&quot; container under Active Directory user &quot;Active Directory operation failed on **********. This error is not retriable. Additional information: Access is denied.\nActive directory response: 00000005: SecErr: DSID-03151E04, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0\n&quot;.\nMake sure the user has inherited permission granted to domain\\Exchange Servers to allow List, Create child, Delete child of object type &quot;msExchangeActiveSyncDevices&quot; and doesn't have any deny permissions that block such operations.\n\n\n\n\n\n\n\n\n\n&#160;\n&#160;\nHier gibt es ein Rechte-Problem. Bei den User wurde wahrscheinlich in AD die Vererbung deaktiviert.\n&#160;\nFehler 5\n&#160;\nFehler beim Download des Offline Adressbuches:\n&#160;\n \n&#160;\nDieser Fehler kann behoben werden, indem im IIS des Exchange Servers im virtual Directory “OAB” die Einstellung gesetzt wird, dass nicht mehr SSL erzwunden werden muss.\n&#160;\n \n&#160;\nViel Spaß bei der Migration zu Exchange Server 2010!\n&#160;\nGrüße   dn"
        },
        {
          "id": "post-forefront-tmg-2010e28093rsa-authentication-manager-71",
          "title": "Forefront TMG 2010–RSA Authentication Manager 7.1",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Server, Security",
          "url": "/post/forefront-tmg-2010e28093rsa-authentication-manager-71/",
          "content": "&nbsp;\nWer das Vergn&uuml;gen hat die beiden genannten Systeme zum kommunizieren zu bewegen wird sich &uuml;ber die &uuml;ppige Dokumentation freuen die es zu den Vorg&auml;ngerprodukten gibt&hellip; die&nbsp;hilft so gut wie gar nicht weiter.\n&nbsp;\nIch gehe davon aus das RSA Authentication Manager 7.1 Sp3 bereits installiert wurde, ein Realm bzw. Security Domain eingerichtet wurde. Man meldet sich also an der RSA Security Console an und erstellt einen neuen &ldquo;Authentication Agent&rdquo;. Dazu klickt man auf Access, Authentication Agents, Add New.\n&nbsp;\n\n&nbsp;\nJetzt m&uuml;ssen die Felder ausgef&uuml;llt werden, also der Hostname des TMG Servers (Array), die IP Adressen die dazu geh&ouml;ren (nat&uuml;rlich nur die vom betreffenden Netzwerk). Bei Agent Type habe ich Standard Agent verwendet und das funktioniert, habe leider keine Dokumentation gefunden aus der hervorgeht welchen Typ man verwenden sollte. Bei &ldquo;Agent may be Accessed by&rdquo; kann konfiguriert werden ob sich alle (aktiven) Benutzer &uuml;ber den Authentication Agent anmeldn k&ouml;nnen oder nur Mitglieder bestimmter Gruppen.\nAnschli&szlig;end muss man nur noch auf Save klicken und der Authentication Agent ist erstellt.\n&nbsp;\nJetzt braucht man eine Konfigurationsdatei f&uuml;r TMG Server. Also wieder auf Access, Authentication Agents klicken und dieses mal &ldquo;Genereate Configuration File&rdquo; w&auml;hlen.\n&nbsp;\n\n&nbsp;\nWenn man dann auf &ldquo;Generate Config File&rdquo; klickt, erh&auml;lt man eine Zip Datei die eine Datei sdconf.rec beinhaltet. Diese Datei muss auf allen TMG Array Mitgliedern in folgende Pfade kopiert werden.\n\n%windir%\\system32\n%programfiles%\\Microsoft Forefront Threat Management Gateway\\sdconfig\n\n&nbsp;\nAchtung: Die Datei muss unbedingt an beiden Orten vorhanden sein, sonst kommt es zu Fehlern wie: &ldquo;106: The Web Server is busy. Try again later.&rdquo;\n&nbsp;\nDie RSA betreffende Konfiguration ist damit eigentlich schon abgeschlossen. Also sehen wir uns die Ver&ouml;ffentlichung am TMG an.\n&nbsp;\nEs wird einfach eine normale Web Ver&ouml;ffentlichung konfiguriert, beim erstellen des Web Listeners ist auf folgendes Acht zu geben:\n&nbsp;\n\n&nbsp;\nDie Authentifizierung erfolgt &uuml;ber ein HTML Formular, wenn hier noch &ldquo;Collect addinoal delegation in the form&rdquo; ausgew&auml;hlt wird kann der Benutzer zus&auml;tzlich zum Username und RSA Passcode noch sein Active Directory Kennwort eingeben und TMG leitet es an den Web Server weiter. Daf&uuml;r muss dann bei der Ver&ouml;ffentlichungsregel die Authentication Delegation auf Basic gesetzt werden und der Web Server dahinter muss nat&uuml;rlich Basic Authentication akzeptieren.\n&nbsp;\n\n&nbsp;\nDas Integrierte HTML Formular von TMG sieht dann je nach Einstellung so aus. Will man OWA ver&ouml;ffentlichen kann man verwendet man nat&uuml;rlich besser den Assistant &ldquo;Publish Exchange Web Client Access&rdquo;. Achtung: Auf den Client Access Servern muss Basic Authentication aktiviert werden (Server Configuration, Client Access, owa).\n&nbsp;\n\n&nbsp;\nAchtung: Mutlihomed TMG\nForefront TMG wird in den allermeisten Konfigurationen mit mehreren Netzwerkkarten installiert, ist ja schlie&szlig;lich eine Firewall. Dadurch wei&szlig; TMG (genauer gesagt ACEClient) nicht &uuml;ber welche Netzwerkkarte er den RSA Server erreichen kann, man sieht im Event Log die Warnung: &ldquo;Multihomed host detected; Primary IP assumed is : x.x.x.x&rdquo;. Die Event ID ist 1012 die Source ACECLIENT.\nDas kann man beheben indem man zu Schl&uuml;ssel HKLM\\Software\\SDTI einen Schl&uuml;ssel ACIClient hinzuf&uuml;gt. Dieser bekommt dann einen String Value mit dem Namen &ldquo;PrimaryInterfaceIP&rdquo;. Der Wert entspricht der IP Adresse, des TMG, &uuml;ber die der RSA Server erreicht werden kann.\n&nbsp;\n\n&nbsp;\nViele Gr&uuml;&szlig;e\ntom"
        },
        {
          "id": "post-apple-ipad",
          "title": "Apple IPad",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/apple-ipad/",
          "content": "Gerade eben hatte ich zum ersten Mal das Vergn&uuml;gen ein IPad zu testen. Es waren zwar nur wenige Minuten aber einen ersten Eindruck habe ich von dem Ding:\nDie Verarbeitung scheint sehr gut, das Ger&auml;t f&uuml;hlt sich hochwertig an. Mit 730 Gramm ist das 3G Modell allerdings ziemlich schwer.\nDas Display ist sehr scharf, wie es in der Sonne ist kann ich nicht sagen, im Raum ist es jedoch ausreichend hell und klar. Wird das IPad auf die Seite gedreht, dreht sich das Bild mit, sowas kennt man ja schon.\nDie Bedienung finde ich innovativ, ist ja auch von Apple ;) Der EBook Reader ist einfach zu bedienen, sonstige Features wie IPod und Web Browser sind nat&uuml;rlich super und bereiten dem Benutzer viel spa&szlig;. Sogar Filme kann man mit dem Ding anschauen.\nF&uuml;r mich w&auml;re das Ger&auml;t dennoch nichts, ich habe keinen wirklichen Verwendungszweck und nur zum Rumspielen ist Preis (in dem Fall 702&euro;) einfach zu hoch.\n\nDas Beste zum Schluss: als ich den Browser &ouml;ffnete kam als Startseite&hellip; na was schon&hellip; Bing zum Vorschein! Da konnte ich mir ein Grinsen nicht verkneifen.\nso long, tom"
        },
        {
          "id": "post-exchange-2010-entourage-web-services-edition-ews-attachement-size",
          "title": "Exchange 2010 Entourage Web Services Edition- EWS Attachement Size",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-entourage-web-services-edition-ews-attachement-size/",
          "content": "&nbsp;\nAuch MAC Clients k&ouml;nnen mit Exchange 2010 arbeiten. Daf&uuml;r gibt es entweder den Microsoft Entourage Client oder den integrierten MAC Mail Client. Entourage muss in der Web Services Edition verwendet werden, da Exchange 2010 kein WebDAV mehr unterst&uuml;tzt, die aktuelle Version von MAC Mail (Snow Leopard) macht das von Haus aus.\n&nbsp;\nWill man allerdings einen Anhang gr&ouml;&szlig;er als ca. 12MB verschicken meckert sowohl Entourage als auch MAC Mail. Entourage bringt folgende Fehlermeldung: &ldquo;HTTP-Fehler: Die Anforderung kann vom Server nicht verarbeitet werden&rdquo;.\n&nbsp;\n\n&nbsp;\nMan kontrolliert also erstmal die Gr&ouml;&szlig;enbeschr&auml;nkungen der betreffenden Mailbox, die der Send und Receive Connectoren und in der Transport Konfiguration, am schnellsten geht das wohl in der Management Shell mit folgenden cmdlets:\n\nget-TransportConfig | fl maxSendSize \nget-SendConnector | fl name, maxMessageSize \nget-ReceiveConnector | fl name, maxMessageSize \nget-Mailbox name | fl maxSendSize\n\n&nbsp;\nSind die Werte an diesen Stellen ok, dann kann der User mit dem Microsoft Office Outlook Client den Anhang ohne Probleme senden, nur mit Entourage bzw. Mac Mail tritt das Problem auf.\n&nbsp;\nDas Problem liegt am Exchange Web Service, das ist eine ASP.NET Applikation und verwendet daher Konfigurationsdateien aus der IIS Konfiguration. Diese k&ouml;nnen in weder in der EMS noch in EMC gesehen bzw. ge&auml;ndert werden.\n&nbsp;\nNun gibt es leider keine ausreichende Dokumentation von Microsoft, also versuche ich hier alles, was in den tiefen des Internet herumschwirrt, zusammenzufassen.\n&nbsp;\nBackup\nAchtung: Vor der Bearbeitung von Konfigurationsdateien unbedingt ein Backup der Datei erstellen!!\n&nbsp;\nEWS \nTreten die Probleme nur im Zusammenhang mit EWS auf reicht folgende &Auml;nderung der Konfiguration am Client Access Server (bzw. an alles CAS wenn mehrere im Einsatz sind):\n&nbsp;\n\nIn der Datei %windir%\\Program Files\\Microsoft\\Exchange Server\\V14\\ClientAccess\\exchweb\\ews\\web.config muss der Wert von &ldquo;maxReceivedMessageSize&rdquo; unter &lt;EWSMessageEncoderSoap11Element /&gt; ge&auml;ndert werden, ACHTUNG: Angabe in Byte!! \n\nIm folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;EWSMessageEncoderSoap11Element /&gt; &lt;httpsTransport maxReceivedMessageSize=\"52428800\" &hellip;.&gt; \n\n\n\n&nbsp;\n\nMit appcmd.exe muss noch der Wert von maxAllowedContentLength angepasst werden, ACHTUNG: Angabe in Byte!! \n\nIm folgenden Beispiel wird der Wert auf 50MB gesetzt appcmd set config \"Default Web Site/ews\" -section:requestFiltering /requestLimits.maxAllowedContentLength:52428800 \n\n\n\n&nbsp;\n\nIn manchen Foren bzw. anderen Blogs findet man immer wieder den Parameter &ldquo;maxRequestLength&rdquo; der auch in der web.config Datei vom EWS angepasst werden soll. Allerdings hat dieser Parameter per Default schon den gr&ouml;&szlig;tm&ouml;glichen Wert eingestellt, ich rate also davon ab diesen Parameter zu ver&auml;ndern.\n\n&nbsp;\n\nDie Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.\n\n&nbsp;\nOWA\nDieses Problem gibt es auch in Outlook Web App, man kann standardm&auml;&szlig;ig keine Anh&auml;nge &uuml;ber 30MB hochladen. Auch hier ist wieder eine Einstellung in der web.config schuld. OWA ist eine ASP.NET Anwendung und die maximale Gr&ouml;&szlig;e der zu &uuml;bertragenden Daten wird mit dem Parameter maxRequestLength konfiguriert.\nHier wird also diese Einstellung interessant, in der web.config von OWA ist diese n&auml;mlich per Default auf 30000 gesetzt.\n&nbsp;\n\nIn der Datei %windir%\\Program Files\\Microsoft\\Exchange Server\\V14\\ClientAccess\\Owa\\web.config muss der Wert von maxRequestLength ge&auml;ndert werden, ACHTUNG: Angabe in KiloByte!! \n\nIm folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;httpRuntime maxRequestLength=\"51200\" /&gt;\n\n\n\n&nbsp;\n\nDie Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.\n\n&nbsp;\nF&uuml;r dieses Problem gibt es sogar einen Artikel im TechNet: Configure Maximum Message Size in Outlook Web App\n&nbsp;\n&nbsp;\nTipp: Man kann mit der PowerShell ganz einfach Werte in Byte und wieder Retour konvertieren. Einfach mal 50mb eintippen und versuchen.\n\n&nbsp;\n&nbsp;\nNaja, ich hoffe ich kann damit einigen weiterhelfen.\n&nbsp;\nGr&uuml;&szlig;e\ntom"
        },
        {
          "id": "post-exchange-2010-e28093-backup",
          "title": "Exchange 2010 – Backup",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-e28093-backup/",
          "content": "Dies ist der erste Teil einer Exchange Backup und Restore Serie.    Der zweite Teil folgt in kürze.\nDatensicherung ist in Exchange 2010 ein umfangreiches Thema. Für die Widerherstellung von einzelnen Elementen (Mails, Kontakte…) bietet sich z.B. der Dumpster an, dazu aber ein anderes Mal mehr. In diesem Beitrag möchte ich Datensicherung im klassischen Sinn behandeln, also Backup von Servern und Datenbanken.\nBackup Software\nExchange 2010 verwendet den Windows eigenen VSS Dienst, kann also nur mit einer Backup Applikation gesichert werden die diesen Service unterstützt. Für Tests eignet sich natürlich Windows Backup von Server 2008R2, will man das Ganze in einer größeren Umgebung betreiben empfiehlt sich der Data Protection Manager.\nSystem State Backup\nJeder Server sollte regelmäßig gesichert werden, dazu gehört ein Backup des System Volumes und des System State. System State Backups enthalten die Registry sowie die Boot Dateien und COM+ Class Registration Datenbank. Je nach installierter Serverrolle (ADDS, IIS…) werden weitere Informationen gesichert.\nMit einem System State Backup kann der Zustand des Servers (und der installierten Rollen/Applikationen) zum Zeitpunkt des Backups widerhergestellt werden.\nSingle Server Backup\nWenn alle Rollen auf einem Server installiert sind müssen der System State sowie die Volumes mit den Datenbanken und Logdateien gesichert werden.\nBackup von Client Access Servern\nAuf CA Servern befinden sich keine Daten die speziell gesichert werden müssen, diese Serverrolle sollte ohnehin ausfallsicher designed werden, da der Clientzugriff im Fehlerfall sonst nicht mehr möglich ist. Die Konfiguration kann aus dem System State Backup widerhergestellt werden.\nAllerdings sollte man nicht vergessen das IIS Log Verzeichnis (C:\\inetpub\\logs\\LogFiles\\W3SVC1) zu überwachen bzw. alte Logs kontinuierlich zu löschen.\nBackup von Hub Transport Servern\nEs sind keine Daten auf Hub Transport Servern vorhanden ohne die eine Exchange Umgebung nicht widerhergestellt werden könnte, allerdings ist es für spätere Analyse Sinnvoll die Message Tracking Logs sowie die Protocol Logs zu sichern. Diese befinden sich im Exchange Installationsordner unter \\Transportroles\\Logs und können einfach auf File-Ebene gesichert werden.\nDie Konfiguration des Transport Servers wird im Active Directory gespeichert, auch diese Serverrolle sollte ausfallsicher designed werden.\nBackup von Edge Transport Servern\nEdge Transport Server speicher die Konfiguration im Active Directory, im Fehlerfall kann man einfach den Server neu aufsetzen und die EdgeSync neu einrichten. Alternativ kann man mit Cloned Configuration arbeiten, also die Konfiguration exportieren und auf dem neuen Server wieder importieren, dazu mehr in einem anderen Beitrag. Die Logs die auf Hub Transport Servern gesichert werden sollten befinden sich bei Edge Transport Servern an der selben Stelle und sollten aus dem selben Grund gesichert werden.\nBackup von Unified Messaging Servern\nDie für die Konfiguration relevanten Informationen werden in der Active Directory gespeichert, einzig die Audio Prompts können auf File- Ebene gesichert werden, diese befinden sich im Exchange Installationsordner unter \\UnifiedMessaging\\Prompts.\n\nBackup von Mailbox Servern\nAuf den Servern auf denen die Mailbox Rolle installiert ist befinden sich die Datenbank und Transaction Log Files, diese müssen auf jeden Fall gesichert werden. Wird eine Sicherung mit Windows Backup durchgeführt muss jeweils das gesamte Volume auf dem die Datenbank bzw. Log Files liegen ausgewählt werden. Von diesen Volumes muss ein “Full VSS&quot; Backup gemacht werden, nur so merkt Exchange dass die Daten gesichert wurden und löscht die entsprechenden Log Files.\n\n\nBackup der Active Directory\nExchange Server speichert viele Daten und Einstellungen in der Active Directory und ist extrem Abhängig von einer funktionstüchtigen Umgebung. Daher sollten natürlich auch Domain Controller regelmäßig gesichert werden. Hierfür reicht ein System State Backup aus, dieses enthält alle Daten/Einstellungen der AD.\nBackups und DAG\nSind die Exchange Server die gesichert werden sollen Mitglieder einer Database Availability Group (DAG) ändern sich die Gründe für eine Datensicherung. Da es bis zu 16 Kopien einer Mailbox innerhalb der DAG geben kann, ist das Backup nicht mehr der einzige Ausweg wenn die aktive Kopie der Datenbank offline geht. Fällt ein Mitglied einer DAG aus, werden die Datenbanken die auf diesem Server aktiv waren vom Server mit der nächst-höheren Priorität übernommen (natürlich muss es eine Kopie der Datenbank dort geben). So ist man bei einem Ausfall eines Mailboxservers gut gerüstet, allerdings kann es auch zu einem Datenbankfehler kommen, dafür gibt es aber folgende alternative zum Backup.\nDatenbank Kopien werden standardmäßig aktuell gehalten, d.h. eine Änderung wird sofort an alle Mitglieder der DAG repliziert. Man kann allerdings eine Verzögerung (ReplayLagTime) konfigurieren und so z.B. auf einem Server ältere Versionen der Datenbanken halten. Tritt nun ein Datenbankfehler auf, kann die ältere Datenbank verwendet werden ohne umständliches Restore von Tape oder woher auch immer.\nEin weiterer Effekt des Backups ist das löschen der Log Files, sollte man also auf regelmäßige Backups verzichten muss man wohl oder übel Circular Logging für die Datenbanken aktivieren um ein überlaufen der Festplatten zu verhindern.\nDiese neue Möglichkeit der Hochverfügbarkeit bringt sicher viele Vorteile, jedoch sollte man meiner Meinung nach nicht auf ein Backup verzichten. Ich empfehle regelmäßige System State Backups von allen Servern. Die Datenbanken würde ich auf jeden Fall auch sichern und das Backup und Restore Szenario ausreichend testen und dokumentieren!\nSoweit mal zum Thema Backup, viele Grüße   tom"
        },
        {
          "id": "post-migration-sharepoint-services-v3-zu-sharepoint-foundation-2010",
          "title": "Migration Sharepoint Services v3 zu Sharepoint Foundation 2010",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/migration-sharepoint-services-v3-zu-sharepoint-foundation-2010/",
          "content": "Heute habe ich die Migration von den Sharepoint Services 3 auf die Version 2010 Foundation abgeschlossen. Während der Umstellung bin ich auf mehrere Probleme gestoßen, die ich mit diesem Post im einzelnen aufzeigen werden. Vielleicht erspart das dem ein oder anderen von euch Zeit nach einer Lösung zu suchen.\n\nProblem 1 – Fehler 7043 (Sharepoint Foundation) im EventLog Anwendung\n \nLösung: Im Ordner C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\14\\TEMPLATE\\CONTROLTEMPLATES befindet sich die Datei SearchArea.ascx. Diese Datei wird in der Version 2010 nicht benötigt und kann umbenannt werden (Bsp: SearchArea.ascx.old)\n\nProblem 2 – Fehler 7009 und 7000 (Service Control Manager) im EventLog System\n \n \nLösung: Es kann passieren, dass der Dienst “Claim to Windows Token Service” beim Systemstart nicht starten kann. Sobald der Start-Typ von “Automatisch” auf “Automatisch (Verzögerter Start)” gesetzt wird, startet der Dienst normal, jedoch ein wenig später als die anderen Dienste.\n&#160;\nProblem 3 – Fehler 6398 und 5586 (Sharepoint Foundation) im EventLog Anwendung\n \n \nLösung: Sharepoint Zentraladministration öffnen und zum Punkt Sicherheit wechseln. Im Menüpunkt Dienstkonten konfigurieren den richtigen Webanwendungspool auswählen und das entsprechende Konto angeben. Mit OK bestätigen sodass das Konto nochmal registriert wird.\n&#160;\nProblem 4: Backup der Sharepoint Farm\nWenn ihr Versucht ein Backup der Sharepoint Farm zu erstellen, bekommt ihr den Hinweis, dass der Verwaltungsdienst angehalten wurde.\n \nACHTUNG: Es geht auch noch schlimmer: Wenn ihr wie ich eure Sharepoint Farm über das Befehlszeilentool stsadm.exe sichert, sind die Menüelemente auf der Sharepoint Webseite während und nach der Sicherung gesperrt. Wenn ihr die Berechtigungen prüft werdet ihr sehen, dass ihr nicht mehr über ausreichend Berechtigungen verfügt um irgendwas an der Webseite zu ändern bzw. hochzuladen zu löschen usw. Auch könnt ihr die Eigenschaften der Webseite nicht mehr öffnen oder bearbeiten.\nLösung: Das Problem lässt sich durch einen ganz einfachen Handgriff beheben. Nach der Installation ist der Dienst “Sharepoint 2010 Administration” auf Start-Typ Manuell gesetzt und somit nicht aktiv. Ändert das Startverhalten des Dienstes auf Automatisch und ihr könnt wieder normal Backups ziehen und die Steuerelemente aktivieren sich nach der Sicherung wieder.\nViel Spaß beim Upgrade auf Foundation 2010, Grüße   dn"
        },
        {
          "id": "post-sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen",
          "title": "Sharepoint Foundation 2010 Dateien lassen sich nicht öffnen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen/",
          "content": "Nach einer Standardinstallation von Sharepoint Foundation 2010 lassen sich gewisse Dateien (z.B. PDF) nur downloaden, nicht aber direkt aus der Bibliothek abrufen.\n&#160;\nDas ist ein neues Sicherheitsfeature, welches den Browser zwingt die Datei nur zum Download anzubieten. \nDas Sicherheitsfeature kann in der Sharepoint Zentraladministration deaktiviert werden.\nAnwendungsverwaltung / Webanwendungen verwalten die entsprechende Webanwendungs auswählen, unter Allgemeine Einstellungen kann nun die Option “Dateiverarbeitung durch den Browser” auf Berechtigt gesetzt werden. \n \nNun können die Dateien wieder direkt aus der Bibliothek geöffnet werden.\nGrüße   dn"
        },
        {
          "id": "post-distributedcom-fehler-10016-fehlende-berechtigungen",
          "title": "DistributedCOM Fehler 10016, fehlende Berechtigungen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2008, Server-2008-R2",
          "url": "/post/distributedcom-fehler-10016-fehlende-berechtigungen/",
          "content": "Wenn auf euren Server DistributedCOM Fehler mit der ID 10016 vorkommen, so bedeutet das meist, dass erforderliche Berechtigungen fehlen.\nBeispiel: Der Benutzer NETZWERKDIENST hat keine Berechtigung die Komponente mit der ID 000C101C-0000-0000-C000-000000000046 zu aktivieren\n \nIn diesem Fall muss dem Benutzer NETZWERKDIENST lediglich das Benutzerrecht gegeben werden um die jeweilige Komponente zu starten. Als erstes wird die Komponente über das Tool Komponentendienste gesucht. \nWenn ihr die Einstellungen der Komponente nicht ändern könnt, habt ihr selbst nicht die notwendigen Berechtigungen. \n \nDie könnt ihr euch aber selber zuweisen indem ihr in der Registry unter HKEY_CLASSES_ROOT\\AppID den Schlüssel mit der ID sucht und in den Berechtigungen der Gruppe Administratoren oder euch selbst den Besitz übertragt und das Recht Vollzugriff gebt.\n \nDanach lassen sich die Einstellungen der Komponente ändern und ihr könnt den jeweiligen Benutzer die erforderlichen Rechte geben.\n&#160;\nGrüße   dn"
        },
        {
          "id": "post-windows-virtual-pc-interner-dhcp-server",
          "title": "Windows Virtual PC / interner DHCP Server",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-virtual-pc-interner-dhcp-server/",
          "content": "Wenn man mit Windows Virtual PC eine DHCP Infrastruktur virtualisiert, wird der Client keine IP-Adresse bekommen, sofern die Netzwerke auf “Internes Netzwerk” geschalten wurden.    Das Verhalten ist weniger ein Problem, sondern ein Feature, das sich leicht deaktivieren lässt.     Sobald man die Netzwerkeinstellungen des Clients auf “Internes Netzwerk” ändert, erhalt er eine Adresse aus dem Pool 196.254.0.16 – 196.254.10.254 (APIPA ist von 169.254.0.0-196.254.255.255)        Um diesen internen DHCP Server zu deaktivieren müssen zuerst alle VM’s heruntergefahren bzw. gespeichert werden. Dann muss folgende Datei geöffnet werden:\n%localappdata%\\microsoft\\Windows Virtual PC\\options.xml        In dieser Datei tauschen wir im Abschnitt dhcp enabled den Wert TRUE durch FALSE.         \nNach dieser Änderung kann der Client IP Adressen vom aufgesetzten DHCP Server empfangen.\nGrüße   dn"
        },
        {
          "id": "post-ntsystems-update",
          "title": "ntSystems - Update",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/ntsystems-update/",
          "content": "Heute habe ich die Blog Platform von ntSystems aktualisiert. Wir verwenden nun die aktuellste Version von BlogEngine.NET.\nDas neue Theme ist in Bearbeitung, wird in den n&auml;chsten Tagen Online sein.\nBis dahin, stay tuned!\ntwitter.com/torgglertwitter.com/nitz_d"
        },
        {
          "id": "post-exchange-2010-e28093-safelist-aggregation",
          "title": "Exchange 2010 – SafeList Aggregation",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-e28093-safelist-aggregation/",
          "content": "In Exchange 2010 gibt es viele M&ouml;glichkeiten sich vor Spam zu sch&uuml;tzen, unter anderem kann jeder User seine pers&ouml;nliche Black- und White List in den Outlook Junk-E-Mail Optionen pflegen.\nIst ein Edge Transport Server in der Exchange Organisation vorhanden, kann man diese pers&ouml;nlichen Listen direkt an der Edge, also an der ersten M&ouml;glichkeit anwenden und so die Effizienz steigern und false positives verringern. Ist die SafeList Aggregation aktiviert werden sichere Mails dem Empf&auml;nger direkt zugestellt, ohne von weitern Filter Agents gepr&uuml;ft zu werden. Au&szlig;erdem werden die blockierten Absender bei der ersten M&ouml;glichkeit blockiert.\nSichere Absender sind alle (E-Mail Adressen oder Domains) die in der entsprechenden Liste eingetragen sind. Outlook Kontakte und E-Mail Adressen an die der Benutzer eine Nachricht sendet k&ouml;nnen optional ausgew&auml;hlt werden.\n \nDie Informationen die der Benutzer in Outlook konfiguriert werden als sogenannte SafeList Collection auf dem Mailbox Server des Benutzers gespeichert. Eine SafeList Collection kann bis zu 1024 Eintr&auml;ge beinhalten.\nDas Update-SafeList cmdlet aktualisiert diese Collection im ActiveDriectory, dort werden die Informationen (Hashes) in den Attributen msExchSafeSenderHash, msExchSafeRecipientHash, und msExchBlockedSendersHash gespeichert.\n\n\n&Uuml;ber den EdgeSync Service werden die Attribute dann mit der ADLDS Instanz am Edge Transport Server synchronisiert (one-way).\nWill man also die SafeList Collection eines einzelnen Users aktualisieren verwendet man &ldquo;update-safelist mail.box&rdquo;.\nSollen die Collections aller Mailboxen aktualisiert werden dann kann man das z.B. so machen: Get-Mailbox | Update-SafeList. Um die Edge Synchronisierung anzusto&szlig;en (Testumgebung) kann man noch Start-EdgeSychronization verwenden.\n\nWenn es sich um eine gr&ouml;&szlig;ere Organisation handelt werden mit Get-Mailbox wom&ouml;glich nicht alle Mailboxen zur&uuml;ckgegeben, daf&uuml;r eignet sich folgende Kommandos.\nSet-AdServerSettings -ViewEntireForest $true Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Update-Safelist\nWenn man diese beiden Kommandos in einer Datei speichert kann man einfach einen geplanten Task erstellen der die SafeList automatisch aktualisiert.\nAchtung: Damit die SafeList Aggregation funktioniert muss der Content Filtering Agent am Edge Transport Server laufen. Das kann mit &ldquo;Get-ContentFilterConfig&rdquo; einfach &uuml;berpr&uuml;ft werden.\ntomt"
        },
        {
          "id": "post-tpm-bitlocker-schlussel-in-ad-ds-speichern",
          "title": "TPM / BitLocker Schlüssel in AD DS speichern",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, de, Server, Server-2008, Server-2008-R2",
          "url": "/post/tpm-bitlocker-schlussel-in-ad-ds-speichern/",
          "content": "Wenn BitLocker im Unternehmen aktiviert wird, empfiehlt es sich die Wiederherstellungsinformationen in Active Directory zu sichern. Diese Anleitung richtet sich an Windows Server 2008 / 2008 R2 und Windows 7 als Client-Betriebssystem. Die Anleitung beschreibt, welche Schritte erforderlich sind um TPM- und BitLocker Schl&uuml;ssel in AD DS zu speichern, als Beispiel wird jenes Volume verschl&uuml;sselt, welches das Betriebssystem enth&auml;lt.  Wir unterscheiden hier zwischen 2 diverse Schl&uuml;ssel:\nTPM: Hierbei wird der Besitzerschl&uuml;ssel des TPM Bausteins in AD DS gespeichert BitLocker: Hierbei handelt es sich um den Wiederherstellungsschl&uuml;ssel f&uuml;r die betreffende Partition\nSchritt 1: AD DS zum speichern von TPM Besitzerschl&uuml;ssel vorbereiten\nAls erstes muss AD DS f&uuml;r das speichern des TPM Besitzerschl&uuml;ssels konfiguriert werden. Sofern Server 2003 als DC verwendet wird, muss vorher noch ein Schema-Update durchgef&uuml;hrt werden. F&uuml;r die Betriebssysteme Server 2008 und Server 2008 R2 ist dies nicht notwendig, da diese die Erweiterung bereits mitbringen.\nDamit der Client den TPM Besitzerschl&uuml;ssel in AD DS speichern kann, muss das Script Add-TPMSelfWriteACE.vbs auf dem DC ausgef&uuml;hrt werden. Dieses Script setzt die Berechtigungen des Attributs msTPM-OwnerInformation so, dass der Client seinen TPM Schl&uuml;ssel einf&uuml;gen kann.\nACHTUNG: Sollte man nicht das Server-Betriebssystem in englischer Sprachversion verwenden, so muss das Script noch angepasst werden: Anstatt die Berechtigung &ldquo;SELF&rdquo; zu setzen, muss diese z.B. f&uuml;r Deutsch in &ldquo;SELBST&rdquo; ersetzt werden. Sonst l&auml;uft das Script nicht erfolgreich durch.\n\nSchritt 2: Setzen der GPO&rsquo;s\nDa nun Active Directory zum speichern von TPM Schl&uuml;sseln vorbereitet ist, setzten wir die Gruppenrichtlinien und weisen den Client an, die Wiederherstellungsschl&uuml;ssel in Active Directory zu speichern.\nBitLocker\nComputerkonfiguration / Administrative Vorlagen / Windows-Komponenten / BitLocker Laufwerksverschl&uuml;sselung / Betriebssystemlaufwerke\n&rdquo;Festlegen, wie BitLocker-gesch&uuml;tzte Betriebssystemlaufwerke wiederhergestellt werden k&ouml;nnen&rdquo;\nAnhand dieser Richtlinie wei&szlig;en wir den Client an die Wiederherstellungsinformationen in der Active Directory zu speichern. BitLocker kann erst aktiviert werden, sobald die Widerherstellungsinformationen in Active Directory hinterlegt sind.\n\nTPM\nComputerkonfiguration / Administrative Vorlagen / System / Trusted Platform Module-Dienste\n&ldquo;TPM-Sicherung in Active-Directory-Dom&auml;nendienste aktivieren&rdquo;\nAnhand dieser Richtlinie wird der Client angewiesen den TPM Besitzerschl&uuml;ssel in der Active Directory zu speichern.\n\nSchritt 3: TPM am Client initialisieren\nWenn der TPM am Client initialisiert wird, wird ein Besitzerschl&uuml;ssel generiert.\n\nIn Active Directory werden die Informationen im Attribut msTPM-OwnerInformation mitgeschrieben.\n\nSchritt 4: Verwaltungsprogramm f&uuml;r BitLocker-Schl&uuml;ssel installieren\nServer 2008 liefert eine zus&auml;tzliche Registerkarte f&uuml;r Active Directory um BitLocker-Schl&uuml;ssel anzuzeigen. Vorher muss jedoch das Feature Verwaltungsdienstprogramm f&uuml;r BitLocker aktiviert werden.\n\nNach der Aktivierung findet man eine neue Registerkarte in den Computerkonten.\n&nbsp;\nSchritt 5: BitLocker aktivieren und Wiederherstellungsschl&uuml;ssel einsehen\nNun k&ouml;nnen wir am Client BitLocker f&uuml;r das Volume aktivieren, welches das Betriebssystem enth&auml;lt.\n\nNach der Aktivierung kann der Wiederherstellungsschl&uuml;ssel im jeweiligen Computerkonto in der Registerkarte &ldquo;BitLocker-Wiederherstellung&rdquo; eingesehen werden.\n\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-wsus-auf-neuen-server-verschieben",
          "title": "WSUS auf neuen Server verschieben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/wsus-auf-neuen-server-verschieben/",
          "content": "Daniel hat in diesem Artikel bereits dar&uuml;ber geschrieben.\nIm Gro&szlig;en und Ganzen habe ich die Migration genau gleich gemacht. Also WSUS auf dem neuen Server installiert, WSUS Content kopiert und mit \"wsutil export datei.cab datei.log\" und \"wsutil import datei.cab datei.log\" die Updates importiert. Allerdings wollte ich die Einstellungen nicht manuell &uuml;bernehmen, daf&uuml;r gibt es WSUSMigrate.\nMan findet das Tool im WSUS TechCenter unter API Samples and Tools. Installiert man diese, erh&auml;lt man diverse zus&auml;tzliche Tools f&uuml;r WSUS, unter anderm WSUSMigrationImport und WSUSMigrationExport mitsamt kurzem HowTo.\nAlso habe ich diese Tools auf dem alten sowie auf dem neuen Server installiert und mit \"WSUSMigrationExport datei.xml\" die Gruppen und Approvals exportiert. Auf dem neuen Server kann man dann mit Parametern entscheiden welche Einstellungen man importieren m&ouml;chte. Die verf&uuml;gbaren Parameter f&uuml;r WSUSMigrationImport sind:\n\n\nTargetGroups -&gt; Importiert nur Gruppen\n\n\nApprovals -&gt; Importiert nur Update Approvals\n\n\nAll -&gt; Importiert Gruppen und Approvals\n\n\nMan kann auch entscheiden was mit den Gruppen passieren soll die es auf dem Zielserver eventuell schon gibt, daf&uuml;r gibt es diese Parameter:\n\n\nNone -&gt; Beh&auml;lt die bestehenden Gruppen\n\n\nDeleteUnmatchedGroups -&gt; L&ouml;scht Gruppen vom Zielserver die nicht in der XML Datei vorhanden sind\n\n\nNoch ein Beispiel f&uuml;r den Import Befehl:\"WSUSMigrationImport datei.xml All None\" -&gt; Importiert alle Gruppen und Approvals und ver&auml;ndert bestehende Gruppen auf dem Zielserver nicht.\nso long!tomt"
        },
        {
          "id": "post-buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3",
          "title": "Buchen einer Ressource in Outlook 2010 mit Exchange 2k3",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3/",
          "content": "Wenn man mit Outlook 2010 &uuml;ber einen Exchange Server in der Version 2003 eine Ressource buchen m&ouml;chte (z.B. Konferenzraum f&uuml;r eine Besprechung) wird das unter Umst&auml;nden nicht funktionieren. Die Besprechungsanfrage wird zwar allen Teilnehmern gesendet und auch im eigenen Kalender eingetragen, die Ressource jedoch nicht gebucht, sprich im Ressourcenkalender nicht eingetragen.  Dieses Problem tretet nur in der Konstellation von Outlook 2010 auf einem Exchange Server 2003 SP* auf.\nL&ouml;sung: Damit die Ressource wieder gebucht werden kann, muss in der Registry des PC&rsquo;s wo Outlook 2010 installiert ist, folgender Schl&uuml;ssel angelegt werden:\nHKCU\\Software\\Microsoft\\Office\\14.0\\Outlook\\Options\\Calendar\nREG_DWORD EnableDirectBooking 1 (HEX)\nGr&uuml;&szlig;e dn"
        },
        {
          "id": "post-nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules",
          "title": "NLB – Unicast vs. Multicast, Konfiguration, Port Rules",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules/",
          "content": "Unicast\nIm Unicast Mode tauscht jeder NLB Knoten seine MAC Adresse mit der Cluster MAC Adresse aus, d.h. alle Knoten haben die gleiche “virtuelle” MAC Adresse.\nDieses Konfiguration zwingt den Switch zu “suboptimalem” Verhalten, da die selbe MAC Adresse über mehrere Switchports erreichbar ist, kann der Switch die Adresse nicht “lernen” also sie nicht in seine MAC Address Table aufnehmen und an ein Switchport binden. Alle Pakete an diese MAC Adresse werden vom Switch über alle Ports geflutet. Das führt zu überflüssiger Last am Switch und im gesamten Netzwerk.\nEin weiteres Problem ist dass die einzelnen NLB Knoten so nicht mehr miteinander kommunizieren können, dafür wird eine zusätzliche Netzwerkkarte benötigt. Aus diesem Grund wird Unicast Mode mit nur einer Netzwerkkarte nicht empfohlen.\nDas Fluten von Paketen kann durch erstellen eines eigenen VLAN für die NLB Knoten vermindert werden. So werden Pakete nur innerhalb dieses VLANs geflutet und nicht über den ganzen Switch. \nMulticast\nBeim Multicast Mode wird jedem Konten eine Multicast MAC Adresse hinzugefügt, so dass alle Knoten mit zwei Layer2 Adressen ausgestattet sind. Das ermöglicht dem Switch das “lernen” der echten MAC Adressen und den einzelnen Knoten eine Kommunikation untereinander.\nDamit ein Multicast Cluster auch erreichbar wird müssen statische ARP Einträge am Switch konfiguriert werden, denn Standardmäßig wird die Auflösung von Unicast IPs in Multicast MAC Adressen blockiert. So werden Pakete an die Multicast Adressen nur an die festgelegten Ports weitergeleitet.\nCluster im Multicast Mode können auch mit nur einer Netzwerkkarte betrieben werden, aus Performancegründen und verbessertem Management empfehle ich aber die Verwendung zweier Netzwerkkarten.\nNLB Konfiguration\nWie bereits oben beschrieben muss im Unicast Mode jeder Knoten zwei Netzwerkkarten besitzen. Im Multicast Mode reicht eine Karte, allerdings ist es eine “Best Practice” zwei zu verwenden.\nAls erstes muss das Feature installiert werden, ich habe hier deutsch Server, also heißt das Ding: Netzwerklastenausgleich. Das geht entweder über die GUI, oder mit “servermanagercmd –i nlb”. Auch mit PowerShell kann man Features installieren, und zwar mit dem Add-WindowsFeature cmdlet.\n \nDann werden die beiden Netzwerkkarten konfiguriert. Eine wird die Netzwerkkarte für das LAN, sie wird mit IP, Gateway und DNS Server konfiguriert. Ich habe sie in LAN umbenannt. Die zweite Netzwerkkarte wird der dedizierte Adapter für NLB. Diese wird nur mit einer IP Adresse konfiguriert.\nIch verwende im LAB 192.168.1.10 als Cluster Adresse. 192.168.1.11 und 192.168.1.12 als Adressen für die Netzwerkkarten “LAN”. Für die NLB Adapter verwende ich 192.168.1.21 und 192.168.1.22.\nWichtig ist dass man auf die Bindings achtet, d.h. der Adapter LAN muss der erste in der Auswahl sein. Die Bindings werden in den Erweiterten Netzwerkeinstellungen konfiguriert.\n \nJetzt wird mit dem NLB-Manager der Cluster erstellt. Dazu wird auf Cluster und Neu geklickt, dann wird der erste Knoten hinzugefügt:\n \nWichtig: Der dedizierte NLB Adapter wird verwendet!\nAls dedizierte Adresse wird als 192.168.1.21 angezeigt, auf dieser NIC wird NLB aktiviert und die Cluster Adresse gebunden.\n \nIm nächsten Fenster wird die Cluster Adresse festgelegt, ich verwende wie oben beschrieben 192.168.1.10/24.\n\nDer Modus, also Unicast oder Multicast wird im nächsten Fenster konfiguriert. Außerdem wird der FQDN für den Cluster hier gesetzt. Mein Testcluster heißt nlb.ntsystems.it und läuft im Multicast Mode.\n&#160; \n Jetzt werden noch die Port Rules konfiguriert, ich akzeptiere vorläufig mal die Standardeinstellungen, dazu aber später mehr.\nSo, jetzt habe ich NLB mal soweit eingerichtet. Natürlich muss noch der zweite Knoten hinzugefügt werden. Dazu einfach auf den Clusternamen klicken und Host hinzufügen wählen. Wichtig auch hier wieder dass die Netzwerkkarte NLB verwendet wird, also die dedizierte Adresse 192.168.1.22.\nIst der zweite Knoten hinzugefügt und der Status im NLB Manager auf “Converged” oder “Zusammengeführt” ist der Cluster erstellt.\nAllerdings ist die Konfiguration damit noch nicht fertig. Die Cluster IP ist noch nicht erreichbar. Das hat zwei Gründe, erstens muss am Switch noch der statische ARP Eintrag erstellt werden (Cisco: arp 192.168.1.10 03bf.c08a.010a). Außerdem muss IP Forwarding noch konfiguriert werden, dazu brauchen wir folgenden netsh Befehl: “netsh int ipv4 set int “NLB” forwarding=enabled”\n\nNLB Port Rules\nAls letzter Schritt bei der Konfiguration des Clusters werden die Port Rules konfiguriert. Standardmäßig werden einfach alle Ports (0-65535) egal ob TCP oder UDP an alle Clusterknoten weitergeleitet. Nun um die Angriffsfläche oder( “Attack Surface”) zu verringern und die Konfiguration zu optimieren sollten nur diese Ports weitergeleitet werden die auch wirklich benötigt werden. Ein weiterer Vorteil von einer eigenen Regel für jedes Protokoll ist dass man die Affinität so für jedes Port einstellen kann.\nMein NLB Cluster soll ein Webserver werden, also werde ich nur die Ports 80 und 443 weiterleiten, ich möchte die Affinität für beide Ports “Einfach” haben, es wird also die IP Adresse jedes Clients verwendet um die Affinität zu steuern. \nIch lösche also die Default Port Rule und erstelle zwei neue.\n \nDie Port Rules werden entweder in den Clustereigenschaften konfiguriert, oder direkt beim erstellen des Clusters.\n\nJetzt erkennen wir einen weiteren Vorteil der Konfiguration mit zwei Netzwerkkarten: Der NLB Manager kann weiterhin mit beiden Knoten kommunizieren, obwohl ich für die Protokolle die verwendet keine Port Rules erstellt habe. Der NLB Manager verwendet für die Konfiguration die dedizierten Adressen.\nChecklist\nHier die einzelnen Schritte nochmal im Überblick.\n        Feature installieren       zusätzliche Netzwerkkarte installieren    Netzwerkkarten konfigurieren (IP, Bindings!)    Cluster erstellen (Unicast/Multicast)    Hosts hinzufügen    evtl. Statische ARP Einträge    IP Forwarding aktivieren (netsh int ipv4 set int “NLB” forwarding=enabled)    Port Rules erstellen \n&#160;\nso long!   tomt"
        },
        {
          "id": "post-installation-der-sharepoint-services-30-auf-server-2008",
          "title": "Installation der Sharepoint Services 3.0 auf Server 2008",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2008, Server-2008-R2, Sharepoint",
          "url": "/post/installation-der-sharepoint-services-30-auf-server-2008/",
          "content": "Die Installation der Sharepoint Services kann sich unter Server 2008 / 2008 R2 als schwierig erweisen, wenn der Windows Installer während der Installationsphase einen falsch angegeben Parameter meldet:\n \nDas Problem hängt hierbei mit der “Windows Internal Database” zusammen.\nLösung: Vor der Installation folgendes Kommando eingeben:    ocsetup.exe &quot;WSSEE&quot; /quiet /norestart /x:&quot; /lv* C:\\bak.log\nGrüße   dn"
        },
        {
          "id": "post-office-2010-fertig!!",
          "title": "Office 2010 fertig!!",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/office-2010-fertig!!/",
          "content": "Kurze Info: Office 2010 ist fertig!! Ab sofort ist es für TechNet und MSDN Abonnenten zum Download verfügbar!\nLasst die Leitungen glühen!! :)"
        },
        {
          "id": "post-programme-vom-server-core-hyper-v-server-deinstallieren",
          "title": "Programme vom Server Core / Hyper-V Server deinstallieren",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Hyper-V, Server",
          "url": "/post/programme-vom-server-core-hyper-v-server-deinstallieren/",
          "content": "Der Server 2008 Core und der Hyper-V Server haben keine Oberfläche um Programme zu deinstallieren (Add/Remove programs).\nUm Programme deinstallieren zu können, öffnen wir die Registrierung. (Üblicherweise Remoteregistrierung von einem Client aus). Unter    HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall    werden die installierten Programme gelistet.\n \nWenn man den Wert im Schlüssel “UninstallString” in der Kommandozeile des Servers eingibt, wird der Windows Installer gestartet und deinstalliert das Programm.\nGrüße   dn"
        },
        {
          "id": "post-exchange-2010-active-sync-funktioniert-nicht",
          "title": "Exchange 2010 - Active Sync funktioniert nicht",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Events, Exchange",
          "url": "/post/exchange-2010-active-sync-funktioniert-nicht/",
          "content": "Ja es ist ruhig zur Zeit auf ntSystems&hellip; das liegt daran dass die beiden Autoren zur Zeit ihre MCSA/MCSE Zertifizierungen auf MCITP-EA aktualisieren. Wir sind auch ganz gut im Rennen, aber einige Pr&uuml;fungen fehlen noch. Naja, bald gibt&rsquo;s hoffentlich wieder mehr zum Lesen.\nInzwischen die L&ouml;sung f&uuml;r folgendes Problem:\nActiveSync funktioniert mit Exchange 2010 nicht, Event ID: 1053 Source: MSExchange ActiveSync wird Protokolliert. Aus der Beschreibung des Fehlers erkennt man auch schon das Problem, fehlende Berechtigungen.\nExchange ActiveSync doesn't have sufficient permissions to create the container &ldquo;CN&rdquo; under Active Directory &hellip; &lt;/p&gt;\nActive directory response: 00000005: SecErr: DSID-03152492, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0 \nMake sure the user has inherited permission granted to domain\\Exchange Servers to allow List, Create child, Delete child of object type \"msExchangeActiveSyncDevices\" and doesn't have any deny permissions that block such operations.&lt;/code&gt;\nAlso einfach die in der Fehlermeldung beschriebenen Berechtigungen setzen, oder die Vererbung auf dem Active Directory User Objekt wieder aktivieren.\nUm Berechtigungen im Active Directory zu setzen muss unter &ldquo;View&rdquo; die Option &ldquo;Advanced Features&rdquo; aktiviert werden. Dann&nbsp;wird unter den Eigenschaften des Benutzers der Reiter &ldquo;Security&rdquo; angezeigt.\ntt"
        },
        {
          "id": "post-wds-remoteinstallationsordner-verschieben",
          "title": "WDS Remoteinstallationsordner verschieben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/wds-remoteinstallationsordner-verschieben/",
          "content": "Um in den Deployment Services den Installationsorder zu verschieben müssen folgende Befehle ausgeführt werden:\nwdsutil /uninitialize-server\nDann den Ordner an seinen neuen Platz verschieben\nwdsutil /initialize-server /reminst:Laufwerksbuchstabe\\Ordner\nGrüße   dn"
        },
        {
          "id": "post-wsus-content-auf-anderes-volume-verschieben",
          "title": "WSUS content / database auf anderes Volume verschieben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/wsus-content-auf-anderes-volume-verschieben/",
          "content": "Content\nUm den WSUS content auf einem anderen Volume zu verschieben, reicht es ein einfaches Command auszuführen:\nwsusutil.exe movecontent “neuer Pfad” “Pfad für das entstehende LogFile”\nDas Tool wsusutil befindet sich unter Program Files\\ Update Services \\ Tools\n\nDatabase\nUm die Datenbank zu verschieben gibt es 2 Möglichkeiten, einmal über das Management Studio oder über SQLCMD. In diesem Post gehe ich lediglich auf die Methode anhand des Management Studio ein\n1) Datenbank über folgenden Pfad öffnen\n\\\\.\\pipe\\MSSQL$MICROSOFT##SSEE\\sql\\query\n \n2) Datenbank trennen\nBevor die Datenbank getrennt wird, sollte der Dienst “update services” beendet werden. Die Datenbank SUSDB trennen und bei den Optionen muss noch angegeben werden, dass die Verbindungen mit getrennt werden sollen. \n\n3) Datenbank auf neuem Volume kopieren\n4) Datenbank wieder anfügen\n\n&#160; \nDanach kann der Dienst “update services” wieder gestartet werden.\nGrüße    dn"
        },
        {
          "id": "post-forefront-2010-e28093-dienste-starten-nicht-automatisch",
          "title": "Forefront 2010 – Dienste starten nicht automatisch",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Server, Security",
          "url": "/post/forefront-2010-e28093-dienste-starten-nicht-automatisch/",
          "content": "Wer Forefront 2010 installiert und das Logging nicht separat konfiguriert wird sich wom&ouml;glich wundern warum bei einem Neustart folgende Dienste nicht starten:\n\nMicrosoft Forefront TMG Control\nMicrosoft Fronfront TMG Firewall\nMicrosoft Forefront TMG Job Scheduler\nMicrosoft Forefront TMG Managed Control\n\nForefront beantwortet somit keine Anfragen und jeglicher Zugriff von allen au&szlig;er den Management Computern wird blockiert.\nDas liegt daran dass Standardm&auml;&szlig;ig eine Lokale SQL Instanz also Logging Ziel konfiguriert ist, der SQL Dienst aber erst nach den Forefront Diensten startet&hellip; Und wenn Forefront nicht Protokollieren kann dann wird der Dienst beendet. Im Eventlog steht:\nThe Microsoft Forefront TMG Control service terminated with service-specific error %%278540.\nL&ouml;sen l&auml;sst sich das Problem ganz einfach, entweder man stellt auf Logging to File\n&nbsp;\noder man Konfiguriert die vier oben genannten Dienste f&uuml;r verz&ouml;gerten Start.\n&nbsp;\n&Uuml;ber die Sinnhaftigkeit dieser Standardkonfiguration muss man wohl nichts mehr sagen&hellip;\ntom"
        },
        {
          "id": "post-wds-tftp-timeout",
          "title": "WDS TFTP TimeOut",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2008-R2, Server-2008, Server-2003",
          "url": "/post/wds-tftp-timeout/",
          "content": "Wenn die Windows Deployment Services auf derselben Maschine wie der DNS Server laufen, wird WDS nach der Installation des DNS-Patches KB953230 (wird auch über Windows Updare verteilt) möglicherweise nicht mehr funktionieren. Wenn der Client versucht über PXE zu booten erscheint folgende Meldung: PXE-E32: TFTP open timeout\nUm dieses Problem zu beheben muss folgendes an den WDS Diensten verändert werden:\nServer 2003 – 2008\nIn den Eigenschaften des WDS Servers muss der UDP Portbereich zu den Werten 50000 bis 65000 verändert werden.\n \n     Server 2008 R2\nWenn als OS Server 2008 R2 verwendet wird, kann auch die Option aktiviert werden, dass WDS automatisch nach verfügbaren WinSock Ports abfragt und nicht den vorkonfigurierten UDP Portbereich verwendet. Dazu muss der Schlüssel UDPPortPolicy unter HKLM\\System\\CurrentControlSet\\Services\\WDSServer\\Parameters von 1 auf 0 gesetzt werden.\nGrüße   dn"
        },
        {
          "id": "post-terminal-lizenzserver-4105",
          "title": "Terminal-Lizenzserver, 4105",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2008, Server-2003",
          "url": "/post/terminal-lizenzserver-4105/",
          "content": "Nach der Domänenmigration von 2003 zu 2008 kann es geg. zu Problemen am Terminal-Lizenzserver kommen, dass Lizenzattribute für Benutzer nicht aktualisiert werden können.\n \nDas Problem ist, dass nach der Migration der Domäne die Benutzer-Berechtigungen für die Gruppe “Terminalserver-Lizenzserver” nicht aktualisiert werden.\nUm die Benutzerberechtigungen für die bestehenden Benutzer manuell zu setzen müssen der Gruppe Terminalserver-Lizenzserver folgende Berechtigungen zugewiesen werden: “Terminalserver-Lizenzserver lesen” und ”Terminalserver-Lizenzserver schreiben” \n \nGrüße   dn"
        },
        {
          "id": "post-bootmgr-is-missing",
          "title": "BOOTMGR is missing",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/bootmgr-is-missing/",
          "content": "Gestern habe ich meinen Windows Server 2008 R2 für den Cluster vorbereitet. Aus versehen habe ich eine Daten-Partition als aktiv markiert. Das habe ich natürlich sofort rückgängig gemacht.\nHeute habe ich meinen Server neu gestartet und musste feststellen, dass er nicht mehr bootet. Als Fehlermeldung wurde angezeigt, dass der Bootloader fehlt (BOOTMGR is missing). Nach ein wenig Recherche über Bing (ehemals Google :) ) bin ich auf 2 Methoden gestoßen um das Problem zu beheben:\nMethode 1: Den BCD Speicher neu erstellen\n   Server CD in einlegen und Server damit starten     Die Option “Computerreparatur” auswählen     CMD starten und den Befehl Bootrec /RebuildBcd eingeben. Nun sollte das Betriebssystem aufgelistet werden. Nun bestätigt man mit YES, dass der BCD Speicher neu geschrieben wird. Sollte das Betriebssystem nicht aufgelistet werden, so muss folgende durchgeführt werden: Export der Konfiguration: Bcedit /export C:\\BCD_Export Alte Konfiguration umbenennen: ren c:\\boot\\bcd bcd.old Und die Konfiguration nochmal erstellen lassen: Bootrec /RebuidlBcd     Server neu starten  \nMethode 2: Den BCD Speicher manuell neu erstellen\nDiese Methode habe ich noch nicht versucht, aber hier der KB-Artikel zum nachlesen.\nNachdem Methode 1 bei mir nicht funktionierte und nach mehreren Anläufen über /fixboot usw. sich nichts getan hat, erinnerte ich mich, dass auf der Windows 7 DVD eine Reparaturoption für den Startvorgang enthalten ist.\n \nNachdem ich den Server mit der Windows 7 DVD gestartet hatte, wählte ich die Option “Startup Repair” aus und lies die Diagnose durchlaufen. Nach 1 Minute und einem Neustart später startete der Server wieder ordnungsgemäß.\nACHTUNG: Das funktioniert nicht für den Microsoft Hyper-V Server. Dieser hat eine andere Bootkonfiguration, die vor dem Start des Betriebssystems den Hypervisor startet.\nGrüße    dn"
        },
        {
          "id": "post-exchange-2010-e28093-this-attachment-was-removed",
          "title": "Exchange 2010 – This Attachment was removed",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange",
          "url": "/post/exchange-2010-e28093-this-attachment-was-removed/",
          "content": "Ich betreibe seit einiger Zeit eine Exchange 2010 Umgebung bestehend aus einem Edge Transport Server und einem Multi-Role Exchange Server im Lan.\nStandardm&auml;&szlig;ig ist am Edge Transport Server der &ldquo;Attachment Filter Agent&rdquo; aktiv, dieser ist daf&uuml;r verantwortlich, potentiell gef&auml;hrliche Anh&auml;nge zu filtern. Will man also z.B. eine .exe Datei verschicken muss man diesen Agent deaktivieren. Das wird auf dem Edge Transport Server gemacht und zwar per PowerShell.\nDisable-TransportAgent -Identity \"Attachment Filter agent\"\nIch schlage allerdings vor dieses Sicherheitsfeature nicht auszuschalten. Man kann diverse Einstellungen vornehmen, so kann z.B. festgelegt werden dass ein unsicherer Anhang nicht entfernt wird sondern das Mail direkt &ldquo;rejected&rdquo; wird.\nMan kann die Attachment Filter Eintr&auml;ge &uuml;ber folgendes cmdlets selbst bearbeiten.\nAdd-AttachmentFilterEntry -Name &lt;FileName&gt; -Type FileName\nAdd-AttachmentFilterEntry -Name &lt;MIMEContentType&gt; -Type ContentType\nAu&szlig;erdem kann man das Verhalten des Attachment Filter Agent festlegen und zwar &uuml;ber das set-AttachmentFilterListConfig cmdlet\nSet-AttachmentFilterListConfig -Action -Reject -RejectResponse \"Versenden von Mails mit unsicheren Anh&auml;ngen nicht erlaubt!\"\nGenauere Syntax und Infos zu den Parametern findet man im TechNet:\nSet-AttachmentFilterListConfig Add-AttachmentFilterEntry\n&nbsp;\nna dann, sch&ouml;nes Wochenende! tom"
        },
        {
          "id": "post-nvspbind-fur-hyper-v",
          "title": "NVSPBIND für Hyper-V",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Hyper-V",
          "url": "/post/nvspbind-fur-hyper-v/",
          "content": "In einem meiner letzten Posts (Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben) habe ich erklärt, wie man über die Registry die Bindungen an den Netzwerkschnittstellen verändern kann.     Die Microsoft Entwickler haben dazu jetzt ein Tool veröffentlich, mit dem das Ganze etwas komfortabler gemanagt werden kann: NVSPBIND.\nGrüße   dn"
        },
        {
          "id": "post-wsus-verschieben",
          "title": "WSUS auf anderen Server verschieben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/wsus-verschieben/",
          "content": "Um den WSUS Server auf einer anderen physischen Maschine zu verschieben müssen folgende Schritte unternommen werden:\n1) WSUS auf dem Zielserver installieren\n2) Einstellungen manuell vom Quellserver zum Zielserver übernehmen\n3) Mit NTBackup das Verzeichnis WSUSContent vom Quellserver sichern (Kopieren ist auch möglich)\n \n4) Daten mit NTBackup auf dem Zielserver in den entsprechenden Ordner wiederherstellen\n5) Metadaten vom Quellserver exportieren\n   CMD öffnen und zum Ordner Tools unter C:\\Programme\\Update Services\\ wechseln    Folgenden Befehl eintippen um die Metadaten zu exportieren: wsusutil.exe export export.cab export.log    2 Files wurden erstellt (Export.cab und Export.log) \n \n6) Metadaten zum Zielserver importieren\n   Mit dem Befhl wsusutil.exe import export.cab import.log werden die zuvor exportierten Metadaten am Zielserver importiert             Info: Es kann einige Zeit vergehen, bis der Import Vorgang vollständig abgeschlossen wurde. 7) GPO abändern und auf den neuen WSUS Server verweisen    Grüße     dn"
        },
        {
          "id": "post-wpad-und-server-2008",
          "title": "WPAD und Server 2008",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2008, Server-2008-R2, Server, Client",
          "url": "/post/wpad-und-server-2008/",
          "content": "Heute habe ich meinen Windows Server 2008 R2 Server zum Domänencontroller promoted. D.h. Domänendienste, GC und DNS wurden installiert. Zudem habe ich als primären DNS Server die lokale Maschine angegeben.\nNach einiger Zeit wunderte ich mich, dass das Internet nicht mehr funktioniert. Als Gateway betreibe ich eine ISA Server 2006, der Proxy wird über WPAD automatisch konfiguriert.\nWindows Server 2008 besitzt für DNS ein neues Sicherheitsfeature, welches WPAD nicht zulässt (DNS Global Query Blocklist).\ndnscmd /info /enableglobalqueryblocklist –&gt; zeigt ob das Sicherheitsfeature aktiv ist. 1 = True, 0 False\ndnscmd /config /enableglobalqueryblocklist 0 –&gt; schaltet das Sicherheitsfeature aus\nWenn das Sicherheitsfeature abgeschaltet wird, muss der DNS Server noch neu gestartet werden.\nGrüße   dn"
        },
        {
          "id": "post-hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben",
          "title": "Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Hyper-V, Server",
          "url": "/post/hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben/",
          "content": "Wenn man den Hyper-V Server bzw. den Server Core verwendet und an den Netzwerkschnittstellen die Bindungen verändern möchte, kommt man um das Editieren der Registry nicht herum.   In meinen Fall möchte ich die “Datei und Druckerfreigabe” von den iSCSI Adaptern loslösen.\nAls erstes muss die ID der Netzwerkadapter ermittelt werden\nwmic nicconfig get Description,SettingID\nDanach erhält man eine Liste mit den Adaptern und deren ID\n \nNun beginnt die Arbeit in der Registry: Zunächst muss der Schlüssel Bind unter \nHKEY_LOCAL_MACHINE\\system\\currentcontrolset\\services\\lanmanserver\\     linkage\ngeöffnet werden. Hier erhält man eine Liste mit den Netzwerkadaptern und ihren Bindungen zum Protokoll der “Datei und Druckerfreigabe”.\n \nDer nächste Schritt besteht darin, die Bindungen aufzuheben, indem man alle Zeilen wo die entsprechende Adapter-ID vorkommt löscht.   Änderungen werden nach einem Reboot aktiv.\nAnbei noch eine Liste mit den Protokollen und ihren Schlüsseln:\nFile and Printer Sharing: LanmanServer     Client for MS Networks: LanmanWorkstation      Link-Layer Discovery Mapper I/O Driver: lltdio      Link-Layer Topology Discovery Responder: rspndr      TCP/IP v4: tcpip      TCP/IP v6: tcpip6\nGrüße   dn"
        },
        {
          "id": "post-bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung",
          "title": "BlueScreen “Stop 0x0000007E” beim aktivieren der Virtualisierungs-Technologie",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Hyper-V, Server-2008-R2",
          "url": "/post/bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung/",
          "content": "Nachdem im BIOS die Virtualisierungs-Technologie aktiviert wird, kann es zu einem BlueScreen bei starten des Servers kommen. Im BlueScreen wird folgender Fehlercode mitgeteilt: 0x0000007E.\nBetroffen sind folgende Produkte:\n Windows Server 2008 R2 Standard \n Windows Server 2008 R2 Enterprise \n Windows Server 2008 R2 Datacenter\n Hyper-V Server 2008 R2\n&#160;\nMicrosoft hat dazu den KB-Artikel 974598 und einen Hotfix veröffentlicht. \nUm den Server wieder flott zu bekommen, muss die Virtualisierungs-Technologie deaktiviert werden. Danach muss der Server gestartet und der Hitfix installiert werden.   Nachdem der Hotfix installiert wurde, kann die Virtualisierungs-Technologie wieder aktiviert und das System gestartet startet.\nGrüße   dn"
        },
        {
          "id": "post-server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen",
          "title": "Server 2008 Core / Hyper-V Netzwerkschnittstelle umbenennen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Hyper-V",
          "url": "/post/server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen/",
          "content": "Um auf einem Server Core oder auch Hyper-V Server die Netzwerkschnittstelle umzubenennen, wird das Tool netsh verwendet.\nUm z.B. “LAN-Verbindung 5” in “iSCSI 10” umzubenennen, muss folgender Befehl ausgeführt werden:\nnetsh interface set interface name=”LAN-Verbindung 5” newname=”iSCSI 10”\nGrüße   dn"
        },
        {
          "id": "post-disclaimer",
          "title": "disclaimer",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/disclaimer/",
          "content": "&lt;p&gt;1. Inhalt des Onlineangebotes &lt;/p&gt;  &lt;p&gt;Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. &lt;/p&gt;  &lt;p&gt;Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen. &lt;/p&gt;  &lt;p&gt;2. Verweise und Links &lt;/p&gt;  &lt;p&gt;Bei direkten oder indirekten Verweisen auf fremde Webseiten (&quot;Hyperlinks&quot;), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. &lt;/p&gt;  &lt;p&gt;Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist. &lt;/p&gt;  &lt;p&gt;3. Urheber- und Kennzeichenrecht &lt;/p&gt;  &lt;p&gt;Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen. &lt;/p&gt;  &lt;p&gt;Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! &lt;/p&gt;  &lt;p&gt;Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet. &lt;/p&gt;  &lt;p&gt;4. Datenschutz &lt;/p&gt;  &lt;p&gt;Sofern innerhalb des Internetangebotes die Möglichkeit zur Eingabe persönlicher oder geschäftlicher Daten (Emailadressen, Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme und Bezahlung aller angebotenen Dienste ist - soweit technisch möglich und zumutbar - auch ohne Angabe solcher Daten bzw. unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet. Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie Emailadressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstössen gegen dieses Verbot sind ausdrücklich vorbehalten. &lt;/p&gt;  &lt;p&gt;5. Rechtswirksamkeit dieses Haftungsausschlusses &lt;/p&gt;  &lt;p&gt;Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt. &lt;/p&gt;  &lt;p&gt;1. Content&lt;/p&gt;  &lt;p&gt;The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect,will therefore be rejected. &lt;/p&gt;  &lt;p&gt;All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the author without separate announcement. &lt;/p&gt;  &lt;p&gt;2. Referrals and links&lt;/p&gt;  &lt;p&gt;The author is not responsible for any contents linked or referred to from his pages - unless he has full knowledge of illegal contents and would be able to prevent the visitors of his site fromviewing those pages. If any damage occurs by the use of information presented there, only the author of the respective pages might be liable, not the one who has linked to these pages. Furthermore the author is not liable for any postings or messages published by users of discussion boards, guestbooks or mailinglists provided on his page. &lt;/p&gt;  &lt;p&gt;3. Copyright&lt;/p&gt;  &lt;p&gt;The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. &lt;/p&gt;  &lt;p&gt;The copyright for any material created by the author is reserved. Any duplication or use of objects such as images, diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's agreement. &lt;/p&gt;  &lt;p&gt;4. Privacy policy&lt;/p&gt;  &lt;p&gt;If the opportunity for the input of personal or business data (email addresses, name, addresses) is given, the input of these data takes place voluntarily. The use and payment of all offered services are permitted - if and so far technically possible and reasonable - without specification of any personal data or under specification of anonymized data or an alias. The use of published postal addresses, telephone or fax numbers and email addresses for marketing purposes is prohibited, offenders sending unwanted spam messages will be punished. &lt;/p&gt;  &lt;p&gt;5. Legal validity of this disclaimer&lt;/p&gt;  &lt;p&gt;This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual terms of this statement are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. &lt;/p&gt;"
        },
        {
          "id": "post-zertifizierungsstelle-verschieben-(backuprestore)",
          "title": "Zertifizierungsstelle verschieben (Backup/Restore)",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/zertifizierungsstelle-verschieben-(backuprestore)/",
          "content": "Eine Zertifizierungsstelle geh&ouml;rt zu den Serverrollen die &uuml;ber viele Jahre gleich bleiben und einige Hardware- bzw. Betriebsystem- Lifecycles &uuml;berdauern. Aus diesem Grund kann es vorkommen dass man eine CA von einem Server auf einen anderen migrieren muss.\nWichtig dabei ist dass der Name des Servers sich nicht &auml;ndern sollte, kann man eine &Auml;nderung nicht verhindern gibt es hier einen KB Artikel der die Vorgehensweise beschreibt. Aber wie gesagt, besser/einfacher ist es den Namen nicht zu &auml;ndern.\nNun denn, zuerst gilt es eine Strategie zu w&auml;hlen, ich habe es so gemacht dass ich die CA gesichert habe, CA deinstalliert, DC heruntergestuft, Server aus der Domain genommen. Neuen Server mit gleichem Namen installiert, zum DC hochgestuft, CA installiert, CA widerhergestellt und l&auml;uft.\nAlso zum ersten Schritt, Sichern einer Zertifizierungsstelle:\n\nIm CA SnapIn auf den CA Namen klicken und All Tasks &ndash;&gt; Backup CA w&auml;hlen\nBeide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivieren\nEinen Ordner angeben wohin das Ganze gesichert wird (sollte leer sein)\nEin Kennwort f&uuml;r den Private Key angeben (sollte man sich nat&uuml;rlich merken)\nregedit &ouml;ffnen und zum Schl&uuml;ssel HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\CertSvc\\Configuration wechseln, Rechtsklick auf den Schl&uuml;ssel und Export w&auml;hlen. Wieder einen Ordner w&auml;hlen um den Registry Key abzulegen.\n\nDeinstallieren einer Zertifizierungsstelle:\n\n\nServer Manager &ouml;ffnen, Remove Roles w&auml;hlen\n\n\nActive Directory Certificate Services entfernen\n\n\nNeu Starten und fertig\n\n\nfolgende Daten bleiben auf dem Server (Achtung bei Entsorgung!!)\n\nCA database, CA public and private keys, CA's certificates in the Personal store\nCA chain's root certificate in the Trusted Root Certification Authorities store\nCA chain's intermediate certificates in the Intermediate Certification Authorities store\nThe CA's CRL\n\nWiederherstellen einer Zertifizierungsstelle:\n\n\nServer Manager &ouml;ffnen, Add Roles w&auml;hlen\n\n\nActive Directory Certificate Services hinzuf&uuml;gen\n\n\nBei &ldquo;Specify Type&rdquo; den entsprechenden Typ ausw&auml;hlen, Standalone oder Enterprise\n\n\nBei &ldquo;Set up Private Key&rdquo; muss man &ldquo;Use existing private Key&rdquo; w&auml;hlen, darunter &ldquo;Select a certificate and use its associated private key&rdquo;\n\n\nJetzt wird das vorher gesicherte Zertifikat (*.p12 Datei) ausgew&auml;hlt und das entsprechende Passwort eingegeben\n\n\nBei &ldquo;Configure Database&rdquo; ist noch darauf zu achten dass der CertLog Ordner im gleichen Pfad liegt wie auf dem alten Server (Standard %systemroot%\\system32\\CertLog)\n\n\nJetzt wird die CA installiert \n\nIst die Installation abgeschlossen, die Dienstkonsole &ouml;ffnen (services.msc) und den Dienst &ldquo;Active Directory Certificate Services&rdquo; beenden\nJetzt das vorher exportierte Registry File doppelklicken und die Einstellungen importieren\nCA SnapIn &ouml;ffnen und auf den CA Namen klicken, All Tasks &ndash;&gt; Restore CA w&auml;hlen\nWieder beide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivieren\nJetzt kann der Dienst &ldquo;Active Directory Certificate Services&rdquo; wieder gestartet werden und die CA l&auml;uft wieder\n\nWeihnachtliche Gr&uuml;&szlig;e tom\n&nbsp;"
        },
        {
          "id": "post-domain-controller-umbenennen",
          "title": "Domain Controller umbenennen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2008-R2, Server-2008, Server",
          "url": "/post/domain-controller-umbenennen/",
          "content": "Es kann vorkommen dass man bei der Wahl der Servernamen mal danebengreift oder einfach im Nachhinein einen anderen Namen braucht. Wenn z.B. eine Zertifizierungsstelle wiederhergestellt werden soll dann ist der Computername wichtig.\nUm also einen Domain Controller (2008, 2008R2) umzubenennen geht man am besten so vor (Achtung: Ein Neustart ist nötig).\nZuerst wird ein zusätzlicher DNS-Hostname hinzugefügt.\nnetdom computername altername.domain.local /add:neuername.domain.local\nWichtig ist nun die Replikation mit allen anderen DCs abzuwarten oder manuell anzustoßen (repadmin, AD Sites and Services). Alle DCs müssen die Änderung im Computerkonto mitbekommen, in allen DNS Servern muss der zusätzliche Namen als Ressource Record aufscheinen. \nErst nachdem die Replikation abgeschlossen ist darf man zum nächsten Schritt gehen. Man kann das Ergebnis der Replikation sehen indem man mit ADSI Edit die Eigenschaften des entsprechenden Computerkontos anzeigt, dort muss das Attribut &quot;msDS-AdditionalDnsHostName” den Wert neuername.domain.local haben. Alternativ zu ADSI Edit kann man auch das SnapIn Active Directory Users and Computers verwenden, allerdings muss man dazu unter “View” die “Advanced Features” aktivieren damit man die Attribute sieht.\nIst die Replikatoin erfolgt wird der neue Computername als Primärer gesetzt.\nnetdom computername altername.domain.local /makeprimary:neuername.domain.local\nNach diesem Schritt ist wiederum die Replikation abzuwarten/anzustoßen. Es ändert sich der Name des Computerobjektes und das Attribut “msDS-AdditionalDnsHostName” bekommt den Wert “altername.domain.local”.\nJetzt muss der Server neu gestartet werden.\nZum Schluss wird der alte Namen noch entfernt.\nnetdom computername neuername.domain.local /remove:altername.domain.local\nMan kommt nicht um den Neustart herum, so funktioniert aber alles reibungslos.\nGrüße.   tt"
        },
        {
          "id": "post-forefront-thread-management-gateway-2010",
          "title": "Forefront Threat Management Gateway 2010",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "de, Security",
          "url": "/post/forefront-thread-management-gateway-2010/",
          "content": "Der Nachfolger des beliebten MS Internet Security and Acceleration Servers (ISA) ist seit Mitte November verf&uuml;gbar. Nat&uuml;rlich wurde der Name ge&auml;ndert&nbsp;sowas ist&nbsp;nach einigen Versionen&nbsp;immer n&ouml;tig ;) Das Ding wurde in die Forefront Produktlinie aufgenommen und hei&szlig;t jetzt Forefront Threat Management Gateway 2010. TMG gibt es wie ISA als Standard und Enterprise Edition, die Unterschiede findet man hier.\nWichtig zu erw&auml;hnen ist dass Forefront TMG nur mehr als 64 Bit Version verf&uuml;gbar ist, es gibt eine Testversion f&uuml;r 32 Bit Systeme, ist Produktiv allerdings nicht unterst&uuml;tzt. Die Genauen Systemvoraussetzungen gibt es hier.\nDie wichtigsten neuen Features kurz im &Uuml;berblick:\n\nWeb Protection Subscription Service\n\nBietet HTTP/HTTPS Traffic Inspection\nURL Filterung in Zusammenarbeit mit MRS (Microsoft&nbsp;Reputation Services) mehr dazu z.B. bei Technet Edge\n\n\nE-Mail Support\n\narbeitet mit Exchange Edge Transport zusammen\n\n\nNIS Network Inspection System\nIntrusion Prevention\nEnhanced NAT\n\nendlich eine 1-to-1 NAT Funktion, d.h. man kann selbst entscheiden welche interne Adresse auf welche externe &uuml;bersetzt wird\n\n\nVoIP Support\n64 Bit Support\n\nStartet man das Setup bekommt man mal etwas wirklich cooles, das Preparation Tool.&nbsp;Dieses Tool installiert alle&nbsp;ben&ouml;tigten Serverrollen und Features. Diese sind je nach Installation unterschiedlich:\nForefront TMG services\n\nWindows Installer 4.5\n.Net Framework 3.5 SP1\nWindows PowerShell\nWindows Web Services API (WWSAPI)\nNetwork Policy Server (NPAS-Policy-Server)\nNPAS Routing and Remote Access Services (NPAS-RRAS-Services)\nActive Directory Lightweight Directory Services (ADLDS)\nNetwork Load Balancing (NLB)\n\nForefront TMG management only\n\nWindows Installer 4.5\n.Net Framework 3.5 SP1\nWindows PowerShell\n\nForefront TMG EMS (nur Enterprise Version)\n\nWindows Installer 4.5\n.Net Framework 3.5 SP1\nWindows PowerShell\nActive Directory Lightweight Directory Services (ADLDS)\n\n\nIst der Preparation Wizard abgeschlossen, kann mit der Installation des TMG begonnen werden.\n\nDie Installation dauert einige Zeit, wenn sie abgeschlossen ist kann man die Management Konsole &ouml;ffnen und mit der Konfiguration beginnen. Zuerst sind noch mit einfachen Wizards die Netzwerkeinstellungen, Updates und URL Filtering bzw. Web Protection Subscription zu konfigurieren.\n\nWenn jetzt noch der Web Access Wizard ausgef&uuml;hrt wird kann man gleich noch eine erste Regel erstellen. Man kann ausw&auml;hlen welche URL Kategorien man sperren m&ouml;chte, ob man Web und HTTPS inspection aktivieren m&ouml;chte und wenn ja mit welchem Zertifikat. Au&szlig;erdem kann hier gleich das Caching aktiviert werden.\nAlles in allem scheint TMG wirklich ein sehr interessantes Produkt zu werden, das deutlich mehr kann als nur den ISA Server zu ersetzen. In n&auml;chster Zeit werde ich sicher noch einiges dar&uuml;ber berichten.\nviele Gr&uuml;&szlig;e.tom"
        },
        {
          "id": "post-exchange-2010-e28093-anonymous-relay",
          "title": "Exchange 2010 – Anonymous Relay",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Exchange, Server",
          "url": "/post/exchange-2010-e28093-anonymous-relay/",
          "content": "Immer wieder gibt es Gründe (z.B. SharePoint) um bestimmten Hosts anonymes Relaying über Exchange zu erlauben. Man muss sich so eine Konfiguration natürlich gut überlegen und die entsprechenden Hosts müssen vertrauenswürdig bzw. sicher sein.\nMan erstellt also einen neuen “Custom” Receive Conenctor, dem man erst mal einen Namen geben muss (Server Configuration, Hub Transport).\n \nUnter “Local Network Settings” kann man die IP Adresse angeben über welche der Exchange Server am besten mit dem Host reden kann. Wenn man nur eine Netzwerkkarte im Hub Transport Server hat kann man sich diese Einstellung schenken und einfach alle verfügbaren IPv4 Adressen verwenden. Außerdem kann man noch den FQDN eingeben mit dem sich der Exchange Server melden soll.\n \nUnter “Remote Network Settings” wird jetzt der Host (bzw. die Hosts) hinzugefügt der anonym über den Exchange Relayen darf. Wichtig: der Host muss wirklich vertrauenswürdig sein und AntiVirus bzw. Firewall sollen laufen, damit man nicht selbst zur Spamschleuder wird. Man kann einzelne Hosts, IP Bereiche oder ganze Subnets angeben.\n \nDurch klicken auf weiter und wird der Connector erstellt. Jetzt muss man noch die benötigten Berechtigungen setzen. Dazu Rechtsklick auf den Connector und die Eigenschaften öffnen. Unter “Authentication” werden alle Felder deaktiviert, unter “Permission Groups” wird die Gruppe Anonymous Users hinzugefügt. \n \n \nDas Ganze kann man natürlich auch wieder mit der PowerShell machen, dazu einfach das New-ReceiveConnector cmdlet verwenden. Hier ein Beispiel:\nNew-ReceiveConnector -Name &quot;SharePoint Relay&quot; -Usage Custom -PermissionGroups AnonymousUsers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.1.10,192.168.1.15-192.168.1.18\nJetzt gibt es also den Connector und die angegeben Hosts verwenden diesen, das Relaying funktioniert allerdings noch nicht.    Dazu muss man dem User “NT AUTHORITY\\ANONYMOUS LOGON” die Berechtigung “Ms-Exch-SMTP-Accept-Any-Recipient” geben. Diese Aktion kann man nur in der EMS (Exchange Management Shell) durchführen.\nGet-ReceiveConnector &quot;SharePoint Relay&quot; | Add-ADPermission -User &quot;NT AUTHORITY\\ANONYMOUS LOGON&quot; -ExtendedRights &quot;Ms-Exch-SMTP-Accept-Any-Recipient&quot;\nHat man auch das gemacht funktioniert das Realying.\ntt"
        },
        {
          "id": "post-ersten-ws08r2-dc-im-vorhandenen-forest-installieren",
          "title": "Ersten WS08R2 DC im vorhandenen Forest installieren",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Server-2008-R2",
          "url": "/post/ersten-ws08r2-dc-im-vorhandenen-forest-installieren/",
          "content": "Neue Features wie das AD Administrative Center (hat Daniel hier&nbsp;schon&nbsp;vorgestellt)&nbsp;oder der AD Recycle Bin erfordern Windows Server 2008 R2 Domain Controller. Das Administrative Center braucht nur einen neuen DC, f&uuml;r den Recycle Bin muss das Forest Functional Level auf WS08R2 gestuft werden, mehr dazu in einem n&auml;chsten Beitrag.\nUm die Domain auf den ersten 2008 R2 DC vorzubereiten muss wie auch schon bei fr&uuml;heren Updates zuerst das AD Schema aktualisiert werden (auf Version 47). Dazu wird auf einem bestehenden DC die Windows Server 2008 R2 CD eingelegt, man muss nat&uuml;rlich mit einem Benutzer mit Schema Admin Rechten anmelden. Im Ordner Support\\adprep befinden sich die Dateien adprep.exe und adprep32.exe. Wie der Dateiname schon sagt wird mit adprep.exe die Schemaerweiterung bei x64 Systemen durchgef&uuml;hrt, mit adprep32.exe wird das Schema auf x86 DCs erweitert.\nFolgende Parameter werden ben&ouml;tigt:\n\nadprep[32].exe /forestprep \n\nBereitet den gesamten Forest auf WS08R2 vor\n\n\nadprep[32].exe /domainprep /gpprep \n\nMuss auf dem Infrastruktur Master ausgef&uuml;hrt werden\nBereitet die Domain vor und setzt Berechtigungen auf Sysvol Share f&uuml;r RSoP Planning Mode\n\n\nadprep[32].exe /rodcprep \n\nMuss nur ausgef&uuml;hrt werden wenn ein RODC vorhanden ist, bzw. installiert werden soll\n\n\n\nJetzt sind Domain und Forest bereit f&uuml;r den neuen DC und der Windows Server 2008R2 kann mit dcpromo hochgestuft werden.\nviele Gr&uuml;&szlig;e tt"
        },
        {
          "id": "post-exchange-2010-e28093-edge-subscription",
          "title": "Exchange 2010 – Edge Subscription",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Exchange",
          "url": "/post/exchange-2010-e28093-edge-subscription/",
          "content": "Exchange 2010 bringt wie sein Vorg&auml;nger die Edge Transport Rolle mit. In Exchange 2007 wurde bei jeder Synchronisation die gesamte Konfiguration repliziert, dieser Prozess wurde mit Exchange 2010 verbessert, jetzt ist die erste Replikation vollst&auml;ndig, bei allen weiteren werden nur noch die &Auml;nderungen repliziert (incremental updates).Diese Serverrolle kann als einzige nicht mit anderen Rollen auf einem Server installiert werden, der Grund daf&uuml;r ist auch einfach erkl&auml;rt: der Edge Transport Server wird als Mail Relay in der DMZ eingesetzt und ist kein Dom&auml;nenmitglied bzw. hat nur sehr eingeschr&auml;nkten Zugriff auf das LAN.\nVor der Installation des Edge Transport Servers muss die interne Hub Transport Rolle konfiguriert werden. Das hei&szlig;t Accepted Domains und die Connectoren m&uuml;ssen konfiguriert werden. Hier ein Link zur entsprechenden Technet Seite.\nDie Installation des Edge Transport Servers gestaltet sich sehr einfach. Man braucht einen x64 Server 2008 (am besten R2) in der Standard Edition. Dort wird das .net Framework installiert. Au&szlig;erdem wird ein Verzeichnisdienst ben&ouml;tigt, der Edge Transport Server muss ja wissen welche Empf&auml;nger es im Active Directory gibt. Active Direcotry Lightweight Directory Services (ADLDS), der Nachfolger des ADAM, und die entsprechende Verwaltungskonsole werden also auch installiert.\nAm schnellsten geht das wohl &uuml;ber die PowerShell:\n\nImport-Module ServerManager\nAdd-WindowsFeature NET-Framework,RSAT-ADDS,ADLDS &ndash;Restart\n\nNach dem Neustart muss noch der Starttyp eines Dienstes ge&auml;ndert werden, auch wieder in der PowerShell:\n\nSet-Service NetTcpPortSharing -StartupType Automatic\n\nDer Server ist jetzt soweit vorbereitet, man muss (wenn nicht schon passiert) noch den DNS Suffix der internen Domain (z.B: domain.local) eintragen.\nDa der Server in der DMZ stehen soll, muss auf der Firewall folgendes konfiguriert werden:\n\nDNS: Port 53 (tcp/udp) Richtung interne DNS Server\nSMTP:&nbsp;Port 25 (tcp)&nbsp;Richtung interner Hub Transport Server\nEdgeSync:&nbsp;Port 50636 (tcp)&nbsp;Richtung interner Hub Transport Server (Replikationspartner)\n\nJetzt kann das Exchange 2010 Setup ausgef&uuml;hrt werden, bei dem die &ldquo;Custom Installation&rdquo; gew&auml;hlt wird und dort nur die Edge Transport Rolle und die Management Tools installiert werden. Die Installation ist schnell abgeschlossen, was jetzt noch ben&ouml;tigt wird ist die Synchronisation zwischen Edge Transport und internem Exchange (HUB) Server. Wichtig: Auf dem Edge Transport Server ist keine Konfiguration (Accepted Domains usw.) n&ouml;tig, diese Einstellungen werden mit der Edge Synchronisierung &uuml;bernommen.\nAuf dem Edge Transport Server ein neues Subscription File erstellt. Es wird einfach New-EdgeSubscription -FileName \"C:\\filename.xml\" in der EMS eingegeben. Die eben erstellte Datei wird auf den Hub Transport Server &uuml;bertragen, dort wird&nbsp;mit dem selben cmdlet die EdgeSync erstellt. New-EdgeSubscription -FileName \"C:\\EdgeSubscriptionInfo.xml\" -Site \"Name-der-AD-Site\". Nat&uuml;rlich kann man die EdgeSync auch in der EMC erstellen, dazu in der Organization Configuration die Hub Transport Rolle ausw&auml;hlen, dort auf den Edge Subscription Tab wechseln und New Edge Subscription w&auml;hlen. Jetzt muss noch der Active Directory Standort gew&auml;hlt werden und das xml File angegben werden. Auch hier k&ouml;nnen die Connectoren auf Wunsch automatisch erstellt werden.\nWichtig: Der interne Hub Transport Server muss den Edge Transport Server per DNS Name aufl&ouml;sen k&ouml;nnen!\nDurch die EdgeSync werden die ben&ouml;tigten Connectoren erstellt und die relevanten Einstellungen &uuml;bernommen. So wird z.B. die Konfiguration des Default Recipient Connector sowie die Accepted Domains vom internen Server &uuml;bernommen.\nWeiterf&uuml;hrend kann ich das Exchange 2010 TechCenter empfehlen.Sehr lesenswert ist auch der Exchange Team Blog, zu finden in der Blogroll.\nviele Gr&uuml;&szlig;ett"
        },
        {
          "id": "post-exchange-2010-e28093-get-owavirtualdirectory-access-denied",
          "title": "Exchange 2010 – Get-OwaVirtualDirectory Access Denied",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Exchange",
          "url": "/post/exchange-2010-e28093-get-owavirtualdirectory-access-denied/",
          "content": "Wird Exchange 2010 Server in einer Exchange 2007 Umgebung installiert erscheint folgender Fehler wenn man in der Exchange Management Console unter “Server Configuration” die Client Access Rolle verwalten möchte. \n“An IIS directory entry couldn't be created. The error message is Access is denied. HResult = -2147024891. It was running the command 'Get-OwaVirtualdirectory'”\n\nDen selben Fehler erhält man wenn man in der Exchange Management Shell den Befehl “Get-OwaVirtualDirectory” ausführt, macht die EMC eigentlich auch, nur mit Bild drum herum :).\n\nDer Grund dafür ist wohl dass Exchange 2010 keine Berechtigungen auf der entsprechenden Website im IIS auf dem 2007 Client Access Server erhält.\nDie Lösung: Alle Exchange 2010 Server sollen Mitglied der lokalen Administratoren auf allen Exchange 2007 Servern sein. Also am besten die Gruppe “Exchange Trusted Subsystems” zu den Lokalen Admins auf den Exchange 2007 Server hinzufügen.\nAlternativ kann man der Gruppe “Exchange Trusted Subsystems” auch Berechtigungen (Full Control) auf der entsprechenden Website (Default Website) im direkt im IIS geben.\nviele Grüße   tt"
        },
        {
          "id": "post-dhcp-fehler-1003",
          "title": "DHCP Fehler 1003",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server",
          "url": "/post/dhcp-fehler-1003/",
          "content": "Letztens konnte ich auf mehreren meiner Client-PC’s Fehlermeldungen im Eventlog bezüglich fehlerhafter Anmeldungen feststellen:\nEreignistyp:&#160;&#160;&#160; Warnung   Ereignisquelle:&#160;&#160;&#160; Dhcp    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 1003    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:25    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****    Beschreibung:    Der Computer konnte die Netzwerkadresse, die durch den DHCP-Server für die Netzwerkkarte mit der Netzwerkadresse ******A98F0 zugeteilt wurde, nicht erneuern. Der folgende Fehler ist aufgetreten:     Das Zeitlimit für die Semaphore wurde erreicht. . Es wird weiterhin im Hintergrund versucht, eine Adresse vom Netzwerkadressserver (DHCP) zu erhalten. \nEreignistyp:&#160;&#160;&#160; Fehler   Ereignisquelle:&#160;&#160;&#160; NETLOGON    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 5719    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:33    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****\nBeschreibung:   Es steht kein Domänencontroller für die Domäne ***** aus folgendem Grund zur Verfügung:     Es sind momentan keine Anmeldeserver zum Verarbeiten der Anmeldeanforderung verfügbar.    Stellen Sie sicher, dass der Computer mit dem Netzwerk verbunden ist, und versuchen Sie es erneut. Wenden Sie sich an den Domänenadministrator, wenn das Problem weiterhin besteht. \nAls erstes habe ich die DNS Struktur gecheckt. Danach mit den beiden Tools dcdiag und netdiag mehrfach Diagnosen gestartet und ausgewertet. Laut den Diagnosetools war alles OK.    Nach ein wenig Recherche habe ich das Problem entdeckt: Es war der Switch.     Auf den Switch ist das STP Protokoll aktiv. Dieses braucht üblicherweise 30-60 Sekunden um den Switchport von Listening und Learning Status auf Forwarding zu bringen. Da die PC’s schneller starten als der Switchport aktiv ist, kann der PC seine IP nicht erneuern bzw. anfordern.\nDas Problem kann man umgehen indem man die Client-Switchports auf “PortFast” stellt und somit der Switchport sofort in den Forwarding-Status geht.\nGrüße, dn"
        },
        {
          "id": "post-windows-7-usbdvd-download-tool",
          "title": "Windows 7 USB/DVD Download Tool",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-usbdvd-download-tool/",
          "content": "Microsoft hat nun ein kostenloses Tool zur Verfügung gestellt um einen USB Stick Bootfähig zu machen, die Windows 7 Installationsdateien darauf zu kopieren und damit die Windows 7 Installation durchzuführen.\nWindows 7 USB/DVD Download Tool\nDer USB Stick muss mindestens 4 GB groß sein. Wie ein USB Stick manuell für die Installation präpariert werden kann, hat Thomas in einen vorhergehenden Post erklärt.\nViel Spaß beim installieren!!    Grüße, dn"
        },
        {
          "id": "post-microsoft-techday-dezember-2009",
          "title": "Microsoft TechDay Dezember 2009",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Events",
          "url": "/post/microsoft-techday-dezember-2009/",
          "content": "Die jährlichen Microsoft Techdays stehen wieder vor der Tür. Vorgestellt werden folgende Produkte: Office, Sharepoint und Exchange in der Version 2010.   Steffen Krause und Daniel Melanchton präsentieren alle wesentlichen Neuerungen anhand von vielen Demos.\nTermine:     08.12.2009: Stuttgart    09.12.2009: München    15.12.2009: Düsseldorf    16.12.2009: Berlin\nZur Anmeldung und Agenda über den Link\nGrüße, dn"
        },
        {
          "id": "post-microsoft-hyper-v-server-2008-v1-vs-v2",
          "title": "Microsoft Hyper-V Server 2008 V1 vs. V2",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Hyper-V",
          "url": "/post/microsoft-hyper-v-server-2008-v1-vs-v2/",
          "content": "Der neue Microsoft Hyper-V Server 2008 R2 steht ja nun seit einigen Wochen auf TechNet zum downloaden bereit. Hier erkläre ich nochmal kurz alle Neuerungen.\nIn der folgenden Tabelle werden die Features von Hyper-V V1 und V2 gegenübergestellt.\n \nNeu in V2 ist außerdem:\n   Hochverfügbarkeit und Live-Migration (nettes Feature)    Bis zu 384 virtuelle Maschinen und 512 virtuelle Prozessoren werden unterstützt    Virtuelle Festplatten können ab jetzt im laufenden Betrieb hinzugefügt bzw. entfernt werden. Ein Neustart ist nicht mehr nötig    Für die Netzwerkunterstützung: VMQ, TOE, Jumbo Frames    Möglichkeit von einem Flash-Speicher zu booten \nGrüße, dn"
        },
        {
          "id": "post-netlogon-fehler-5719-auf-server-(nicht-dc)",
          "title": "Netlogon Fehler 5719 auf Server (nicht DC)",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/netlogon-fehler-5719-auf-server-(nicht-dc)/",
          "content": "Wenn der Fehler NETLOGON 5719 direkt nach dem starten des Servers (nicht DC) protokolliert wird, bedeutet das folgendes: Die Netlogon-Prozess hat stattgefunden bevor das Netzwerk bereit war und somit standen beim Anmeldeprozess keine Domänencontroller für die Authentifizierung zur Verfügung.\n\nEs gibt 2 Möglichkeiten das Problem zu beheben:\n1) Update des Netzwerkkartentreibers\nAls allererstes sollte der Netzwerkkartentreiber geupdated werden. In den meisten Fällen erledigt sich das Problem damit. Ich empfehle den Treiber immer von der Support-Webseite des Servers herunterzuladen, nicht vom NIC-Hersteller direkt (Bsp: Server von HP und Netzwerkkarte von Intel). Diese Treiber auf der Support-Webseite des Servers sind getestet und für das System freigegeben.\n2) Den Netlogon Service zwingen auf das Netzwerk zu warten\nWenn der aktuelle Netzwerkkartentreiber nichts bringt, kann man den Netlogon-Prozess so zum warten zwingen:\nIn der Registry muss der Eintrag “TermService” dem Schlüssel “DependOnService” hinzugefügt werden.    HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Netlogon\nNachdem der Server neu gestartet wurde, sollte das Problem behoben sein.\nGrüße, dn"
        },
        {
          "id": "post-windows-7-e28093-update-von-rc-auf-rtm",
          "title": "Windows 7 – Update von RC (7100) auf RTM (7600)",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-e28093-update-von-rc-auf-rtm/",
          "content": "Es ist zwar nicht wirklich empfohlen, gewünscht oder supported aber es geht. \nWindows 7 RTM Installationsdateien auf einen (vorbereiteten) USB Stick kopieren. In der Datei \\Sources\\cversion.ini muss der Wert MinClient auf 7100.0 (die entsprechende Build Nr. von der man updaten will) gesetzt werden. Man sollte für so ein Update einige Zeit einplanen, bei mir dauerte es ca. zwei Stunden. Das gilt übrigens auch für unterstützte Updates. Eine normale Windows 7 Installation ist bekanntlich in 20 Minuten abgeschlossen.\nEin Update von x86 auf x64 oder umgekehrt lässt sich so natürlich auch nicht machen, dafür ist immer eine neuinstallation nötig. In diesem Post erklärt Daniel nochmal genau welche Updates unterstützt werden.\nNochmal: ich empfehle dieses Workaround nicht für produktive Systeme, ich habe mein Notebook so aktualisiert und alles läuft wunderbar, aber es ist wie gesagt kein produktiv genutzter PC.\nGruß    tt"
        },
        {
          "id": "post-windows-7-bootloader-os-hinzufugen",
          "title": "Windows 7 Bootloader, OS hinzufügen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-bootloader-os-hinzufugen/",
          "content": "Der Windows Vista / 7 Bootloader hat sich ja im vergleich zu Windows XP geändert. In den früheren Windows Version konnte man die Datei Boot.ini bearbeiten um den Bootloader zu sagen was er tun soll. Ab der Version Vista nutzt man das Commandline-Tool bcdedit.exe.     Auf meinen Computer habe ich 2 Windows 7 Installationen. Auf C:\\befindet sich die erste, die zweite auf der Partition D:\\     Da ich das zweite Windows 7 durch den Restore eines Images aufgespielt habe, erscheint dies natürlich nicht automatisch in der Betriebssystemauswahl. Um das zweite Betriebssystem dem Bootloader hinzuzufügen, müssen folgende Schritte durchgeführt werden:\n1) Commandline mit Administratorrechte öffnen\n2) Einen neuen Eintrag dem Bootloader hinzufügen\nbcdedit /create /d “Windows 7 zweite Installation” /application osloader            Nachdem dieser Befehl ausgeführt wurde, bekommen wir eine ID       Bsp: {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395}\n3) Nun müssen wir den Bootloader noch sagen wo sich das zweite Betriebssystem befindet (D:)\nbcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} device partition=C:      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} osdevice partition=D:\n4) Nun fügen wir den Pfad für den Bootloader und dem System Root Verzeichnis hinzu\nbcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} path \\Windows\\system32\\winload.exe      \nbcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} systemroot \\Windows\n5) Als letztes stellen wir noch die Reihenfolge der Auflistung der Betriebssysteme fest\nbcdedit /displayorder {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} /addlast\nNoch zur Info: Den Namen, der bei der Betriebssystemauswahl angezeigt wird, könnt ihr mit diesen Command ändern:\nbcdedit /set {current} description &quot;Windows 7 erste Installation&quot;\nGrüße, dn"
        },
        {
          "id": "post-servergespeicherte-ts-profile-fehler-1543",
          "title": "Servergespeicherte TS-Profile, Fehler 1543",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Client, Server-2008, Server-2003",
          "url": "/post/servergespeicherte-ts-profile-fehler-1543/",
          "content": "Auf meinem Terminalserver-Cluster 2008 habe ich mehrere EventLog Warnungen mit der ID 1543 (User Profile Service) bemerkt. Die Einträge deuten darauf hin, dass das UserProfil nicht synchronisiert werden konnte. Die Einträge konnte man auf allen Servern im TS Cluster finden.\n \nEtwas zur Struktur: Als Server setze ich Windows Server 2008 ein, die Server sind auf Hyper-V Servern virtualisiert. Als Speicherort für die Profile benutze ich das DSF Feature von Server 2003 R2.\nZuerst dache ich mir, dass es da Probleme mit dem Netzwerk gibt. Eines wollte ich aber noch versuchen bevor ich mit der Analyse des Netzwerkes starte: Windows-Defender.\nNachdem ich den Windows-Defender auf allen Terminalservern deaktiviert hatte, konnte das Problem nicht mehr reproduziert werden. Anscheinend blockiert der Windows-Defender bei der Anmeldungen bestimmte Vorgänge, die der Server braucht um das User-Profil herunterzuladen. \nGrüße, dn"
        },
        {
          "id": "post-netzwerkprobleme-lassen-dynamics-absturzen",
          "title": "Netzwerkprobleme lassen Dynamics abstürzen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/netzwerkprobleme-lassen-dynamics-absturzen/",
          "content": "Wie ich in einem meiner letzten Posts versprochen hatte, hier der Post über die Dynamics Netzwerkprobleme.\nMein Microsoft Dynamics Server arbeitete immer sehr zuverlässig, das EventLog war frei von den unbeliebten “roten Kreuzen”. Bis an den Tag x, an dem der Dynamics Service seinen Dienst verweigerte und im laufenden Betrieb stoppte. Im EventLog wurden folgende Fehlermeldungen protokolliert:\n \nDer Fehler “Error 1450 in module 1..\\server.cpp(498) weißt auf zu wenig Server-Ressourcen hin. Dieser Fehler konnte durch die Korrektur nicht optimaler Einstellungen an der Auslagerungsdatei behoben werden.\nDer Fehler “Error 3 in module 244..\\server.cpp(351) weißt auf einen TCP-Fehler hin. Durch die Installation der neuesten Soft- und Firmware der Netzwerkkarte konnte ich das Problem beheben.\nNun ist das EventLog wieder sauber und der Server hat bisher seinen Betrieb nicht wieder unterbrochen.\nGrüße, dn"
        },
        {
          "id": "post-upgrade-auf-windows-7",
          "title": "Upgrade auf Windows 7",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/upgrade-auf-windows-7/",
          "content": "Die beiden Betriebssysteme Windows XP und Vista können durch eine Upgrade-Lizenz auf Windows 7 geupdated werden. Für alle anderen Betriebssysteme braucht es eine Vollversion.\nBeim Upgrade unterscheiden wir 2 Szenarien:    Custom Install: Das Betriebssystem muss komplett neu installiert werden.    In-Place Upgrade: Das bestehende Betriebssystem kann auf Windows 7 geupdatet werden und übernimmt somit alle vorhandenden Einstellungen bzw. Programme.\nAnhand dieser Matrix kann man feststellen in welchen Fällen ein In-Place Upgrade möglich ist.\n&#160; Quelle der Grafik: http://blogs.technet.com/dmelanchthon/\nGrüße, dn"
        },
        {
          "id": "post-sharepoint-logfiles-verkleinern",
          "title": "Sharepoint LogFiles verkleinern",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Sharepoint",
          "url": "/post/sharepoint-logfiles-verkleinern/",
          "content": "In letzter Zeit ist mir aufgefallen, dass der freie Speicherplatz auf meinem Sharepoint-Server immer kleiner wird. Nachdem ich mich ein bisschen auf der Partition umgesehen hatte fielen mir die großen LOG Files der Sharepoint Datenbank auf.    Wenn ihr wie ich Sharepoint in den Standardeinstellungen inkl. der Windows Internal Database installiert habt, so legt Sharepoint die Files unter C:\\WINDOWS\\SYSMSI\\SSEE\\MSSQL.2005\\MSSQL\\Data ab.         In meinem Fall hat das Content-Log 8 GB und das Config-Log 5 GB verbraten.         Um die LogFiles nun zu verkleinern muss zunächst SQL Server Management Express installiert werden.\nDanach muss die Datenbank mit den folgenden Parameter geöffnet werden: \\\\.\\pipe\\MSSQL$MICROSOFT##SSEE\\sql\\query\n \nNachdem die Datenbank geöffnet wurde wählt man die Datenbank aus, deren LogFiles verkleinert werden sollen. Nach einem Rechtsklick auf die Datenbank wählt man Tasks / Verkleinern / Dateien\nNun erscheint das Optionsfenster. Hier muss als Dateityp Protokoll ausgewählt werden. Als Information erhält man hier wie groß das aktuelle LogFile und zu wie viel es belegt ist. Im unteren Bereich kann der Speicherplatz neu organisiert werden. (In meinem Fall 2 GB)\n \nNachdem die Eingaben bestätigt werden, schrumpft das LogFile auf die angegebene Größe zusammen.    Dieser Schritt kann für alle Datenbanken vorgenommen werden, dessen LogFile zu groß ist.\nGrüße, dn"
        },
        {
          "id": "post-exchange-2010-e28093-dynamic-signature",
          "title": "Exchange 2010 – Dynamic Signature",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/exchange-2010-e28093-dynamic-signature/",
          "content": "Ein leidiges Thema mit den bisherigen Exchange und Outlook Versionen war die zentrale Verwaltung von Signaturen. Die meisten Administratoren verwendeten Skripts oder dritthersteller Tools um das Problem einigerma&szlig;en in den Griff zu bekommen.\nMit Exchange 2010 stellt Microsoft (endlich) eine M&ouml;glichkeit vor um die Signaturen zentral zu verwalten und dynamisch zu erstellen. Verwendet wird dazu der seit Exchange 2007 bekannte Disclaimer, dieser wurde erweitert und kennt jetzt HTML Tags und Attribute aus dem Active Directory.\nKonfiguriert wird der Disclaimer in der Hub Transport Rolle auf Organisationsebene. Man erstellt eine neue Transport Rule indem man einfach mit rechts auf den Knoten Hub Transport klickt und &ldquo;New Transport Rule&rdquo; ausw&auml;hlt.\n\nNachdem man Namen und Beschreibung vergeben hat, kann per Filter festgelegt werden f&uuml;r welche Mails diese Regel gelten soll. Mehr Details zu den Filterm&ouml;glichkeiten: Exchange 2010 Transport Rule Predicates.&nbsp;\n\nAls Action w&auml;hlt man &ldquo;Append disclaimer text and fallback to action if unable to apply&rdquo;. Dort kann ein beliebiger Text eingegeben werden den man mit HTML Tags formatieren und mit Platzhaltern wie %%DisplayName%% personalisieren kann. Neben dem Text kann man auch die Fallback Action festlegen, d.h. was Exchange mit der Nachricht machen soll wenn der Disclaimer nicht angewendet werden kann. Es gibt drei M&ouml;glichkeiten:\n\nwrap: die originale Nachricht wird in einen Anhang gepackt, und der Disclaimer wird in die neue Nachricht eingef&uuml;gt.\nreject: die Nachricht wird nicht &uuml;bermittelt, der Sender erh&auml;lt ein NDR in dem steht warum die Nachricht nicht &uuml;bermittelt werden konnte.\nignore: die Nachricht wird unver&auml;ndert &uuml;bermittelt, es wird kein Disclaimer angeh&auml;ngt.\n\n\nEinige Details noch im Technet: Understanding Disclaimers\nZum Schluss kann man noch Au&szlig;nahmen definieren, f&uuml;r welche die Regel nicht zutreffen soll:\n\nJetzt fehlt noch der klick auf New und die Regel wird erstellt. Es wird ab jetzt also jedem Mail das den Konditionen entspricht der Disclaimer Text angef&uuml;gt, egal ob es von OWA oder Outlook kommt.\nEine endg&uuml;ltige L&ouml;sung stellt diese Funktion nicht dar, denn ein Nachteil des Disclaimers ist dass er am Ende der Nachricht eingef&uuml;gt wird. Antwortet man also auf ein Email so steht die Signatur (Disclaimer) ganz unten, unter dem zitiertem Mail. Alles in allem ist das meiner Meinung nach ein Schritt in die richtige Richtung, allerdings fehlt noch einiges bis zum Ziel."
        },
        {
          "id": "post-fehler-bei-hp-netzwerkkarten-update",
          "title": "Fehler bei HP Netzwerkkarten Update",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/fehler-bei-hp-netzwerkkarten-update/",
          "content": "Zu Abwechslung mal ein Problem aus der HP Welt:\nFür heute habe ich das Firmware / Treiber Update meiner HP ML 350 G5 Server geplant. Zuerst habe ich mir die neueste Firmware-CD von HP gezogen und diese dann installieren lassen. Alles verlief ohne Probleme.    Danach wollte ich die Treiber updaten und habe bemerkt, dass jede Komponente geupdated wurde, nur der Treiber der Netzwerkkarte (v. 5.0.16.0) nicht.     Das war sehr ärgerlich, denn dieser Treiber war der Wichtigste, denn es gab Netzwerkprobleme mit Microsoft Dynamics. \nFolgender Fehler wurde ausgegeben: “HP Virtual Bus Device installation requires a newer version. Version 4.6.16.0 is required.”\nUm den Treiber dennoch installieren zu können, muss zuerst auf die Version 4.6.16.0 geupdated werden, dann kann man erst die neueste Version installieren: Link zum Treiber v4.6.16.0\n Grüße, dn\nPS: Wenn die Netzwerkprobleme mit Dynamics behoben sind, werde ich dazu noch einen Post veröffentlichen. (kleiner Ausflug in die ERP-Software :) )"
        },
        {
          "id": "post-e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung",
          "title": "“DATA ENCRYPTION” Fehler bei RDP Verbindung",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2003, Server",
          "url": "/post/e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung/",
          "content": "Kürzlich hatte ich ein seltsames Problem mit der RDP Verbindung auf einem meiner Server die im Ausland stehen und nur über RDP erreichbar sind.   Jedes Mal wenn ich eine RDP Verbindung starten wollte, erschien die Fehlermeldung, dass ein Netzwerkfehler vorliegt.\nIm Eventlog wurde ein Fehler protokolliert, dass die RDP-Protokollkomponente “DATA ENCRYPTION” ein Problem verursachte.\n \nGlücklicherweise funktionierte der Zugriff durch AdminMagic noch, sodass ich mit der Fehlerbehebung beginnen konnte.\nUm die RDP Verbindung wieder flott zu bekommen muss folgender Registry-Eintrag gelöscht werden:\nHKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\TermService\\     Parameters\\ Certificate\nNach einem Neustart des Servers konnte ich mich wieder via RDP auf dem Server verbinden.\nGrüße, dn"
        },
        {
          "id": "post-windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden",
          "title": "Windows Server / Hyper-V Server 2008; storflt kann nicht geladen werden",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden/",
          "content": "Nachdem ich alle meine Hyper-V Server 2008&#160; auf SP2 aktualisiert habe, erhalte ich beim Start der Maschinen einen Fehler im Ereignisprotokoll, dass storflt nicht geladen werden konnte.\n \nDieser Fehler ergibt sich aus upgedateten Treibern für den Hypervisor durch SP2 und wird nur auf physischen Maschinen protokolliert. \nDer Eventlog-Eintrag kann einfach ignoriert werden.\nMit dem Befehl sc delete storflt wird der Dienst storflt gelöscht und der Fehler nicht mehr protokolliert. Dies darf jedoch nur für den Windows Server 2008 gemacht werden, nicht für den Hyper-V Server, da dieser den Service für die virtuellen Maschinen braucht.\nSollte der Service auf einem Hyper-V Server gelöscht werden, bleibt dieser beim Starten mit einem Bluescreen stehen. Durch die “Letzte bekannte Konfiguration” kann der Server aber wieder gestartet werden.\nGrüße, dn"
        },
        {
          "id": "post-active-directory-verwaltungscenter",
          "title": "Active-Directory-Verwaltungscenter",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server",
          "url": "/post/active-directory-verwaltungscenter/",
          "content": "Mit dem Windows Server 2008 R2 ist ein neues Verwaltungs-Feature hinzugekommen: “Active-Directory-Verwaltungscenter”. Das neue Verwaltungscenter basiert auf der PowerShell v2 was bedeutet, dass jede Aktion im Hintergrund einen PowerShell Befehl startet.     Durch dieses neue Feature soll dem Administrator die tägliche AD-Objektverwaltung vereinfacht werden. \nFür folgende Aufgaben kann die neue Konsole verwendet werden (Auszug aus technet.microsoft.com)\n   Erstellen neuer Benutzerkonten oder Verwalten vorhandener Benutzerkonten     Erstellen neuer Gruppen oder Verwalten vorhandener Gruppen     Erstellen neuer Computerkonten oder Verwalten vorhandener Computerkonten     Erstellen neuer Organisationseinheiten und Container oder Verwalten vorhandener Organisationseinheiten     Herstellen von Verbindungen mit einer oder mit mehreren Domänen bzw. Domänencontrollern in derselben Active Directory-Verwaltungscenterinstanz und Anzeigen oder Verwalten der Verzeichnisinformationen für diese Domänen oder Domänencontroller     Filtern von Active Directory-Daten mithilfe der abfragegenerierenden Suche  \n\nDie Oberfläche\n \nDie Oberfläche wirkt strukturiert und Übersichtlich. \nDie Suche\n \nHäufig verwendete Kriterien lassen sich schnell der Suche hinzufügen.\n \nNeuen Benutzer anlegen\n \nEinfache Navigation durch die Container\n&#160;\nAuf mich wirkt die Oberfläche sehr übersichtlich und durchdacht. Alle Aufgaben lassen sich jedoch nicht abbilden, sodass man auf die Konsole “Active-Directory-Benutzer und Computer” nicht völlig verzichten kann.    Im täglichen AD-gebrauch spricht einer Verwendung der neuen Konsole jedoch nichts dagegen.\nGrüße, dn"
        },
        {
          "id": "post-language-pack-fur-windows-7",
          "title": "Language Pack für Windows 7",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/language-pack-fur-windows-7/",
          "content": "Für Windows 7 in der Enterprise und Ultimate Edition sind die Language Packs nun verfügbar.\nIm Windows Update Fenster lassen sich die Pakete herunterladen und installieren.\n \nNachdem das Paket heruntergeladen und installiert wurde, kann es in der Systemsteuerung unter “Region und Sprache” bei “Anzeigesprache” aktiviert werden.\n\nGrüße, dn"
        },
        {
          "id": "post-hyper-v-server-2008-r2-cluster",
          "title": "Hyper-V Server 2008 R2 Cluster",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Hyper-V, Server, Server-2008-R2",
          "url": "/post/hyper-v-server-2008-r2-cluster/",
          "content": "Da der Hyper-V Server 2008 R2 und der Windows Server 2008 R2 nun RTM sind, habe ich mir den Hyper-V Cluster näher angeschaut.        Für die Simulation habe ich 3 physische Computer verwendet:\n2 Hyper-V Server 2008 R2   1 Windows Server 2008 R2 (inkl. iSCSI Target)\nDas zentrale Storage wird über iSCSI angebunden. Dafür verwenden wir den Windows Server 2008 R2.\nTopologie\n&#160; \nUm den Cluster zu erstellen müssen 8 Schritte durchgeführt werden:\nSchritt 1 Hyper-V Server und Server 2008 R2 auf den 3 Computern installieren\nDie beiden Hyper-V Server werden mit der Standard-Installation installiert. Der Windows Server 2008 R2 wird zusätzlich zum DC heraufgestuft um die Domäne hyper.local bereit zu stellen.\nSchritt 2 Firewall deaktivieren\nFür den Test habe ich auf den 3 Servern die Firewall deaktiviert, um nicht die entsprechenden Ports öffnen zu müssen.\nSchritt 3 Hyper-V Server in Domäne aufnehmen\nAls nächstes werden die Hyper-V Server in die Domäne aufgenommen.\nSchritt 4 Verwaltungstools auf dem Windows Server installieren\nUm den Cluster später steuern zu können müssen wir 2 Konsolen installieren: Clusterverwaltung und die Hyper-V Tools. Die Konsolen können unter den Features aktiviert werden.\n \nSchritt 5 iSCSI Target installieren und konfigurieren\nAls iSCSI Target Software habe ich das Tool von StarWind verwendet. Nachdem das Programm installiert wurde, kann man sich unter den Benutzernamen “test”, Password “test” anmelden und das Target entsprechen konfigurieren.\n\nAm iSCSI Target erstellen wir zunächst 2 virtuelle Volumes. 1 Volume wird als Quorumdatenträger für den Cluster verwendet, das andere als Storage für die VHD’s. Wichtig ist dabei, dass die Option “Allow multiple concurrent iSCSI connections (clustering)” verwendet wird, somit können beide Hyper-V Knoten gleichzeitig auf die Volumes zugreifen.\n\nSchritt 6 Hyper-V Server mit den iSCSI Volumes verbinden\nJetzt muss noch die Verbindung zwischen den Hyper-V Server und dem iSCSI Target hergestellt werden. In der Version R2 des Hyper-V Servers wurde eine grafische Oberfläche für den iSCSI-Initiator hinzugefügt. Der Initiator wird mit den Command iscsicpl gestartet. Nachdem wir zugestimmt haben den iSCSI Dienst zu starten, erhalten wir die Oberfläche wo wir die IP Adresse des iSCSI Targets eintragen und uns zunächst nur mit dem Quorum Volume verbinden.\n\nJetzt muss das Volume noch entsprechend Formatiert werden.\nSchritt 7 Cluster einrichten\nNun können wir den Cluster erstellen. Wir verbinden uns auf die Hyper-V Server und aktivieren mit Option 11 die Failoverclusterfeatures.\n\nNachdem die Features auf beiden Servern aktiviert sind, öffnen wir den Failovercluster-Manager auf dem Windows Server und starten die Clusterkonfiguration.\n\nNachdem wir beide Hyper-V Server für den Cluster angegeben haben, startet die Konfigurationsüberprüfung. Sofern bis hierhin alle richtig Konfiguriert wurde, sollte der Check keine Fehler aufzeigen.\n&#160; \nNachdem der Cluster vollständig erstellt wurde, werden beide Hyper-V Server im Manager angezeigt.\nDa wir den Quorumdatenträger bereits mit beiden Cluster-Knoten verbunden haben, wurde dieser erkannt und schon als Quorumdatenträger konfiguriert.\n\nJetzt verbinden wir das Storage-Volume mit den beiden Cluster Knoten um auf die VHD’s zuzugreifen. Bevor das Volume benutzt werden kann, muss es noch formatiert werden.    Jetzt aktivieren wir im Failovercluster-Manager die “Cluster Shared Volumes” und erlauben somit gleichzeitigen Zugriff auf die VHD’s.\n \nUm nun das Storage-Volume einzubinden, müssen wir es zunächst dem “Speicher” und dann den “Freigegeben Clustervolumes” (Cluster Shared&#160; Volumes) hinzufügen.\n\nSobald Cluster Shared Volumes verwendet werden, kann man auf diese unter C:\\ClusterStorage\\ zugreifen. Für jedes Volume wird ein eigener “Ordner” erstellt.\n\nSchritt 7 Virtuelle Maschine erstellen\nAls nächstes erstellen wir eine virtuelle Maschine (z.B. Windows XP) und ein virtuelles Netzwerk über die zuvor installierte Hyper-V Konsole auf einem der Hyper-V Server. Die VHD und entsprechende Konfigurationsdatei wird dabei auf dem Storage-Volume erstellt.\n \nWichtig: Die virtuelle Maschine muss mit dem Netzwerkadapter verbunden werden bevor sie hochverfügbar gemacht wird, sonst kann die Maschine nicht auf den anderen Knoten verschoben werden.\nSchritt 8 Virtuelle Maschine hochverfügbar machen\nUm die virtuelle Maschine hochverfügbar zu machen, fügen wir einen neuen Dienst hinzu. Dabei muss geachtet werden, dass sich die Maschine im Status beendet oder gespeichert befindet. Ich empfehle die Maschine komplett herunterzufahren um Probleme zu vermeiden. \n\nWir erhalten danach eine Liste mit den virtuellen Maschinen. \n\nNachdem wir die Testmaschine ausgewählt haben, startet die Konfiguration um den Host hochverfügbar zu machen.\nDie Konfiguration ist soweit abgeschlossen.\nTest 1 Quick- und Live-Migration\nQuick- und Live-Migration sind beides Verfahren um virtuelle Maschine auf einen anderen Knoten zu verschieben.&#160; Mehr Infos (Whitepapers) zu Live- und Quick-Migration\nLive Migration    In meinen Test habe ich für die Live-Migration lediglich 1 Ping verloren.\n&#160;\n\nQuick-Migration     Für den Umzug auf den 2. Knoten durch Quick-Migration gingen 9 Pings an die virtuelle Maschine verloren.\n&#160; \nTest 2 Ausfall von einem Hyper-V Server simulieren\nAls 2. Test habe ich den Stromstecker des Hyper-V Servers gezogen, der aktuell die virtuelle Maschine hostet. Der Failovercluster hat nach wenigen Sekunden die virtuelle Maschine auf dem 2. Konten neu gestartet.\n   Grüße,dn"
        },
        {
          "id": "post-applocker",
          "title": "AppLocker",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server",
          "url": "/post/applocker/",
          "content": "In einem meiner letzten Beiträge habe ich kurz über ein paar Neuerungen von Windows 7 berichtet. Mittlerweile habe ich mir das Feature “AppLocker” näher angeschaut:\nMit AppLocker kann man den Clientcomputer noch besser schützen, indem man nun sehr viel genauer vorgeben kann welche Anwendungen ein Benutzer ausführen bzw. installieren darf. AppLocker kann über ein Domänen- oder über die lokale-GPO konfiguriert werden.\nWie man AppLocker verwendet zeige ich Anhand von folgendem Beispiel: Benutzern ist es nur erlaubt Applikationen auszuführen, die sich unter %Programfiles% und %Windir% befinden. Benutzer die der Gruppe “Not Restr Access” angehören ist es außerdem erlaubt das Testprogramm “Excel Viewer 2003” aus dem Verzeichnis “C:\\Program Files 2” zu starten. \nAls erstes öffnet man das GPO und wechselt zur Option “AppLocker”\n&#160;\nFür die Option Executable Rules lassen wir die Standardregeln generieren (“Create default Rules”). Nachdem diese konfiguriert sind, findet man 3 Regeln vor:        1. Admins dürfen alle Programme aufrufen    2. User dürfen Programme aus %Windir% starten    3. User dürfen Programme aus “%Programfiles% starten\n \nJetzt müssen wir eine neue Regel erstellen, die der Benutzergruppe “Not Restr Access” erlaubt unsere Testapplikation zu starten. Über “Create New Rule” wird der entsprechende Wizard gestartet.\n \nWir wählen die Option “Allow” und beziehen die Regel auf die Gruppe “Not Restr Access”.\n \nJetzt haben wir 3 Möglichkeiten. Über die Option Publisher kann ein einzelnes signiertes Programm freigegeben oder gesperrt werden, über die Option Path ein ganzer Pfad und über die Option File Hash eine nicht-signierte Applikation. Im unseren Beispiel wählen wir die Option Publisher, da der Excel Viewer von Microsoft zertifiziert ist. Nachdem die Applikation ausgewählt wurde, kann über einen Schieberegler die Genauigkeit der Prüfung von AppLocker eingestellt werden. (Bsp. AppLocker soll nur den Dateinamen, nicht die Dateiversion prüfen)\n \nWenn nötig können im nächsten Schritt noch Ausnahmen definiert werden. Somit haben wir unsere Regel definiert.\nWichtig: AppLocker ist auf einen Dienst angewiesen der aus Sicherheitsgründen nicht automatisch startet. Damit die Einstellungen greifen, muss der Dienst “Application Identity” gestartet werden. Ich empfehle den Dienst solange im Startmodus “Manuell” zu belassen, bis alle Einstellungen passen.\n \nWenn wir jetzt den Test machen, können Benutzer aus der Gruppe “Not Restr Access” problemlos den Excel Viewer starten. Benutzer, die nicht dieser Gruppe angehören, erhalten eine Fehlermeldung.\n \nGrüße, dn"
        },
        {
          "id": "post-windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn",
          "title": "Windows 7, Server 2008 R2 und Hyper-V Server 2008 R2 in Deutsch auf TechNet/MSDN",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server, Server-2008-R2, Hyper-V",
          "url": "/post/windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn/",
          "content": "Für TechNet bzw. MSDN Abonnenten stehen nun auch die deutschen ISO’s zu Windows 7 bereit. Zeitgleich wurde der Server 2008 R2 und der Hyper-V Server 2008 R2 zum downloaden bereit gestellt.\nTechNet    MSDN\nGrüße, dn"
        },
        {
          "id": "post-windows-virtual-pc-e28093-undo-und-differencing-disks",
          "title": "Windows Virtual PC – UnDo und Differencing Disks",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-virtual-pc-e28093-undo-und-differencing-disks/",
          "content": "In meinem letzen Beitrag über den Windows Virtual PC habe ich die Undo und differenzierenden Festplatten erwähnt, hier die versprochenen Details.\nUnDo Disks – Snapshots für Virtual PC!?\nBei den UnDo Disks handelt es sich um ein Feature das ich in bisherigen Virtual PC Versionen immer vermisste: Man kann den Status einer VM vor einer Änderung sichern und kann auf den Punkt der Sicherung zurückspringen wenn die Änderung nicht so funktioniert wie man sich das vorgestellt hat.\nUnDo Disks werden in den Einstellungen der VM aktiviert. Die Virtuelle Maschine muss ausgeschaltet (heruntergefahren) sein damit die Option zur Verfügung steht.\n \nBeim nächsten Start der VM wird eine .vud Datei erstellt, in dieser werden (wie bei einem Snapshot in der Enterprise Umgebung) ab jetzt&#160; alle Änderungen gespeichert. Die VHD bleibt unverändert.\n \nIn der Zwischenzeit habe ich um eine Änderung zu simulieren einfach mal ein Programm installiert. Man sieht auch gleich dass die .vud Datei größer wird.\n \nUm die Änderungen in die VHD zu übernehmen bzw. diese zu verwerfen muss man die VM wieder schließen (herunterfahren/Ruhezustand) und in den Einstellungen den entsprechenden Punkt auswählen. Ich habe mich entschieden die Änderungen zu verwerfen also wird meine .vud Datei gelöscht. Nach dieser Aktion wird wieder von der VHD gestartet und alles ist so wie es vorher war.\n     Wenn man Änderungen übernimmt werden diese in die VHD geschrieben.\nLässt man die Undo Disk aktiv und startet die Virtuelle Maschine wieder, wird erneut eine .vud Datei erstellt in der alle Änderungen bis zum Übernehmen oder Verwerfen separat gespeichert werden. Um die Undo Disk zu deaktivieren muss die virtuelle Maschine heruntergefahren werden, im Ruhezustand geht das nicht.\nInsgesamt also ein super Feature, spart einem sicher ‘ne Menge Arbeit.\nDifferencing Disks\nIm zweiten Beispiel installiere ich mehrere neue VMs in differenzierenden Disks auf Basis einer bereits bestehenden Maschine.\nWichtig: Differenzierende Virtuelle Maschinen basieren auf einer bereits installierten VM, wenn ich also für eine Testumgebung mehrere VMs brauche kann ich eine bestehende beliebig oft duplizieren und so Zeit sparen. Ich habe die Quell-VM mit sysprep vorbereitet um Probleme mit gleichen SID und Computernamen zu verhindern. Wichtig ist außerdem dass man die Quell-VHD herunterfährt und auf Schreibgeschützt setzt, denn wenn diese geändert wird sind alle erstellten Differenzierenden Disks ungültig.\nUpdate: Wenn man die VMs so dupliziert erhalten alle “Child” VMs die gleiche MAC Adresse. Die einzige Lösung die ich im Moment gefunden habe ist in der .vmc Datei die MAC Adresse zu löschen, dann wird einen neue generiert. \n\nAlso kann man sagen um die Quell VM richtig vorzubereiten muss man 3 Punkte beachten:\n   Betriebssystem vorbereiten (sysprep)     Quell VM herunterfahren und VHD als Read-Only markieren     MAC Adresse aus der Konfigurationsdatei der Quell VM löschen  \n   Man erstellt also eine neue VM über den Button “Create virtual machine” und gibt ihr einen Namen. Bei Add Disk wählt man “Create a Virtual Hard Disk using advanced options” und dann “Differencing Hard Disk”. Der neuen HD kann man einen Namen geben und dann muss man die Quell-VHD (parent) angeben.\n \nWenige Sekunden später hat man eine neue VM bei der man nur noch die Windows Einstellungen anpassen muss. Der Vorteil ist dass nicht die ganze Quell-VM kopiert wird, sondern nur der Teil ab dem man die Differenzierende HD erstellt. So spart man neben viel Zeit auch noch einiges an Speicherplatz.\nviele Grüße!    tt"
        },
        {
          "id": "post-windows-virtual-pc",
          "title": "Windows Virtual PC",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-virtual-pc/",
          "content": "Mit Windows 7 wurde auch der Windows XP Mode vorgestellt. Dieser basiert auf der neuen Virtualisierungstechnologie Windows Virtual PC.\nVoraussetzung für die Verwendung des Windows VPC ist dass die CPU Virtualisierungstechnologien unterstützt. \nMit diesen Tools kann man überprüfen ob Virtualisierung unterstützt wird: Intel, AMD\nDie Virtualisierungstechnologien müssen im BIOS noch aktiviert werden, also am besten im Handbuch des Mainboard Herstellers nachschlagen.    Tipp: Bei HP Computern ist die Einstellung unter “Sicherheit” versteckt, nicht unbedingt logisch aber bitte.\nAuf die Installation des XP-Mode möchte ich nicht weiter eingehen, den kann man sich selbst herunterladen und mit wenigen Klicks installieren.\nIch habe die Virtuellen Maschinen selbst installiert und die Integration Features und Auto Publish aktiviert, so kann ich in Windows 7 Programme aus meinen virtuellen Vista und XP Maschinen verwenden.\n \nSo präsentiert sich der neue Virtual PC, integriert in ein normales Explorer Fenster hat man die Möglichkeit Virtuelle Maschinen und Festplatten zu erstellen, zu bearbeiten oder zu löschen. Durch einen rechtsklick auf die VM kommt man zu den bekannten Einstellungen.\n \nEine neue virtuelle Maschine wird einfach durch klicken auf “Create virtual machine” erstellt, in den folgenden Dialogen wird der Speicherort für VHD und Konfigurationsdateien festgelegt.\n \nIm nächsten Dialog kann der Arbeitsspeicher festgelegt werden und Networking für die VM aktiviert oder deaktiviert werden.\n \nAbschließend entscheidet man sich für einen VHD Typ (Fix, Dynamisch, Differenzierend) seiner Wahl und klickt auf Create. Ein genauerer Blick lohnt sich auf die Undo Disk Option, bei dieser werden die Änderungen die man in der VM macht in einem separatem File gespeichert. So kann man fehlgeschlagenen Änderungen immer wieder verwerfen. Dazu (und zum Thema Differenzierende Festplatte) gibts einen eigenen Artikel.\n&#160;\nUnd schon haben wir eine VM erstellt. In den Einstellungen (rechtsklick auf die VM) kann man noch genauere Einstellungen definieren, für mich reicht es aber vorerst das CD Image für die Installation auszuwählen.\n \nWenn man die VM startet wird von “CD” gestartet und die Windowsinstallation beginnt. Hat man das Betriebssystem installiert, sollte man die Integration Features aktivieren (Klick auf Tools, Enable Integration Features). Mit diesen Features kann man Sound, Zwischenablage, Drucker, Smart Cards und die Laufwerke des Lokalen Computers in der VM verwenden.\nMöchte man außerdem die Programme der VM auf dem physikalischen Computer verwenden muss man noch ein Update Installieren und “Auto publish” in den Einstellungen der VM aktivieren.\nUpdate for Windows XP SP3 to enable RemoteApp     Update for Windows Vista SP1 or above to enable RemoteApp\n \nIm Startmenü von Windows 7 werden nun die Programme angezeigt die in den Virtuellen Maschinen installiert sind.&#160; Wichtig: Es muss eine Verknüpfung mit dem Programm und All Users/Startmenü erstellt werden, nur dann werden die Programme korrekt angezeigt. Um ein Virtuelles Programm zu starten muss die Virtuelle Maschine geschlossen sein. Wenn sie sich im Ruhezustand befinden wird sie im Hintergrund automatisch gestartet.\nviele Grüße!   tt"
        },
        {
          "id": "post-bitlocker-to-go",
          "title": "BitLocker To Go",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/bitlocker-to-go/",
          "content": "Mit BitLocker To Go lassen sich lokale / externe Datenträge sowie USB Sticks einfach verschlüsseln. Eine neue Funktion ist zudem, dass die Partition bzw. das Laufwerk nicht nur verschlüsselt, sondern auch mit Passwort geschützt wird. Die Verschlüsselungsstärke kann über eine GPO von 128 auf 256 Bit erhöht werden.\nUm den mit BitLocker verschlüsselten Datenträger auf Windows Vista bzw. XP verwenden zu können muss der Datenträger zwingend mit FAT formatiert sein. In diesem Legacy-Modus kann mit Vista und XP auf dem Datenträger nur gelesen, nicht geschrieben werden.\nAnleitung um BitLocker To Go zu aktivieren\n1) Datenträger mit FAT formatieren   2) BitLocker für den Datenträger aktivieren\n \n3) Art des Schutzes wählen (Passwort oder Smart Card)\n \n4) Nun muss gewählt werden, in welcher Form der Wiederherstellungsschlüssel&#160; gespeichert wird. Der Wiederherstellungsschlüssel dient dazu den Datenträger zu entschlüsseln, sollte man das Passwort vergessen haben. Man hat hier 2 Möglichkeiten: Den Key speichern oder drucken.\n5) Nun kann das Laufwerk verschlüsselt werden\n \nWindows 7    Steckt man den Datenträger nun in den Windows 7 Computer, so erscheint folgende Passwortabfrage bevor auf dem Datenträger lesen und schreiben werden kann.\n \nWindows Vista bzw. XP     Steckt man den Datenträger in einem Vista oder XP Rechner startet das “BitLocker To Go-LeseTool”. Nach Eingabe des Passwortes kann auf dem Datenträger gelesen werden.\n&#160;\nGrüße, dn"
        },
        {
          "id": "post-windows-7-sicherheitsproblem-in-uac",
          "title": "Windows 7 - Sicherheitsproblem in UAC",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-sicherheitsproblem-in-uac/",
          "content": "Auf diversen Blogs ist zu lesen dass es ein Problem mit der Benutzerkontensteuerung (UAC, User Account Control) in Windows 7 gibt. Das habe ich mir gestern kurz angesehen und hier ist das Ergebnis. (getestet mit Windows 7 RC, 7100)\nEs war möglich mit dem Tool von Leo Davidson ein beliebiges Programm mit administrativen Rechten zu starten ohne eine UAC abfrage hervorzurufen. Aber ich musste Mitglied einer Gruppe mit administrativen Rechten sein (z.B. Administratoren), als normaler User funktionierte es nicht. Wenn man also mit in der UAC nur noch “Ja ich will&quot; klicken müsste, dann kann man sie mit dem Code Injection Issue umgehen, wird ein Passwort abgefragt funktioniert das Ganze anscheinend nicht.\nMeiner Meinung nach handelt es sich hier also um ein Problem, jedoch ist es in meinen Augen nicht so dramatisch. Im Enterprise Umfeld sollte eh kein User Mitglied in administrativen Gruppen sein und zu Hause wird man wohl kaum (gewollt) seinen eigenen PC abschießen. Trotzdem sollte sich Microsoft das Problem zu Herzen nehmen, denn der Entwickler hat es genau Dokumentiert und laut eigenen Angaben MS schon seit längerem informiert.\nLinks zu Artikeln Rund um dieses Thema:\nLong Zheng 1, 2, Video    Leo Davidson\nviele Grüße   tt"
        },
        {
          "id": "post-windows-7-neuerungen-auf-den-ersten-blick",
          "title": "Windows 7 Neuerungen auf den ersten Blick",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-neuerungen-auf-den-ersten-blick/",
          "content": "Benutzeroberfl&auml;che Was einem sofort ins Auge sticht ist die v&ouml;llig &uuml;berarbeitete Oberfl&auml;che. Ge&ouml;ffnete Programme scheinen als Icons in der Taskleiste auf und genehmigen Einblicke auf die ge&ouml;ffneten Fenster.\n\nWLAN Auf der rechten Seite der Taskleiste findet sich eine &Uuml;bersicht der verf&uuml;gbaren Drahtlosnetzwerke. Die Verbindungen lassen sich mit einen klick auf Connect z&uuml;gig herstellen.\n\nBitLocker to Go Mit dieser Erweiterung von BitLocker lassen sich Wechseldatentr&auml;ger verschl&uuml;sseln. Somit sind auch Daten die unterwegs mitgenommen werden gesch&uuml;tzt. Einfach den USB Stick anschlie&szlig;en und im BitLocker Men&uuml; die Verschl&uuml;sselung aktivieren.\n&nbsp;\nOberfl&auml;che Die Verwaltung zu Oberfl&auml;chenanpassung wurde sehr viel &Uuml;bersichtlicher gestaltet. Neue Styles lassen sich einfach ausw&auml;hlen und aktivieren.\n\nMedia Center + Media Player 12 Das Media Center wurde &uuml;berarbeitet. Die Men&uuml;s sind klarer strukturiert und die Konfiguration l&auml;sst sich in wenigen Schritten beenden.\n\nDer Media Player hat auch ein neues Gesicht bekommen. Die Multimedia-Unterst&uuml;tzung wurde durch zus&auml;tzliche Codes f&uuml;r langsame Systeme optimiert.\n\nDie Installation vom USB Stick hat keine halbe Stunde gedauert und schon war Windows 7 betriebsbereit. Auf den ersten Blick macht Windows 7 RTM einen sehr guten Eindruck. Was das Betriebssystem in Sachen Performance und Alltagstauglichkeit leisten kann wird sich in den n&auml;chsten Wochen zeigen. Es wird sicher noch der ein oder andere Post von Thomas und mir diesbez&uuml;glich erscheinen.\nGr&uuml;&szlig;e, dn"
        },
        {
          "id": "post-remoteapp-mit-zertifikat",
          "title": "RemoteApp mit Zertifikat",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client, Server, Server-2008",
          "url": "/post/remoteapp-mit-zertifikat/",
          "content": "Die Sicherheit von RemoteApp Programmen kann erh&ouml;ht werden indem die Echtheit des Servers mit einem Zertifikat best&auml;tigt wird. Daf&uuml;r habe ich ein Computerzertifikat f&uuml;r den Terminal Server ausgestellt der die RemoteApp Programme hosted. Das ausgestellte Zertifikat muss nat&uuml;rlich g&uuml;ltig sein, d.h. Datum und Namen m&uuml;ssen stimmen und die ausstellende CA (Enterprise CA in meinem Fall) muss vertrauensw&uuml;rdig sein.&nbsp;\nUm RemoteApp Programme mit Zertifikaten zu signieren muss man nicht wie bei den Makros (wie Daniel schreibt) eine Richtlinie f&uuml;r Softwareeinschr&auml;nkung erstellen, sondern man erstellt ein GPO in dem man den Fingerabdruck des Zertifikates zu den Vertrauensw&uuml;rdigen RDP-Herausgebern hinzuf&uuml;gt. Die entsprechende Einstellung findet sich als Computer oder Benutzerkonfiguration unter:\nAdministrative Vorlagen/Windows-Komponenten/Remote Desktop Services/Remotedesktopverbindungs-Client/SHA1-Fingerabdr&uuml;cke von Zertifikaten angeben, die vertrauensw&uuml;rdige RDP-Herausgeber darstellen\nSo wird die Identit&auml;t des Remotecomputers verifiziert und beim verbinden erh&auml;lt der Benutzer keine Abfrage ob er dem Herausgeber auch wirklich vertraut."
        },
        {
          "id": "post-doch-kein-windows-7-e",
          "title": "Doch kein Windows 7 E",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/doch-kein-windows-7-e/",
          "content": "Nachdem man schon ein paar Tage etwas dar&uuml;ber lesen konnte scheint es nun fix zu sein: Windows 7 kommt mit Internet Explorer f&uuml;r alle, also kein \"E\" Version f&uuml;r den europ&auml;ischen Markt.\nAlle die&nbsp;Windows 7 E Vorbestellt haben werden eine Vollversion des jeweiligen Produktes erhalten.\nAls alternative wird vermutlich eine Browserauswahl beim Start von Windows 7 zur Verf&uuml;gung stehen, so kann der Benutzer sich f&uuml;r seinen bevorzugten Browser entscheiden.\nDer gr&ouml;&szlig;te Vorteil dieser Aktion ist wohl die Upgrade Funktion die nun auch f&uuml;r uns Europ&auml;er verf&uuml;gbar ist. So kann man von Windows Vista bequem updaten ohne seine Einstellungen zu verlieren. F&uuml;r Windows XP wird es keine Upgrade Funktion geben, man kann jedoch eine g&uuml;nstigere Upgrade Version kaufen und diese installieren.\nHier&nbsp;gehts zum Artikel von Daniel Melanchthon wo man genaueres nachlesen kann."
        },
        {
          "id": "post-windows-7-joint-launch-roadshow",
          "title": "Microsoft Roadshow zu neue Produkte",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Events",
          "url": "/post/windows-7-joint-launch-roadshow/",
          "content": "Microsoft startet Roadshow zu Windows 7, Windows Server 2008 R2, Exchange Server 2010 in f&uuml;nf deutsche St&auml;dte.\nSteve Ballmer selbst wird in M&uuml;nchen die neuen Produkte vorstellen.\nEventtermine\n\n07. Oktober 2009 ICM M&uuml;nchen \n18. November 2009 Maritim Airport Hotel Hannover\n20. November 2009 Swiss&ocirc;tel D&uuml;sseldorf\n23. November 2009 Congress Center Frankfurt am Main\n25. November 2009 Stadthalle Karlsruhe\nMehr zum Event Agenda Anmeldung \nGr&uuml;&szlig;e, dn\nDanke an Daniel f&uuml;r die Info."
        },
        {
          "id": "post-windows-home-server-pp3-(beta)-e28093-windows-7",
          "title": "Windows Home Server PP3 (Beta) – Windows 7",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Home-Server, Client",
          "url": "/post/windows-home-server-pp3-(beta)-e28093-windows-7/",
          "content": "Mit dem Power Pack 3 wird Windows 7 besser in den Home Server integriert und man hat folgende Vorteile:\n   Backup &amp; Restore von Clients mit Windows 7     bessere Integration in das Windows 7 Media Center     Integration in die Bibliotheken (Libraries) von Windows 7     Verbesserungen der Suche     Besserer Support von Netbooks  \nUm die Beta Version des neuen Power Packs herunterzuladen muss man sich auf der Microsoft Connect Seite Registrieren.\n\nNach dem Download erhält man ein Verzeichnis dass drei Updates, die Release Dokumentation und jeweils eine Batch Datei für Installation und Deinstallation beinhaltet. Die Batch Datei macht nichts anderes als der Reihe nach folgende Updates zu installieren: (es empfiehlt sich die Verwendung der Batch Datei, so erspart man sich einige Reboots :)).\n   WindowsSearch-KB940157-Srv2K3-x86-enu.exe (Installiert Windows Search 4.0)     WindowsServer2003.WindowsXP-KB969949-x86-ENU.exe (Hotfix für Windows Search 4.0 und WHS)     WHS-KB968349-v1-x86-ENU.exe (WHS Power Pack 3)  \nNach der Installation wird der WHS Connector auf den Clients automatisch aktualisiert. Die neuen Features sind nach dem Update verwendbar.\n \nFür die Integration in das Media Center muss man den Media Center Connector (Start Menü) ausführen.\n \nNach einem Neustart sind die Bibliotheken des WHS im Media Center verfügbar.\n \nWann die endgültige Version des Power Pack 3 verfügbar sein wird ist noch nicht bekannt, man spekuliert auf eine Veröffentlichung zeitgleich mit Windows 7, also vermutlich im Oktober.\nViele Grüße!"
        },
        {
          "id": "post-server-logs-in-sql-datenbank-importieren",
          "title": "Server Logs in SQL Datenbank importieren",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Security, SQL",
          "url": "/post/server-logs-in-sql-datenbank-importieren/",
          "content": "Als ich letztens die &Uuml;berwachungsrichtlinien der Dom&auml;ne &uuml;berarbeitet habe, sind mir mehrfach fehlgeschlagene &ldquo;Objektzugriffe&rdquo; von Clients aufgefallen, die versuchten in Bereiche einzudringen, f&uuml;r die sie keine Berechtigung haben. Da das EventLog am Server jedoch kein dauerhafter Speicher f&uuml;r Log Files und f&uuml;r Auswertungen relativ umst&auml;ndlich ist, schreibe ich die Logs in eine SQL Datenbank. Anschlie&szlig;end werden die Daten so bereinigt, dass nur noch Ereignisse des Typs &ldquo;Objektzugriff&rdquo; enthalten sind.\nWie ich dabei vorgegangen bin erkl&auml;rt dieser Beitrag\nSchritt 1 &ndash; SQL Server installieren Als erstes habe ich mir einen neuen Server auf meiner Hyper-V Umgebung bereitgestellt und auf diesen dann Microsoft SQL Server 2008 installiert.\nSchritt 2 &ndash; Tabellen erstellen\nUm meine EventLogs zu speichern habe ich 2 gleiche Tabelle erstellt. Eine f&uuml;r das tempor&auml;re Speichern der EventLogs (&ldquo;tblTMPLog&rdquo;) und eine f&uuml;r das dauerhafte Speichern (&ldquo;tblSecurityObject&rdquo;). Die tempor&auml;re Tabelle wird deshalb verwendet, da die Daten vor dem eigentlichen Speichern noch bereinigt werden.\n\nSchritt 3 &ndash; EventLogs exportieren\nUm die Event Logs vom Server zu exportieren hilft uns das Tool &ldquo;DUMPEVT&rdquo;. Es exportiert Logs vom Server und schreibt sie in ein File. Die Logs werden dabei vom Server nicht gel&ouml;scht. Auch merkt sich das Tool welche Logs vom Server schon exportiert wurden, sodass ein Mehrfach-Export nicht passieren kann.\nDUMPEVT habe ich heruntergeladen, und unter C:\\DUMPEVT entpackt.\nNun kann man sich schon von der Befehlszeile Logs vom Server holen\n&ldquo;C:\\DUMPEVT\\DUMPEVT.exe /logfile=sec /outfile=C:\\DUMPEVT\\evtlog.csv /computer=localhost\nDie Logs werden wie angegeben in die Datei evtlog.csv geschrieben\n\nEs ist auch m&ouml;glich DUMPEVT vom SQL Server aus zu steuern. Daf&uuml;r muss als erstes das Feature &ldquo;xp_cmdshell&rdquo; aktiviert werden (sofern nicht nicht geschehen).\nMit den folgenden Code kann man sich dann die Logs holen\nmaster..xp_cmdshell 'C:\\DUMPEVT\\DUMPEVT.exe /logfile=sec /outfile=C:\\DUMPEVT\\evtlog.csv /computer=localhost'\nSchritt 4 &ndash; Logs in die SQL Datenbank importieren\nUm die Logs in SQL zu importieren wird zun&auml;chst die tempor&auml;re Tabelle gel&ouml;scht und dann &uuml;ber den BULK INSERT Befehl eingelesen.\nDELETE FROM tblTMPLog BULK INSERT tblTMPLog FROM 'c:\\dumpevt\\evtlog.csv' WITH (FIELDTERMINATOR = ',')\nSchritt 5 &ndash; Tabelle bereinigen\nWenn ich jetzt ein SELECT * FROM tblTMPLog ausf&uuml;hre, erhalte ich folgende Ausgabe:\n\nUm die Daten zu bereinigen, entferne ich alle Ereignisse, die nicht die Kategorie &ldquo;Objektzugriff&rdquo;, ID &ldquo;560&rdquo; aufweisen. Im Field Data werden Sonderzeichen entfernt, die vom Export des Logs entstanden sind.\nDELETE FROM tblTMPLog WHERE NOT Category = 'Objektzugriff' DELETE FROM tblTMPLog WHERE NOT EventID = '560' Update tblTMPLog Set Data = Replace(Data, ' ', '') Update tblTMPLog Set Data = Replace(Data, '^', '') Update tblTMPLog Set Data = Replace(Data, '`', '')\nSchritt 6 &ndash; Tempor&auml;re Tabelle &uuml;bertragen\nNachdem die Daten bereinigt wurden, kann die tempor&auml;re Tabelle in die fixe Tabelle &uuml;bertragen werden. Wenn n&ouml;tig, kann man sich an dieser Stelle die Daten noch ein wenig zurechtr&uuml;cken.\nBsp: Nur die Information &ldquo;Objektname&rdquo; wird f&uuml;r das Field Data &uuml;bertragen.&nbsp; &nbsp;&nbsp; UPDATE tblSecurityObject SET Data = SUBSTRING(Data,CHARINDEX('Objektname:', Data)+12,CHARINDEX('Handlekennung:', Data) - CHARINDEX('Objektname:', Data)-12) WHERE CHARINDEX('Objektname:', Data) &gt; 0\nSchritt 7 &ndash; Auswertung\nNachdem die Daten sich auf dem SQL Server befinden, kann man diese entsprechend sauber auswerten und speichern.\nBsp: Programm in C# um die SQL Daten anzuzeigen\n\n&nbsp;\nViel Spa&szlig; beim importieren und auswerten, dn\n- Vielen Dank an Robert van den Berg, der in seinem Blog das Thema bereits &auml;hnlich behandelt hat -"
        },
        {
          "id": "post-mehrere-externe-ipe28099s-am-isa-server",
          "title": "Mehrere externe IP’s am ISA Server",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server, Security",
          "url": "/post/mehrere-externe-ipe28099s-am-isa-server/",
          "content": "Stellt euch folgende Situation vor:\nIhr habt einen ISA Server als Firewall und mehrere öffentliche IP Adressen zur Verfügung. Die Adressen werden dem externen Interface des ISA Servers zugewiesen.    Beispiel:\n\n200.200.200.1 –&gt; VPN   200.200.200.2 –&gt; OWA    200.200.200.3 –&gt; Veröffentlichte Webseite    200.200.200.4 –&gt; Sonstiges\nDer MX-Reccord der Domäne leitet Mails der IP Adresse 200.200.200.2 weiter. Von der 200.200.200.2 werden die Mails dem internen Mailserver zugestellt. Der Zielverkehr für das externe Netzwerk wird über die erste IP Adresse am externen Interface geleitet. Folglich wird Internetverkehr, sowie Mails über die öffentliche IP 200.200.200.1 geleitet (nach Standardkonfiguration).\nWenn eurer Mailserver selbst die DNS-Auflösung vornimmt und Mails dem Ziel zustellt, tut er das mit der 200.200.200.1\nMailserver führen vermehrt ein Reverse-DNS-Lookup durch, um den Versender zu verifizieren. In dieser Konfiguration stellt das aber ein Problem dar, da die Mails über die 200.200.200.1 versendet werden, der MX aber auf die 200.200.200.2 zeigt. Folglich kann es passieren, dass Mails nicht angenommen werden oder man landet gleich direkt auf der Blacklist.\nUm dieses Problem zu beheben hat man 2 Möglichkeiten:\n   Mails über einen Smarthost senden    Die öffentliche IP Adresse des Mail Servers am externen Interface des ISA Servers als erste Adresse eintragen \n&#160;\nISA Server unterstützt bis jetzt (aktuelle Version 2006) nicht die Anbindung mehrerer öffentlicher IP Adressen.\nGrüße, dn"
        },
        {
          "id": "post-ein-paar-infos-zu-e2809cdirectaccesse2809d",
          "title": "Ein paar Infos zu “DirectAccess”",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Server-2008-R2, Client, Server",
          "url": "/post/ein-paar-infos-zu-e2809cdirectaccesse2809d/",
          "content": "Mit Windows 7 und Windows Server 2008 R2 kommt ein neues Remote-Verbindungs-Feature: DirectAccess. \nDirectAccess ist der traditionellen VPN Verbindung sehr ähnlich, bietet jedoch entscheidende Vorteile: Clientcomputer initiieren automatisch eine gesicherte Verbindung zum Ziel. Somit bedarf es keinen Eingriff des Users, denn er ist sofort mit dem Zielnetzwerk verbunden. \nDirectAcces baut eine IPv6 Verbindung zum DirectAccess Server auf. Sollte die Firewall den IPv6 Verkehr blocken, so wird IP over HTTPS verwendet. Somit kann also jede Firewall mit geöffneten Web-Ports passiert werden.\nMan kann DirectAccess in 3 verschiedene Modi betreiben:\n   Full Intranet Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt     Selected Server Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt. Die Verbindung vom Clientcomputer zum internen Netzwerk ist authentifiziert     End-to-End Access: Die Verbindung vom Clientcomputer über das Internet zum internen Netzwerk ist verschlüsselt und authentifiziert  \n \nEin weiterer Vorteil bezieht sich auf das Patch- und Richtlinienmanagement. Befindet sich der Client mehrere Wochen nicht im internen Netzwerk, könnte es unter Umständen sein, dass er in dieser Zeit keine Updates vom Server bezieht. Mit DirectAccess ist der Client ständig in Verbindung mit den internen Servern und kann Updates sowie die aktuellen GPO’s beziehen.\nUm DirectAccess benutzen zu können ist zwingend Windows 7, Windows Server 2008 R2 und eine PKI nötig. Der Client muss außerdem der Domäne angehören.\nGrüße, dn"
        },
        {
          "id": "post-windows-7-e28093-nativer-vhd-support",
          "title": "Windows 7 – Nativer VHD Support",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-e28093-nativer-vhd-support/",
          "content": "Das neue Windows kann von Haus aus VHDs als Festplatten einbinden. So kann man sich z.B. ein Testsystem installieren ohne die Festplatt partitionieren zu m&uuml;ssen.\nVirtuelle Festplatten k&ouml;nnen direkt in der Datentr&auml;gerverwaltung erstellt werden (rechtsklick auf Datentr&auml;gerverwaltung, neue virtuelle Festplatte).\n\nWill man Windows 7 auf der zu erstellenden VHD installieren muss man die Festplatte mit fester Gr&ouml;&szlig;e erstellen.\n&nbsp;\nWindows 7 von einem beliebigem Installationsmedium (USB Stick, DVD) starten und mit Shift-F10 eine Eingabeaufforderung starten. Jetzt muss man die vorhin erstellte VHD mit diskpart einbinden. Dazu wird die VHD mit selet vdisk file=c:\\pfad\\zur\\datei.vhd ausgew&auml;lt und mit attach vdisk angebunden.\nDie Installation von Windows 7 kann jetzt normal fortgesetzt werden, die Warnung dass Windows auf einer virtuellen Festplatte nicht installiert werden kann, ignoriert man einfach.\nmfg tt"
        },
        {
          "id": "post-windows-7-e28093-installation-mit-usb-stick",
          "title": "Windows 7 – Installation mit USB Stick",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "Client",
          "url": "/post/windows-7-e28093-installation-mit-usb-stick/",
          "content": "Windows 7 kann von einem USB Wechseldatentr&auml;ger aus installiert werden. So kann es problemlos auf Netbooks und anderen Ger&auml;ten ohne ein optisches Laufwerk installiert werden. Ich verwende eigentlich immer diese Variante da USB Sticks in der Regel schneller sind als DVD Laufwerke.\nUm den USB Stick vorzubereiten verwendet man das Programm diskpart (standartm&auml;&szlig;ig installiert). Diskpart wird in einer Eingabeaufforderung mit administrativen Rechten gestartet.\nWenn Diskpart gestartet wurde \"list disks\" ausf&uuml;hren, um die installierten Laufwerke anzuzeigen.\nMit \"select disk\" wird der USB Stick ausgew&auml;hlt, dann wird er mit \"clean\" gel&ouml;scht (ACHTUNG: Alle Daten auf dem Stick gehen verloren)\nJetzt wird mit \"create partition primary\" eine Prim&auml;re Partition erstellt die mit \"active\" als Aktiv gesetzt wird (damit das BIOS davon booten kann). Jetzt fehlt noch das Dateisystem das mit \"format fs=fat32 quick\" festgelegt wird. Mit \"assign\" wei&szlig;t man noch einen Laufwerksbuchstaben zu.\n\nDieser Prozess kann auch &uuml;ber GUI ausgef&uuml;hrt werden, wichtig ist nur dass am Ende eine prim&auml;re, aktive Fat32 Partition auf dem USB Stick vorhanden ist.\nZu Schluss kopiert man noch alle Daten von der Windows 7 DVD auf den USB Stick. So erstellt man einen Bootf&auml;higen Stick, man muss nur noch dem BIOS beibringen davon zu starten und schon kann Windows installiert werden.\nGenauere Details zu Diskpart gibts im entsprechenden KB Artikel."
        },
        {
          "id": "post-msat-deckt-schwachstellen-in-der-it-umgebung-auf",
          "title": "MSAT deckt Schwachstellen in der IT Umgebung auf",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/msat-deckt-schwachstellen-in-der-it-umgebung-auf/",
          "content": "Microsoft bietet das kostenlose Tool MSAT (Microsoft Security Assessment Tool) Unternehmen an, ihre IT-Sicherheitsumgebung zu bewerten. \nAls erstes wird der aktuelle Stand der IT-Sicherheit ermittelt, das Tool gibt eine nach Priorität geordnete Liste mit Problemen und Verbesserungsmöglichkeiten aus.\nFolgende Features sind im Tool enthalten:\n   Einfach zu verwendende, umfassende und kontinuierliche Sicherheitsinformationen     Ein Defense-in-Depth-Framework mit branchenbezogener vergleichender Analyse     Detailliertes, kontinuierliches Reporting mit Vergleich von Ausgangsbasis und Fortschritt     Empfehlungen und nach Priorität geordnete Maßnahmen zur Verbesserung der Sicherheit     Strukturierte Anleitungen von Microsoft und anderen Branchenvertretern  \n \nDownloaden kann man das Tool hier\nGrüße, dn"
        },
        {
          "id": "post-windows-7-e28093-rtm-verfugbarkeit",
          "title": "Windows 7 – RTM Verfügbarkeit",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/windows-7-e28093-rtm-verfugbarkeit/",
          "content": "Wie im Windows 7 Team Blog zu lesen ist steht nun das RTM Datum fest.\nDie wichtigsten Daten im Überblick:\n   MSDN &amp; Technet ab 6. August&#160;    Volume License mit SA ab 7. August    Volume License ohne SA ab 1. September    Microsoft Partner Network Portal ab 16. August    Microsoft Action Pack ab 23. August \nBei diesen Daten handelt es sich um die englischen Versionen, andere Sprachen folgen am 1. Oktober und in den Regalen steht Windows 7 ab 22. Oktober.\nviele Grüße    tt"
        },
        {
          "id": "post-zertifikat-fur-makros-der-domane-bereitstellen",
          "title": "Zertifikat für Makros der Domäne bereitstellen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/zertifikat-fur-makros-der-domane-bereitstellen/",
          "content": "Letzens habe ich mir vorgenommen alle von mir geschriebenen Makros digital zu signieren, sodass die User beim Öffnen der Dateien keine Abfragen bekommen ob sie den Code aktivieren möchten oder nicht. \nUm einen Makro digital zu signieren und das Zertifikat der Domäne zur Verfügung zu stellen bedarf es mehrerer Schritte: \n   Zertifikatdienste auf einem Server installieren     Zertifikat zur Codesignatur ausstellen     Makros digital signieren und die Office-Files ablegen  \nNun muss nur mehr das Zertifikat den Usern bereit gestellt werden. Wenn man das mit einem GPO macht, muss darauf geachtet werden, dass man die Einstellungen für Computer vornimmt. \nDas Zertifikat muss als erstes unter die Vertrauenswürdigen Stammzertifizierungsstellen \nComputerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Vertrauenswürdige Stammzertifizierungsstellen \n\n Bis hierher wird das Zertifikat in den lokalen Zertifikat-Speicher “Vertrauenswürdigen Stammzertifizierungsstellen” geschoben. Das Zertifikat muss aber noch in den Speicher für “Vertrauenswürdige Herausgeber”, sonst erscheinen weiterhin Abfragen. Um das Zertifikat da rein zubekommen muss im vorher konfigurierten GPO eine neue “Richtlinie zur Softwareeinschränkung” erstellt werden. \nComputerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Richtlinien für Softwareeinschränkung \nDanach muss unter “Zusätzliche Regeln” eine neue Zertifikatsregel mit den entsprechenden Zertifikat erstellt werden. \n\nWichtig dabei ist, dass die Sicherheitsstufe “Nicht eingeschränkt” lautet.\n \nNun wird das Zertifikat an alle Computer unter dem GPO verteilt. Alle digital signierten Makros werden ohne Abfrage ausgeführt."
        },
        {
          "id": "post-delta-crl-e2809cunable-to-downloade2809d-iis-7",
          "title": "Delta CRL “Unable to Download” IIS 7",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/delta-crl-e2809cunable-to-downloade2809d-iis-7/",
          "content": "Erstmal herzlich willkommen in unserem Blog ;)\nund zweitens ein Problemchen &uuml;ber das ich in dieser Woche gestolpert bin: IIS 7 blockiert aus Sicherheitsgr&uuml;nden sogenannte Double-Escape Sequenzen (\"+\" \"-\"). Da die Delta CRL jedoch standardm&auml;&szlig;ig ein \"+\" im Namen hat schl&auml;gt der Download fehl. M&ouml;chte man die CRL's bzw. Delta CRL's in seiner PKI &uuml;ber http ver&ouml;ffentlichen kann man sich durch abschalten dieser Sicherheitsfunktion f&uuml;r die betreffenden Virtual Directories helfen:\n%windir%\\system32\\inetsrv\\appcmd.exe set config \"Default Web Site/virtual Directory\" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true \"virtual Directory\" entspricht dem Virtuellen Verzeichnis in dem die Delta CRL ver&ouml;ffentlicht wird.\nhier der entsprechende KB Artikel: http://support.microsoft.com/kb/942076\nmfg tt"
        },
        {
          "id": "post-drucken-mit-internet-explorer-8-nicht-mehr-moglich",
          "title": "Drucken mit Internet Explorer 8 nicht mehr möglich",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/drucken-mit-internet-explorer-8-nicht-mehr-moglich/",
          "content": "Letztens hatte ich das Problem, dass mein Internet Explorer plötzlich das Drucken verweigerte. Auch ist mir aufgefallen, dass das „Info-Fenster“ nur mehr ein weißes Fenster zeigte. \nEs scheint Probleme zu geben, wenn zum Internet Explorer 8 der „Microsoft Software Inventory Analyzer“ installiert wird. Deinstallation des Analyzers hat das Problem behoben."
        },
        {
          "id": "post-willkommen",
          "title": "Willkommen",
          "collection": {
            "label": "posts",
            "name": "Posts"
          },
          "categories": "Archive",
          "tags": "",
          "url": "/post/willkommen/",
          "content": "Willkommen im Blog von ntSystems – info.tech"
        },
        {
          "id": ".well-known-lnurlp-tto",
          "title": "Tomt",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/.well-known/lnurlp/tto",
          "content": "{\n    \"status\":\"OK\",\n    \"tag\":\"payRequest\",\n    \"commentAllowed\":255,\n    \"callback\":\"https://getalby.com/lnurlp/tomt/callback\",\n    \"metadata\":\"[[\\\"text/identifier\\\", \\\"tomt@getalby.com\\\"], [\\\"text/plain\\\", \\\"Sats for tto\\\"]]\",\n    \"minSendable\":1,\n    \"maxSendable\":1000000000,\n    \"payerData\":\n    {\n        \"name\":{\"mandatory\":false},\n        \"email\":{\"mandatory\":false}\n    }\n}"
        },
        {
          "id": "404",
          "title": "404",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/404",
          "content": "404\n\nPage not found :(\nThe requested page could not be found.\nYou can search or go back home."
        },
        {
          "id": "500",
          "title": "500",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/500",
          "content": "500\n\nInternal Server Error :(\n\nThe requested page could not be delivered."
        },
        {
          "id": "api-v1-docs",
          "title": "Index",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/api/v1/docs/",
          "content": "[{\n  \"id\": \"powershell-start-lyncbackup\",\n  \"title\": \"New-SfBBackup\",\n  \"author\": \"tto\",\n  \"tags\": [\"OnlineHelp\",\"Lync\",\"PowerShell\"],\n  \"content\": \"This script exports Lync Core Data and Settings according to the documentation availabe on TechNetIt is intended to be run as scheduled task, the Retention parameter can be used to indicate how long to keep existing backup files in the target directory.InputsNone. This script does not take any pipeline input.OutputsNone. This script does not write any output to the pipeline.PermissionsThe Account used to run this script needs to be member of the RTCUniversalServerAdmins group.Example 1.\\\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\\\\\SERVER\\\\Share\\\\CSBackupThis example exports Lync config and saves it into a subfolder at \\\\\\\\SERVER\\\\Share\\\\CSBackupExample 2.\\\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\\\\\SERVER\\\\Share\\\\CSBackup -Retention 10This example exports Lync config and saves it into a subfolder at \\\\\\\\SERVER\\\\Share\\\\CSBackup. It deletes existing backups in the destination directory if they are older than 10 days.Download &amp; Source for New-SfBBackupThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name New-SfBBackup -Scope CurrentUserSave-Script -Name New-SfBBackup -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/start-lyncbackup/\"\n},{\n  \"id\": \"powershell-test-groupmembership\",\n  \"title\": \"Test-GroupMembership\",\n  \"author\": \"tto\",\n  \"tags\": [\"blog\",\"archives\",\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"This function uses [ADSI] to test group membership based on the constructed security token of the principal. You can pipe objects to this function. The function writes $true or $false for each tested object.This function makes use of Richard Muellers “PowerShell script to check group membership”. Check the related link.Inputs[Microsoft.ActiveDirectory.Management.ADAccount]You can pipe an ADAccount object, such as returned by Get-AdUser or Get-AdComputer, to Test-GroupMembership.Outputs[bool]Test-GroupMembership returns $true or $false for each tested account.Example 1Get-AdUser -Filter * | Test-GroupMemership -GroupName \\\"Domain Users\\\"This example gets users from Active Directory and tests wether or not they are member of the “Domain Users” security group.Example 2Get-AdComputer -Filter * | Test-GroupMemership -GroupName \\\"Domain Computers\\\"This example gets computers from Active Directory and tests wether or not they are member of the “Domain Computers” security group.Related LinksRichard Muellers Script in the TechNet ScriptCenter: http://gallery.technet.microsoft.com/scriptcenter/5adf9ad0-1abf-4557-85cd-657da1cc7df4Download &amp; Source for Test-GroupMembershipThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Test-GroupMembership -Scope CurrentUserSave-Script -Name Test-GroupMembership -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/test-groupmembership/\"\n},{\n  \"id\": \"powershell-invoke-sefautil\",\n  \"title\": \"Invoke-SEFAUtil\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\",\"Lync\"],\n  \"content\": \"This is a wrapper function for the SEFAUtil.exe tool from the Lync Resource Kit Tools. It’s intended purpose is to make dealing with the cmdline tool easier.SYNTAX.\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddTeamMember &lt;String&gt;] [-RemoveTeamMember &lt;String&gt;] [-DelayRingTeam &lt;Int32&gt;] [-DisableTeamCall] [-SimulRingTeam] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddDelegate &lt;String&gt;] [-RemoveDelegate &lt;String&gt;] [-DelayRingDelegates &lt;Int32&gt;] [-FwdToDelegates] [-SimulRingDelegates] [-DisableDelegation] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableSimulRing &lt;String&gt;] [-DisableSimulRing] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableFwdNoAnswer &lt;String&gt;] [-EnableFwdImmediate &lt;String&gt;] [-CallAnswerwaitTime &lt;Int32&gt;] [-DisableFwdImmediate] [-DisableFwdNoAnswer] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThe default Value for the Path parameter assumes Lync 2013 Resource Kit Tools are installed at C:\\\\Program Files\\\\Microsoft Lync Server 2013\\\\ResKit. This function requires version 3 of PowerShell as well as the Lync Module for user validation. Note: Check the related links for a really cool GUI wrapper by MVP Johan Veldhuis.RELATED LINKS  Invoke-SEFAUtil – a PowerShell wrapper function  Updated: Invoke-SEFAUtil  SefaUtil GUI  Skype for Business Server 2015 Resource Kit Tools DocumentationEXAMPLE 1.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\"OU=users,OU=tomt,DC=tomt,DC=local\\\" | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThis example uses Get-CsUser to get all Lync Users from within the specified Organizational Unit and adds thomas@tomt.it as delegate.Download &amp; Source for Invoke-SEFAUtilThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/invoke-sefautil/\"\n},{\n  \"id\": \"powershell-restore-vmpermission\",\n  \"title\": \"Restore-VMPermission\",\n  \"author\": \"tto\",\n  \"tags\": [\"OnlineHelp\",\"Hyper-V\",\"PowerShell\"],\n  \"content\": \"Adds permissions for the VMId to all assigned disks.SYNTAX.\\\\Restore-VMPermission.ps1 [-VM] &lt;String[]&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThis script uses the Hyper-V Module to update permissions for all assigned disks on one ore more VMs. This is useful if you move/replace VHDs and the read permission ACE for VMId is missing.PARAMETERS-VM &lt;String[]&gt;    VM, specify the VM that needs permissions fixed.    Required?                    true    Position?                    1    Default value    Accept pipeline input?       true (ByPropertyName)    Accept wildcard characters?  false-WhatIf [&lt;SwitchParameter&gt;]    Required?                    false    Position?                    named    Default value    Accept pipeline input?       false    Accept wildcard characters?  false-Confirm [&lt;SwitchParameter&gt;]    Required?                    false    Position?                    named    Default value    Accept pipeline input?       false    Accept wildcard characters?  false&lt;CommonParameters&gt;    This cmdlet supports the common parameters: Verbose, Debug,    ErrorAction, ErrorVariable, WarningAction, WarningVariable,    OutBuffer, PipelineVariable, and OutVariable. For more information, see    about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216).INPUTSYou can pipe objcets with a VMName property, such as returned by Get-VM, to this script.OUTPUTSNone. This script does not write any objects to the pipeline.EXAMPLE 1PS C:\\\\&gt;Restore-VMPermission.ps1 -VM dc01This example adds permission for dc01 VMId to the ACL of all assigned disks for dc01.EXAMPLE 2PS C:\\\\&gt;Get-VM | Restore-VMPermission.ps1This example uses Get-VM to get all VMs on the local machine. It gets all disks for all VMs and adds the required premissions for VMId to the ACL.Download &amp; Source for Restore-VMPermissionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Restore-VMPermission -Scope CurrentUserSave-Script -Name Restore-VMPermission -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/restore-vmpermission/\"\n},{\n  \"id\": \"powershell-create-ucszoninghints\",\n  \"title\": \"Create-UcsZoningHints\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cisco\",\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"This script uses the CiscoUcs PowerTool to get information about one or more service profiles and creates SIST zoning configuration for NX-OS. The Target’s device-alias as well as the name for the ZoneSet and the VSAN can be specified with parameters. Zone names will be automatically created.Syntax.\\\\Create-UcsZoningHints.ps1 -Name &lt;String&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;].\\\\Create-UcsZoningHints.ps1 -InputObject &lt;Object&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;].\\\\Create-UcsZoningHints.ps1 [-UcsCentral] -TemplateName &lt;String&gt; [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]Inputs  Cisco.Ucsm.LsServer  Cisco.UcsCentral.LsServerYou can pipe objects of the above types to this script.Outputs  System.Management.Automation.PSObject  System.StringDepending on the parameters used, this script writes a custom PSObject or a System.String to the pipeline. The default behavior is to output a custom PSObject. If the –OutFile parameter is used, a string will be output instead.Example 1PS Scripts:\\\\&gt; Connect-Ucs 192.168.1.100PS Scripts:\\\\&gt; Get-UcsServiceProfile -Name HVSV02 | .\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-aId CommandLine-- -----------0 ! Fabric A1 device-alias database2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:413 device-alias commit4 ! Zones5 zone name HVSV02-vHba-A_vnx-a vsan 16  member device-alias vnx-a7  member device-alias HVSV02-vHba-A8 ! Zoneset9 zoneset name myZoneSet vsan 110  member HVSV02-vHba-A_vnx-a11 ! zoneset activate name myZoneSet vsan 1In this example, we use Connect-Ucs to connect to an instance of UCS Manager. Using Get-UcsServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, creates the output shown above. The –TargetAlias parameter specifies the device-alias to use as zone target.Lines 1-3 create a device-alias for the vHBA of Fabric A in the NX-OS configuration.Lines 5-7 create a zone create a SIST zone and adds the vHBA’s and the target’s device-aliases as members.Lines 9 and 10 add the newly created zone to an existing zoneset configuration.Line 11 can be uncommented to activate the updated zoneset.Example 2PS Scripts:\\\\&gt; Connect-UcsCentral 192.168.1.102PS Scripts:\\\\&gt; Get-UcsCentralServiceProfile -Name HVSV02 | .\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-a -UcsCentralId CommandLine-- -----------0 ! Fabric A1 device-alias database2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:413 device-alias commit4 ! Zones5 zone name HVSV02-vHba-A_vnx-a vsan 16  member device-alias vnx-a7  member device-alias HVSV02-vHba-A8 ! Zoneset9 zoneset name myZoneSet vsan 110  member HVSV02-vHba-A_vnx-a11 ! zoneset activate name myZoneSet vsan 1In this example, we use Connect-UcsCentral to connect to an instance of UCS Central. Using Get-UcsCentralServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, using the Parameter –UcsCentral creates the output shown above.Example 3PS Scripts:\\\\&gt; Get-UcsServiceProfile -AssignState assigned | .\\\\Create-UcsZoningHints.ps1 –TargetAlias vnx-b -Fabric B -ZoneSet cfg-prodId CommandLine-- -----------0 ! Fabric B1 device-alias database2  device-alias name ESX01-vHba-B pwwn 20:01:00:25:B5:00:0B:013  device-alias name ESX02-vHba-B pwwn 20:01:00:25:B5:00:0B:024  device-alias name HVSV02-vHba-B pwwn 20:01:00:25:B5:00:0B:415 device-alias commit6 ! Zones7 zone name ESX01-vHba-B_vnx-b vsan 18  member device-alias vnx-b9  member device-alias ESX01-vHba-B10 zone name ESX02-vHba-B_vnx-b vsan 111  member device-alias vnx-b12  member device-alias ESX02-vHba-B13 zone name HVSV02-vHba-B_vnx-b vsan 114  member device-alias vnx-b15  member device-alias HVSV02-vHba-B16 ! Zoneset17 zoneset name cfg-prod vsan 118  member ESX01-vHba-B_vnx-b19  member ESX02-vHba-B_vnx-b20  member HVSV02-vHba-B_vnx-b21 ! zoneset activate name cfg-prod vsan 1This example uses the -AssignState parameter when getting Service Profiles from UCS Manager. This will retrieve all Service Profiles that are assigned to a physical server. Piping the retrieved Service Profile objects to this script, creates zones from each individual vHBA of each server to the device-alias specified using the –TargetAlias parameter.The -Fabric parameter specifies which Cisco UCS SwitchId is used to query vHBA information.The -ZoneSet parameter specifies the name of the zoneset to use in the configuration snippet.Example 4PS Scripts:\\\\&gt; Get-UcsServiceProfile | .\\\\Create-UcsZoningHints.ps1 -Fabric B -Vsan 200 -OutFile c:\\\\temp\\\\zoneset.txt! Fabric Adevice-alias databasedevice-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:41...This example creates zoning configuration for all configured Service Profiles. The -OutFile parameter specifies a filename where the output is written to. The output is also written to the pipeline.Note: Using the -OutFile parameter does not output an object but a simple string of commands to make copy/pasting easier. (alternatively use “| Select-Object -ExpandProperty CommandLine”)The -Vsan parameter specifies the Id of the vsan to use in the NX-OS configuration.Example 5PS Scripts:\\\\&gt; Get-UcsServiceProfile | .\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-1-a,vnx-2-aThis example creates zoning configuration for all configured Service Profiles to all specified Targets.Download &amp; Source for Create-UcsZoningHintsThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Create-UcsZoningHints -Scope CurrentUserSave-Script -Name Create-UcsZoningHints -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/create-ucszoninghints/\"\n},{\n  \"id\": \"powershell-start-testwebserver\",\n  \"title\": \"Start-TestWebServer\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"Start-TestWebServerSYNOPSISWebserver for load balancer testing.SYNTAXStart-TestWebServer.ps1 [[-Port] &lt;Int32&gt;] [-CreateFirewallRule]DESCRIPTIONStart a web listener that listens on a specified port and simply answers to any request, returning JSON object containing the request.Requires administrative rights to create the listener.EXAMPLES————————– EXAMPLE 1 ————————–.\\\\Start-TestWebServer -Port 8001Start the test WebServer on port 8001.————————– EXAMPLE 2 ————————–.\\\\Start-TestWebServer -Port 80 -CreateFirewallRuleInvoke-RestMethod -Uri http://localhost | Select-Object UserAgentStart the test WebServer on port 80 and create a Firewall Rule to allow traffic to the specified port.The Invoke-RestMethod cmdlet is used to send a request to the listener and parse the output.PARAMETERS-PortSpecify a TCP port number for the HTTP listener to use.Defaults to 8000.Type: Int32Parameter Sets: (All)Aliases: Required: FalsePosition: 1Default value: 8000Accept pipeline input: FalseAccept wildcard characters: False-CreateFirewallRuleUse this switch to automatically create a Windows Firewall rule to allow incoming connections on the specified port.Type: SwitchParameterParameter Sets: (All)Aliases: Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseINPUTSNone.OUTPUTSNone.NOTESRELATED LINKShttps://ntsystems.it/PowerShell/start-testwebserver/Download &amp; Source for Start-TestWebServerThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name Start-TestWebServer -Scope CurrentUserSave- -Name Start-TestWebServer -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/start-testwebserver/\"\n},{\n  \"id\": \"powershell-send-splunkevent\",\n  \"title\": \"Send-SplunkEvent\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"SYNOPSISSend events to Splunk’s HTTP Event Collector.SYNTAXSend-SplunkEvent.ps1 [-InputObject] &lt;Object&gt; [[-HostName] &lt;String&gt;] [[-DateTime] &lt;DateTime&gt;] [[-Uri] &lt;String&gt;] [[-Key] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to send structured data to Splunk HTTP Event Collector.Use the HostName and DateTime parameters to control Splunk’s ‘host’ and ‘time’ properties for the generated event.EXAMPLESEXAMPLE 1.\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\"Hello Splunk!\\\"} -Key &lt;token&gt;This example sends a simple event containing “message”: “Hello Splunk!” to the event collector running on the local system.EXAMPLE 2Import-Csv logs.csv | .\\\\Send-SplunkEvent -Key &lt;token&gt; -HostName SBC1 -Uri \\\"https://splunk01.example.com:8088/services/collector\\\"This example imports logs from a CSV file and sends each one of them to event collector running on splunk01.example.com.The HostName parameter specifies which host created the logs.PARAMETERS-InputObjectData object that will be sent to Splunk’s HTTP Event Collector.Type: ObjectParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-HostNameHostName to be used for Splunk’s ‘host’ property.Default’s to name of the local system.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: (hostname)Accept pipeline input: FalseAccept wildcard characters: False-DateTimeDate and Time of the event.Defaults to now() on the local system.Type: DateTimeParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: (Get-Date)Accept pipeline input: FalseAccept wildcard characters: False-UriURI of the Splunk HTTP Event Collector instance.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Http://localhost:8088/services/collectorAccept pipeline input: FalseAccept wildcard characters: False-KeyKey for the Splunk HTTP Event Collector instance.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).INPUTS[psobject]OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKShttps://ntsystems.it/PowerShell/Send-SplunkEvent/Download &amp; Source for Send-SplunkEventThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Send-SplunkEvent -Scope CurrentUserSave-Script -Name Send-SplunkEvent -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/send-splunkevent/\"\n},{\n  \"id\": \"powershell-remove-logfile\",\n  \"title\": \"Remove-LogFile\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"SYNOPSISDeletes log files.SYNTAXRemove-LogFile.ps1 -Path &lt;Object&gt; [-Age &lt;Int32&gt;] [-Filter &lt;String&gt;] [-LogFile &lt;FileInfo&gt;] [-Recurse] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONDeletes log files, parameters can be used to specify the root folder, whether or not to include subfolders, a file extension filter and the age. This is intended to be run as scheduled task to regularly clean-up log files.EXAMPLESExample 1.\\\\Remove-LogFile.ps1 -Path C:\\\\inetpub\\\\logs -Age 7 -RecurseThis example removes all *.log files older than 7 days from C:\\\\inetpub\\\\logs and any subfolders.PARAMETERS-AgeSpecify a number of days. Files with a LastWriteTime older than this will be deleted.Type: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-FilterSpecify file extension filter. Defaults to ‘*.log’.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-LogFileSpecify a path to a log file. The script will log information and erros to the file.Type: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathSpecify folder in which logs will be deleted.Type: ObjectParameter Sets: (All)Aliases:Required: TruePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-RecurseInclude subfolders.Type: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).INPUTSOUTPUTSNOTESRELATED LINKSDownload &amp; Source for Remove-LogFileThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Remove-LogFile -Scope CurrentUserSave-Script -Name Remove-LogFile -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/remove-logfile/\"\n},{\n  \"id\": \"powershell-psspeech\",\n  \"title\": \"PSSpeech\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  PSSpeech is a collection of functions to work with Azure Cognitive Services, more specifically the Speech Service.The function  Get-SpeechToken can be used to get an OAuth token for authentication to the service. The function Get-SpeechVoicesList can be use to get a list of available voices and the function Covert-TextToSpeech can be used to convert a given string to speech.Get-SpeechToken -Key &lt;yourkey&gt; Convert-TextToSpeech -Text \\\"Hi there, how are you doing today?\\\" -Path hithere.mp3Functions                                Convert-TextToSpeech        Convert a string to audio using Azure Cognitive Services.                                                            Get-SpeechToken        Get OAuth token for authorization to Azure Cognitive Services.                    Get-SpeechTokenResult         Get-SpeechTokenResult                     Get-SpeechVoicesList        Get a list of available voices from the speech service.                                                                                            Download &amp; Source for PSSpeechThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name PSSpeech -Scope CurrentUserSave- -Name PSSpeech -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    \",\n  \"url\": \"https://onprem.wtf/powershell/psspeech/\"\n},{\n  \"id\": \"powershell-tak\",\n  \"title\": \"TAK\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  Tom’s Admin Kit, or TAK, is a PowerShell script module that contains useful tools which I collected or created over the years.The main goal of creating the module and writing the scripts it contains, was learning PowerShell and making my job a little bit easier. As I am currently looking into continuous integration, I used this module to build an example deployment pipeline. You can read more about that here.Functions                Add-EtcHostsEntry        Add an entry to local hosts file.                    Connect-Lync        Connect to Skype for Business Server or Online.                    Connect-SfB        Connect to Skype for Business Server or Online.                    Convert-SubnetMask        Convert a SubnetMask to PrefixLength or vice-versa.                        ConvertFrom-Base64        Convert Base64 to ClearText String                    ConvertFrom-SID        Get the account name for a SID.                    ConvertTo-Base64        Convert a String to Base64                    ConvertTo-SID        Get the SID for an account name                    Edit-EtcHosts        Edit etc hosts file with notepad.                    Get-DKIMRecord        Get DKIM Record for a domain.                    Get-DMARCRecord        Get DMARC Record for a domain.                    Get-MacAddressVendor        Mac Address vendor lookup.                    Get-MxRecord        Get MX Records for a domain.                    Get-SPFRecord        Get SPF Record for a domain. If the include tag is present, recursively get that SPF Record, too.                                Get-TakHash        Get hash for a string.                    Get-WlanProfile         Get-WlanProfile                     Import-Csr        Import certificate signing request from base64 text.                    Import-DhcpServerLog        Import DHCP Server Log files.                    Import-IISLog        Import IIS log files with default header.                    Invoke-WhoisRequest        Wohis request.                    New-FirewallRule        Create a new Windows Firewall Rule.                    New-RgsReport        Gather information about Skype for Business Response Groups, Queues, Agent Groups.                    New-SPFRecord        Create SPF record for a given mail domain.                    Remove-EtcHostsEntry        Remove an entry from local hosts file by it's IP address.                    Show-EtcHosts        Display /etc/hosts file content on Windows or Linux/macOS.                    Show-WlanProfile        Get wlan pre-shared key.                    Test-ExchangeAutodiscover        Test Exchange Autodiscover Web Service.                    Test-FederationService        Test the ADFS web service                    Test-LyncDNS        Test DNS entries for Skype for Business / Lync deployments.                    Test-LyncDiscover        Test the Lyncdiscover service for Skype for Business/Lync deployments                    Test-OOSFarm        Get internal and external URLs for PowerPoint sharing.                    Test-SfBDNS        Test DNS entries for Skype for Business / Lync deployments.                    Test-SfBDiscover        Test the Lyncdiscover service for Skype for Business/Lync deployments                    Test-TCPConnection        Test if a TCP Connection can be established.                    Test-TLSConnection        Test if a TLS Connection can be established.                    Update-FileWriteTime        Touch a file.    Download &amp; Source for TAKThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Module -Name TAK -Scope CurrentUserSave-Module -Name TAK -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/TAK    \",\n  \"url\": \"https://onprem.wtf/powershell/tak/\"\n},{\n  \"id\": \"powershell-ntsystemspsdrive\",\n  \"title\": \"ntSystemsPSDrive\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  ntSystemsPSDrive is a SHiPS provider for ntSystems.it.It uses the SHiPS module to create a PSProvider for our blog which exposes our json-api as PSDrive and enables the following:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\Posts by Category\\\\PowerShell\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\Posts by Category\\\\ntSystems\\\\Jekyll Fun: Consuming ntSystems with PowerShell' You can read more about it here.Functions                                                                                                                                                                Download &amp; Source for ntSystemsPSDriveThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Module -Name ntSystemsPSDrive -Scope CurrentUserSave-Module -Name ntSystemsPSDrive -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/ntSystemsPSDrive    \",\n  \"url\": \"https://onprem.wtf/powershell/ntsystemspsdrive/\"\n},{\n  \"id\": \"powershell-add-etchostsentry\",\n  \"title\": \"Add-EtcHostsEntry\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Add-EtcHostsEntrySYNOPSISAdd an entry to local hosts file.SYNTAXAdd-EtcHostsEntry [-IPAddress] &lt;String&gt; [-Fqdn] &lt;String&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONAdds a lines to the /etc/hosts file of the local computer.Requires write access to /etc/hosts - if running PowerShell Core on  Linux/macOS try “sudo powershell”EXAMPLESEXAMPLE 1Add-EtcHostsEntry -IPAddress 1.1.1.1 -Fqdn test.fqdnThis example adds following line to the hosts file1.1.1.1 test.testPARAMETERS-IPAddressIPAddress of the hosts entry to be addedType: StringParameter Sets: (All)Aliases: ipRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-FqdnFQDN of the hosts entry to be addedType: StringParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/add-etchostsentry/\"\n},{\n  \"id\": \"powershell-connect-lync\",\n  \"title\": \"Connect-Lync\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Connect-LyncSYNOPSISConnect to Skype for Business Server or Online.SYNTAXDESCRIPTIONThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Serversor Skype for Business Online.The resulting PS Session is then imported and makes cmdlets available in the current session.The Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.This function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6EXAMPLESEXAMPLE 1Connect-SfB -Online -AdminDomain uclabThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.comPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/connect-lync/\"\n},{\n  \"id\": \"powershell-connect-sfb\",\n  \"title\": \"Connect-SfB\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Connect-SfBSYNOPSISConnect to Skype for Business Server or Online.SYNTAXServerConnect-SfB -Server &lt;Object&gt; [-Credential &lt;PSCredential&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]OnlineConnect-SfB [-AdminDomain &lt;String&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Serversor Skype for Business Online.The resulting PS Session is then imported and makes cmdlets available in the current session.The Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.This function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6EXAMPLESEXAMPLE 1Connect-SfB -Online -AdminDomain uclabThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.comPARAMETERS-ServerSpecifies the ServerName that the session will be connected toType: ObjectParameter Sets: ServerAliases:Required: TruePosition: NamedDefault value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-AdminDomainSpecify the admin doamin to connect to (OverrideAdminDomain parameter)Type: StringParameter Sets: OnlineAliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-CredentialCredential used for connection; if not specified, the currently logged on user will be usedType: PSCredentialParameter Sets: ServerAliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-TimeoutSession idle timeout in secondsType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: 3600Accept pipeline input: FalseAccept wildcard characters: False-ProxyTypeProxyAccessType to use for the PsSessionType: ProxyAccessTypeParameter Sets: (All)Aliases:Accepted values: None, IEConfig, WinHttpConfig, AutoDetect, NoProxyServerRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/connect-sfb/\"\n},{\n  \"id\": \"powershell-convert-subnetmask\",\n  \"title\": \"Convert-SubnetMask\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Convert-SubnetMaskSYNOPSISConvert a SubnetMask to PrefixLength or vice-versa.SYNTAXConvert-SubnetMask [-SubnetMask] &lt;Object&gt; [&lt;CommonParameters&gt;]DESCRIPTIONLong descriptionEXAMPLESEXAMPLE 1Convert-SubnetMask 24255.255.255.0This example converts the PrefixLength 24 to a dotted SubnetMask.EXAMPLE 2Convert-SubnetMask 255.255.0.016This example counts the relevant network bits of the dotted SubnetMask 255.255.0.0.PARAMETERS-SubnetMaskSubnetMask to convertType: ObjectParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string]OUTPUTS[string]NOTESLogic from: https://d-fens.ch/2013/11/01/nobrainer-using-powershell-to-convert-an-ipv4-subnet-mask-length-into-a-subnet-mask-address/RELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convert-subnetmask/\"\n},{\n  \"id\": \"powershell-convert-texttospeech\",\n  \"title\": \"Convert-TextToSpeech\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Convert-TextToSpeechSYNOPSISConvert a string to audio using Azure Cognitive Services.SYNTAXConvert-TextToSpeech [-Text] &lt;String&gt; [-Path] &lt;FileInfo&gt; [[-Voice] &lt;String&gt;] [[-OutputFormat] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to call the Azure Cognitive Service Speech Service API, convert a string to speech, and save the resulting audio to a file.EXAMPLESEXAMPLE 1Convert-TextToSpeech -Text \\\"Hi, this is a test.\\\" -Path test.mp3This example converts the string “Hi, this is a test.” to speech and saves the audio to the test.mp3 file.PARAMETERS-TextType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathType: FileInfoParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-VoiceType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: En-GB-LibbyNeuralAccept pipeline input: FalseAccept wildcard characters: False-OutputFormatType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Audio-16khz-32kbitrate-mono-mp3Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convert-texttospeech/\"\n},{\n  \"id\": \"powershell-convertfrom-base64\",\n  \"title\": \"ConvertFrom-Base64\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertFrom-Base64SYNOPSISConvert Base64 to ClearText StringSYNTAXConvertFrom-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis Function uses [System.Convert] to convert Base64 encoded String to ClearText.The Encoding parameter can be used to specify which encoding to use.Believe it or not, works on Linux/macOS!EXAMPLESEXAMPLE 1ConvertFrom-Base64 'YXdlc29tZSwgaXNuJ3QgaXQ/'This example converts the given Base64 encoded string to clear text.PARAMETERS-StringOne or more Strings to be convertedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-EncodingThe Encoding to use.Type: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DefaultAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertfrom-base64/\"\n},{\n  \"id\": \"powershell-convertfrom-sid\",\n  \"title\": \"ConvertFrom-SID\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertFrom-SIDSYNOPSISGet the account name for a SID.SYNTAXConvertFrom-SID [-SID] &lt;SecurityIdentifier&gt; [&lt;CommonParameters&gt;]DESCRIPTIONUse [System.Security.Principal.SecurityIdentifier].Translate() to get the samAccountName for a SIDEXAMPLESEXAMPLE 1ConvertFrom-SID -Sid S-1-5-21-2330142668-2157844774-769409458EXAMPLE 2\\\"S-1-3-1\\\" | ConvertFrom-SIDPARAMETERS-SIDSID, specify the SID to translate.Type: SecurityIdentifierParameter Sets: (All)Aliases: ValueRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSYou can pipe input to this function.OUTPUTSReturns string values.NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertfrom-sid/\"\n},{\n  \"id\": \"powershell-convertto-base64\",\n  \"title\": \"ConvertTo-Base64\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertTo-Base64SYNOPSISConvert a String to Base64SYNTAXConvertTo-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis Function uses [System.Convert] to convert a ClearText String to Base64.The Encoding parameter can be used to specify which encoding to use.Believe it or not, works on Linux/macOS!EXAMPLESEXAMPLE 1ConvertTo-Base64 'my cleartext'This example converts ‘my cleartext’ to Base64 using ‘Default’ encoding.PARAMETERS-StringOne or more Strings to be convertedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-EncodingThe Encoding to use.Type: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DefaultAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertto-base64/\"\n},{\n  \"id\": \"powershell-convertto-sid\",\n  \"title\": \"ConvertTo-SID\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertTo-SIDSYNOPSISGet the SID for an account nameSYNTAXConvertTo-SID [-SamAccountName] &lt;NTAccount&gt; [&lt;CommonParameters&gt;]DESCRIPTIONUse [System.Security.Principal.SecurityIdentifier].Translate() to get the SID for a samAccountNameEXAMPLESEXAMPLE 1ConvertTo-SID -SamAccountName ttorgglerEXAMPLE 2\\\"ntsystems\\\\ttorggler\\\" | ConvertTo-SIDPARAMETERS-SamAccountNameSamAccountName, specify the account name to translate.Type: NTAccountParameter Sets: (All)Aliases: ValueRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSYou can pipe input to this function.OUTPUTSReturns string values.NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertto-sid/\"\n},{\n  \"id\": \"powershell-edit-etchosts\",\n  \"title\": \"Edit-EtcHosts\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Edit-EtcHostsSYNOPSISEdit etc hosts file with notepad.SYNTAXEdit-EtcHostsDESCRIPTIONThis funtion starts notepad.exe as administrator and opens the hosts file for editing.If this function is running on PowerShell Core, it runs “sudo vi /etc/hosts”run notepad as administrator and open the hosts file for editingEXAMPLESExample 1PS C:\\\\&gt; PARAMETERSINPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/edit-etchosts/\"\n},{\n  \"id\": \"powershell-get-dkimrecord\",\n  \"title\": \"Get-DKIMRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-DKIMRecordSYNOPSISGet DKIM Record for a domain.SYNTAXGet-DKIMRecord [-DomainName] &lt;String&gt; [[-Selector] &lt;String[]&gt;] [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to get the DKIM Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.The function defaults to “selector1” as thisis typically used with Exchange Online.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-DKIMRecordThis example gets DKIM records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name to use in the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-SelectorSpecify a selector name to use in the query.Type: String[]Parameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: @(\\\"selector1\\\",\\\"selector2\\\")Accept pipeline input: FalseAccept wildcard characters: False-ServerSpecify a DNS server to query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-dkimrecord/\"\n},{\n  \"id\": \"powershell-get-dmarcrecord\",\n  \"title\": \"Get-DMARCRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-DMARCRecordSYNOPSISGet DMARC Record for a domain.SYNTAXGet-DMARCRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to get the DMARC Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-DMARCRecordThis example gets DMARC records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name to use for the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-ServerSpecify a DNS server to query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-dmarcrecord/\"\n},{\n  \"id\": \"powershell-get-macaddressvendor\",\n  \"title\": \"Get-MacAddressVendor\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-MacAddressVendorSYNOPSISMac Address vendor lookup.SYNTAXGet-MacAddressVendor [-MacAddress] &lt;Object&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-WebRequest to look up the vendor of a Mac Address’ Organizationally Unique Identifier (OUI).Works on PowerShell Core for Linux/macOS.EXAMPLESEXAMPLE 1Get-MacAddressVendor -MacAddress '00-50-56-C0-00-01','00:0F:FE:E8:4F:27'This example looks up the vendor for the two specified Mac Addresses.EXAMPLE 2Get-NetAdapter | Get-MacAddressVendorThis example looks up the vendor of all network adapters returned by Get-NetAdapter.EXAMPLE 3Get-NetAdapterConfig -ComputerName Server01.domain.local | Get-MacAddressVendorThis example looks up the vendor of all network adapters returned by Get-NetAdapterConfig which supports remoting.EXAMPLE 4Get-DhcpServerv4Lease -ComputerName DhcpServer -ScopeId 192.168.1.0 | Get-MacAddressVendorThis example looks up the vendor of all currently assigned address leases on a DHCP Server.PARAMETERS-MacAddressSpecifiy a MAC Address to look upType: ObjectParameter Sets: (All)Aliases: ClientId, MARequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.Management.Automation.PSObjectNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-macaddressvendor/\"\n},{\n  \"id\": \"powershell-get-mxrecord\",\n  \"title\": \"Get-MxRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-MxRecordSYNOPSISGet MX Records for a domain.SYNTAXGet-MxRecord [-Domain] &lt;String&gt; [[-Server] &lt;IPAddress&gt;] [-ResolvePTR] [&lt;CommonParameters&gt;]DESCRIPTIONUses Resolve-DnsName to get MX Records, Priority and the IP Address of the records.EXAMPLESEXAMPLE 1Get-MxRecord ntsystems.itThis example gets the MX record for the domain ntsystems.it.PARAMETERS-DomainSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases: DomainNameRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-ServerSpecify the DNS server to query.Type: IPAddressParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ResolvePTRAlso resolve PTRType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string]OUTPUTS[Selected.Microsoft.DnsClient.Commands.DnsRecord_MX]NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-mxrecord/\"\n},{\n  \"id\": \"powershell-get-spfrecord\",\n  \"title\": \"Get-SPFRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SPFRecordSYNOPSISGet SPF Record for a domain.If the include tag is present, recursively get that SPF Record, too.SYNTAXGet-SPFRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [-Recurse] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to recursively get the SPF Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-SPFRecordThis example gets SPF records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-ServerSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-RecurseType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-spfrecord/\"\n},{\n  \"id\": \"powershell-get-speechtoken\",\n  \"title\": \"Get-SpeechToken\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SpeechTokenSYNOPSISGet OAuth token for authorization to Azure Cognitive Services.SYNTAXGet-SpeechToken [-Region] &lt;String&gt; [-Key] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get a bearer token that can be used in the Authorization header when calling Azure Cognitive Services.This requires access to an Azure subscription and API key for the speech service.EXAMPLESEXAMPLE 1Get-SpeechToken -Region &lt;region&gt; -Key &lt;apikey&gt;This example gets a token using the provided key and region.PARAMETERS-RegionType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-KeyType: StringParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESKey should probably be a secure string, update once secrets management module is released.The token is stored in $script:SpeechToken and can be retrieved with Get-SpeechTokenResultRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-speechtoken/\"\n},{\n  \"id\": \"powershell-get-speechtokenresult\",\n  \"title\": \"Get-SpeechTokenResult\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SpeechTokenResultSYNOPSISSYNTAXGet-SpeechTokenResultDESCRIPTIONEXAMPLESExample 1PS C:\\\\&gt; PARAMETERSINPUTSNoneOUTPUTSSystem.ObjectNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-speechtokenresult/\"\n},{\n  \"id\": \"powershell-get-speechvoiceslist\",\n  \"title\": \"Get-SpeechVoicesList\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SpeechVoicesListSYNOPSISGet a list of available voices from the speech service.SYNTAXGet-SpeechVoicesList [[-token] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get a list of available voices from the Azure Cognitive Services Speech Service.Use the Token parameterto specify a token created with Get-SpeechToken and use the Region parameter to specify a region other than the default westeurope.If the Token parameter is not specified, the global variable created by Save-SpeechToken is used.EXAMPLESEXAMPLE 1Get-SpeechVoicesListThis example gets a list of available voices.PARAMETERS-tokenType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: $script:SpeechToken.TokenAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-speechvoiceslist/\"\n},{\n  \"id\": \"powershell-get-takhash\",\n  \"title\": \"Get-TakHash\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-TakHashSYNOPSISGet hash for a string.SYNTAXGet-TakHash [-String] &lt;String&gt; [[-Algorithm] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses various various crypto service providers to get the hash value for a given input string.EXAMPLESEXAMPLE 1Get-TakHash \\\"Hello World!\\\"This example returns the MD5 hash of “Hello World!”.EXAMPLE 2Get-TakHash \\\"Hello World!\\\" -Algorithm Sha256This example gets the SHA256 hash of “Hello World!”.PARAMETERS-StringType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-AlgorithmType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-takhash/\"\n},{\n  \"id\": \"powershell-get-wlanprofile\",\n  \"title\": \"Get-WlanProfile\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-WlanProfileSYNOPSISSYNTAXGet-WlanProfileDESCRIPTIONEXAMPLESExample 1PS C:\\\\&gt; PARAMETERSINPUTSNoneOUTPUTSSystem.ObjectNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-wlanprofile/\"\n},{\n  \"id\": \"powershell-import-csr\",\n  \"title\": \"Import-Csr\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Import-CsrSYNOPSISImport certificate signing request from base64 text.SYNTAXImport-Csr [[-Path] &lt;FileInfo&gt;] [-ShowText] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses the Windows Subsystem for Linux to invoke `openssl` to decode a certificate signing request.EXAMPLESEXAMPLE 1Import-Csr c:\\\\temp\\\\cert.reqThis example imports a CSR located at the given path and decodes it’s contents.PARAMETERS-PathType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ShowTextType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNoneOUTPUTS[psobject]NOTESAuthor: @torgglerDate: 2019-06-14RELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/import-csr/\"\n},{\n  \"id\": \"powershell-import-dhcpserverlog\",\n  \"title\": \"Import-DhcpServerLog\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Import-DhcpServerLogSYNOPSISImport DHCP Server Log files.SYNTAXImport-DhcpServerLog [[-Path] &lt;Object&gt;] [[-Filter] &lt;Object&gt;] [[-ComputerName] &lt;Object&gt;] [-Latest] [&lt;CommonParameters&gt;]DESCRIPTIONThis function imports DHCP Server Log files from CSV format.EXAMPLESEXAMPLE 1Import-DhcpServerLogImport all logs found in the default log folder.PARAMETERS-PathType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: C:\\\\Windows\\\\System32\\\\dhcpAccept pipeline input: FalseAccept wildcard characters: False-FilterType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DhcpSrvLog*.logAccept pipeline input: FalseAccept wildcard characters: False-ComputerNameType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-LatestType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/import-dhcpserverlog/\"\n},{\n  \"id\": \"powershell-import-iislog\",\n  \"title\": \"Import-IISLog\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Import-IISLogSYNOPSISImport IIS log files with default header.SYNTAXImport-IISLog [[-Path] &lt;String&gt;] [[-Filter] &lt;String&gt;] [[-Line] &lt;Object&gt;] [[-Tail] &lt;Int32&gt;] [[-Count] &lt;Int32&gt;] [-Wait] [&lt;CommonParameters&gt;]DESCRIPTIONThis function imports IIS log files from CSV format.EXAMPLESEXAMPLE 1Import-IISLogImport the latest log found in the default log folder.EXAMPLE 2Import-IISLog -Tail 10 -WaitImport the latest 10 lines of the latest log found in the default log folder and wait for new lines until stopped with ctrl-c.PARAMETERS-PathType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: C:\\\\inetpub\\\\logs\\\\LogFiles\\\\*Accept pipeline input: FalseAccept wildcard characters: False-FilterType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: *.logAccept pipeline input: FalseAccept wildcard characters: False-LineType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-TailType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: -1Accept pipeline input: FalseAccept wildcard characters: False-CountType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: 1Accept pipeline input: FalseAccept wildcard characters: False-WaitType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[IISLogEntry]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/import-iislog/\"\n},{\n  \"id\": \"powershell-invoke-whoisrequest\",\n  \"title\": \"Invoke-WhoisRequest\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Invoke-WhoisRequestSYNOPSISWohis request.SYNTAXInvoke-WhoisRequest [-DomainName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function creats a New-WebServiceProxy and then uses the GetWhoIs method to query whois information from www.webservicex.netEXAMPLESEXAMPLE 1Invoke-WhoisRequest -DomainName ntsystems.itThis example queries whois information for the domain ntsystems.itPARAMETERS-DomainNameType: StringParameter Sets: (All)Aliases: domainRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/invoke-whoisrequest/\"\n},{\n  \"id\": \"powershell-new-firewallrule\",\n  \"title\": \"New-FirewallRule\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"New-FirewallRuleSYNOPSISCreate a new Windows Firewall Rule.SYNTAXNew-FirewallRule [[-Port] &lt;Int32&gt;] [[-Protocol] &lt;String&gt;] [[-Store] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function is wrapper for New-NetFirewallRule with the goal of making it easier to create simple firewall rules and have consistent naming.EXAMPLESEXAMPLE 1New-FirewallRule -Port 6060This example creats a new firewall rule to allow connections on tcp/6060.PARAMETERS-PortType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: 0Accept pipeline input: FalseAccept wildcard characters: False-ProtocolType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: TCPAccept pipeline input: FalseAccept wildcard characters: False-StoreType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: PersistentStoreAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/new-firewallrule/\"\n},{\n  \"id\": \"powershell-new-rgsreport\",\n  \"title\": \"New-RgsReport\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"New-RgsReportSYNOPSISGather information about Skype for Business Response Groups, Queues, Agent Groups.SYNTAXNew-RgsReport [[-Filter] &lt;String&gt;] [-Path] &lt;FileInfo&gt; [-Html] [-PassThru] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses varios cmdlets of the Lync module (or an appropriate remote session) to gather information about Response Groups.EXAMPLESEXAMPLE 1Get-RgsReport -Filter Office -Path .\\\\Desktop\\\\report.csvThis example creates a CSV report for all RGS workflows matching Office.EXAMPLE 2Get-RgsReport -Filter Office -Path .\\\\Desktop\\\\report.html -HtmlThis example creates a HTML report for all RGS workflows matching Office.EXAMPLE 3Get-RgsReport -Filter Office -Path .\\\\Desktop\\\\report.html -Html -PassThru | Out-GridViewThis example creates a HTML report for all RGS workflows matching Office, because the PassThru switch is present,the collected data will also be written to the pipeline.From there we can use it and pipe it to Out-GridView or do whatever.PARAMETERS-FilterType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathType: FileInfoParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-HtmlType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-PassThruType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/new-rgsreport/\"\n},{\n  \"id\": \"powershell-new-spfrecord\",\n  \"title\": \"New-SPFRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"New-SPFRecordSYNOPSISCreate SPF record for a given mail domain.SYNTAXNew-SPFRecord [[-DomainName] &lt;String&gt;] [-mx] [-a] [-ptr] [[-IncludeIP] &lt;IPAddress[]&gt;] [[-IncludeDomain] &lt;String&gt;] [[-IncludeHost] &lt;String&gt;] [[-Action] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function helps with creating SPF records for mail domains.The SPF record should look something like this:v=spf1 mx a ptr ip4:127.1.1.1/24 a:host.example.com include:example.com -allMore information: https://www.ietf.org/rfc/rfc4408.txtEXAMPLESEXAMPLE 1Get-AcceptedDomain | New-SPFRecord -mx -IncludeDomain spf.protection.outlook.com -IncludeIP 192.0.2.1,2001:DB8::1 -Action FailDomainName : uclab.euRecord     : “v=spf1 mx ip4:192.0.2.1 ip6:2001:DB8::1 include:spf.protection.outlook.com -all”The above example creates SPF records for all accepted domains in Exchange (Online).PARAMETERS-DomainNameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-mxType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-aType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-ptrType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-IncludeIPType: IPAddress[]Parameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-IncludeDomainType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-IncludeHostType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ActionType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: FailAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string][AcceptedDomain]This function accepts a string or objects with a DomainName property (such as returned by Get-AcceptedDomain) as input.OUTPUTS[psobject]This function writes a custom object to the pipeline.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/new-spfrecord/\"\n},{\n  \"id\": \"powershell-remove-etchostsentry\",\n  \"title\": \"Remove-EtcHostsEntry\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Remove-EtcHostsEntrySYNOPSISRemove an entry from local hosts file by it’s IP address.SYNTAXRemove-EtcHostsEntry [[-IPAddress] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONFind an IP address and remove all lines where it appears from the \\\\etc\\\\hosts file of the local computer.EXAMPLESEXAMPLE 1Remove-EtcHostsEntry -IPAddress 1.1.1.1This example removes following lines from the hosts file1.1.1.1 test.test1.1.1.1 another.test.comPARAMETERS-IPAddressIPAddress of the hosts entry to be addedType: StringParameter Sets: (All)Aliases: ipRequired: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/remove-etchostsentry/\"\n},{\n  \"id\": \"powershell-show-etchosts\",\n  \"title\": \"Show-EtcHosts\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Show-EtcHostsSYNOPSISDisplay /etc/hosts file content on Windows or Linux/macOS.SYNTAXShow-EtcHosts [&lt;CommonParameters&gt;]DESCRIPTIONThis funtion gets the content of the hosts file, parses the lines and outputsa custom object with HostName and IPAddress properties.EXAMPLESExample 1PS C:\\\\&gt; PARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/show-etchosts/\"\n},{\n  \"id\": \"powershell-show-wlanprofile\",\n  \"title\": \"Show-WlanProfile\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Show-WlanProfileSYNOPSISGet wlan pre-shared key.SYNTAXShow-WlanProfile [[-Name] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function invokes the netsh tool to get the pre-shared key for a given wireless lan profile.EXAMPLESEXAMPLE 1Show-WlanProfile \\\"my_net\\\"This example shows the key for the wlan profile “my_net”EXAMPLE 2Get-WlanProfile | Show-WlanProfileThis example shows the keys for all known wlan profiles on the system.PARAMETERS-NameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/show-wlanprofile/\"\n},{\n  \"id\": \"powershell-test-exchangeautodiscover\",\n  \"title\": \"Test-ExchangeAutodiscover\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-ExchangeAutodiscoverSYNOPSISTest Exchange Autodiscover Web Service.SYNTAXTest-ExchangeAutodiscover [[-EmailAddress] &lt;String&gt;] [[-ComputerName] &lt;String&gt;] [[-Credential] &lt;PSCredential&gt;] [-ExcludeExplicitO365Endpoint] [[-Report] &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function tests the Exchange Autodiscover Web Serivce for a given Emailaddress.If ComputerName is not specified,the function tries to look up the Autodiscover service using the Outlook Clients logic.Locally cached and SCP dataare not evaluated.EXAMPLESEXAMPLE 1Test-ExchangeAutodiscover thomas@ntsystems.it -Credential (Get-Credential)This example tests the Autodiscover service for the given mailbox.It will query dns for autodiscover.ntsystems.it and _autodiscover._tcp.ntsystems.it. It will then try to retrieve an Autodiscover payload from https://ntsystems.it, https://autodiscover.ntsystems.it and the Office 365 endpoint.PARAMETERS-EmailAddressType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ComputerNameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-CredentialType: PSCredentialParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ExcludeExplicitO365EndpointType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-ReportType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-exchangeautodiscover/\"\n},{\n  \"id\": \"powershell-test-federationservice\",\n  \"title\": \"Test-FederationService\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-FederationServiceSYNOPSISTest the ADFS web serviceSYNTAXTest-FederationService [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to test if the federation service metadata can be retrieved from a given server.EXAMPLESEXAMPLE 1Test-FederationService -ComputerName fs.uclab.euThis example gets federation service xml information over the server fs.uclab.euPARAMETERS-ComputerNameSpecifies the name of the federation serverType: StringParameter Sets: (All)Aliases: ServerRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-federationservice/\"\n},{\n  \"id\": \"powershell-test-lyncdns\",\n  \"title\": \"Test-LyncDNS\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-LyncDNSSYNOPSISTest DNS entries for Skype for Business / Lync deployments.SYNTAXDESCRIPTIONThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.The NameSever parameter can be used to specify a nameserver.EXAMPLESEXAMPLE 1Test-LyncDNS -SipDomain uclab.euThis example queries DNS records for the domain uclab.euPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-lyncdns/\"\n},{\n  \"id\": \"powershell-test-lyncdiscover\",\n  \"title\": \"Test-LyncDiscover\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-LyncDiscoverSYNOPSISTest the Lyncdiscover service for Skype for Business/Lync deploymentsSYNTAXDESCRIPTIONThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.EXAMPLESEXAMPLE 1Test-LyncDiscover -SipDomain uclab.eu -HttpThis example gets Lyncdiscover information over http for the domain uclab.euPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-lyncdiscover/\"\n},{\n  \"id\": \"powershell-test-oosfarm\",\n  \"title\": \"Test-OOSFarm\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-OOSFarmSYNOPSISGet internal and external URLs for PowerPoint sharing.SYNTAXTest-OOSFarm [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get and parse hosting discovery information for Office Online Server farms.If successfull, it returns a custom object with the internal and external URL for PowerPoint sharing.EXAMPLESEXAMPLE 1Test-OOSFarm -Name oos.example.comThis example tries to retrieve information from https://oos.example.com/hosting/discoveryPARAMETERS-ComputerNameSpecifies the name of the OOS server/farmType: StringParameter Sets: (All)Aliases: Server, Farm, NameRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-oosfarm/\"\n},{\n  \"id\": \"powershell-test-sfbdns\",\n  \"title\": \"Test-SfBDNS\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-SfBDNSSYNOPSISTest DNS entries for Skype for Business / Lync deployments.SYNTAXTest-SfBDNS [-SipDomain] &lt;String&gt; [[-NameServer] &lt;IPAddress&gt;] [-OpenDNS] [-internal] [-testConnection] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.The NameSever parameter can be used to specify a nameserver.EXAMPLESEXAMPLE 1Test-LyncDNS -SipDomain uclab.euThis example queries DNS records for the domain uclab.euPARAMETERS-SipDomainSpecifies the DNS domain name to testType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-NameServerSpecifies the nameserver which is used by Resolve-DnsNameType: IPAddressParameter Sets: (All)Aliases: ServerRequired: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-OpenDNSA quick way to use OpenDns servers instead of using NameServerType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-internalDo also query for internal records, they should only resolve when testing from the internal networkType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-testConnectionDo also test a TLS connection to the servers received from the queryType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-sfbdns/\"\n},{\n  \"id\": \"powershell-test-sfbdiscover\",\n  \"title\": \"Test-SfBDiscover\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-SfBDiscoverSYNOPSISTest the Lyncdiscover service for Skype for Business/Lync deploymentsSYNTAXTest-SfBDiscover [-SipDomain] &lt;String&gt; [-Http] [-internal] [-Online] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.EXAMPLESEXAMPLE 1Test-LyncDiscover -SipDomain uclab.eu -HttpThis example gets Lyncdiscover information over http for the domain uclab.euPARAMETERS-SipDomainSpecifies a DNS domain name to testType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-HttpUse HTTP instead of HTTPSType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-internalUse internal name (lyncdiscoverinternl) instead of the external one (lyncdiscover)Type: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-OnlineTest against Office 365 endpointsType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-sfbdiscover/\"\n},{\n  \"id\": \"powershell-test-tcpconnection\",\n  \"title\": \"Test-TCPConnection\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-TCPConnectionSYNOPSISTest if a TCP Connection can be established.SYNTAXTest-TCPConnection [-ComputerName] &lt;Object&gt; [[-Port] &lt;Object&gt;] [-Count &lt;Int32&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses System.Net.Sockets.Tcpclient to test if a TCP connection can be established with aComputerName on a given port.Much like “telnet” which is not installed by default.EXAMPLESEXAMPLE 1Test-TcpConnection -ComputerName www.ntsystems.itThis example tests if port 80 can be reached on www.ntsystems.itEXAMPLE 2Test-TcpConnection -ComputerName www.ntsystems.it -Port 25 -Count 4This example tests for 4 times if port 25 can be reached on www.ntsystems.itPARAMETERS-ComputerNameSpecifies the DNS name of the computer to testType: ObjectParameter Sets: (All)Aliases: HostName, Server, RemoteHostRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-PortSpecifies the TCP port to test on the remote computer.Type: ObjectParameter Sets: (All)Aliases: RemotePortRequired: FalsePosition: 2Default value: 80Accept pipeline input: FalseAccept wildcard characters: False-CountSpecifies the number of tests to run, this can be useful when testing load-balanced services; default is 1Type: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: 1Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.BooleanNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-tcpconnection/\"\n},{\n  \"id\": \"powershell-test-tlsconnection\",\n  \"title\": \"Test-TLSConnection\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-TLSConnectionSYNOPSISTest if a TLS Connection can be established.SYNTAXComputerNameTest-TLSConnection [-ComputerName] &lt;Object&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]UriTest-TLSConnection -Uri &lt;Uri&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses System.Net.Sockets.Tcpclient and System.Net.Security.SslStream to connect to a ComputerName andauthenticate via TLS.This is useful to check if a TLS connection can be established and if the certificate used onthe remote computer is trusted on the local machine.If the connection can be established, the certificate’s properties will be output as custom object.Optionally the certificate can be downloaded using the -SaveCert switch.The Protocol parameter can be used to specifiy which SslProtocol is used to perform the test.The CheckCertRevocationStatus parametercan be used to disable revocation checks for the remote certificate.EXAMPLESEXAMPLE 1Test-TlsConnection -ComputerName www.ntsystems.itThis example connects to www.ntsystems.it on port 443 (default) and outputs the certificate’s properties.EXAMPLE 2Test-TlsConnection -ComputerName sipdir.online.lync.com -Port 5061 -Protocol Tls12 -SaveCertThis example connects to sipdir.online.lync.com on port 5061 using TLS 1.2 and saves the certificate to the temp folder.EXAMPLE 3Test-TlsConnection -IPAddress 1.1.1.1 -ComputerName whatever.cloudflare.comThis example connects to the IP 1.1.1.1 using a Hostname of whatever.cloudflare.com.This can be useful to test hosts that don’t have DNS records configured.EXAMPLE 4\\\"host1.example.com\\\",\\\"host2.example.com\\\" | Test-TLSConnection -Protocol Tls11 -QuietThis example tests connection to the hostnames passed by pipeline input.It uses the -Quiet parameter and therefore only returns true/flase.PARAMETERS-ComputerNameSpecifies the DNS name of the computer to testType: ObjectParameter Sets: ComputerNameAliases: Server, Name, HostNameRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-UriType: UriParameter Sets: UriAliases: ExternalUrlRequired: TruePosition: NamedDefault value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-IPAddressSpecifies the IP Address of the computer to test.Can be useful if no DNS record exists.Type: IPAddressParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PortSpecifies the TCP port on which the TLS service is running on the computer to testType: ObjectParameter Sets: (All)Aliases: RemotePortRequired: FalsePosition: 2Default value: 443Accept pipeline input: FalseAccept wildcard characters: False-ProtocolType: SslProtocols[]Parameter Sets: (All)Aliases:Accepted values: None, Ssl2, Ssl3, Tls, Default, Tls11, Tls12, Tls13Required: FalsePosition: 3Default value: Tls12Accept pipeline input: FalseAccept wildcard characters: False-FilePathSpecifies a path to a file (.cer) where the certificate should be saved if the SaveCert switch parameter is usedType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Temp.cerAccept pipeline input: FalseAccept wildcard characters: False-CheckCertRevocationStatusCheck revocation information for remote certificate.Default is true.Type: BooleanParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: TrueAccept pipeline input: FalseAccept wildcard characters: False-SaveCertSaves the remote certificate to a file, the path can be specified using the FilePath parameterType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-QuietOnly returns true or false, instead of a custom object with some information.Type: SwitchParameterParameter Sets: (All)Aliases: SilentRequired: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.Management.Automation.PSObjectSystem.BooleanNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-tlsconnection/\"\n},{\n  \"id\": \"powershell-update-filewritetime\",\n  \"title\": \"Update-FileWriteTime\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Update-FileWriteTimeSYNOPSISTouch a file.SYNTAXUpdate-FileWriteTime [-Name] &lt;String[]&gt; [-Date &lt;DateTime&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function checks whether a given file exists, and if so, updates the LastWriteTime property of the given file.Should the file not exist, a new, empty file is created.This function works on Linux/macOS.EXAMPLESEXAMPLE 1touch myfileThis example creates myfile if it does not exist in the current directory.If the file does exist, the LastWriteTime property will be updated.PARAMETERS-NameOne or more filenames to be touchedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-DateSpecify a specific date for LastWriteTimeType: DateTimeParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: (Get-Date)Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/update-filewritetime/\"\n},{\n  \"id\": \"tags-adfs\",\n  \"title\": \"ADFS\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/adfs/\"\n},{\n  \"id\": \"tags-ai\",\n  \"title\": \"AI\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/ai/\"\n},{\n  \"id\": \"tags-asr\",\n  \"title\": \"ASR\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/asr/\"\n},{\n  \"id\": \"tags-appv\",\n  \"title\": \"AppV\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/appv/\"\n},{\n  \"id\": \"tags-audiocodes\",\n  \"title\": \"AudioCodes\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/audiocodes/\"\n},{\n  \"id\": \"tags-azure\",\n  \"title\": \"Azure\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/azure/\"\n},{\n  \"id\": \"tags-basics\",\n  \"title\": \"Basics\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/basics/\"\n},{\n  \"id\": \"tags-cisco\",\n  \"title\": \"Cisco\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/cisco/\"\n},{\n  \"id\": \"tags-citrix\",\n  \"title\": \"Citrix\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/citrix/\"\n},{\n  \"id\": \"tags-client\",\n  \"title\": \"Client\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/client/\"\n},{\n  \"id\": \"tags-cloud\",\n  \"title\": \"Cloud\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/cloud/\"\n},{\n  \"id\": \"tags-crypto\",\n  \"title\": \"Crypto\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/crypto/\"\n},{\n  \"id\": \"tags-events\",\n  \"title\": \"Events\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/events/\"\n},{\n  \"id\": \"tags-exchange\",\n  \"title\": \"Exchange\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/exchange/\"\n},{\n  \"id\": \"tags-firewall\",\n  \"title\": \"Firewall\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/firewall/\"\n},{\n  \"id\": \"tags-github\",\n  \"title\": \"GitHub\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/github/\"\n},{\n  \"id\": \"tags-go\",\n  \"title\": \"Go\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/go/\"\n},{\n  \"id\": \"tags-help\",\n  \"title\": \"Help\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/help/\"\n},{\n  \"id\": \"tags-home-server\",\n  \"title\": \"Home-Server\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/home-server/\"\n},{\n  \"id\": \"tags-hybrid\",\n  \"title\": \"Hybrid\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/hybrid/\"\n},{\n  \"id\": \"tags-hyper-v\",\n  \"title\": \"Hyper-V\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/hyper-v/\"\n},{\n  \"id\": \"tags-intune\",\n  \"title\": \"Intune\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/intune/\"\n},{\n  \"id\": \"tags-jekyll\",\n  \"title\": \"Jekyll\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/jekyll/\"\n},{\n  \"id\": \"tags-lync\",\n  \"title\": \"Lync\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/lync/\"\n},{\n  \"id\": \"tags-markdown\",\n  \"title\": \"MarkDown\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/markdown/\"\n},{\n  \"id\": \"tags-network\",\n  \"title\": \"Network\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/network/\"\n},{\n  \"id\": \"tags-office365\",\n  \"title\": \"Office365\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/office365/\"\n},{\n  \"id\": \"tags-onlinehelp\",\n  \"title\": \"OnlineHelp\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/onlinehelp/\"\n},{\n  \"id\": \"tags-powershell\",\n  \"title\": \"PowerShell\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/powershell/\"\n},{\n  \"id\": \"tags-rds\",\n  \"title\": \"RDS\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/rds/\"\n},{\n  \"id\": \"tags-rm\",\n  \"title\": \"RM\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/rm/\"\n},{\n  \"id\": \"tags-sql\",\n  \"title\": \"SQL\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/sql/\"\n},{\n  \"id\": \"tags-security\",\n  \"title\": \"Security\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/security/\"\n},{\n  \"id\": \"tags-server-2003\",\n  \"title\": \"Server-2003\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2003/\"\n},{\n  \"id\": \"tags-server-2008-r2\",\n  \"title\": \"Server-2008-R2\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2008-r2/\"\n},{\n  \"id\": \"tags-server-2008\",\n  \"title\": \"Server-2008\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2008/\"\n},{\n  \"id\": \"tags-server-2012-r2\",\n  \"title\": \"Server-2012-R2\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2012-r2/\"\n},{\n  \"id\": \"tags-server-2012\",\n  \"title\": \"Server-2012\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2012/\"\n},{\n  \"id\": \"tags-server\",\n  \"title\": \"Server\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server/\"\n},{\n  \"id\": \"tags-sharepoint\",\n  \"title\": \"Sharepoint\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/sharepoint/\"\n},{\n  \"id\": \"tags-skype4b\",\n  \"title\": \"Skype4B\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/skype4b/\"\n},{\n  \"id\": \"tags-teams\",\n  \"title\": \"Teams\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/teams/\"\n},{\n  \"id\": \"tags-update\",\n  \"title\": \"Update\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/update/\"\n},{\n  \"id\": \"tags-vmware\",\n  \"title\": \"VMware\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/vmware/\"\n},{\n  \"id\": \"tags-veeam\",\n  \"title\": \"Veeam\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/veeam/\"\n},{\n  \"id\": \"tags-wsl\",\n  \"title\": \"WSL\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/wsl/\"\n},{\n  \"id\": \"tags-workplace\",\n  \"title\": \"Workplace\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/workplace/\"\n},{\n  \"id\": \"tags-zed\",\n  \"title\": \"Zed\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/zed/\"\n},{\n  \"id\": \"tags-de\",\n  \"title\": \"de\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/de/\"\n},{\n  \"id\": \"tags-en\",\n  \"title\": \"en\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/en/\"\n},{\n  \"id\": \"tags-macos\",\n  \"title\": \"macOS\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/macos/\"\n},{\n  \"id\": \"tags-ntsystems\",\n  \"title\": \"ntSystems\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/ntsystems/\"\n},{\n  \"id\": \"tags-technology\",\n  \"title\": \"technology\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/technology/\"\n},{\n  \"id\": \"tags-uag\",\n  \"title\": \"uag\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/uag/\"\n},{\n  \"id\": \"post-lost-found-ai-highlights\",\n  \"title\": \"lost & found: AI highlights of the week\",\n  \"author\": \"tto\",\n  \"tags\": [\"AI\"],\n  \"content\": \"I learned a lot attending AI Lowlands this week and wanted to share some links and highlights.gpt-realtime and vibevoiceOpenAI’s gpt-realtime is available on Microsoft Foundry very fast but quite expensive.Microsoft just launched VibeVoice-Realtime.llms.txt and NLwebllms.txt as a way to provide LLM-friendly content has been around for a little while.Microsoft proposes NLweb as a proof-of-concept for conversational interfaces and a semantic layer for the web.planetary defensehera.space is on a mission to study asteroid deflection. the website is also a super-cool multi-modal AI showcase.\",\n  \"url\": \"https://onprem.wtf/post/lost-found-ai-highlights/\"\n},{\n  \"id\": \"post-technology-transforms-everything\",\n  \"title\": \"The Ecological Nature of Technological Change\",\n  \"author\": \"tto\",\n  \"tags\": [\"technology\"],\n  \"content\": \"  Technological change is not additive; it is ecological. A new medium does not add something; it changes everything.I’ve been thinking about this quote from media theorist Neil Postman lately. Written in the 1990s about television’s impact on society, it feels more relevant than ever as we watch AI reshape our industry.From Smartphones to AI: Patterns of ChangeConsider the smartphone: it didn’t just add a portable phone to our lives - it transformed how we navigate spaces (goodbye paper maps), coordinate socially (from fixed meeting times to fluid arrangements), and process information. This wasn’t simply adding features; it was a fundamental reshaping of our behaviors and capabilities.The AI Transformation in ITToday, we’re witnessing a similar ecological transformation with AI in the IT industry. Like previous technological waves, the initial phase brings a surge of integration work - much as we saw with cloud adoption. But AI isn’t just another tool being added to our stack; it’s reshaping the entire landscape of how we work.The traditional cycle of coding, debugging, and deployment is evolving. But perhaps most intriguingly, while previous technological advances often reduced human interaction, AI might do the opposite. By handling routine tasks, it could create more space for meaningful human collaboration.Looking AheadHowever, this remains largely theoretical. While we’re seeing increased integration work now, the deeper transformation of workplace dynamics will take time. Technology capabilities may advance rapidly, but organizational and human adaptation follows its own pace.The challenge ahead isn’t just technical implementation - it’s about thoughtfully shaping AI’s role to enhance rather than diminish human connection in our work. As with any ecological change, the outcomes will depend not just on the technology itself, but on how we choose to integrate it into our (professional) lives.— TomThis post was generated from a conversation I had with Claude.\",\n  \"url\": \"https://onprem.wtf/post/technology-transforms-everything/\"\n},{\n  \"id\": \"post-zed-pwsh\",\n  \"title\": \"Zed and PowerShell on macOS\",\n  \"author\": \"tto\",\n  \"tags\": [\"Zed\",\"PowerShell\"],\n  \"content\": \"VSCode has been my daily driver pretty much since it launched. It’s got a great community and amazing extensions, but sometimes it’s slow, and it started draining my battery a lot. I began looking for alternatives, and it wasn’t long before I came across Zed. Zed is a relatively new, high-performance code editor. It’s so fast that typing literally feels easier :)Most of my (coding) work revolves around PowerShell, so the lack of support was a problem for me. I followed Zed Industries’ GitHub and noticed that some good soul closed this issue a few days ago. Did they just add support for PowerShell? The answer is yes, as it turns out!The ExtensionFirst of all, we need to install the PowerShell extension. Like in VSCode, press ⌘ ⇧ X (Command + Shift + X) to open the extensions tab. Type “PowerShell” and press install.PowerShell Editor ServicesThen we need a language server to provide common editor features for the PowerShell language. Think tab completion, IntelliSense, best practices, and so on. There’s a PowerShell module that provides just that:             PowerShell/PowerShellEditorServices    Download the latest release and unzip it to a folder on your local device; in my case, it is: /Users/tom/code/PowerShellEditorServices.Zed ConfigurationLastly, we need to tell Zed where to find the language server (LSP). Again, like in VSCode, press ⌘ , (Command + ,) to open settings and configure the LSP. You can also set pwsh as the default shell and much more.\\\"terminal\\\": {  \\\"shell\\\": {    \\\"program\\\": \\\"pwsh\\\"  }},\\\"lsp\\\": {  \\\"powershell-es\\\": {    \\\"command\\\": \\\"pwsh\\\",    \\\"args\\\": [      \\\"-NoProfile\\\",      \\\"-Command\\\",      \\\"/Users/tom/code/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1\\\"    ]  }}Have fun!\",\n  \"url\": \"https://onprem.wtf/post/zed-pwsh/\"\n},{\n  \"id\": \"post-setup-sign-in-with-apple-with-azure-swa\",\n  \"title\": \"Configure Sign in with Apple for Azure Static Web App\",\n  \"author\": \"tto\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"I’m working on a side project and decided to use Sign in with Apple as an additional authentication provider, next to AAD that I would normally use.As per Microsoft’s documentation, adding apple as custom authentication provider is simple enough, just add the following lines to your staticwebapp.config.json file:\\\"identityProviders\\\": {    \\\"apple\\\": {    \\\"registration\\\": {        \\\"clientIdSettingName\\\": \\\"APPLE_CLIENT_ID\\\",        \\\"clientSecretSettingName\\\": \\\"APPLE_CLIENT_SECRET\\\"    }  }}Then we add the two setting names to the Web App’s configuration and we’re done, right? Almost.First we have to take a deep-dive into JWT as the APPLE_CLIENT_SECRET must be a signed JWT. There is no documentation specifically for Static Web Apps but this one for App Service is close enough.I converted the sample C# code to powershell for easier use. The required package have a dependency loop and so, instead of easily installing them with Install-Package I had to use nuget. Follow the documentation above to obtain client id, team id, key id, and the key in pkcs8 format, then use the following snippet to generate the client secret:function Get-AppleClientSecret {    param (        [string]$TeamId,        [string]$ClientId,        [string]$KeyId,        [System.IO.FileInfo]$P8KeyFile    )    $p8Content = Get-Content -Path $p8keyfile    $p8key = $p8Content.where{$_ -notmatch \\\"^---\\\"} -join(\\\"\\\")    [string]$audience = \\\"https://appleid.apple.com\\\"    [string]$issuer = $teamId    [string]$subject = $clientId    [string]$kid = $keyId    $Claims = New-Object -TypeName System.Collections.Generic.List[System.Security.Claims.Claim]    $Claims.Add(        (New-Object -TypeName System.Security.Claims.Claim(\\\"sub\\\", $subject))    )        $cngKey = [System.Security.Cryptography.CngKey]::Import(        [Convert]::FromBase64String($p8key),         [System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob    )    $signingCred = New-Object Microsoft.IdentityModel.Tokens.SigningCredentials(        (New-Object Microsoft.IdentityModel.Tokens.ECDsaSecurityKey(            (New-Object System.Security.Cryptography.ECDsaCng($cngKey)        ))),        \\\"ES256\\\" # EcdsaSha256    )    $NotBefore = Get-Date    $Expires = (Get-Date).AddDays(180)    $token = New-Object -TypeName System.IdentityModel.Tokens.Jwt.JwtSecurityToken(        $Issuer,         $Audience,         $Claims,         $NotBefore,         $Expires,         $signingCred    )    $null = $token.Header.Add(\\\"kid\\\", $kid)    $null = $token.Header.Remove(\\\"typ\\\")    $tokenHandler = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler        return $tokenHandler.WriteToken($token)}# install &amp; import requirementsInvoke-WebRequest -Uri 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' -OutFile \\\"$env:USERPROFILE\\\\Downloads\\\\nuget.exe\\\"&amp; \\\"$env:USERPROFILE\\\\Downloads\\\\nuget.exe\\\" Install System.IdentityModel.Tokens.Jwt -Version 6.32.0 -OutputDirectory \\\"$env:USERPROFILE\\\\Downloads\\\\.nuget\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.Tokens\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Tokens.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\System.IdentityModel.Tokens.Jwt\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\System.IdentityModel.Tokens.Jwt.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.Logging\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Logging.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.JsonWebTokens\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.JsonWebTokens.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\microsoft.identitymodel.abstractions\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Abstractions.dll\\\"# set parameters and get secret$p = @{    TeamId = \\\"Q847A7FG64\\\"    ClientId = \\\"wtf.onprem.appleid\\\"    KeyId = \\\"8QKD4J6XDZ\\\"    P8KeyFile = \\\".\\\\AuthKey_8QKD4J6XDZ.p8\\\"}Get-AppleClientSecret @pOnce we have obtained the APPLE_CLIENT_SECRET, the sign in process with Apple should be successful. However, after signing in, we are redirected to the Static Web App and greeted with a 403: Forbidden:  We need an email address or a handle from your login service. To use this login, please update your account with the missing info.It turns out the identityProviders example given in Microsoft’s documentation is not quite complete. Sign in with Apple only inserts the user’s email address as claim in the authentication token if we specifically ask for it during the sing in process. To do that, we have to add the scopes property to the staticwebapp.config.json file:\\\"identityProviders\\\": {    \\\"apple\\\": {    \\\"registration\\\": {        \\\"clientIdSettingName\\\": \\\"APPLE_CLIENT_ID\\\",        \\\"clientSecretSettingName\\\": \\\"APPLE_CLIENT_SECRET\\\"    },    \\\"login\\\": {        \\\"scopes\\\": [\\\"email\\\"]    }  }}Adding the scope will allow new users to sign in successfully. Users that had already signed in must first remove the app from Sign in with Apple in their Apple account.So, after adding the scope and removing the app from Sign in with Apple, we can finally attempt to sign in again and we should see that the user has to consent sharing their email address in the sign in process:                \",\n  \"url\": \"https://onprem.wtf/post/setup-sign-in-with-apple-with-azure-swa/\"\n},{\n  \"id\": \"post-mastodon-and-webfinger\",\n  \"title\": \"Mastodon and WebFinger\",\n  \"author\": \"tto\",\n  \"tags\": [\"ntSystems\",\"PowerShell\"],\n  \"content\": \"With the uncertainty surrounding Twitter I have decided to set up an account on Mastodon. If you haven’t heard about it Mastodon is an de-centralized, open-source alternative to centralized social media. It is powered by open protocols such as ActivityPub and WebFinger which allow federation of individual servers (called instances).If a user on one server searches for a user on another server, they will enter the full name, i.e. @user@example.com, into the search field. The server will then look for information about the user at the path https://example.com/.well-known/webfinger. If found, the reply contains information about where the profile of the user can be found.We can use this protocol to be discoverable by servers on our own domain. We are using Bridgetown to build this site so placing a JSON file at this path src/.well-known/webfinger did the trick. So even though my profile is currently hosted at masto.ai you can still find me with @tom@onprem.wtf. And if you do find me, give me a follow :)I used this PowerShell function to test the WebFinger endpoint on our and other sites.function Invoke-WebFinger {    [CmdletBinding()]    param(        [Parameter(ValueFromPipeline)]        [ValidatePattern('^@?[\\\\d\\\\w]+@[\\\\d\\\\w]+\\\\.[\\\\d\\\\w]+')]        [string]$Uri,        [string]$Server,        [string]$Username    )    process {        if($Uri){            $Username, $server = $uri -replace '^@' -split '@'        }        $webFingerUri = \\\"https://$server/.well-known/webfinger?resource=acct:$Username@$Server\\\"        Write-Verbose \\\"GET $webFingerUri\\\"        $r = Invoke-RestMethod -Uri $webFingerUri        [PSCustomObject]@{            Uri = $Username,$Server -join '@'            Subject = $r.subject            Aliases = $r.Aliases            ProfilePage = $r.links.where{$_.rel -eq 'http://webfinger.net/rel/profile-page'}.href        }    }}# Examples'tto@masto.ai','@tom@onprem.wtf' | Invoke-WebFingerInvoke-WebFinger -Uri tom@onprem.wtfInvoke-WebFinger -Server onprem.wtf -Username tomOther people wrote about this:  Use your own user @ domain for Mastodon discoverability with the WebFinger Protocol without hosting a server  Mastodon on your own domain without hosting a server  Using Cloudflare to Customize Your Mastodon Username Domain\",\n  \"url\": \"https://onprem.wtf/post/mastodon-and-webfinger/\"\n},{\n  \"id\": \"post-how-to-connect-exchange-online-managed-identity\",\n  \"title\": \"How to connect to Exchange Online powershell with a managed identity\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Azure\",\"Exchange\"],\n  \"content\": \"The latest preview version of the ExchangeOnlineManagement powershell module includes the following new parameters: -ManagedIdentity and -ManagedIdentityAccountId.As their names imply, they can be used to connect to Exchange Online with a managed identity. According to the documentation this is currently only supported with Azure Virtual Machines and Virtual Machine Scale Sets, however I have used this successfully within Azure Automation runbooks.Create the automation accountIf you have an existing account skip this step. I will be reusing the variables from this first example, so fill in the name of your automation account and the resource group.$accountName = 'azautomation1'$rgName = 'onprem-core'$location = 'West Europe'Connect-AzAccountNew-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -Location $locationGet the moduleThe first step is to add the module to the Automation Account. Installing it through the Azure Portal did not work, as that way only seems to support the latest non-preview version. I used the following commands from the Az powershell module to install the preview version of the module in my automation account:$moduleName = 'ExchangeOnlineManagement'$moduleVersion = '2.0.6-Preview7'New-AzAutomationModule -AutomationAccountName $accountName -ResourceGroupName $rgName -Name $moduleName -ContentLinkUri \\\"https://www.powershellgallery.com/api/v2/package/$moduleName/$moduleVersion\\\"Managed IdentityNow it’s time to enable the system assigned managed identity for the automation account. We can do this through the Azure portal by navigating to the automation account and setting the Status to On under Identity. Alternatively, we can use the Az powershell module like this:Set-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -AssignSystemIdentityNext we will need the id of the managed identity. It will show up in the Azure portal once it has been enabled or it can be retrieved with Az powershell:Get-AzADServicePrincipal -DisplayName $accountNameIn my case the object id is b395da15-4904-490c-9109-2bc91a12a08d. With this id in hand, we use the Microsoft Graph powershell SDK to grant the necessary permissions to the managed identity.Connect-MgGraph$params = @{    ServicePrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    PrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    ResourceId = (Get-MgServicePrincipal -Filter \\\"AppId eq '00000002-0000-0ff1-ce00-000000000000'\\\").id # Exchange online    AppRoleId = \\\"dc50a0fb-09a3-484d-be87-e023b12c6440\\\" # Exchange.ManageAsApp}New-MgServicePrincipalAppRoleAssignedTo @paramsLastly we want to assign the role Exchange Administrator to the managed identity. Again, we can do this through the Azure portal or with the following command:$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter \\\"DisplayName eq 'Exchange Administrator'\\\").idNew-MgRoleManagementDirectoryRoleAssignment -PrincipalId b395da15-4904-490c-9109-2bc91a12a08d -RoleDefinitionId 29232cdf-9323-42fd-ade2-1d097af3e4de -DirectoryScopeId \\\"/\\\"Please assign the role with the least amount of privileges to complete the task you need.Connect to Exchange Online in the runbookAfter completing the steps above we are ready to connect to Exchange Online using the managed identity in the runbook. If you create a new runbook, please make sure to use runtime version 5.1 as the that’s where we have imported the module earlier.Connect-ExchangeOnline -ManagedIdentity -Organization 'onpremwtf.onmicrosoft.com'Get-AcceptedDomainTom\",\n  \"url\": \"https://onprem.wtf/post/how-to-connect-exchange-online-managed-identity/\"\n},{\n  \"id\": \"post-goodbye-jekyll\",\n  \"title\": \"Goodbye Jekyll, hello Bridgetown!\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\"],\n  \"content\": \"We have been using Jekyll for our little site since 2016. It was fast, simple, it did it’s job nicely. Bridgetown does all the same things, and much more. It’s Jekyll’s modern cousin.We have used GitHub pages to host our site as it integrates nicely with Jekyll. I have long wanted to play with Cloudflare pages, so I decided to upgrade the site and move it over to Cloudflare in the progress.How to run Bridgetown on Cloudflare pages?Well, it’s easy enough, we just have to things to consider:  Include a .node-version file because Cloudflare pages defaults to 12.18.0 and bridgetown requires a version newer than 14  Set the BRIDGETOWN_ENV environment variable to productionTo tell Cloudflare pages to use a newer version of node, I created the file .node-version with the content 16.16.0 in the root directory of my repository. Just like with Jekyll, the base is a GitHub repository. All that’s left to do is sign in to Cloudflare and create a new pages project. I sign in to my GitHub account from Cloudflare, select the repository and enter the following information:Build command: bin/bridgetown deployBuild output directory: outputEnvironment variable: BRIDGETOWN_ENV  productionDone.Cloudflare redirectsWe have used Jekyll’s jekyll-redirect-from plugin to create redirects for some URLs. It seems bridgetown does not yet have a plugin for that, so I used Cloudflare page’s _redirect file instead. I created a file with the name _redirect in the src folder of my bridgetown project. The content of the file is like this:/a/very/long/url/path /shorturl 301You can read more in the docsI used the following few lines of powershell code to find Jekyll’s redirect_from statements in my source folder, convert them into slugs, and add them to the _redirect file.Get-ChildItem ./src/ -Recurse -Filter *.md | Select-String -pattern \\\"redirect_from\\\" | ForEach-Object {    $p = $_.path    $n = $_.filename    $l = $_.line    # remove date and extension from filename as slug contains neither    if($n -match \\\"^\\\\d{4}-\\\"){        $n = $n -replace \\\"\\\\d{4}-\\\\d{2}-\\\\d{2}-\\\",\\\"\\\"     }    $n = $n -replace \\\".md\\\",\\\"\\\"    $name = $n.ToLower()    # find parent path and create slug    $p = Split-Path -Path $p -Parent | Split-Path -Leaf    switch($p){        \\\"_OnlineHelp\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"Archive\\\" { $slug = \\\"/post/$name\\\" }        \\\"_Modules\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"_Scripts\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"_posts\\\" { $slug = \\\"/post/$name\\\" }    }    # write _redirects file    $l -replace \\\"redirect_from: \\\",\\\"\\\" | ConvertFrom-Json | ForEach-Object {        \\\"$_ $slug 301\\\"    } } | Set-Content ./src/_redirects\",\n  \"url\": \"https://onprem.wtf/post/goodbye-jekyll/\"\n},{\n  \"id\": \"post-sender-authentication-exo-2021\",\n  \"title\": \"How to configure sender authentication for Exchange Online in 2021\",\n  \"author\": \"tto\",\n  \"tags\": [\"Office365\",\"Exchange\",\"Security\"],\n  \"content\": \"The current state of emailThe year is 2021 and, despite many efforts to kill it off, email is still going strong. According to Microsoft’s latest digital defense report Exchange Online Protection processed 6 trillion messages last year, 13 billion of which malicious. 6 trillion, that’s a number with 12 zeros. And that’s just Exchange Online. Worldwide we are sending and receiving over 300 billion emails every day, according to this site. 300 billion. Every day.With these numbers there’s no wonder email is one of the main threat vectors.As many organizations are moving their mailboxes to Exchange Online, I thought I would share my basic setup for new tenants. This will help you getting started with a secure configuration in no time. I have two goals with this basic setup:  Protect your brand (domain) from being spoofed/abused  Protect your users from receiving malicious emailsSender AuthenticationSo you have just signed up for a new tenant with Microsoft 365 and you are adding your custom domains. The wizard will ask you, whether or not you are planning to use Exchange Online and, if you select yes, it will help you setup SPF.Sender policy frameworkEven though it has only been published as proposed standard by the IETF in 2014, SPF has been around since the early 2000’s. Despite it’s age it is still something we regularly find missing or misconfigured in customer environments. SPF gives an administrator of an email domain a way to specify which systems (IP addresses) are allowed to send emails using the domain. The admin publishes a TXT record in the DNS, listing all IP addresses that are allowed to send emails. This would typically be your onprem Exchange servers or email gateways.Receiving systems check the TXT record and see if the system that’s trying to deliver a message is allowed to do so.If you want to start sending emails from Exchange Online, you should add the following line to your existing SPF record.include: include:spf.protection.outlook.comIf you don’t have an SPF record in place, create a new TXT record at the root of your domain with this content:v=spf include:spf.protection.outlook.com -all  If you are not using a domain for outbound email, please publish the following SPF record to make it harder for criminals to abuse your domain:  TXT: v=spf -allThis is how far the wizard goes but we should really always configure the following records as well.DomainKeys Identified MailDKIM has been standardized in 2011 and, in parts thanks to Exchange Online, is being used widely. However, we find SPF is better known and understood by our customers. DKIM leverages digital signatures that let a receiving system cryptographically verify whether an email was sent by an authorized system or not. The signature includes a domain name (d=) that should match the domain in the mail from address. Like SPF, DKIM uses DNS records in the sender’s email domain. The administrator of the domain publishes a TXT record that contains a public key and then configures the email server to sign all outgoing messages with the corresponding private key.Receiving systems see the signature and a so called selector in the header of the email. The selector tells the receiving system where to find the public key to verify the signature. As always with certificates, keys have to be rotated periodically which means DKIM DNS records must be updated accordingly. Sounds like a lot of complicated work, right?With Exchange Online, Microsoft does that work for you. All outgoing emails from Exchange Online are signed with a key that Microsoft manages. The only thing we have to do, is point our DNS to that key and enable the configuration. There is a lengthy docs article about DKIM and how to build the DNS records you have to publish. I am using a few lines of PowerShell to make that process easier.Use the following PowerShell snippet to:  Create a new DKIM signing configuration for your custom domain  Publish DNS records pointing to Microsoft domains  Enable the DKIM signing configuration# Create DKIM signing config for all domains that do not have one$d = Get-DkimSigningConfig$domains = $d.domainGet-AcceptedDomain | % {​​​​​​     if ($_.DomainName -in $domains) {​​​​​​}​​​​​​     else {​​​​​​ New-DkimSigningConfig -KeySize 2048 -DomainName $_.DomainName -Enabled $false}​​​​​​ }​​​​​# Create DNS RecordsGet-DkimSigningConfig | Where-Object Name -NotMatch onmicrosoft | Select-Object Name,*cname*,@{    n=\\\"Selector1\\\";    e={($_.Selector1CNAME -split \\\"-\\\" | Select-Object -First 1),$_.name -join \\\"._domainkey.\\\"}},@{      n=\\\"Selector2\\\";    e={($_.Selector2CNAME -split \\\"-\\\" | Select-Object -First 1),$_.name -join \\\"._domainkey.\\\"}} Once the DNS records are in place, we can go ahead and enable the DKIM configuration:Get-DkimSigningConfig | Set-DkimSigningConfig -Enabled $true  If you are not using a domain for outbound email, you don’t have to worry about DKIM.Domain-based Message Authentication, Reporting and ConformanceDMARC is the new kid on the bloc. Well kind of, the RFC is from 2015. It is yet another DNS record that an administrator can use to tell receiving systems what exactly they should do with emails that fail SPF or DKIM. Essentially DMARC builds on SPF and DKIM and uses both to calculate an authentication result that supports scenarios where SPF alone would fail (forwarding). The DMARC policy is also used to define what should happen with unaligned or failing DKIM signatures as DKIM itself doesn’t really specify that.So, another DNS record you said? Here we go:Name: _dmarc.example.comType: TXTValue: v=DMARC1; p=none; pct=100;  While the SPF record must be published at the root of your domain, the DMARC record must be at _dmarc.With DMARC it is recommended to implement monitoring, so we will have to look at an additional tool. I have found the DMARC Monitor from ValiMail is a good option to get started, it is also free for Microsoft 365 customers. There are many alternatives, please check with your security team if you already have a tool. Whichever tool you end up using, it will ask you to update your DMARC record to include an URI of a mailbox to send reports to. The rua and ruf tags in the TXT record are used for that, in the case of ValiMail the complete record looks like this:v=DMARC1; p=none; pct=100; rua=mailto:dmarc_agg@vali.email;This record tells a receiving system to deliver emails independent of the authentication result (p is set to none) and send aggregated reports (rua) to ValiMail.With this record in place, you are now ready to send emails from Exchange Online. But we’re not completely done with DMARC just yet.The ultimate goal is to set the DMARC policy to p=reject thereby telling any receiving system to reject emails that fail authentication. Before we can do that, we must make sure all legitimate emails pass authentication. The monitoring helps us verify exactly that, the example in the following screenshot shows outbound emails from our systems for the last month. As you can see, all of them authenticated successfully:                  Exchange Online does currently not send DMARC reports, so if you are sending only to Exchange Online recipients, don’t expect much information in your monitoring.Remember that I said from our systems above, now let’s change that filter in ValiMail and look at all emails from our domain. As you can see in the screenshot below, over the same period of time, 90 emails failed DMARC authentication:                In our case, we already have a reject policy in place, so receiving systems should not accept these emails which are spam or worse. So, after setting up DMARC monitoring with a policy of none, observe the situation for some time and, if you are confident your systems are configured correctly, go ahead and update the record:v=DMARC1; p=reject; pct=100; rua=mailto:dmarc_agg@vali.email;  If you are not using a domain for outbound email, please publish the following DMARC record to make it harder for criminals to abuse your domain:  TXT: v=DMARC1; p=reject; pct=100;In the next post we will have a look at preset security policies in Exchange Online Protection.— Tom.\",\n  \"url\": \"https://onprem.wtf/post/sender-authentication-exo-2021/\"\n},{\n  \"id\": \"post-why-is-this-website-fast\",\n  \"title\": \"Why is this website so fast?\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\",\"GitHub\"],\n  \"content\": \"I have recently updated our website and have learned a few things while doing so. As mentioned on the home page, this website is still built with Jekyll. The so-called grandfather of static website generators is maybe not perfect, but the following reasons make it a good option for me.  It just works: I don’t have much time to tinker with this side-project, there are no complicated, always changing dependencies like with newer, javascript-based tools (oh and no gigantic node_modules either)  It’s simple: True how variables are handled is not always intuitive but I have learned enough to use it effectively  GitHub pages: The build process is automated, I just push my changes and the rest is taken care ofYou promised fast, what’s all this?I’m getting there. Fast websites are generally associated with more modern site generators like Gatsby. These typically use a lot of javascript that makes them fast but also more complicated. I wanted to see, if I could get good results with good old Jekyll.This site is fast because it’s small and very simple. I’m not saying bigger sites don’t need all that node_modules goodness, I’m saying small sites - like this one - don’t need it.This site is also fast, because I’ve added a few extra lines to the head section of the html. At the end of every post you can find a next navigation button that brings you to the next post. With a little help from Jekyll, I was able to include the relative URL of the next post as link to the head section with the keyword rel=next. This little keyword tells the browser to download the post whenever it has a free moment:{% if page.next %}&lt;link rel=\\\"next\\\" href=\\\"{{ page.next.url }}\\\"&gt;{% endif %}The result is a super fast navigation experience because the target has already been downloaded. I’m also preloading fonts with rel=\\\"preload\\\" and the little CSS we use is inlined.Service workersAnother thing I learned while looking at modern websites is the concept of service workers. This is a little bit of javascript that can be very powerful indeed. Essentially, a service worker is a script that is installed in the browser when a user opens the website. Once installed it can intercept and handle network requests from the browser to the site. It’s a kind of proxy in your browser just for our site.I’m using a service worker to create a local cache for use with this site. On the first visit, the service downloads a few static files that visitors will definitely need (fonts, main pages). It uses a cache-first strategy, so whenever the browser requests something, the service worker looks in the cache first and returns any results from there. After that it goes out to the site and retrieves the latest version of what the browser was looking for. If there’s no cache-hit, the resource is fetched from the network.The service worker needs a manifest and we have to tell the browser where to find it. We add the manifest to the head section and use a few lines of javascript to trigger the installation of the service worker. This is the pointer to the manifest file:&lt;link rel=\\\"manifest\\\" href=\\\"/manifest.json\\\"&gt;And this is the code that registers the service worker in your browser after the page is loaded. I have added a condition to skip the registration if the site is accessed through localhost, which is the case when developing locally:if ('serviceWorker' in navigator &amp;&amp; !(/localhost/.test(window.location.href))) {  window.addEventListener('load', function() {    navigator.serviceWorker.register('//serviceworker.js')    console.log('Servie worker registered.');  });}Faster build times with Jekyll on WSLI have used Jekyll on Windows 10 leveraging the Windows Subsystem for Linux since 2017. Today I realized that actually storing the files within WSL makes the build time much (much) faster. Until today I stored the repository in my Windows user profile, something like C:\\\\users\\\\tto\\\\.... In the WSL I happily changed into this directory following /mnt/C/Users... before running jekyll serve. Build time was around 5 minutes. Not great.Today it ocurred to me to clone the repository again, this time into the WSL. So I can access it using a WSL path, something like /home/tto/.... Build time is now less than one minute. Not bad.WebpageTest resultsYou don’t have to take my word for it, webpagetest also thinks this website is pretty fast:                — Tom\",\n  \"url\": \"https://onprem.wtf/post/why-is-this-website-fast/\"\n},{\n  \"id\": \"post-so-long-2020\",\n  \"title\": \"So long, 2020\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\",\"GitHub\"],\n  \"content\": \"Goodbye 2020! What a year it has been.True, I had to cancel some trips and I stayed home a lot more than usual, but apart from that, it was a pretty spectacular year for me. I moved to Amsterdam from a smaller city in the outskirts. I was able to go to Zürich, Sardinia, Marbella, Napoli and a few other places. In a prolonged episode of lockdown blues I managed to get about 1000 km on my road bike done. However, that was sometime before the summer, since then I have been (a lot) less active. I worked a lot. I learned a lot.Since a certain global event made more travelling impossible, or at least not very recommendable, I’m staying in Amsterdam for the holiday season and started building this new site.After more than 10 years, it’s now time to say: Goodbye ntSystems.itWelcome onprem.wtfWelcome to our new home. This site is still build with Jekyll and hosted on GitHub pages. I replaced the default minima theme with a custom one, mostly because I wanted to learn and experiment with some CSS features. I also had a good look at some of the more modern static site generators and other alternatives but decided to stick with Jekyll because it is simple and I really don’t need all of that node_modules stuff for just a simple blog.The new site has a simpler layout with less clutter, should be easier to read on any screen, and it also has a dark theme. Actually, unless you select a theme, it will use the same settings that your operating system (or browser) uses. Pretty slick, right?What about the domain name you ask? Well, this one was available and it kind of fits with what we are doing at the moment. If you find a better one, I’m open to suggestions 😉What’s next?Well that’s a good question. For now, like many others, I’ll be watching how the vaccine rollout is going and what’s happening in the US of A. I would like to become a better writer so I will try to publish my thoughts more regularly. We’ll see how that goes.With that I wish you all the best for the new year.— Tom.\",\n  \"url\": \"https://onprem.wtf/post/so-long-2020/\"\n},{\n  \"id\": \"post-converting-powershell-help-to-a-website\",\n  \"title\": \"Convert PowerShell Help to a Website\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Help\",\"MarkDown\"],\n  \"content\": \"How to use the platyPS PowerShell module to convert comment-based help to markdown and easily host it on GitHub pages.Now you might have read that our blog is powered by Jekyll, which is a static-site generator that turns markdown files into html. So, obviously, if I would be able to convert PowerShell help content to markdown files, I could simply put them into a folder an serve them via the blog.Create markdown filesThe first step is to install platyPS (available on the PS Gallery) and create the markdown files for every function.Install-Module platyPSImport-Module platyPS, TAK, PSSpeechforeach ($cmdlet in (Get-Command -Module PSSpeech)) {     $h = Get-Help $($cmdlet.Name)    $meta = @{        'layout' = 'pshelp';        'author' = 'tto';        'title' = $($cmdlet.Name);        'category' = $($cmdlet.ModuleName.ToLower());        'excerpt' = \\\"`\\\"$($h.Synopsis)`\\\"\\\";        'date' = $(Get-Date -Format yyyy-MM-dd);        'redirect_from' = \\\"[`\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name)/`\\\", `\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name.ToLower())/`\\\", `\\\"/PowerShell/$($cmdlet.Name.ToLower())/`\\\"]\\\"    }    if($h.Synopsis -notmatch \\\"\\\\[|\\\\]\\\") {        New-MarkdownHelp -Command $cmdlet -OutputFolder .\\\\_OnlineHelp\\\\a -Metadata $meta -Force     }}The above example creates a .md help file for every function in the TAK module. The files are almost ready to be used by our Jekyll-powered blog, I’m using the -Metadata parameter to add some additional information to the ‘front matter’ of each file.  I could be using New-MarkdownHelp -Module TAK but that way, I was not able to include the metadata automatically.Rename files for JekyllThe only thing that I have to do now, in order to have Jekyll pick up the files and create websites, is to rename them accordingly.foreach ($file in (Get-ChildItem '.\\\\tak-md-help\\\\*.md')) {    $timestamp = (Get-Date -Format 'yyyy-MM-dd')    $NewName = $timestamp, $file.name -join '-'    Rename-Item -Path $file.FullName -NewName $NewName}The above example renames all *.md files in the tak-md-help folder to include a timestamp. This step is not necessary if you are using a collection in Jekyll.Include HelpUriThe Get-Help command has an -Online parameter, that can be used to easily open a related link when looking for help. To include this functionality in my scripts, I just have to put the URL of the online article in the [CmdletBinding()] statement, like so:[CmdletBinding(HelpUri = 'https://ntsystems.it/PowerShell/TAK/test-tlsconnection/')]Links  https://github.com/PowerShell/platyPSThat’s it :)Tom\",\n  \"url\": \"https://onprem.wtf/post/converting-powershell-help-to-a-website/\"\n},{\n  \"id\": \"post-using-powershell-and-azure-cognitive-services-to-convert-text-to-speech\",\n  \"title\": \"Using PowerShell and Azure Cognitive Services to convert text to speech\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"content\": \"In one of our recent Microsoft Teams projects I needed some voice prompts for a customer service call queue. I figured it would be nice to have Azure’s artificial-intelligence-powered speech service convert my text input to an audio file. Turns out it’s easier than I thought it would be.Azure Cognitive Speech ServiceFirst of all we need an Azure Subscription where we can deploy our Speech Services instance. If you don’t have an Azure subscription, you can sign up for a trial account using the links below. If you already have a subscription, you can easily create a free Speech Services account using the following commands from Azure Cloud Shell:az group create -n ntsystems-speech -l WestEuropeaz cognitiveservices account create -n ntsystems-speech -g ntsystems-speech --kind SpeechServices --sku F0 -l WestEurope --yesNow the account was created and we can start using it right away. To authenticate our calls from PowerShell, we need an API key, again we can use Azure Cloud Shell to retrieve the key:az cognitiveservices account keys list -n ntsystems-speech -g ntsystems-speechPowerShellThe speech service provides a well documented API that can easily be called using PowerShell’s native Invoke-RestMethod command. The required information is available on Microsoft Docs (link below), all I had to do is wrap a little PowerShell around it and I had created a quick module. You can install the module using the following command:Install-Module PSSpeechBefore we can call any of the speech service’s API endpoints, we have to use the API key to get a token and store it in a variable for later use:Get-SpeechToken -Key yourapikey | Save-SpeechTokenNow we should be able to get a list of available voices using Get-SpeechVoicesList | Format-Table.And finally we can convert some input text to speech using one of the voices from the list:Convert-TextToSpeech -Voice en-US-JessaNeural -Text \\\"Hi Tom, I'm Jessa from Azure!\\\" -Path jessa.mp3Convert-TextToSpeech -Voice en-GB-HarryNeural -Text \\\"Hi Tom, I'm Harry from Azure!\\\" -Path harry.mp3You can find a lot of information about the speech service in the links below, be sure to check out the SSML structure to see how you can customize the voices, introduce pauses to the audio file, and many other things.You can find the code for the module in my GitHub, please let me know if you find it useful and feel free to submit a pull request with your optimizations :)This is the first post in this new year, best wishes and thanks for reading!TomLinks  Speech Services  Speech Synthesis Markup Language (SSML)  Text to Speech REST API  PSSpeech Module\",\n  \"url\": \"https://onprem.wtf/post/using-powershell-and-azure-cognitive-services-to-convert-text-to-speech/\"\n},{\n  \"id\": \"post-configuring-policy-based-qos-for-teams-with-intune\",\n  \"title\": \"Configuring policy-based QoS for Teams with Intune\",\n  \"author\": \"tto\",\n  \"tags\": [\"Workplace\",\"Intune\",\"Teams\"],\n  \"content\": \"Traditional Active Directory with group policy has no place in the big-picture of the modern workplace, so we need a novel solution to apply policy-based QoS to our Teams clients. One could argue that QoS has no place in the modern workplace either, but that’s a discussion for another day.Configuration Service ProviderSo a CSP or configuration service provider is pretty much exactly what everyone with some traditional enterprise IT background would expect from a group policy object, but delivered from the cloud and, at least in theory, applicable to various types of devices. According to Microsoft Docs it is “an interface to read, set, modify, or delete configuration settings on the device. These settings map to registry keys or files.”You can find a link to the CSP reference below.NetworkQoSPolicy CSPNow it turns out there is a CSP for policy-based QoS but it just applies to Surface Hub devices. If you’re lucky enough to configure QoS on such a device, here is a screenshot of the settings you will most likely use.  The port numbers may be different in your environment.                MSFT_NetQosPolicySettingDataSo here we are trying to configure QoS settings on our Windows 10 clients but CSPs are of no great help. Luckily we can use PowerShell to configure policy-based QoS and Intune provides an easy way to deploy PowerShell scripts to our clients.To configure Windows 10 to tag packets sent by the Teams.exe and on the configured source ports for each modality, we could use three simple commands like in the example below:New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50020 -IPSrcPortEndMatchCondition 50039 -DSCPValue 46 -Name \\\"Teams Audio\\\"New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50400 -IPSrcPortEndMatchCondition 50059 -DSCPValue 34 -Name \\\"Teams Video\\\" New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50069 -IPSrcPortEndMatchCondition 50070 -DSCPValue 28 -Name \\\"Teams AppSharing\\\"You can find a link to the cmdlet reference for New-NetQosPolicy below.Save the above commands to a file with ps1 extension and head over to endpoint.microsoft.com. Create a new script for Windows 10, upload the the ps1 file and set it to run in system context and using the 64 bit PowerShell host. Now assign the script to a group that contains your devices.                Once the script was applied you can use Get-NetQosPolicy to verify the policies were applied correctly.Teams Meeting SettingsFor the above configuration to make any sense, we first have to specify a port range for each modality in the Microsoft Teams admin center.You can find a link to the Teams admin center below.The following screenshot shows an example configuration where a distinct port range is used for each type of traffic, this allows us to distinguish the traffic types and apply different DSCP tags using policy-based QoS.                Special thanks to Mr. Workplace Expert Dave Wenger! Check out his blog in the links below.Links  Configuration service provider reference  New-NetQosPolicy  Microsoft Teams admin center  https://blog.contoso-bern.ch/\",\n  \"url\": \"https://onprem.wtf/post/configuring-policy-based-qos-for-teams-with-intune/\"\n},{\n  \"id\": \"post-send-check-point-logs-to-azure-sentinel-beta\",\n  \"title\": \"Send Check Point Logs to Azure Sentinel (beta)\",\n  \"author\": \"tto\",\n  \"tags\": [\"Azure\",\"Cloud\",\"Security\"],\n  \"content\": \"Azure Sentinel is Microsoft’s new, cloud-native security information and event management (SIEM) tool. In my simplistic point-of-view it is a security-focused, machine-learning-driven add-on for Log Analytics (OMS). Today we will be looking into ingesting Check Point Firewall logs into Log Analytics.Log Analytics Agent (linux)Log Analytics currently lists only linux-based agents for syslog forwarding. In this case I installed Ubuntu Server 18.10, for production it maybe better to stick with 18.04. The following command installs required components:sudo apt install python auditdFrom the Azure Portal, copy the snippet to install the Log Analytics agent (non-Azure Linux VM). It should look something like this and already have the correct values for workspace id and key.sudo wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh &amp;&amp; sh onboard_agent.sh -w &lt;workspace-id&gt; -s &lt;workspace-key&gt; -d opinsights.azure.comFinally, download the security configuration file for OMS agent. This contains the required regular expressions for the oms.security event type:sudo wget -O /etc/opt/microsoft/omsagent/&lt;workspace-id&gt;/conf/omsagent.d/security_events.conf \\\"https://aka.ms/syslog-config-file-linux\\\"Syslog (rsyslog.d)Now with the Log Analytics agent ready, we need to configure rsyslog to accept logs from the firewall and forward them to the agent.Uncomment the following lines in the file /etc/rsyslog.conf to enable the rsyslog listener on udp port 514:module(load=\\\"imudp\\\")input(type=\\\"imudp\\\" port=\\\"514\\\")Now lets create a new configuration file to tell rsyslog to forward all events that contain the string “Check Point” to the Log Analytics agent. Azure Sentinel documentation creates the file at /etc/rsyslog.d/security-config-omsagent.conf::msg, contains, \\\"Check Point\\\" @127.0.0.1:25226At last it may be a good idea to change the default configuration in such a way that not all logs are written to a file. The default configuration for rsyslog is located at /etc/rsyslog.d/50-default.conf. Just modify the line with *.* accordingly:#*.*;auth,authpriv.none         -/var/log/sysloglocal.*;auth,authpriv.none      -/var/log/syslogWhen we’re done with the configuration we use the following commands to restart the Log Analytics agent and the rsyslog service:sudo /opt/microsoft/omsagent/bin/service_control restart &lt;workspace-id&gt;Sudo service rsyslog restartCheck PointCheck Point publish information about how to configure log export in the article sk122323, see links below. On version R80.20 the required packages are already installed and we just add a log export target like this. Note that this is using export mode shell:cp_log_export add name azsentinel target-server 10.1.1.1 target-port 514 protocol udp format cef read-mode semi-unifiedMake sure to select cef log format and set the read-mode to semi-unified. The existing configuration can be verified with:cp_log_export showname: azsentinel     enabled: true     target-server: 10.1.1.1     target-port: 514     protocol: udp     format: cef     read-mode: semi-unifiedTroubleshootAccording to the Sentinel documentation it can take a while before the first logs show up in Log Analytics, in my case it didn’t take more than five minutes. But if they don’t show up at all, the following steps can be helpful for troubleshooting:Check if syslog services are listening:tom@azsentinel:~$ netstat -anuActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 127.0.0.53:53           0.0.0.0:*udp        0      0 0.0.0.0:514             0.0.0.0:*udp        0      0 127.0.0.1:25224         0.0.0.0:*udp        0      0 127.0.0.1:25226         0.0.0.0:*udp        0      0 0.0.0.0:33569           0.0.0.0:*udp6       0      0 :::514                  :::*Note: rsyslog listens on 514 and the omsagent listens on 25224 and 25226, the latter is of interest in this case.Check if logs are coming in from Check Point:sudo tcpdump -A -ni any port 514 -vvCheck if logs are forwarded to omsagent:sudo tcpdump -A -ni any port 25226 -vvLog Analytics agent log file:sudo tail /var/opt/microsoft/omsagent/log/omsagent.logLinks  Check Point Log Export (sk122323)  Azure Sentinel Documentation\",\n  \"url\": \"https://onprem.wtf/post/send-check-point-logs-to-azure-sentinel-beta/\"\n},{\n  \"id\": \"post-create-a-sas-token-for-azcopy\",\n  \"title\": \"Create a SAS token for AzCopy\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\",\"Azure\"],\n  \"content\": \"I’ve spent way too much time trying to figure this out, so here goes a quick note that hopefully saves someone a minute.AzCopyIs a command-line tool that can be used to copy data to all kinds of Azure storage. In this post I am focusing on the Azure Files service because I want to use AzCopy to copy data from an existing file server to a new file share in Azure.According to the documentation, AzCopy supports authentication via Azure AD (using azcopy login) and SAS-token. For the files part, however, only SAS-token authentication is supported.Shared Access Signatures?A shared access signature, SAS, is a string that can be used to delegate access to resources in Azure. It looks something like that:?sv=2018-11-09&amp;sig=&lt;..key..&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=bfqt&amp;sp=racupwdlThere is some documentation out there on how to create the SAS token with the SDK but I couldn’t find much that I could easily use. So after some searching around I found the New-AzStorageAccountSASToken cmdlet in the Az PowerShell module.PowerShell Az ModuleThe Az module is the latest version (I believe) of the PowerShell module to manage Azure. We are going to use it to create the SAS token, so if you don’t have it already, install via the PowerShell Gallery (requires PowerShell 5.1):Install-Module Az -AllowClobberOnce installed I can login to my Azure subscription and create the token:Connect-AzAccount$StorageContext = New-AzStorageContext -StorageAccountName mystorageaccount -StorageAccountKey \\\"storageaccountkey==\\\"New-AzStorageAccountSASToken -Service File -ResourceType Service,Container,Object -Permission racwdlup -Context $StorageContext -ExpiryTime (Get-Date).AddDays(+3)The -ExpiryTime parameter can be used to set an expiration time for the generated token. I believe the default is one hour, so if you expect the copy job to take longer adjust accordingly.Please note: I could also create the storage context without specifying the -StorageAccountKey parameter, but that would lead to the following error message when creating the token:New-AzStorageAccountSASToken : Cannot create Shared Access Signature unless Account Key credentials are used.Copying the dataActually copying files or directories to Azure Files is pretty straight-forward once we have the SAS-token, we just pass it along with the url.To copy a single file:.\\\\azcopy.exe cp D:\\\\Data\\\\file.txt \\\"https://mystorageaccount.file.core.windows.net/myshare/file.txt?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\"To copy a directory:.\\\\azcopy.exe cp D:\\\\Data \\\"https://mystorageaccount.file.core.windows.net/myshare?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\" --recursiveLinks  https://github.com/Azure/azure-storage-azcopy  https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstorageaccountsastoken  https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-files  https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1\",\n  \"url\": \"https://onprem.wtf/post/create-a-sas-token-for-azcopy/\"\n},{\n  \"id\": \"post-ntsystemspsdrive-a-ships-drive-for-the-blog\",\n  \"title\": \"ntSystemsPSDrive: a SHiPS drive for the blog\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Jekyll\",\"ntSystems\"],\n  \"content\": \"Some time ago I wrote a post about Consuming ntSystems with PowerShell. It boils down to this: we have a json-based API that is available via https://ntsystems.it/api/v1/ and returns json elements for posts and pages on the blog. For more information check out the linked post. Then I wanted play around with the SHiPS module for some time and finally got around to doing it this past weekend. Now I’m happy to be sharing another method do consume ntSystems with PowerShell: It can be mounted as PSDrive.PSProviderPowerShell has always had the concept of providers which serve as a way of accessing and interacting with data that would otherwise not be easily available at the command-line. According to about_Providers they are Microsoft .NET Framework-based programs that make the data in a specialized data store available in PowerShell so that you can view and manage it.There are some built-in providers such as Alias, Certificate, and Registry that you will be familiar with. Essentially they provide a file-system-like view into the data stores, so we can easily see all defined aliases with the following command:Get-ChildItem -Path Alias:We can see installed certificates in the Cert: drive and access the registry via hkcu: and hklm:. Not only can we list the content of the data stores with cmdlets such as Get-ChildItem, we can also modify values with Set-Item or Set-ItemProperty like this:# Create a new REG_SZ New-ItemProperty -Path HKCU:\\\\Environment\\\\ -PropertyType string -Name TestPS -Value \\\"test pwsh\\\"# Create an aliasNew-Item Alias:\\\\test -Value \\\"Get-Process\\\"# Remove expired CertificatesGet-ChildItem Cert:\\\\CurrentUser\\\\my | Where-Object NotAfter -lt (Get-Date) | Remove-ItemWell, you get it by now: providers make it relatively easy to work data stored in certain locations.Some vendors, such as VMware, add providers to their PowerShell tools. So after installing PowerCLI and connecting to a server, we can browse the inventory using:Get-ChildItem vi:Get-ChildItem vmstore:We can see all available drives using Get-PSDrive.There are not too many 3rd-party providers out there, probably because it was quite hard to write them. Enter SHiPS.Simple Hierarchy in PowerShell (SHiPS)According to the SHiPS GitHub repository, “developing PowerShell provider got so much easier”. The module leverages PowerShell classes to create the hierarchy and items that are then exposed as a PS Drive.How easy you ask? Well I gave it a shot the other day and here is the result.ntSystemsPSDriveAs stated above, the module requires the SHiPS module and builds on top of it. So in the code we first declare the following:using namespace Microsoft.PowerShell.SHiPSThen we go ahead and create classes for our navigation nodes, folders (items containing child items) inherit from SHiPSDirectory and leafs (like files) inherit from SHiPSLeaf.In the classes we define constructors and methods as needed, if a folder shall be used as root node, i.e. the entry point used by New-PSDrive, it must have a constructor with the node name as parameter.Home([string]$name): base($name) { }All folder nodes must define a GetChildItem() method that is called when browsing the directory.[object[]] GetChildItem() { }So for example the Home node in the module ntSystemsPSDrive is used as root (entry point) when mounting the PSDrive:New-PSDrive -Name $Name -PSProvider SHiPS -Root \\\"ntSystemsPSDrive#Home\\\" -Scope Global -ErrorAction StopTo create such a node and its contents, we define a class like this :class Home : SHiPSDirectory {    # required constructor for root nodes    Home([string]$name): base($name) {    }    # The method GetChildItems is called when listing directory content    [object[]] GetChildItem() {        $obj = @()        $obj += [ntSystemsType]::new(\\\"Category\\\")        $obj += [ntSystemsType]::new(\\\"Tags\\\")        $obj += [ntSystemsType]::new(\\\"Author\\\")        $obj += [ntSystemsType]::new(\\\"Language\\\")        return $obj    }}The above example contains the constructor required for root nodes as well as a method GetChildItem that returns an array of objects when it gets called.See it in action:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\Posts by Category\\\\PowerShell\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\Posts by Category\\\\ntSystems\\\\Jekyll Fun: Consuming ntSystems with PowerShell' Pretty cool, right? Thanks for reading, have fun!TomLinks  SHiPS  SHiPS Architecture\",\n  \"url\": \"https://onprem.wtf/post/ntsystemspsdrive-a-ships-drive-for-the-blog/\"\n},{\n  \"id\": \"post-powershell-script-to-enable-specific-office-365-service\",\n  \"title\": \"Powershell Script to enable specific Office 365 Service\",\n  \"author\": \"dni\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"content\": \"Currently I’m in an Exchange Migration project to migrate all mailboxes from Exchange onPremise to Exchange Online. Yeah.. of course.. killing Exchange onPrem… again :)I have the following situation that all users already have Office 365 Licenses assigned like E1 / E3 or E5. There are some users that don’t have all Office 365 services the license includes enabled and so there are some disabled services. The license situation is not really structured.. When I’m going to migrate the mailboxes to Exchange Online I need to enable the Exchange service for every user so they can access the mailbox.It doesn’t sound like a big deal but the tricky part is I want to preserve the disabled services for every user. I cannot apply a default license to all users and I’m too lazy to click through all users and enable the Exchange Online switch manually..So now I want to share with you a script that does all the magic automatically.. Maybe its also helpful for you in some situations.Please consider:I’m not a DEV :)  The Scripts works for one service at a time  The Script works for E1 / E3 / E5 licenses but can easily extend to include other license types  I write out a LOG file with the detail the script does  The user list can also be a CSV file# ConnectConnect-MsolService# Load User List$UserList = \\\"User1@domain.local\\\",\\\"User2@domain.local\\\",\\\"User3@domain.local\\\"$LogFile = \\\"C:\\\\Users\\\\nitz_\\\\LOG\\\\LicenseLog.txt\\\"# Troubleshoot#$UserList = \\\"user1@domain.com\\\"#$User = \\\"user1@domain.com\\\"ForEach($User in $UserList){    If (Get-MsolUser -User $User)    {        #Variable        $UserLicense = $Null        $ChangeLicense = $false        # Check what License the user has        $LicensesAssigned = (Get-MsolUser -User $User).Licenses.AccountSkuId        If ($LicensesAssigned -like \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -notlike \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -notlike \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E5\\\"            $LicenseToActivate = \\\"EXCHANGE_S_ENTERPRISE\\\"            $UserLicense = \\\"ENTERPRISEPREMIUM\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E5\\\"        }        ElseIf($LicensesAssigned -notlike \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -notlike \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -like \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E3\\\"            $LicenseToActivate = \\\"EXCHANGE_S_ENTERPRISE\\\"            $UserLicense = \\\"ENTERPRISEPACK\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E3\\\"        }        ElseIf($LicensesAssigned -notlike \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -like \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -notlike \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E1\\\"            $LicenseToActivate = \\\"EXCHANGE_S_STANDARD\\\"            $UserLicense = \\\"STANDARDPACK\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E1\\\"        }        Else{            Write-Host \\\"User $User has License mismatch, please check\\\" -ForegroundColor Red            Add-content $Logfile -value \\\"ERROR -- User $User has License mismatch, please check\\\"        }        # Change License        If($ChangeLicense)        {            $DisabledLicenses = @()                $License = (Get-MsolUser -User $User).Licenses | where{$_.AccountSkuId -like \\\"*$UserLicense*\\\"}                ForEach($LicenseOption in $License.ServiceStatus){                    If($LicenseOption.ProvisioningStatus -eq \\\"Disabled\\\"){                        If($LicenseOption.ServicePlan.ServiceName -eq $LicenseToActivate){                            Write-Host \\\"Skip disabling License $LicenseToActivate for User $User\\\" -ForegroundColor Green                        }Else{                            If($DisabledLicenses -eq $Null){$DisabledLicenses = $LicenseOption.ServicePlan.ServiceName}                            Else{$DisabledLicenses = $DisabledLicenses + $LicenseOption.ServicePlan.ServiceName}                                        }                    }                }                Add-content $Logfile -value \\\"User $User has disabled Plans $DisabledLicenses\\\"                # Assign new License Option                $LicenseOptions = New-MsolLicenseOptions -AccountSkuId $License.AccountSkuId -DisabledPlans $DisabledLicenses                Write-Host \\\"Applying License Option to User $User\\\" -ForegroundColor Green                Set-MsolUserLicense -UserPrincipalName $User -LicenseOptions $LicenseOptions                Add-content $Logfile -value \\\"User $User assigned new License Option\\\"        }    }else{        Add-content $Logfile -value \\\"ERROR -- User $User NOT FOUND\\\"    }}Feel free to use this script or just to take the basic functions and improve it to fulfill your special needs.Daniel\",\n  \"url\": \"https://onprem.wtf/post/powershell-script-to-enable-specific-office-365-service/\"\n},{\n  \"id\": \"post-windows-server-2019-radius\",\n  \"title\": \"Windows Server 2019 and RADIUS\",\n  \"author\": \"tto\",\n  \"tags\": [\"Security\",\"Firewall\"],\n  \"content\": \"First of all, happy new year :) Today we will have a quick look at Windows Server 2019, more specifically the Network Policy Server role.BackgroundI was recently asked to help with an enterprise WiFi deployment and decided to use a RADIUS server for authentication purposes. I went on to deploy a new Windows 2019 VM and installed the NPS role. After adding the RADIUS client and configuring the required policies, I added the NPS server’s IP address to the WiFi controller and tried to authenticate. A simple task generally, but this time it did not work.TroubleshootingThe RADIUS server was located behind a NAT device so my first guess was that I had misconfigured a policy or mistyped an address or something. I double checked the configuration and, as it looked ok, started to scratch my head. In order to better understand what was going on, I installed wireshark on the NPS machine and saw packets incoming from the WiFi controller quite happily. But packet were only incoming, I could not find a single response coming from NPS. The Security Event Log on the VM, where you would typically find NPS logs, had no events related to NPS. So basically the NPS was not responding to RADIUS messages at all.SolutionAfter a quick google search for “Windows 2019 NPS” I found an entry in the TechNet Forums (link below) where someone explained the Windows Firewall had to be configured to allow RADIUS (udp/1812, udp/1813) traffic even though such a rule did already exist. Sure enough, after adding the firewall rule, authentication worked.DHCP Relay (update)So today, half a year later, I had a very similar problem with DHCP relay. The Windows 2019 DHCP Server would receive DHCP requests from a relay agent but it would never respond to them. I configured the local firewall to allow traffic on UDP ports 67 and 69 and voilà, DHCP started working.Links  TechNet Forums  User Voice\",\n  \"url\": \"https://onprem.wtf/post/windows-server-2019-radius/\"\n},{\n  \"id\": \"post-sending-events-to-splunks-http-event-collector-with-powershell\",\n  \"title\": \"Sending events to Splunk's HTTP Event Collector with PowerShell\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Using Invoke-RestMethod to send events to a Splunk instance.SplunkIf you don’t know Splunk this article is not going to give a thorough introduction. Let’s just say it’s a pretty fancy log collector/analytics tool. According to the company’s profile, Splunk turns machine data into answers. The goal of this article is to demonstrate how to use PowerShell to send events to the HTTP Event Collector which is Splunk’s REST interface to ingest logs.Enable Event Collector and create API Key (Token)Connect to your Splunk’s web interface with appropriate permissions and using Settings, Data inputs, click on HTTP Event Collector. If you are not already using the Event Collector service it has to be enabled using the Global Settings button in the top right corner.Then use the New Token button to create a new API key and configure how Splunk handles data it receives using this token. In the first step, give a name to the token you are about to create.The second step is about handling the data, select an appropriate source type, I use json in this case, and the the right App Context. I select the search app for this example, though it can be any installed Splunk app. At the bottom of step two, select the index where Splunk will store the data. If you are not sure which index to use, create a new one. I created an index with the name of PowerShell and assigned it to the search application as selected before.Review the configuration in the last step and create the new token. Take note of the Token Value, you will need it later.Once the token has been created, you can click on Start Searching and Splunk will automatically create the right search for you. As we have not yet sent data, the search should not return any results.PowerShell Send-SplunkEventI put together a quick wrapper for Invoke-RestMethod that makes sending logs to Splunk relatively easy. All you need is the API key (Token Value) from above and the URI of your event collector service. For this example I am using a Splunk instance on my local machine, so the Uri is “http://localhost:8088/services/collector”, for a production environment, you would probably use https and replace localhost with the name of your instance.The idea behind the script was to sort through logs from different systems in PowerShell, turn them into structured data and send them to Splunk. As logs originate on systems other than the one where this script runs, the HostName parameter can be used to specify the ‘host’ property of the event and the DateTime parameter can be used to set the ‘time’ property.Examples and usageThe script has two required parameters, InputObject and Key. Use the InputObject parameter to pass an object (or hashtable) to the script. This will be turned into json, using PowerShell’s ConvertTo-Json and then sent to the REST API using Invoke-RestMethod.Use the Key parameter to pass the HTTP Event Collector token that we created above to the script..\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\"Hello Splunk!\\\";severity=\\\"INFO\\\"} -Key &lt;token&gt; Get-Service wuauserv | .\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; -Uri http://localhost:8088/services/collectorThe first example just sends a custom hashtable with the two fields message and severity. The second example gets a service object and converts it into a json object before sending it.Note: The Uri parameter defaults to localhost, you will have to specify it like in the second example, if sending to a remote instance.SearchNow search for the events in the newly created PowerShell index: index=\\\"powershell\\\" sourcetype=_jsonPerformanceAs the script is making a new RESTful call for every single event, this is not the fastest way to get logs into Splunk. I have made some tests to compare WindowsPowerSell with the Core edition, here is what I’ve found:Measure-Command { Get-Process | .\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; }The above command takes 30 seconds on WindowsPowerShell, while it takes about 280 seconds on Core (tested with 6.1.0 and 6.2.0 preview 2).Download &amp; Source forThe Script is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    Links:  Send-SplunkEvent  Splunk REST API Reference  PowerShell Invoke-RestMethod\",\n  \"url\": \"https://onprem.wtf/post/sending-events-to-splunks-http-event-collector-with-powershell/\"\n},{\n  \"id\": \"post-lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5\",\n  \"title\": \"lost & found: FFmpeg and Skype4B, Security Baseline for RS5\",\n  \"author\": \"tto\",\n  \"tags\": [\"Skype4B\",\"WSL\",\"Client\",\"Server\"],\n  \"content\": \"A quick edition of lost &amp; found on how to use FFmpeg on WSL to create audio files that can be used for Skype for Business announcements. And an observation about the recently published security baseline for Windows 10 1809 and Server 2019.FFmpegAccording to it’s website, FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.Packages are available for various operating systems but since Ubuntu runs just fine on Windows 10, I started using linux-style command-line tools in the Windows Subsystem for Linux.Check if you are running the latest version using ffmpeg -version or install to tool using sudo apt-get install ffmpeg.According to @greiginsydney a 16 kHz, mono, 16-bit Wave file is recommended for best performance.To convert an MP3 file to Wave with the above specifications, we can use something like this:ffmpeg -i Downloads/ringtone.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ringtone.wavSecurity BaselineMicrosoft recently released the draft of the security baseline configuration for RS5 builds, that’s Windows 10 v1809 and Windows Server 2019. You can find more information about that on the Security Guidance blog, I just wanted to share a quick note for the Office 365 Admins out there:The security baseline configuration contains a setting to disable Basic Authentication for the WinRM client. After applying the baseline configuration, I was no longer able to connect to Exchange Online or Skype for Business Online remote PowerShell Sessions as they rely on basic authentication.Set the following configuration to Not Configured on your admin machines:Administrative Templates\\\\Windows Components\\\\Windows Remote Management (WinRM)\\\\WinRM Client\\\\Allow Basic authenticationLinks:  Audio file formats for Lync and Exchange  FFmpeg  Security baseline (DRAFT) for Windows 10 v1809 and Windows Server 2019\",\n  \"url\": \"https://onprem.wtf/post/lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5/\"\n},{\n  \"id\": \"post-remote-ems-over-ipmi-serial-over-lan\",\n  \"title\": \"Remote EMS over IPMI serial-over-lan\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"PowerShell\",\"Server\",\"AudioCodes\"],\n  \"content\": \"Using standards-based IPMI to get some sort of out-of-band management for AudioCodes’ embedded server modules.BackgroundWe’ve installed a number of session border controllers with embedded server modules for our international customers. The embedded server modules are typically used to run Skype for Business survivable branch servers which provide limited calling services in case of a connectivity issue with the Front End pools. Because IT personnel is not available in branch sites or the devices are installed in data centres with limited access, we relied upon Intel’s AMT for out-of-band management of the earlier version of the server module.AudioCodes upgraded the embedded server module and it turns out, the new version no longer has an AMT chip. Studying the data sheet of the OEM that builds the module, we found that it Supports IPMI v1.5 and Serial-over-LAN function. The OEM couldn’t help much so I basically googled/tried my way to this solution, maybe my experience saves someone a few hours in the future.Intelligent Platform Management Interface (IPMI)First of all, I had to read up on IPMI. According to Wikipedia it provides management and monitoring capabilities independently of the host system’s CPU, firmware (BIOS or UEFI) and operating system. Windows does implement some basic functionality through CIM and the PcsvDevice PowerShell module, but, apart from that, we have to rely on other tools such as ipmiutil to communicate with this interface.ipmiutil is an open-source utility to manage and interpret IPMI systems with common software. If used inside the OS on the server, it can access and configure the local Baseboard Management Controller (BMC). Once configured, the utility can be used to invoke IPMI functions remotely.IPMI configurationTo show the current configuration of the local BMC we can use the following examples:.\\\\ipmiutil.exe config.\\\\ipmiutil.exe lan -lTo set an IP address and the username/password to use for remote connections, we can use something like this:.\\\\ipmiutil.exe lan -e -I 192.168.120.131 -S 255.255.255.0 -G 192.168.120.254 -L 5 -p ipmipass -u ipmiadminThe above example sets the IP address of the BMC to 192.168.120.131/24 and the default gateway to 192.168.120.254. Additionally, we set the username to ipmiadmin and the password to ipmipass.We verify the configuration using the ipmiutil config from the first example, if it looks good, we can try the same from a remote system:[PS] ~\\\\ipmiutil&gt; .\\\\ipmiutil.exe config -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil config ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0### ipmiutil config, GetPefEntry ...# GetPefEntry(1): ret = 193 Invalid Command### ipmiutil config, GetLanEntry for channel 5 ...LanParam 5,0,0:  00LanParam 5,1,0:  14LanParam 5,2,0:  14 14 14 14 00LanParam 5,3,0:  c0 a8 78 83# LanParam(5,3,0) IP address: 192.168.120.131LanParam 5,4,0:  01LanParam 5,5,0:  c4 00 ad 01 f5 73...In the above example, we run ipmiutil config on another machine and use the -N parameter to specify a remote host, -U and -R are used to specify the username and password, respectively. The output shows the connection succeeded and thus, we have remote connectivity.Now we have an way to manage certain features of the remote system independently from the operating system that’s installed on said system. We can, for example, use ipmiutil reset to control the systems power state..\\\\ipmiutil.exe reset -c -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\ipmiutil.exe reset -d -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\ipmiutil.exe reset -u -N 192.168.120.131 -U ipmiadmin -R ipmipassThe above lines power cycle, power down or power up the remote system. Use with caution.If the BMC is not reachable from a remote system, I’ve found ipmiutil reset -k useful. This does reset the BMC, without affecting the OS.Serial over LAN (sol) and Emergency Management Services (EMS)Apart from controlling the systems power state, IPMI also implements serial-over-lan connectivity. This can be used to connect to a remote system’s serial console using an IP connection. Now on Windows servers we do not typically use serial connections, at least not for management. But, as it happens, the Emergency Management Services console provides exactly that: a special management console over serial connections. The Emergency Services are not enabled by default, so we have to enable it and make sure it uses our serial-over-lan connection.To do this, we use the bcdedit utility (from an administrative command-line), first to redirect the EMS console to serial port #2, then to enable EMS for the current Windows installation:bcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200bcdedit /ems on To activate the change and enable EMS, Windows must be rebooted. After that, we can go ahead and start our first sol session using the following command:[PS] ~\\\\ipmiutil&gt; .\\\\ipmiutil.exe sol -a -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil sol ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0Opening lanplus connection to node 192.168.120.131 ...[SOL session is running, use '~.' to end, '~?' for help.]SAC&gt;The SAC prompt indicates we are now connected to the special administration console. This console can be used to retrieve information about the system, it’s network interfaces and running processes. We can also connect to the OS via cmd.SAC&gt;cmdSAC&gt;ch -si 1The above example creates a new cmd channel and connects to it. It will prompt for credentials to connect to Windows and, upon success, we have a remote cmd.exe interface. Type in powershell and enjoy :)Finally, we can use -d to disconnect from the sol session:.\\\\ipmiutil.exe sol -d -N 192.168.120.131 -U ipmiadmin -R ipmipassThis is also useful if the sol session fails with the message: “SOL payload already active on another session”.SecurityNow as you can see, enabling IPMI and making the SAC available over serial-over-lan, adds another way of managing the system. This can be convenient but it also increases the system’s attack surface. Make sure to limit access to IPMI endpoints and don’t use high-privilege accounts when logging into the SAC remotely.Links:  Sourceforge download and man page  AudioCodes 1000 sbc  Boot Parameters to Enable EMS Redirection\",\n  \"url\": \"https://onprem.wtf/post/remote-ems-over-ipmi-serial-over-lan/\"\n},{\n  \"id\": \"post-network-assessment-with-policy-based-qos-and-iperf3\",\n  \"title\": \"Network assessment with policy-based QoS and iperf3\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"Skype4B\",\"PowerShell\"],\n  \"content\": \"In Skype for Business and, more recently, Teams deployments, a solid network and a good knowledge of it are fundamentally important.We typically work very closely with the network/security departments and make sure to involve them from the beginning to have their support throughout the project. After deploying QoS, ideally before rolling out voice/video for the end-users, we run some tests to verify the QoS configuration, measure the reserved bandwidth and whether it remains stable over some amount of time. There are various tools available for this task, I mostly use iperf3 to generate traffic and measure basic parameters.iperf3 basicsAccording to the GitHub page, iperf3 is “a tool for active measurements of the maximum achievable bandwidth on IP networks”. It is primarily developed on Linux but Windows executable are available from various sources. I’m using the version 3.6 build that can be found on NeoWin (see below).After copying the files to the machine, we can start the server using the the following command line. This starts a listener at tcp/udp 5201 and waits for iperf clients to connect..\\\\iperf3.exe -sOn the client side, we have multiple options, as stated above, iperf’s goal is to measure the maximum bandwidth, so if we start the client without parameters, that is what it will do: .\\\\iperf3.exe -c 192.168.120.185 Connecting to host 192.168.120.185, port 5201[  5] local 192.168.120.160 port 52070 connected to 192.168.120.185 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec   530 MBytes  4.44 Gbits/sec[  5]   1.00-2.00   sec   607 MBytes  5.09 Gbits/sec...Note that in the above example, iperf uses TCP and measures end-to-end available bandwidth between the client and server. This may saturate network links in between. Use with caution.We can also try to simulate RTP media (small UDP packets) by specifying the following parameters: .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200Note that with UDP, the target bitrate defaults to 1 Mbit per second, this can be changed with the -b parameter. Also, when using UDP, jitter and packet loss are measured.More information: NeoWin, GitHub, Documentation (outdated)Now that we have a tool to generate traffic and measure bandwidth, we can go ahead and put some DSCP tags on the traffic to see how the network handles quality of service.  iperf has a –dscp parameter, this does not work on Windows as applications are not trusted to set DSCP values. The only way (that I know of) to tag packets with DSCP values is policy-based QoS.Creating the QoS PoliciesWe would typically use group policies to manage policy-based QoS settings but since this is a test, we can go ahead and use the NetQos PowerShell module on the client/server machines to create temporary policies.A quick Get-Command -Module NetQos shows that the module provides four cmdlets, we can Get, Set, Remove, and create New QoS policies with the respective *NetQosPolicy cmdlet.So we create two policies for the iperf server and client applications. The server listens on port 5201 by default, so all traffic originating from the server will use that source port.New-NetQosPolicy -Name \\\"iperf_server\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPSrcPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreThe client will communicate with the server by sending to the port 5201, so all traffic originating from the client will use that destination port.New-NetQosPolicy -Name \\\"iperf_client\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPDstPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreNote: By specifying ActiveStore as the policy store, the QoS policy will not be persistent. On the next reboot of the system, it will be gone.  We want to measure both directions, so we create both policies on the server and both on the client.Test and traceNow it’s time to start a network trace on the client and the server and run iperf again. If QoS has been configured, we should see packets leaving the client tagged with DSCP 46 and this tag should be preserved and be displayed on the server-side as well. I run the following two tests on the client, the -R parameter reverses the flow, so in the second case, the server sends packets to the client: .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -J --logfile send.json .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -R -J --logfile recv.jsonThe following screenshots show a trace from the above test on the client (1) and on the server (2). We can see that packets from client to the server (source: 192.168.120.160, destination: 192.168.120.185) are tagged on the client…… and the tag is still present when the server receives them.After switching the stream’s direction (with -R), we observe the same: packets leave the server tagged, and are received by the client with the tag still on.With the -J and --logfile parameters we instruct iperf to write output in JSON format and redirect it to a text file. With PowerShell we can now easily work with that data:$send = Get-Content send.json -Raw | ConvertFrom-Json$send.intervals.streams | Out-GridView$send.end.sumAt this point, it’s important to note that until now we have only proved, that the network does not remove the DSCP tags we put on our test packets. Whether the network actually prioritizes such packets is not yet clear. The easy way to verify that, would be to log into the network devices (QoS policies are typically enforced on routers) and get some counters/statistics. If that is not possible, we have to find out how much bandwidth is reserved for a given class empirically. To do that, we need a link that can be saturated (no congestion, no prioritization) and then run the above test again.More about QoS PoliciesWhen configuring policy-based QoS, either by group policy or by PowerShell, check the event log to see if the system refreshed the policy correctly. The following event is logged, when a policy change is detected:Log Name:      Microsoft-Windows-Policy/OperationalSource:        Microsoft-Windows-EQoSEvent ID:      2Level:         InformationDescription:   Computer QoS policies successfully refreshed. Policy changes detected.The NetQos module is a wrapper for the WMI/CIM objects managing the quality of service policies. We can also manipulate the CIM instance directly, e.g. to delete policies:Get-CimInstance -Namespace ROOT/StandardCimv2 -ClassName MSFT_NetQosPolicySettingData | Remove-CimInstanceLinks:  How to validate VPN throughput to a virtual network\",\n  \"url\": \"https://onprem.wtf/post/network-assessment-with-policy-based-qos-and-iperf3/\"\n},{\n  \"id\": \"post-exchange-hybrid-observations\",\n  \"title\": \"Exchange Hybrid Observations\",\n  \"author\": \"tto\",\n  \"tags\": [\"Office365\",\"Hybrid\",\"Exchange\"],\n  \"content\": \"Like I did here with Skype for Business, I’m collecting some observations and useful snippets about Exchange in hybrid environments.Completing individual migration usersRecently we have been using the CompleteAfter flag in favour of the older SuspendWhenReadyToComplete to set a date for migration batches to complete. To update this timestamp for a single mailbox in a batch, we can use the following command:Get-MoveRequest tom | Set-MoveRequest -CompleteAfter (Get-Date).AddHours(-1)In the above example, the move request for the mailbox tom will be completed immediately without affecting other mailboxes in the batch.Getting details about BadItemsPart of every migration are mailboxes with items that are either corrupt or cannot be imported to Exchange Online for some reason. Now if we don’t just increase the BadItemLimit counter but want more information about the corrupt items, we can get more information by using the -IncludeReport parameter with the Get-MigrationUser cmdlet:$Stats = Get-MigrationUserStatistics -Identity tom@ntsystems.it -IncludeReport $Stats.Report.BadItemsRecipient PermissionsThe *RecipientPermission cmdlets are used to manage SendAs permissions in Exchange Online. A nice goody of the Get-RecipientPermission cmdlet is the option to find permissions by assignee, i.e. by user to whom the permissions are granted. To get all entries that grant permissions to the user tom we use the -Trustee parameter like this:Get-RecipientPermission -Trustee tomLikewise, we can find all permissions by access right using the -AccessRights parameter. The following example gets all entries that grant SendAs permissions:Get-RecipientPermission -AccessRights SendAsShared MailboxesStarting with the June 2018 quarterly updates (2013 CU21 and 2016 CU10), the management of shared mailboxes in hybrid scenarios got easier. A -Shared parameter got added to the *RemoteMailbox cmdlets, instead creating a shared mailbox on-prem and then moving it to Exchange Online, we can now use New-RemoteMailbox -Name Office -Shared.You have already updated to CU21/CU10 but the Shared parameter is not available? Run .\\\\setup.exe /PrepareAD /IAcceptExchangeServerLicenseTermsMore Info: KB4133605Tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-hybrid-observations/\"\n},{\n  \"id\": \"post-lost-found-no-tracking-on-ntsystems\",\n  \"title\": \"lost & found: Updates and no more tracking on ntSystems.it\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"I’ve recently updated the sources of the blog and moved to the gem-based version of the minima theme. This should make the site easier to maintain in the future.On the old, blogengine-based site, we used Google Analytics to get some information about our readers.  Since the migration to GitHub pages and Jekyll, I’ve tried to remove external scripts and tracking as much as possible.This is just a static website with some free (as in beer) content we’d like to share. We do no longer inject any tracking code and the few scripts we use are served directly from GitHub pages. But, until recently, there was one last exception to this: the comments. We’ve used Disqus comments for a long time now and I don’t really see a need to change that.However, as the comments iFrame is loaded from an external source (and may include tracking code), I’ve decided to stop automatically loading the iFrame and instead give you, the reader, an option to load it.From now on, you’ll see a “Show comments.” link at the bottom of each post and only after clicking the link, external content is loaded.What do you think? Leave a comment below ;)Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-no-tracking-on-ntsystems/\"\n},{\n  \"id\": \"post-azure-functions-building-a-telegram-bot-with-powershell-2\",\n  \"title\": \"Azure Functions: Building a Telegram Bot with PowerShell 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"content\": \"Welcome back to the second part of our little fun experiment with Telegram and Azure Functions. In the first part we created the function app and the bot, now let’s hook them up.Connecting the bot with the Azure FunctionWe can get updates from Telegram bots in two ways, there is a getUpdate method that can be polled periodically, or we can use Webhooks. Our HTTP trigger function in Azure will run whenever it receives a http request, so it is just perfect for the latter.To configure our Azure Function as a destination for the bot’s webhook, we use the setWebhook method and pass a hashtable with an URL parameter:Invoke-RestMethod -Uri https://api.telegram.org/bot528059907:AAxxVs/setWebhook -Body @{    \\\"url\\\"=\\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\"} -Method PostTo verify that the URL has been set correctly, we can call getWebhookInfo:[PS] C:\\\\&gt; Invoke-RestMethod https://api.telegram.org/bot528059907:AAxxVs/getWebhookInfo  ok result  -- ------True @{url=https://ntsystemsbot.azurewebsites.net/api/Listener?code=Waa...At this point our function will get a http request every time someone writes to the Bot account. So now it’s time to do something with it.OverviewFirst of all: I am sure there are a hundred ways this can be done better… What I am trying to accomplish with this simple example is a demonstration of Azure Functions and the different triggers, inputs, and outputs it provides. That said, here’s what I came up with:Our first function, the Listener, uses a HTTP trigger as input and Azure Queue Storage as output. This function will run, whenever a user sends a message to our bot and it will take the message and write it to a Storage Queue.Another function, I called it UpdateData uses a timer trigger to get information from the blog and write it to Azure Blob Storage.The third function, our Worker, uses Azure Queue Storage as trigger and Azure Blob Storage as input. The trigger is the same Queue that the Listener writes to, so a request coming from Telegram will be written to a Queue by the Listener function and trigger this Worker function.A last function, the Responder, finally sends a POST request to the Telegram bot. This function is triggered by the Worker’s output queue and uses no other inputs or outputs.To summarize, the Storage Queues are connected like this:  Listener &gt; Worker &gt; ResponderThe FunctionsThere are different ways to create or modify functions. The Azure console provides an easy-to-use GUI to configure triggers, inputs and outputs. It even has an editor for the functions’s code :) For the more advanced stuff, we can connect to the functions Kudu Services and upload files directly or use the debug consoles. Each function basically consists of a folder, the folder contains a function.json file which describes the function (type, trigger, input, output) and a run.ps1 file which contains the PowerShell code.The ListenerAs mentioned before, the first function just listens for a http request by the Telegram Bot and writes it to a storage queue.The function.json file defines the trigger httpTrigger and the input/output variables. The following is the actual configuration file for my Listener function:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"req\\\",      \\\"type\\\": \\\"httpTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"webHookType\\\": \\\"genericJson\\\"    },    {      \\\"name\\\": \\\"res\\\",      \\\"type\\\": \\\"http\\\",      \\\"direction\\\": \\\"out\\\"    },    {      \\\"type\\\": \\\"queue\\\",      \\\"name\\\": \\\"outputQueueItem\\\",      \\\"queueName\\\": \\\"listenerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}The name defined in each object is made available as variable in the function’s code and contains a file path. That allows us to use Get-Content $req to get the HTTP request’s body. As well as Out-File $outputQueueItem and Out-File $res to write to the Storage Queue or respond to the HTTP request, respectively. How cool is that?!The functions code, in the run.ps1 file is as simple as that:# POST method: $req$requestBody = Get-Content $req -Raw # Wirte input to QueueOut-File -FilePath $outputQueueItem -Encoding Ascii -inputObject $requestBody# Respond to the incoming web requestOut-File -Encoding Ascii -FilePath $res -inputObject $trueThe request body is made available through the $req variable, we read the variable and write it to the $outputQueueItem which represents the Storage Queue listenerqueue\\\\outputQueueItem in the AzureWebJobsDashboard storage account.We do also respond to the incoming web request by writing to the $res variable.The WorkerThe next function is triggered by the same listenerqueue\\\\outputQueueItem we write to in the first function, so it will always run, after the first function finished. The content of the storage queue is made available through the $triggerInput variable:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"triggerInput\\\",      \\\"type\\\": \\\"queueTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"queueName\\\": \\\"listenerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\"    },    {      \\\"type\\\": \\\"blob\\\",      \\\"name\\\": \\\"inPosts\\\",      \\\"path\\\": \\\"outcontainer/posts\\\",      \\\"connection\\\": \\\"AzureWebJobsStorage\\\",      \\\"direction\\\": \\\"in\\\"    },    {      \\\"type\\\": \\\"queue\\\",      \\\"name\\\": \\\"outputQueueItem\\\",      \\\"queueName\\\": \\\"workerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}This function does not send HTTP responses, so there is no need to define an HTTP output. The only output for the Worker is another storage queue.As you’ve noted, we define another input for this function, namely outcontainer/posts, we’ll get to that later.The PowerShell code in run.ps1 does the actual work, so it evaluates the input and decides what to do with it.# Read input from StorageQueue$requestBody = Get-Content $triggerInput -Raw | ConvertFrom-Json$posts = Get-Content $inPosts -Raw | ConvertFrom-Json | Select-Object -Expand items...Out-File -Encoding Ascii -FilePath $outputQueueItem -inputObject ($outObj | ConvertTo-Json)Again, we simply read the input using Get-Content and write the output to the defined variable. I’ve omitted the actual code, to make this readable. You can find the code here:             ntsystemsit/ntsystemsbot    The ResponderThe responder is finally triggered by the workerqueue\\\\outputQueueItem and sends an http request to the Telegram Bot API, thereby responding to the user. The configuration is basically the same as above, and you can find it in the GitHub repo.To actually send a message to the Telegram Bot, I’ve created the following helper function. It uses Invoke-RestMethod to send a POST request to the /sendMessage API endpoint.function New-TelegramMessage {    [cmdletbinding()]    param(        $ChatId,        $Text,        $Mode = \\\"Markdown\\\",        $ReplyId,        $ReplyMarkup    )    $body = @{        \\\"parse_mode\\\" = $mode;        \\\"chat_id\\\"= $ChatId;        \\\"text\\\" = $Text;    }    if($ReplyId) {        $body.Add(\\\"reply_to_message_id\\\",$ReplyId)    }    if($ReplyMarkup) {        $body.Add(\\\"reply_markup\\\",(ConvertTo-Json $ReplyMarkup -Depth 5))    }    Invoke-RestMethod -Uri https://api.telegram.org/bot$env:TG_Token/sendMessage -Body $body -Method Post}  Note: The URL must contain the Bot’s API key. As I wanted to publish the code, I’ve stored the key in the function’s application settings. These settings are available as environment variables in the code, so I can access the key thorough: $env:TG_Token.Update DataThe last piece we need for our little example is the UpdateData function. This one uses a timer trigger and just gets all posts of our blog and stores them in an Azure Storage Blob.The function definition contains the schedule and the Storage Blob we want to write to:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"myTimer\\\",      \\\"type\\\": \\\"timerTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"schedule\\\": \\\"0 0 1 * * *\\\"    },    {      \\\"type\\\": \\\"blob\\\",      \\\"name\\\": \\\"outPosts\\\",      \\\"path\\\": \\\"outcontainer/posts\\\",      \\\"connection\\\": \\\"AzureWebJobsStorage\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}The schedule is in a cron-type format, so this function will run at 01:00 hours every day.Again, the PowerShell code is simple enough:(Invoke-WebRequest https://ntsystems.it/api/v1/posts/ -UseBasicParsing).content | Out-File -Encoding ascii -FilePath $outPostsThe Bot in actionOk, so with all of our code in place, we should now be able to communicate with our Bot using the Telegram messenger. Just search for the ntsystemsbot account and try it out :)This turned out to be a long story and there is so much left to explore. I hope the first two posts of this little series helped you understand the basics of Azure Functions, if someone finds a more practical use case a PowerShell-based Chatbot, I’d like to hear about it :)Thanks for reading!TomMore Information:  Telegram Bot Api  Azure Functions Webhooks\",\n  \"url\": \"https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-2/\"\n},{\n  \"id\": \"post-azure-functions-building-a-telegram-bot-with-powershell-1\",\n  \"title\": \"Azure Functions: Building a Telegram Bot with PowerShell 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"content\": \"Today I’ve got a fun one, we’re going to use Azure Functions to build a Telegram Bot with PowerShell. Sounds interesting? Well here we go. Before diving into the technical details, lets have a quick overview of what we’re trying to do.A Telegram Bot is an application that runs inside Telegram; users can interact with a Bot by sending them messages (or commands). The bot’s administrator controls the bot through a https-based API.Azure Functions is a serverless platform that lets us run pieces of code (functions) without worrying about the infrastructure. It’s called serverless because we just deploy code, no need to install virtual machines or applications. Azure functions support different programming languages, one of them is PowerShell. It’s still in experimental state, but it works just fine for what we’re going to do.So yes, we’re going to hook up our bot with a function app running PowerShell code in Azure.Azure FunctionsIn order to deploy our Azure Function, we have to login to the Azure Portal and create a new resource. Select the “Serverless Function App” which is currently listed in the Popular section of the marketplace, if it doesn’t show up, search for “Function App” and click Create.We’ll have to give a name to our app and select a storage account and location for the deployment. Once the deployment is finished, we can find the application through the All resources button on the left side in the Azure portal. Click the function app and add a new function. As noted before, PowerShell support is still experimental, so we have to create a new custom function, enabling the “Experimental Language Support”.Functions can have different triggers as well as various inputs and outputs. For our example, we’ll go with the “HTTP trigger” function. This function will run whenever it receives a HTTP request. Set the Language to PowerShell and the Authorization level to Function.The function is created with some basic code to get started, I’ve changed it a bit so that it will just return the object we pass to it.# POST method: $req$requestBody = Get-Content $req -Raw | ConvertFrom-Json# Response: $resOut-File -Encoding Ascii -FilePath $res -inputObject ($requestBody | ConvertTo-Json)Please make note of the function URL, right there next to the Run button. Remember that we selected an Authorization level of Function when creating the function, so we need to use a key when calling the function. This makes sure, that only our bot can call the function.To test the function, we can use Invoke-RestMethod to send a POST request:[PS] C:\\\\&gt; Invoke-RestMethod -Uri \\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\" -Body '{\\\"Name\\\": \\\"Tom\\\"}' -Method PostName----TomOk, so now that we’ve got a working function, let’s go ahead and create the bot.Telegram BotTo create a Telegram bot, well, we use a bot. Look up the @BotFather account and follow the instructions.For this basic example, it was enough to specify a name and account name:The BotFather will guide you through the process and, at the end, give you access token for the http API. To edit the bot after the fact, just use the /myBots command. To test the access token and verify the bot has been created, we can call the following URL:https://api.telegram.org/bot&lt;AccessToken&gt;/getMeReplace &lt;AccessToken&gt; with the actual token, just like that:[PS] C:\\\\&gt; Invoke-RestMethod -Uri \\\"https://api.telegram.org/bot528059907:AAxxVs/getMe\\\"  ok result  -- ------True @{id=550258749; is_bot=True; first_name=ntSystems.it; username=ntsystemsbot}Ok, now we should have a working Azure function app and a barebones Telegram bot. Continue to part two for the next steps.\",\n  \"url\": \"https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-1/\"\n},{\n  \"id\": \"post-lost-found-onion-service-cloudflare-dns\",\n  \"title\": \"lost & found: ntSystems Onion Service, Cloudflare DNS\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"It’s Friday and here’s another edition of lost &amp; found.We’re on torOur few twitter followers may already know it, for the rest of you here’s the news: Our little website is now also available as an Onion Service. Check it out at: ntsystcp…id.onionI’ve made some changes to the site in order to improve our readers privacy. Basically trying to serve all content directly and, for the Onion version, there are no Disqus comments as that requires external content and automatically loads some tracking scripts.Cloudflare launches 1.1.1.1We have been using Cloudflare to enable TLS and IPv6 (and more) for quite some time now. They launched a consumer DNS service on the first day of April. No, it was no joke. The Service is available at 1.1.1.1 and 1.0.0.1 and, interestingly, supports DNS over HTTPS.I have not been aware of DoH until now, and even though there don’t seem to be any existing client implementations, it enables some nice use cases. We can now use PowerShell’s Invoke-RestMethod to make DNS queries :)Here’s a quick function that does it:function Resolve-HttpsDns {    param(        [Parameter(Mandatory=$true)]        [string]        $Name,        [string]        $Type = \\\"A\\\",        [ipaddress]        $Server = \\\"1.1.1.1\\\"    )    $uri = -join(\\\"https://\\\",$Server,\\\"/dns-query\\\")    Invoke-RestMethod -Uri $uri -Body @{        ct = \\\"application/dns-json\\\"        name = $Name        type = $Type.toUpper()    } | Select-Object -ExpandProperty Answer}And there is a much more advanced module on GitHub and the PowerShell Gallery.Sun’s out, so let’s have a cold one. Nice weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-onion-service-cloudflare-dns/\"\n},{\n  \"id\": \"post-skype-for-business-hybrid-observations\",\n  \"title\": \"Skype for Business Hybrid Observations\",\n  \"author\": \"tto\",\n  \"tags\": [\"Office365\",\"Lync\",\"Skype4B\",\"Hybrid\",\"Exchange\"],\n  \"content\": \"A collection of information about Skype for Business in hybrid environments.Hosting ProviderExchange Online Hosted VoiceMailNew-CsHostingProvider -Identity 'ExchangeOnline' -Enabled:1 -EnabledSharedAddressSpace:1 -HostsOCSUsers:0 -ProxyFqdn \\\"exap.um.outlook.com\\\" -IsLocal:0 -VerificationLevel UseSourceVerificationSkype for Business OnlineNew-CsHostingProvider -Identity \\\"SkypeforBusinessOnline\\\" –Enabled:1 -ProxyFQDN \\\"sipfed.online.lync.com\\\" – EnabledSharedAddressSpace:1 -VerificationLevel UseSourceVerification – HostsOCSUsers:1 -AutodiscoverUrl 'https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root'  Note: Make sure the Edge Servers can lookup the _sipfederationtls records for your domains. The targets must be the Edge Server’s external interface.Push NotificationFor the push notification service to work, make sure the Skype for Business Online hosting provider has been configured and add push.lync.com to the allowed domains. Then enable the Push Notification Configuration:New-CsAllowedDomain -Identity \\\"push.lync.com\\\"Set-CsPushNotificationConfiguration -EnableMicrosoftPushNotificationService $True – EnableApplePushNotificationService $TrueExchange Online Integration# SFB Online PowerShell: Get Tenant Guid(Get-CsTenant).TenantId.Guid# SFB On-Premises PowerShell: OAuth ConfigurationNew-CsOAuthServer microsoft.sts -MetadataUrl \\\"https://accounts.accesscontrol.windows.net/&lt;GUID from above&gt;/metadata/json/1\\\"New-CsPartnerApplication -Identity microsoft.exchange -ApplicationIdentifier 00000002-0000-0ff1-ce00-000000000000 -ApplicationTrustLevel Full -UseOAuthServerSet-CsOAuthConfiguration -ServiceName 00000004-0000-0ff1-ce00-000000000000# SFB On-Premises PowerShell: Export SfB OAuth Certificate (on Front End Server)$thumbprint = (Get-CsCertificate -Type OAuthTokenIssuer).ThumbprintExport-Certificate -Cert Cert:\\\\localMachine\\\\my\\\\$Thumbprint -FilePath C:\\\\oAuth.cer# SFB On-Premises PowerShell: Point Autodiscover to EXOSet-CsOAuthConfiguration -ExchangeAutodiscoverUrl \\\"https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc\\\"# MSOnline PowerShell: Publish OAuth Cert and Add Service Principal Name$certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate$certificate.Import(\\\"C:\\\\oAuth.cer\\\")$binaryValue = $certificate.GetRawCertData()$credentialsValue = [System.Convert]::ToBase64String($binaryValue)New-MsolServicePrincipalCredential -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000 -Type Asymmetric -Usage Verify -Value $credentialsValue# Add Service Principal Name (sfb pool web services)$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\"00000004-0000-0ff1-ce00-000000000000/sfbwebext.uclab.eu\\\")$MsolSP | Set-MsolServicePrincipalThe Service Principal Names can alternatively be set using the *-AzureRmADServicePrincipal cmdlets from the AzureRM module.Once the configuration is complete, we can test Exchange Storage connectivity with the following command:Test-CsExStorageConnectivity -SipUri \\\"sip:tom@uclab.eu\\\" -Verbose  Note: The Front End Servers must be able to communicate with Exchange Online (directly or via proxy), otherwise the “Add Skype meeting” button will not be visible in Exchange Online OWA. This is also required for Modern Hybrid Authentication.To troubleshoot the Exchange Online Integration, run an UCWA (Web Infrastructure) trace on the Front End Servers. You should see incoming requests from Exchange Online and the corresponding responses from the Front End.# Request: Start-Line: POST /ucwa/oauth/v1/applicationsStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/defaultValuesStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/customInvitationStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/phoneDialInInformation...User-Agent: Exchange/15.20.588.14/OnlineMeetingContent-Type: application/vnd.microsoft.com.ucwa+jsonAccept: application/vnd.microsoft.com.ucwa+jsonX-ExCompId: OnlineMeeting# Response:Start-Line: 200 OKContent-Type: application/vnd.microsoft.com.ucwa+json; charset=utf-8{\\\"accessLevel\\\": \\\"Everyone\\\",\\\"entryExitAnnouncement\\\":\\\"Enabled\\\",\\\"attendees\\\":[],\\\"automaticLeaderAssignment\\\":\\\"SameEnterprise\\\",\\\"description\\\":\\\"\\\",\\\"leaders\\\":[],\\\"onlineMeetingId\\\":\\\"RMANN9FF\\\",\\\"onlineMeetingUri\\\":\\\"sip:tom@uclab.eu;gruu;opaque=app:conf:focus:id:RMANN9FF\\\",\\\"onlineMeetingRel\\\":\\\"myOnlineMeetings\\\",\\\"organizerUri\\\":\\\"sip:tom@uclab.eu\\\",\\\"conferenceId\\\":\\\"257150\\\",\\\"phoneUserAdmission\\\":\\\"Enabled\\\",\\\"lobbyBypassForPhoneUsers\\\":\\\"Disabled\\\",\\\"subject\\\":\\\"\\\",\\\"joinUrl\\\":\\\"https://meet.uclab.eu/tom/RMANN9FF\\\",\\\"2c04865e-a621-4a4d-81e0-8047131f87d8\\\":\\\"please pass this in a PUT request\\\",\\\"_links\\\":{\\\"self\\\":{\\\"href\\\":\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF\\\"},\\\"onlineMeetingExtensions\\\":{\\\"href\\\":\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF/extensions\\\"}},\\\"rel\\\":\\\"myOnlineMeeting\\\",\\\"etag\\\":\\\"3055269905\\\"}...Modern AuthenticationTo use modern authentication with Skype for Business, the ADFS Server has to be prepared using the sfbadalscripts. More information about how to use the scripts can be found here. The script has to be run on the ADFS server, be sure to include all internal and external URLs of the Skype deployment in the PoolIds parameter..\\\\Setup-Adfs2016OAuthTrustForSfB.ps1 -PoolIds 'https://sfbwebext.uclab.eu/','https://sfbwebint.uclab.eu/'When the ADFS Server has been prepared, the following commands can be used to enable modern authentication.  Note: This can only be configured globally, double-check the prerequisites and, even though existing sessions will not be re-authenticated, schedule a maintenance window.# Create new OAuth ServerNew-CsOAuthServer -Identity uclabFS -Type ADFS -MetadataURL \\\"https://fs.uclab.eu/FederationMetadata/2007-06/FederationMetadata.xml\\\"# Require Authorization using ADFSSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity uclabFSAfter that just wait for the management store replication to publish the change and test it with a client or the Test-CsRegistration cmdlet.  To roll back the change simply set the ClientAuthorizationOAuthServerIdentity parameter to $null.Hybrid Modern AuthenticationFor hybrid authentication to work, we need to add more SPNs to the MSOL Service Principal. Add all internal and external Web Services URLs of the Skype deployment to the list:# MSOnline PowerShell$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\"https://sfbwebext.uclab.eu\\\")$MsolSP.ServicePrincipalNames.Add(\\\"https://sfbwebint.uclab.eu\\\")$MsolSP | Set-MsolServicePrincipalThen, add the evoSTS (Azure AD Federation Service) to the Skype for Business OAuth configuration and enable it using:# Create new OAuth ServerNew-CsOAuthServer -Name evoSTS -IssuerIdentifier sts.windows.net -MetadataUrl \\\"https://login.windows.net/common/FederationMetadata/2007-06/FederationMetadata.xml\\\" -Type AzureAd -AcceptSecurityIdentifierInformation $True# Require Authorization using Azure ADSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity evoSTSOn the client, make sure to set AllowAdalForNonLyncIndependentOfLync and Enable Modern Authentication if required.$a = New-CsClientPolicyEntry -name AllowAdalForNonLyncIndependentOfLync -value \\\"True\\\"Set-CsClientPolicy -Identity Global -PolicyEntry @{Add=$a} HKEY_CURRENT_USER\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\1x.0\\\\Lync\\\"AllowAdalForNonLyncIndependentOfLync\\\"=dword:00000001Hybrid VoiceIf we move enterprise voice users to the cloud they can still use our on-perm PSTN connectivity to make and receive calls. For that to happen, we need Skype for Business Edge Servers and the edge’s next-hop pool must also be running Skype. Then we configure a PSTN Usage for the online users as well as an Online Voice Routing policy. In it’s most basic form we need the following:# SFB Online PowerShell: Create the PSTN UsageSet-CsOnlinePstnUsage  -Identity Global -Usage @{Add=\\\"Unrestricted\\\"}# Create and assign the Voice Routing policyNew-CsOnlineVoiceRoutingPolicy OnlineVRP -OnlinePstnUsages UnrestrictedGrant-CsOnlineVoiceRoutingPolicy -Identity tom@uclab.eu -PolicyName OnlineVRPTo move a user from on-premises to Skype for Business Online, use the following:Move-CsUser -Identity tom@uclab.eu -Target sipfed.online.lync.com -Credential (Get-Credential)To move a user from Skype for Business Online to on-premises, use the following:Move-CsUser -Identity tom@uclab.eu -Target sfb01.uclab.eu -Credential (Get-Credential) -HostedMigrationOverrideUrl https://admin1e.online.lync.com/HostedMigration/hostedmigrationService.svcThe host part of the HostedMigrationOverrideUrl parameter can change based on where your tenant is hosted. To determine the host part, open the legacy Skype for Business admin center and copy the URL. It should look something like this: https://webdir1e.online.lync.com/LSCPThen replace webdir with admin and LSCP with HostedMigration/hostedmigrationService.svc. You think I am making this up, right? Read more here.Skype for Business Online users must be assigned an E5 license or have PSTN calling added to their E1/E3 plans to be able to make and receive calls.To be continued ;)Tom\",\n  \"url\": \"https://onprem.wtf/post/skype-for-business-hybrid-observations/\"\n},{\n  \"id\": \"post-aad-connect-failed-to-load-configuration-information\",\n  \"title\": \"Azure AD Connect: Failed to load configuration information\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\",\"Azure\",\"Office365\"],\n  \"content\": \"When upgrading Azure AD Connect (ADSync), the wizard fails with the error: “Failed to load configuration information from primary ADFS server”.ProblemThis can happen if the federation service was moved to a different machine after installing Azure AD Connect. Subsequent updates to the synchronization service fail with the above error message. This is because AD Connect stores the name of the original ADFS server in the PersistedState XML file.The fils is located at: C:\\\\ProgramData\\\\AADConnect\\\\PersistedState.xmlThe ADFS servername is stored in the IAdfsContext.TargetAdfsServers property, oh and it’s Base64 encoded. PowerShell can be used to easily read the file:[xml]$xml = Get-Content \\\"C:\\\\ProgramData\\\\AADConnect\\\\PersistedState.xml\\\"$xml.PersistedStateContainer.Elements.PersistedStateElementSolutionSimply update the value of the IAdfsContext.TargetAdfsServers with the servername of the new ADFS machine, as the servername has to be Base64 encoded, the following PowerShell code can be used to convert a string:$name = \\\"adfs01.example.com\\\"[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($name))Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/aad-connect-failed-to-load-configuration-information/\"\n},{\n  \"id\": \"post-tunneling-ssh-through-tor\",\n  \"title\": \"Tunneling SSH through Tor\",\n  \"author\": \"tto\",\n  \"tags\": [\"WSL\",\"Cloud\"],\n  \"content\": \"I’ve been using Onion Services aka. Hidden Services to connect to remote machines for some time now. Tor clients can connect to such services through the Tor network, there is no need to know the IP address of the destination machine, likewise there is no need to configure inbound port mappings or firewall rules.Destination (running the Onion Service)On the destination machine, we need to install Tor. For best results follow the instructions here.Once installed, we configure the hidden service in the /etc/tor/torrc configuration file. Find the section dedicated to hidden services in the file and create a new service or uncomment on of the examples.HiddenServiceDir /var/lib/tor/my_hidden_service/HiddenServicePort 80 127.0.0.1:80HiddenServicePort 2244 127.0.0.1:22The above example, creates a service with the name of my_hidden_service which will listen on port 80 and provide whatever runs on 127.0.0.1:80 over the Tor network. It will also listen on port 2244 and provide ssh (which runs on 127.0.0.1:22) as a hidden service.Securing SSHAs you are essentially making your sshd accessible to the whole Tor network, it might be a good idea to disallow password authentication and root access. To do that, make sure your /etc/ssh/sshd_config contains the following lines:PasswordAuthentication noPermitRootLogin prohibit-passwordHostname and KeysAfter configuring the Onion Service, restart the Tor service: sudo service tor restart. After it has started, the hidden service directory (as configured in HiddenServiceDir) will have been created and we can find two files in the directory. The hostname file contains the hostname that we need on the client side in order to connect to the service.sudo cat /var/lib/tor/my_hidden_service/hostnamexxxxxxx.onionClient (accessing the Onion Service)To connect to the first hidden service, a website running on port 80, we can simply use Tor Browser and open the hostname we found in the hidden service directory above. To connect via SSH, there are multiple options but first, we do also need to install Tor. Again for best results follow the official instructions.On WSL I was able to install it by simply using sudo apt-get install tor. We will also need the nc tool from the netcat-openbsd package, if it is not available on your system, install it using: sudo apt-get install netcat-openbsd.Once installed, start tor by typing tor --runasdaemon 1.torifyTorify comes with the installation of the Tor package on the client and is a simple wrapper that tries to connect a given application through Tor.torify ssh tom@xxxxxxx.onion 2244The above example connects ssh to the .onion address on port 2244. On my system, torify throws a few errors but finally works well enough..ssh/configAnother option is to add the destination hostname to the ssh config file of the client. This can typically be found in the users profile directory at .ssh/config.Simply add a line for each destination you want to connect to. The ProxyCommand uses the nc tool, to tunnel the connection through 127.0.0.1:9050 which is the clients Tor endpoint.Host t01 HostName xxxxxxxx.onion port 2244 ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %pPlease note, on Mac OS I had to use ncat instead of nc, so the ProxyCommand looks like:   proxyCommand ncat --proxy rhel01:9050 --proxy-type socks5 %h %p  A final note on privacy: This guide is meant to help connect to remote systems behind NAT routers or firewalls with and changing public IPs. Think connect to your home network from work. It is not meant to provide the best possible privacy. For that, please refer to the official documentation.Have fun!Tom\",\n  \"url\": \"https://onprem.wtf/post/tunneling-ssh-through-tor/\"\n},{\n  \"id\": \"post-testing-coinhive\",\n  \"title\": \"Testing CoinHive\",\n  \"author\": \"tto\",\n  \"tags\": [\"ntSystems\",\"Crypto\"],\n  \"content\": \"I’ve recently stumbled upon coinhive and with all the recent fuzz about crypto currencies, I decided to have a look at it. So what’s that all about?coinhive: A JavaScript Monero MinerMany crypto currencies rely on a https://en.wikipedia.org/wiki/Proof-of-work_system algorithm in order to verify transactions. There are quite a few different algorithms out there, some of them more difficult than others. Bitcoin for example uses hashcash which, at current difficulty levels, can only be feasibly generated on specialized hardware (ASIC).Another one of those PoW algorithms is CryptoNight which has been designed to be ASIC resistant and can feasibly be generated on modern CPUs and GPUs. Monero, a private and censorship-resistant digital currency, happens to use the CryptoNight algorithm, which means it can be mined efficiency on consumer devices.That’s what the coinhive miner does. It essentially runs a JavaScript application in the users web browser and uses the devices CPU to mine Monero. The mined Monero will then be payed out to a wallet we own.ntSystemsNow as this website is a side-project and does not make us any money at all (and we don’t like Ads), we decided to test drive coinhive for a week.  Starting today, by visiting our side your device will be used to mine Monero and, by doing so, help us maintain the site and deliver more awesome content.After the first week’s trial we will publish the stats and discuss the ethics behind “abusing” our visitors spare CPU cycles.The following code has been added to the site’s footer in order to start the miner:/edit: removed codeUpdateAfter one week of testing here are the results of this little experiment. This site has between 300 and 600 active users on a given day, not a lot but it’s something. So with the above code, we are using up to 90% of the visitors CPU cycles to generate Monero using coinhive’s JavaScript miner.This resulted to be about 468 hashes per second totalling about 173.82 million hashes in a week. According to monerobenchmarks.info, these figures can be compared to what a not-very-modern GPU with 4GB of memory would produce.The final balance after the weeks test is 0.02582 xmr, worth about 2€ at the time of this writing.Another UpdateSoon after the last update, ad-blockers started blocking the download of the javascript and the hashrate dropped quite a bit. I’ve since decided to remove the code and stop (ab)using our visitors CPUs.Thanks!Tom\",\n  \"url\": \"https://onprem.wtf/post/testing-coinhive/\"\n},{\n  \"id\": \"post-the-invisible-internet-project-and-wsl\",\n  \"title\": \"The Invisible Internet Project and WSL\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"WSL\",\"Cloud\"],\n  \"content\": \"The Windows Subsystem for Linux can be used to run quite a few interesting things on Windows, one of them is the Invisible Internet Project or i2p.Install i2pFirst of all we’ll have to install i2p on our system. Before starting the installation, we have to add the required repository:sudo apt-add-repository ppa:i2p-maintainers/i2psudo apt-get updatesudo apt-get install i2pAfter the installation we can start the i2prouter with the following command:i2prouter startAs soon as the service  is running, we can access the homepage using http://127.0.0.1:7657/home likewise the configuration page is available at http://127.0.0.1:7657/configConfigure ProxyFor testing, we don’t have to change anything in the home or configuration pages and we can just point our systems proxy configuration to i2p. The i2prouter listens on ports 4444 and 4445 for http and https traffic, respectively.Now you will soon notice that pointing your system’s proxy to i2p will allow you to browse .i2p sites but the “clear” intertnet will no longer work very well.Unlike tor, i2p is not intended to be used as proxy to the internet, but it’s purpose is to enable secret communication to resources inside the i2p network. Therefore it does not make a lot of sense to route all internet traffic trough i2p, it’s enough if we use the i2prouter to access *.i2p domains.Install PrivoxyTo get that done, i.e. routing only requests to .i2p domains to the i2prouter, we’ll need another small proxy that is capable of routing requests based on pattern. Let’s install privoxy:sudo apt-get install privoxyAfter installing privoxy, we’ll have to configure it so that it routes requests to *.i2p domains to i2prouter which runs at localhost:4444:Use your favorite editor to update the config file at /etc/privoxy/config and add the following line:forward .i2p localhost:4444Now restart privoxy sudo /etc/init.d/privoxy restart and set the systems proxy configuration to 127.0.0.1:8118.Setting the proxy with PowerShell and PACConstantly changing the proxy configuration does not work really well, I forget that I’ve set the proxy and if privoxy is not running, I have to disable the proxy in order to access the internet. In the first iteration, I wrote two quick and dirty PowerShell functions to enable/disable the proxy settings:Function Disable-Proxy {    $reg=\\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 0    Set-ItemProperty -Path $reg -Name ProxyServer -Value \\\"\\\"}Function Enable-Proxy {    param($proxyServer = \\\"localhost:8118\\\")    $reg=\\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 1    Set-ItemProperty -Path $reg -Name ProxyServer -Value $proxyServer}I put these in my $PROFILE and used them for a few days. It was ok, but there had to be a better solution… So I started to look into PAC or “Proxy auto-config” which is a configuration file that defines how web browsers can automatically choose the appropriate proxy server. Read more on WikipediaLong story short, I ended up using the following configuration file:function FindProxyForURL(url, host) {        // .onion URLs need a proxy:        if (shExpMatch(host, \\\"*.onion\\\"))        {                return \\\"PROXY localhost:8118\\\";        }        // other requests go directly        return \\\"DIRECT\\\";}Save the function above to a text file called proxy (without extension) and put it in C:\\\\Windows\\\\system32\\\\drivers\\\\etc\\\\ and set the systems AutoConfigUrl to: file://C:/Windows/system32/drivers/etc/proxyEnjoyTom\",\n  \"url\": \"https://onprem.wtf/post/the-invisible-internet-project-and-wsl/\"\n},{\n  \"id\": \"post-powershell-and-variable-references\",\n  \"title\": \"PowerShell and Variable References\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"I’ve come across an interesting behavior (or feature) of PowerShell the other day. As I don’t really understand what’s going on, I decided to write it up, maybe someone out there can help explaining this.ExpectedI’m writing a script that contains multiple functions and objects get passed from one function to another. As it happens the functions modify the objects that are passed in and output the modified information. So far so good, but what I found is, that the original object gets updated. So in the end I don’t need the function to output anything and can just carry on using the passed-in object.Confused? Well I am, so let’s try it with an example:$var = 1function Update-Value ([int]$InputObject) {    $InputObject++    Write-Output $InputObject}In the above example we define a variable with a value of 1 and a simple function that increases the value by 1 and outputs the increased value. That works as I would have expected, if we run the code, the output is:C:\\\\&gt; Update-Value $var2C:\\\\&gt; $var1UnexpectedNow if we do the same exercise with an object instead of a simple integer, the outcome is not exactly as I would have expected it to be. Here goes another example:$obj = New-Object -TypeName psobject -Property ([ordered]@{ a=1; b=2; c=3; })function Update-Value ([psobject]$InputObject) {    $InputObject.a++    Write-Output $InputObject}The idea is basically the same as above, the variable in this case contains a custom object with three properties: a, b, c. The function is still increasing the value on the input object, only that now we access the “a” property and increase it’s value.The output is as follows:C:\\\\&gt; Update-Value $obja b c- - -2 2 3C:\\\\&gt; $obja b c- - -2 2 3Now apparently the variable $obj gets updated as well. While in the first example, the integer in $var did not change, i.e. after running the function it was still 1, the value of $obj.a does change when I run the function.In my script I just decided to change the function so that it does no longer output the modified object and instead, I just call the function and carry on with my original variable. I do think the variable referencing in memory might be different when using a single integer vs. an object. It works for now, but as stated above, I don’t understand why and that worries me to some degree…Thanks to anyone who cares to comment and offer an explanation!TomUpdateAfter posting this to /r/PowerShell someone referred me to this thread which explains the behavior quite well.The variable $InputObject in my case does not contain the object but is just a pointer to $obj, which is therefore updated directly.\",\n  \"url\": \"https://onprem.wtf/post/powershell-and-variable-references/\"\n},{\n  \"id\": \"post-jekyll-on-wsl\",\n  \"title\": \"Jekyll on WSL\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"WSL\",\"ntSystems\"],\n  \"content\": \"Today we are looking at running Jekyll on WSL or Bash on Ubuntu on Windows.Install WSLFirst of all we’ll have to make sure our system fulfills the prerequisites to run the “Windows Subsystem for Linux”. We need a 64-bit version of the Windows 10 Anniversary (build 14939) or newer for that. Then we’ll have to enable the “Developer mode” using “Settings”, “Update &amp; Security” and finally “For Developers”.Once the above prerequisites are met, we can go ahead and enable the WSL using the control panel or the following command in an elevated PowerShell session:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-LinuxAnd finally we can type bash into an administrative command prompt to download and install bash.A detailed installation guide is available on MSDNInstall JekyllAfter setting up Bash on Ubuntu on Windows we can now install the required packages for Jekyll using the following commands.sudo apt-add-repository ppa:brightbox/ruby-ngsudo apt-get -y updatesudo apt-get install git build-essential libcurl4-openssl-dev zlib1g-devsudo apt-get install ruby2.4 ruby2.4-devAfter installing ruby verify the the installed version using ruby -v. Jekyll requires a version greater that 2.Now let’s install nodejs and finally Jekyll:curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -sudo apt-get install -y nodejssudo gem install jekyll bundlerServeNow that the prerequisites are installed, we can go ahead and build our static website. To get started with Jekyll, head over to the official documentation page. In my case, I just want to serve up a local copy of this great blog, so I clone the git repository and build the site locally using:git clone https://github.com/ntsystemsit/ntsystemsit.github.iocd ntsystemsit.github.io/bundle installbundle exec jekyll serve -d /tmp/ntsystemsNote: There seems to be a bug related with WSL. I have to use the --force-polling switch with the serve command on Windows 10 1607, on 1703 it works without that switch. Check the  following issue on GitHub.Well, what can I say? I really like the possibility to natively run Linux packages on Windows 10. Even though it doesn’t make the Linux part less complicated, at least I don’t need a VM anymore :)So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/jekyll-on-wsl/\"\n},{\n  \"id\": \"post-keeping-track-of-powershellcore-releases-on-github\",\n  \"title\": \"Keeping track of PowerShellCore releases on GitHub\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"GitHub\"],\n  \"content\": \"I’ve been using PowerShell Core on my MacBook for a while now. As the code is still in its early stages, there’s no way of managing/updating the software one is running, at least none that I would be aware of. I did miss some updates and, as a result, had problems with Visual Studio Code. So I’ve put together a quick function that checks the latest release on GitHub and can conveniently be put into my $PROFILE.GitHub Releases feedPowerShell Core was open-sourced some time ago and the team behind it is using GitHub to manage the code. The latest version for all the supported operating systems can be found in the PowerShell repository. Every so often, a new release is published to the Releases feature of GitHub and it happens that GitHub does provide an atom feed for releases. This feed can be accessed by simply appending “.atom” to the URL.Get-PSVersionGitHubArmed with this information, I wrote the following simple function. It just gets the latest release from the repository’s atom feed and adds the information to a hash table, which is then output as a custom object:Now I just put the function into my $PROFILE and make it run every time PowerShell starts.Easy enough, right?Tom\",\n  \"url\": \"https://onprem.wtf/post/keeping-track-of-powershellcore-releases-on-github/\"\n},{\n  \"id\": \"post-jekyll-fun-consuming-ntsystems-with-powershell\",\n  \"title\": \"Jekyll Fun: Consuming ntSystems with PowerShell\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"As you might have read before, our little blog is powered by Jekyll. Well I stumbled over the jsonify filter the other day, and so I built a little “kind-of” API :) Sound interesting? Read on.HowIt all started with search, I was looking for a search feature for our blog. After some testing with Algolia I stumbled over this great post by Katy. She’s using lunr.js with Jekyll. I liked the client-side approach of lunr.js and that it has no external dependencies, so I adopted Katy’s implementation for our site and, voilà, we have search. So, why do I keep talking about search? Well lunr.js consumes data in as json objects, so that’s how I learned about the jsonify filter.After some playing around with curly braces and the forloop in liquid I ended up creating the first version of our so-called API.Basically, what I’m doing is looping through the posts and creating json objects.I created a few different folders to expose different information, but more about that in the examples below.Use Invoke-RestMethod to consume the jsonThere are various “endpoints” available, we can get meta information about the site at /meta/ or a list of all pages and posts at /pages/and /posts/, respectively.In the following example, we’re getting all posts with a Category of ntSystems and then just select the tags property:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Where-Object category -eq ntSystems | Select-Object tagstags----{migrate, jekyll}{migrate, jekyll}{update, jekyll}Alternatively, we can get list of all categories, just like that:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Select-Object Category -Uniquecategory--------CloudAzureDev...Awesome, right?Well, that’s all for today. Enjoy your weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/jekyll-fun-consuming-ntsystems-with-powershell/\"\n},{\n  \"id\": \"post-my-takeaways-from-ms-techsummit\",\n  \"title\": \"My takeaways from MS Tech Summit\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\"],\n  \"content\": \"Daniel and I have attended the Microsoft Tech Summit in Milan earlier this week. Overall it was a pretty good event, especially taking into account that it was free. The keynote was quite interesting, so much so, that I thought I’d share my takeaways.  Focus on solutions (not individual components) and add valueThis, for me, is the message that came across most clearly. Focus on helping your business, brining value by enabling new processes and possibilities. Don’t waste your valuable time upgrading the umpteenth server or migrating from v14 to v15. Move to the cloud where it makes sense and free-up resources.  Infrastructure continues to lose importance and platform services get more importantSure, there is a huge uptake in IaaS but that can only be an interim solution. If any organization is going to really benefit from using cloud services, the managing of virtual machines (just like on-prem) should not be part of the equation.  Skills change!In a modern world, the IT pro’s focus can no longer be a single nitty-gritty technical thing. Many of us almost ignored the business’ evloving needs while pursuing mastery in that single discipline. In this increasingly cloud-first world, we will have to change. Radically.  GDPR: General Data Protection RegulationThis thing is coming and fast. The business must be prepared and IT can should play a key role in implementing the right tools and policies to follow the regulation. Oh, and tell me about changing skills ;)  Cloud adoption in Italy is above average and growingIt was really interesting to see that the economic turbulences were a driver for cloud adoption in Italy. A great customer story with a well-known, Italian media outlet showed how a sensible approach to cloud technologies could both, enable exciting new scenarios and drive down cost.Sessions and slide decks can be downloaded from the Tech CommunityWhat do you think about the changing role of IT? Leave a comment below!Tom\",\n  \"url\": \"https://onprem.wtf/post/my-takeaways-from-ms-techsummit/\"\n},{\n  \"id\": \"post-aure-site-recovery-deployment-planner\",\n  \"title\": \"Azure Site Recovery Deployment Planner\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"ASR\"],\n  \"content\": \"Today I was super excited about the first tests with the Azure Site Recovery Deployment Planner. Sometimes calculating the Bandwidth, Storage, local infrastructure needed for Site Recovery can be very tricky. Therefore, I’m happy that Microsoft released a helpful tool to get the right information needed.The planner is a command-line tool in public preview for VMWare only, so the final version is not completed yet. Profiling the environment can be done remotely, so no agents or pieces of software on ESX Server or vCenter is needed. The planner provides following details:  Compatibility assessment  Network bandwidth need versus RPO assessment  Azure infrastructure requirements  On-premises infrastructure requirementsRequirementsThe planner needs following components:  Windows Server 2012 R2  .Net Framework 4.5  VMware vSphere PowerCLI 6.0 R3  Microsoft Visual C++ Redistributable for Visual Studio 2012  Microsoft ExcelProfilingFirst of all, we have to start profiling the VM’s that we want to protect with Azure ASR. The tool connects to the vCenter server (or ESX) to collect performance data. There is no performance impact on the VM’s because the performance data of the vCenter is taken and no data from inside the VM. The tool basically queries every 15 minutes the vCenter to get the performance data.As first step we create a VM list with VM’s we want to profile. Connect to the vCenter with the VMWare CLI:Connect-VIServer -ServerExport the list of all VM’s to a Text FileGet-VM |  Select Name | Sort-Object -Property Name &gt;  C:\\\\Service\\\\Output.txtYou should get a list like this. I deleted the not needed VM’s from the Textfile and saved the changes.Now we are ready to start profiling. Microsoft recommends to profile at least 15 days. In our test we will profile 24 hours. From a Powershell window we can start profiling with the following command:.\\\\ASRDeploymentPlanner.exe -Operation StartProfiling -Directory “C:\\\\vCenter1_ProfiledData” -Server vCenter1.FQDN -VMListFile “C:\\\\Service\\\\Output.txt” -NoOfDaysToProfile 0.04 -User vCenterUser1A complete list of all switches can be seen here.If you see following output in powershell you are all right. In my case, there are some VM’s not running and therefore a warning is displayed because the tool can obviously not collect performance data.Generate reportAfter profiling is completed we can see that the tool created some performance CSV Files:Now we can run the tool in report-generation mode to get the report.\\\\ASRDeploymentPlanner.exe -Operation GenerateReport -Server vCenter1.FQDN -Directory “C:\\\\vCenter1_ProfiledData” -VMListFile “C:\\\\Service\\\\Output.txt”A complete list of all switches can be seen here.The report is named as “DeploymentPlannerReport” and can be opened with Excel.What we can see from the Excel Report is basically the number of profiled, compatible and incompatible VM’s. If we click on details, we can get the name of the not compatible VM. In my case a VM’s has a Disk with 10TB VMDK attached. (Azure has a limit of 1TB per disk).I selected in the right corner a desired RPO with 15 minutes. Based on this value the report start calculating the Mbit/s needed.In the Required Network Bandwidth section there are 3 graphs:  To meet RPO 100 percent of the time: The recommended bandwidth in Mbps to be allocated to meet the desired RPO 100 percent of the time.  To meet RPO 90 percent of the time: If we cannot set the bandwidth needed to meet your desired RPO 100 percent of the time, we can choose to go with a lower bandwidth setting that can meet a desired RPO 90 percent of the time. (In my case 100 and 90 RPO are both 2 Mbit.. maybe there is still a bug with the calculation. Because the tool is in preview I guess this will be fixed before GA)  Achieved Throughput: This is the real Throughput that can be measured with the following command:ASRDeploymentPlanner.exe -Operation GetThroughputIn my case this is $Null because I have to change the QoS rules and didn’t execute the test acutally.Based on the storage activity the planner recommends the storage accounts needed. I have one VM with heavy storage operations that needs Premium disks (SSD).Very interesting is the recommendation about the local infrastructure. In my case, only one server is needed to replicate the VM’s to Azure.The WhatIf Graph shows what would happen if we decide to use a throughput to meet 90% of the RPO. Actually, I don’t fully understand the sense of the graph. Helpful would be to choose the bandwidth in a combo box or something similar and then see what happens.In the Recommended VM batch size for initial replication section, Microsoft shows the recommendation of number of VMs that can be protected in parallel to complete the initial replication within 72 hours with the suggested bandwidth to meet desired RPO 100 percent of the time being set. The value can be changed using the GoalToCompleteIR parameter during report generation.Let’s switch to the “Input” Tab in Excel. Here we can see some very interesting values. The most interesting values for me is: Total Data to be replicated for initial replicationConclusionSome things don’t work as expected. But we have to consider that the tool is in public preview, so many changes and improvements are expected. Stay tuned for further updates.Daniel\",\n  \"url\": \"https://onprem.wtf/post/aure-site-recovery-deployment-planner/\"\n},{\n  \"id\": \"post-get-going-with-go\",\n  \"title\": \"Get Going with Go!\",\n  \"author\": \"tto\",\n  \"tags\": [\"Go\",\"Basics\"],\n  \"content\": \"Everyone is talking about Go these days so I decided to have a look at it and see what it could do for me.BasicsSo what is Go? Well according to golang.org  Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.Ok, so another programing language, why do I care you ask? Well that’s a story for another day, for now, let’s say that I’m just generally interested in awesome technology.Installing on macOSThe first “Hello World” kind of program can easily be done using tour.golang.org but I wanted to get it up and running on my MacBook so I installed the package using brew, it’s easy enough with: brew install goAfterwards, a quick go version confirmed that the latest and greatest version of Go has been installed. 1.8 at the time of writing.go version go1.8 darwin/amd64Environment VariablesBefore firing up an editor, some environment variables need to be set in order for Go to work and store projects and dependencies in some user-defined path. I’ve added the following to lines to my bash profile:export GOPATH=$HOME/git/goexport GOBIN=$(go env GOPATH)/binexport PATH=$PATH:$GOBINWhat this does, is setting the GOPATH and GOBIN environment variables to a folder in my home directory and adding the GOBIN directory to the systems’ PATH variable. The first variable instructs Go to look for and install sources and packages in the specified folder, the second variable defines where binaries are located and adding this to the systems’ PATH simply makes running Go programs easier.Hello World with Visual Studio CodeOn the Mac, I’m mostly using VS Code to write/edit text files, as it has some extensions for Go, I figured it would do the trick for the beginning. So I opened up my GOPATH directory in VS Code and created a new folder under src, hello in my case. In this folder I created a hello.go file, and at this point, Visual Studio Code recognises the Go language and downloads some required tools to the GOPATH directory.After a restart, I created the following hello world program:package mainimport \\\"fmt\\\"// SayHelloTo takes a string and prints it to the console.func SayHelloTo(s string) {\\tfmt.Println(\\\"Hello \\\" + s + \\\"!\\\")}// The main function just invokes SayHelloTo with a stringfunc main() {\\tSayHelloTo(\\\"Tom\\\")}Run / Build / InstallTo run the above program, just change into the hello folder and run go run hello.go which should result in the following output:ttor$ go run hello.goHello Tom!Now if I wanted to create a binary and install it, I could simply run go build hello.go which leaves me with the executable file. To install it, into Go’s bin directory (GOBIN) I use: go install hello.goAfter that, I can run hello and again get the above output:ttor$ helloHello Tom!Well that was my quick introduction to Go, we’ll soon see if there’s more to come…Nice weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/get-going-with-go/\"\n},{\n  \"id\": \"post-get-started-with-azure-arm-templates\",\n  \"title\": \"Get started with Azure ARM Templates\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"RM\"],\n  \"content\": \"To start with the deployment using Azure ARM Templates is quite easy. A first step can be to deploy an Azure SQL Database. But let’s start with a bit of background information:TemplatesWe can create a template (in JSON format) that defines and configures the Azure solution. When we create a solution from the portal, the solution automatically includes a deployment template. So, we don’t have to create our template from scratch but we can download the templates for the existing deployments. To get the templates open the “Resource Group” section in the Azure Portal and click on DeploymentsClick on “View Templates”What we can see now is the Template and Parameter file. When we start a new deployment, we have to define parameters for the resource template, these needs to be entered in before the deployment can start.You can find other ARM templates on the following Microsoft WebsiteDeploymentWe are going to deploy a new SQL Database, so my template looks like this:{    \\\"$schema\\\": \\\"http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#\\\",    \\\"contentVersion\\\": \\\"1.0.0.0\\\",    \\\"parameters\\\": {        \\\"collation\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"databaseName\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"edition\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"requestedServiceObjectiveId\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"maxSizeBytes\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"serverName\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"serverLocation\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"diagnosticStorageAccountId\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        },        \\\"diagnosticsTemplate\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        },        \\\"sampleName\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        }    },    \\\"resources\\\": [        {            \\\"type\\\": \\\"Microsoft.Sql/servers/databases\\\",            \\\"name\\\": \\\"[concat(parameters('serverName'), '/', parameters('databaseName'))]\\\",            \\\"apiVersion\\\": \\\"2014-04-01-preview\\\",            \\\"location\\\": \\\"[parameters('serverLocation')]\\\",            \\\"properties\\\": {                \\\"collation\\\": \\\"[parameters('collation')]\\\",                \\\"edition\\\": \\\"[parameters('edition')]\\\",                \\\"maxSizeBytes\\\": \\\"[parameters('maxSizeBytes')]\\\",                \\\"requestedServiceObjectiveId\\\": \\\"[parameters('requestedServiceObjectiveId')]\\\",                \\\"sampleName\\\": \\\"[parameters('sampleName')]\\\"            }        }    ]}Let’s focus on the parameter file that specifies the deployment. It should look like this:{    \\\"$schema\\\": \\\"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#\\\",    \\\"contentVersion\\\": \\\"1.0.0.0\\\",    \\\"parameters\\\": {        \\\"collation\\\": {            \\\"value\\\": \\\"SQL_Latin1_General_CP1_CI_AS\\\"        },        \\\"databaseName\\\": {            \\\"value\\\": \\\"Database3\\\"        },        \\\"edition\\\": {            \\\"value\\\": \\\"Basic\\\"        },        \\\"requestedServiceObjectiveId\\\": {            \\\"value\\\": \\\"dd6d99bb-f193-4ec1-86f2-4fe4rscbc49c\\\"        },        \\\"maxSizeBytes\\\": {            \\\"value\\\": \\\"2147483648\\\"        },        \\\"serverName\\\": {            \\\"value\\\": \\\"sqllogicalz2010\\\"        },        \\\"serverLocation\\\": {            \\\"value\\\": \\\"westeurope\\\"        },        \\\"diagnosticStorageAccountId\\\": {            \\\"value\\\": \\\"\\\"        },        \\\"diagnosticsTemplate\\\": {            \\\"value\\\": \\\"\\\"        },        \\\"sampleName\\\": {            \\\"value\\\": \\\"AdventureWorksLT\\\"        }    }}I modified that Database Name because I want my new Database to be called “Database3”. Lets save both files to the local machine (or GitHub if you want). Name the template file NewSQLDatabase.json and the parameter file Parameter-NewSQLDatabase.json.The Template and Parameter files are now ready for deployment. Lets fire up Powershell and push the change to Azure. First, we have to connect to the Azure Account and select our subscription# Connect to Azure RM AccountLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId c2a12a42-0179-*************With the “New-AzureRmResourceGroupDeployment” cmdlet we start the deployment process using our template and parameter file as attributes.# ARM Template SQL DatabaseNew-AzureRmResourceGroupDeployment -Name SQLDatabase -ResourceGroupName rg_Z2010 -TemplateFile \\\"F:\\\\Templates\\\\SQL Database\\\\NewSQLDatabase.json\\\" -TemplateParameterFile \\\"F:\\\\Parameters\\\\SQL Database\\\\Parameter-NewSQLDatabase.json\\\"After we executed the command we should see similar output and the Database is running on Azure :)Stay tuned for further postsDaniel\",\n  \"url\": \"https://onprem.wtf/post/get-started-with-azure-arm-templates/\"\n},{\n  \"id\": \"post-disable-backup-protection-for-azure-vm\",\n  \"title\": \"Disable Azure Backup Protection for a VM with Azure PowerShell\",\n  \"author\": \"dni\",\n  \"tags\": [\"PowerShell\",\"Azure\",\"RM\"],\n  \"content\": \"My Azure credits burn faster than expected :) So I decided to remove some VM’s and Backup that I used for a customer’s demonstration. Since I don’t use the Azure Portal for configuration anymore, I fired up Powershell and did the Job. With the following commands, I show you how to stop the Backup for a Virtual Machine and delete the associated Recovery Points.Disable and delete VM BackupLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId ***************$container = Get-AzureRmRecoveryServicesBackupContainer -Name VIRTUAL-MACHINE-NAME  -ContainerType AzureVM$BackupItem = Get-AzureRmRecoveryServicesBackupItem $container -WorkloadType AzureVM Disable-AzureRmRecoveryServicesBackupProtection -Item $BackupItem -RemoveRecoveryPointsI know you may think this is quite simple and why is this guy writing a post with only 3 lines of code.  It’s because Tom moved our blog to Git and this is my first blog post that I try to upload and don’t wanted to wait :)Greetings\",\n  \"url\": \"https://onprem.wtf/post/disable-backup-protection-for-azure-vm/\"\n},{\n  \"id\": \"post-migrating-blogengine-to-github-pages-2\",\n  \"title\": \"Migrating from BlogEngine to GitHub Pages: Fixing the links\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"In this episode of our little series on migration we are having a look at the URL structure of Jekyll and some of the less visible stuff that was associated with the old ntSystems.All the existing URLs on our BlogEngine-based blog used both, upper- and lowercase letters, and had an filename extension of .aspx. Now Jekyll does not use filename extensions (or at least doesn’t display them) and it uses all lowercase letters in URLs.Additionally we moved from https-enabled to https-only and the usage of a www. hostname was not defined. So all of those URLs would have worked on the old blog:  http://ntsystems.it/CONTACT.aspx  https://ntsystems.it/contact.aspx  http://www.ntsystems.it/contact.aspx  …You see, it was a mess. On the current version of ntSystems, only the following URL will work:  https://ntsystems.it/contact/But what about existing links from social media, other blog posts, or where ever else, you ask? Well the solution is twofold. First, enter…CloudflareWe have been using Cloudflare for a while to easily enable IPv6 and and https even for our old blog. Now another feature, Page Rules, comes in very handy indeed. In fact a single rule is enough to get rid of the .aspx extensions:If the URL matches *ntsystems.it/*.aspx forward the request to https://ntsystems.it/$2 where $2 is the stuff that was matched by the second asterisk * in the matching pattern. Easy enough!Jekyll URL structureThe second part of getting URLs right is instructing Jekyll to make them the same as before, without .aspx. And it turns out, that’s not to hard, either:The following setting in our _config.yml file tells Jekyll to build all posts in the /post/ directory.permalink: /post/:titleThe title property was copied into the front matter by the script we used to migrate the posts. Quite ready, but not yet.We still have to deal with the uppercase/lowercase filenames in the URLs. We ended up using JekyllRedirectFrom to work around that. We just added the 'jekyll-redirect-from' gem to our Gemfile and used the migration script to add an uppercase version of the filename to the front matter like this:redirect_from: [\\\"/post/Azure-File-Services\\\", \\\"/post/azure-file-services\\\"]URLs. Check.RSSBlogEngine used a number of .axd scripts/handlers as endpoints for things like the RSS feed, the sitemap file, or a metaweblog extension. Obviously, the /syndication.axd URL does no longer work on Jekyll, a simple /feed.xml file is used instead.I tried various redirection methods but found that RSS clients (like The Old Reader) ignored them and the feed would go dead.After some testing I found that I could create a directory with the name of syndication.axd and simply put an index.html into it. Jekyll does not show the index.html in the URL, therefore the URL would still be /syndication.axd. I copied the content of feed.xml into the /syndication.axd/index.html and, voilá, the existing RSS link continued to work.SitemapThe URL of the sitemap.axd file is less important as it’s only used by search engines and not by users. So we just created a new sitemap.xml file and pointed the search engines to this new file. Additionally, we updated the Sitemap property in our robots.txt file.Well, and that’s it for today. Happy Halloween! :)Tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-blogengine-to-github-pages-2/\"\n},{\n  \"id\": \"post-introducing-tak\",\n  \"title\": \"Introducing: TAK\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"content\": \"Over the years I did create, find, copy, paste, quite a few lines of PowerShell code. Some of which I’m turning into re-usable functions and collecting in a module, creatively called “Tom’s Admin Kit” or TAK. I hope you find it useful.I try to credit the sources for the stuff that I just copied off of the interwebs, even though I don’t actually remember all of them.PesterAs written before, Pester is  a unit testing framework for PowerShell code. So one can write simple tests to verify the code actually does, what it is supposed to do. Not all functions are covered by tests, yet, but I try to be better at that. The existing tests can be found in the GitHub repo for the module.CI&amp;D: GitHub and AppVeyorI read a lot about this continuous integration and delivery and I thought it would be nice to play with some of the involved tools myself. So I created a small-ish release pipeline/workflow for this module using GitHub, AppVeyor and the PowerShell Gallery. Here is how it works: When a new commit is pushed to GitHub, AppVeyor picks up the latest code and deploys it to a test machine. It then runs all the pester tests and, upon success, publishes the module to the PowerShell Gallery.The tests that should be run to verify the code, are defined in the appveyor.yml file in the GitHub repository.test_script:    - ps: |        $testResultsFile = \\\".\\\\TestsResults.xml\\\"        $res = Invoke-Pester -OutputFormat NUnitXml -OutputFile $testResultsFile -PassThru        (New-Object 'System.Net.WebClient').UploadFile(\\\"https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)\\\", (Resolve-Path $testResultsFile))        if ($res.FailedCount -gt 0) {            throw \\\"$($res.FailedCount) tests failed.\\\"        }Just like the deployment task, that will be invoked if the tests passed.deploy_script:  - ps: |      Install-PackageProvider -Name NuGet -Force      $manifest = Join-Path -Path $pwd -ChildPath \\\"TAK\\\\tak.psd1\\\"      (Get-Content $manifest -Raw) -Replace(\\\"1\\\\.0\\\\.0\\\\.\\\\d{1}\\\", $env:APPVEYOR_BUILD_VERSION) | Out-File $manifest      Publish-Module -NugetApiKey $env:psgkey -Path ($PublishPath = Join-Path -Path $pwd -ChildPath TAK) -Confirm:$falseHelpMost functions include comment-based help and a HelpUri that links to the online version of the help article. Just add the -Online parameter when getting help, like in the following example:Get-Help Test-TCPConnection -OnlineA full list of available help files can be found here: TAKDownload &amp; Source forThe Module is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    More information about the PowerShell Gallery can be found in the FAQGive it a try, and, if you spot a bug or have an idea for improvement, just create in a pull request.So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/introducing-tak/\"\n},{\n  \"id\": \"post-azure-stack-poc-tp2-on-vmware\",\n  \"title\": \"AzureStack POC TP2 on VMware\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"content\": \"I’ve been trying to make the Azure Stack Proof-of-Concept (Preview 2) run on VMware and here is what I found. First of all, the documentation to set this stuff up can be found here: Deploy Azure Stack POCPrepare VMAs I currently run VMware in my lab and didn’t want to re-install the physical server, I tried to get the Azure Stack up and running in a VMware VM. Following the recommendation for sizing, I created a VM with 100GB of RAM, 24 vCPUs, one vNIC and 5 hard disks with 200GB each. The many vCPUs are actually not necessary, as the hardware check does fail even though enough cores should be available. More on that later.Additionally, I did enable the “Hardware virtualization” feature in the VM’s CPU settings. You can do this using the vSphere Web Client or use the following quick-and-dirty PowerCLI function for it:As the Virtual Machine will run Hyper-V and some guest VMs, we have to disable the security features on the virtual Port Group where the VM is connected to:Get-VDSecurityPolicy -VDPortgroup VLAN95 |Set-VDSecurityPolicy -AllowPromiscuous:$true -MacChanges:$true -ForgedTransmits:$true  Note in the above example I’m using a distributed virtual Port Group. For a standard virtual Port Group use Set-SecurityPolicy.Prepare WindowsThe next step is to install Windows and the VMware tools, download the Azure Stack TP2 support files (see documentation link above) and copy the CloudBuilder.vhdx file to the root of the C drive of our VM. Then I started .\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath and was confronted with an error, stating “The server is currently already booted from a virtual hard disk…”Fortunatelly, the fix is easy: Open the PrepareBootFromVHD.ps1 file and find the following section:if ((get-disk | where {$_.isboot -eq $true}).Model -match 'Virtual Disk')     {    Write-Host \\\"The server is currently already booted from a virtual hard disk, to boot the server from the CloudBuilder.vhdx you will need to run this script on an Operating System that is installed on the physical disk of this server.\\\"    Exit    }Now either remove the section or just remove the Exit. That way, it will still display a warning but no longer stop the execution of the script.Again, start .\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath which should now succeed and prompt for a reboot of the machine.Install the CloudThe VM restarts and boots from the CloudBuilder.vhdx file with the typical OOBE asking for an admin password and the product key. Once set, startup continues and we can log-in to the VM. At this point, we’ll have to install the VMware tools again. The next step is to initialize the additional hard disks for the machine. The disks must be “empty” so do not create any volumes. I just run Get-Disk | Initialize-Disk and move on.Now the documentation wants us to open an administrative PowerShell console, change into the C:\\\\CloudDeployment\\\\Configuration folder and run the installation script. As a few checks are built-in to prevent this kind of setup (and verify hardware resources) this will fail with the following error message:2016-10-13 08:03:58 Error    Task: Invocation of interface 'Validate' of role 'Cloud\\\\Infrastructure\\\\BareMetal' failed: Function 'Test-BareMetalRole' in module 'Roles\\\\PhysicalMachines\\\\PhysicalMachines.psd1' raised an exception:One or more validation test failed for Role 'BareMetal' on machine 'WIN-MUTSIQJMO43'For detailed test results look at file '\\\\\\\\WIN-MUTSIQJMO43\\\\C$\\\\CloudDeployment\\\\Logs\\\\Tests\\\\TestResults_WIN-MUTSIQJMO43_BareMetal_2016-10-13-08-03-44.xml'Test Failed: Validate that the computer 'WIN-MUTSIQJMO43' is a physical machine.Test Failed: Validate that at least 12 cores are available in computer WIN-MUTSIQJMO43.At C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1:875.+         Trace-Error $messageat Trace-Error, C:\\\\CloudDeployment\\\\Common\\\\Tracer.psm1: line 52at Start-Test, C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1: line 875at Test-BareMetalRole, C:\\\\CloudDeployment\\\\Roles\\\\PhysicalMachines\\\\TestPhysicalMachines.psm1: line 86at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 08:03:58 Verbose  Step: Status of step '(DEP) Validate Physical Machines' is 'Error'.So the two tests that failed use the following CIM Instances (WMI) to query information about the host system: Win32_ComputerSystem, Win32_Processor Now even though I did configure 24 vCPUs for my VM, the NumberOfEnabledCore attribute of Win32_Processor shows a value of “0”.Here too, there’s an easy fix: Find the BareMetal.Tests.ps1 file in the C:\\\\CloudDeployment\\\\Roles\\\\PhysicalMachines\\\\Tests directory and make the following tests pass:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        $physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        ($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}Again, we could just remove the actual test (the expression inside the It {} statement) or make it a comment or modify the code to make it pass. I ended up with the following, slight modification:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        #$physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        #($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}By the way, you’ll see that this script is signed, so in order to make it run, remove the signature and save the script.Install the Cloud #2Now we can go ahead and invoke the install script to actually install Azure Stack inside the virtual machine. As there is no DHCP Server available in the network into which I’m deploying, I specify a few options when invoking the installation script:$installParams = @{    NatIPv4Subnet = \\\"172.16.8.0/24\\\";    NatIPv4Address = \\\"172.16.8.212\\\";    NatIPv4DefaultGateway = \\\"172.16.8.254\\\";    EnvironmentDNS = \\\"172.16.8.120\\\";}.\\\\InstallAzureStackPOC.ps1 @installParamsNote that this script has a rerun parameter, so if execution failes, it can be invoked again and will continue where it left off: .\\\\InstallAzureStackPOC.ps1 -RerunNote that at some point of the installation, the VM is rebooted and logged in automatically to the account “azurestack\\\\azurestackadmin”. From that moment on, all installation related tasks (such as a -Rerun) should be performed using this account.I did stumble over another prolem, installation stopped with the following error:2016-10-13 13:48:18 Error    Task: Invocation of interface 'Configure' of role 'Cloud\\\\Fabric\\\\NC' failed: Function 'ConfigureNC' in module 'Roles\\\\NC\\\\NC.psd1' raised an exception:Task failed with the following error: 'The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota.'.At C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1:83.+         $status.ErrorMessageat Trace-Error, C:\\\\CloudDeployment\\\\Common\\\\Tracer.psm1: line 52at Start-PSScriptUsingTask, C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1: line 83at ConfigureNC, C:\\\\CloudDeployment\\\\Roles\\\\NC\\\\NC.psm1: line 620at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 13:48:18 Verbose  Step: Status of step '(NET) Configure NC on VMs' is 'Error'.Apparently the default value of 500 for MaxEnvelopeSize is not enough, I used the following command to increase the size to 8192:winrm set winrm/config '@{MaxEnvelopeSizekb=\\\"8192\\\"}'ResultOnce the InstallAzureStackPOC.ps1 script finished running, there will be 13 VMs running on our “Host VM”, consuming about 52GB of RAM:Get-VMName         State   CPUUsage(%) MemoryAssigned(M) Uptime           Status             Version----         -----   ----------- ----------------- ------           ------             -------MAS-ACS01    Running 0           8192              00:46:18.2560000 Operating normally 8.0MAS-ADFS01   Running 0           1164              01:33:39.1820000 Operating normally 8.0MAS-ASql01   Running 0           4096              01:00:02.6710000 Operating normally 8.0MAS-BGPNAT01 Running 0           1460              01:46:26.7640000 Operating normally 8.0MAS-CA01     Running 0           844               01:32:56.9940000 Operating normally 8.0MAS-Con01    Running 0           4096              01:39:16.7620000 Operating normally 8.0MAS-DC01     Running 0           4096              02:09:00.7000000 Operating normally 8.0MAS-Gwy01    Running 0           4096              00:54:18.0770000 Operating normally 8.0MAS-NC01     Running 0           2048              01:19:39.9240000 Operating normally 8.0MAS-SLB01    Running 0           4096              01:04:11.8220000 Operating normally 8.0MAS-SUS01    Running 0           2048              01:37:49.5430000 Operating normally 8.0MAS-WAS01    Running 1           8192              01:36:31.2300000 Operating normally 8.0MAS-Xrp01    Running 0           8192              01:34:04.3710000 Operating normally 8.0If you encounter problems during installation, make sure to check the summary.log.xml file in C:\\\\CloudDeployment\\\\Logs.To actually log in to the Azure Stack Portal, open the MAS-Con01 VM’s conole and find a link to the portal on the desktop:Ok, so with that: Have fun with Azure Stack and happy hacking ;)Tom\",\n  \"url\": \"https://onprem.wtf/post/azure-stack-poc-tp2-on-vmware/\"\n},{\n  \"id\": \"post-migrating-blogengine-to-github-pages-1\",\n  \"title\": \"Migrating from BlogEngine to GitHub Pages: BlogML to Markdown\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"As promised here, I’m sharing the first part of our migration process from BlogEngine to GitHub Pages. A major part is, obviously, the migration of the content of the blog itself.BlogMLAccording to Wikipedia “BlogML is an open format derived from XML to store and restore the content of a blog.” Luckily, BlogEngine has an export option that exports all content (posts and pages) to a XML file.  Note: The XML file contains only the text content. So images, files and other assets have to be migrated separately.I downloaded the BlogML file and started to look around for solutions to somehow convert the stuff to something Jekyll could use. After some googling, I found this blog describing something very similar. Apparently he was using a ruby script to create a properly formatted markdown (.md) file for each post in the BlogML file. Thankfully, the script could be found in his GitHub Repo.The script was almost perfectly suited for our purposes after some small modifications I started it like so:$ ruby -r './blogml.rb' -e 'Jekyll::BlogML.process(\\\"BlogML.xml\\\")'Note that in my case the BlogML.xml file is located in the same directory as the script and a new directory named “_posts” is created in the same path. Any existing directory with the same name will be deleted.The modified version of the script is available here.WritingOnce the posts (and the rest) was migrated, one has to start writing new stuff. Posts are written in plain text with markdown formatting so no super fancy editor is required and I’m getting along well with VS Code. I’m using the “Spelling and Grammar Checker” extension hoping it catches to most obvious typos ;)Stay tuned for more.Tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-blogengine-to-github-pages-1/\"\n},{\n  \"id\": \"post-welcome-to-the-all-new-ntsystems\",\n  \"title\": \"Welcome to our new blog!\",\n  \"author\": \"tto\",\n  \"tags\": [\"Update\",\"Jekyll\",\"GitHub\"],\n  \"content\": \"This site has been running on Azure Web Sites for some time. As we are doing this for fun and are not making any money with the site (see any ad?) we had to use the “Shared” pricing tier which was economically acceptable but from a performance and feature point-of-view, well, not great. We used Cloudflare to get some caching and enable stuff like https and IPv6 for the site and it was OK :) Then came……JekyllRecently I started publishing some of the PowerShell code I’m writing to GitHub and while browsing around, I stumbled over a static page generator, called Jekyll. I was quite impressed and started hacking around for a little while… after a couple of train rides I was happy with the result and decided to give it a go. So, that’s it:  Welcome to our new home on GitHub!As of 2016-10-02 we moved to Jekyll. The current version of our little blog is hosted on GitHub Pages and uses a slightly modified version of the default Minima theme for Jekyll.ToolsAs this is now, essentially, a static website, we have to use some tools to make it as awesome as possible:  Cloudflare: Security, IPv6, TLSv3, Page Rules… and more awesomeness  Algolia: Search as a Service  lunr.js: Full-text search in your browser  Favicon Generator  Shariff: Share without compromising privacy  Disqus: CommentsWork in progressThis migration is a work in progress and therefore not all features the good, old ntsystems.it are available as of today. I intend publishing a few lines about the migration itself, and keeping it up-to-date as we move along and build new features into the site.We do hope you enjoy our new look. It is all open source, so if you are interested in how we do stuff, just check out our repoOh and if you find any errors you’d wish to correct, please just send us a pull-request :-)So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/welcome-to-the-all-new-ntsystems/\"\n},{\n  \"id\": \"post-powershell-on-macos\",\n  \"title\": \"PowerShell on macOS\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"macOS\",\"GitHub\"],\n  \"content\": \"Just sharing some quick notes on how to run PowerShell (and dotnet core) on macOS Sierra.OpensslPowerShell requires dotnet core which, in turn, requires openssl to be installed (and linked correctly). Using brew, one can easily install openssl, if it is already installed, use brew list to show the installation location:$ brew install openssl$ brew list openssl.../usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib/usr/local/Cellar/openssl/1.0.2j/lib/libssl.1.0.0.dylib...As of 2016-10 it is required to create symlinks for the above listed libraries (libcrypto, libssl) at /usr/local/lib, use ln -s like so:$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/lib$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/libNote: Make sure that the path used in the link (ln) actually matches the one given by the `brew list` output..NET CoreHead over to https://www.microsoft.com/net/core#macos and download a copy of the installer. Installation is straight-forward, just double-click the .pkg and follow instructions.After installation, verify that dotnet works by creating the “Hello World” app as suggested on the download site:$ mkdir testapp$ cd testapp$ dotnet newCreated new C# project in /Users/tom/testapp.$ dotnet restore$ dotnet runPowerShellGet the latest .pkg at https://github.com/PowerShell/PowerShell/releases. Again, installation is simple, just double-click the .pkg and follow instructions. To verify installation, open a terminal and run powershell`$ powershellPowerShellCopyright (C) 2016 Microsoft Corporation. All rights reserved.PS /Users/tom&gt; $PSVersionTableName                           Value----                           -----PSVersion                      6.0.0-alphaPSEdition                      CorePSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}BuildVersion                   3.0.0.0GitCommitId                    v6.0.0-alpha.10CLRVersionWSManStackVersion              3.0PSRemotingProtocolVersion      2.3SerializationVersion           1.1.0.1Note: It's still early days, the above procedure might be simplified soon Enjoy :)\",\n  \"url\": \"https://onprem.wtf/post/powershell-on-macos/\"\n},{\n  \"id\": \"post-deploying-labs-using-azure-resource-manager\",\n  \"title\": \"Deploying Labs using Azure Resource Manager\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Azure\",\"Cisco\"],\n  \"content\": \"I did a demo of Cisco CSR 1000v on Azure the other day and the easy deployment of a small test-network was part of that demo. I really enjoyed deploying the lab using ARM templates, so why not share the love?So what’s ARM?Azure Resource Manager is the “new” deployment model for all kinds of resources within Azure. The great thing about it is, that it works with template and parameter files, so we can easily prepare an environment and deploy it over and over again, with either the same or different parameters.CSR 1000v?That’s what the customer wanted to see and why I got do a demo on Azure in the first place. Cisco provides images in the Azure Marketplace (https://azure.microsoft.com/en-us/marketplace/) so that customers can run a fully featured IOS XE router in the cloud.The Lab networkSo as mentioned above, i wanted to demo the setup of a quick lab along with the CSR, having only the router and no endpoints to connect to, doesn’t make to much sense. I used the Azure Resource Manager to create a new resource group and a new virtual network with two subnets. One of which would be CSR’s “public” facing subnet (with a Public IP associated) the other one was my “backend” network for cloud workloads (without Public IPs). A Nano Server was quick to deploy and provided the “backend” for my lab.The templateI did use Visual Studio to modify and adapt the ARM template to my needs, but really any text editor/ISE can be used.The template consists of two files, the template itself and a file for parameters. In my case, I did use the parameter file just for the passwords of the CSR and the Nano Server, the other parameters are assigned directly in the template file. There is room for improvement in this case, as the template would be more flexible if it had less “hardcoded” information.The template specifies how the virtual network, subnets and eventually the CSR and Nano Servers should be deployed.DeployOnce ready, the template can be be deployed to any Azure Subscription using a number of methods: One can deploy directly from Visual Studio or PowerShell or even from the cross-platform CLI on a Mac.Using PowerShellFirst, we have to create a Resource Group to which the template will be deployed:$RGName = 'rg-tomt-lab' $RGLocation = 'westeurope' New-AzureRmResourceGroup -Name $RGName -Location $RGLocation Then we prepare a variable which specifies the resource group, the template file and the parameters file.$Params = @{     'ResourceGroupName' = $RGName    'TemplateFile' = 'C:\\\\azure\\\\azure_arm_csr_nano_template.json'    'TemplateParameterFile' = 'C:\\\\azure\\\\azure_arm_csr_nano_parameters.json' }Using the Test-* cmdlet we can simulate deployment and verify that all checks out:Test-AzureRmResourceGroupDeployment @Params -VerboseAnd if everything looks good, we can go ahead and finally create the deployment:New-AzureRmResourceGroupDeployment @Params -VerboseUsing the xPlat CLIAlmost the same thing can be be done using the cross-platform CLI, which is what I use on my Mac.Create a Resource Group:azure group create -n rg-csr-lab -l \\\"West Europe\\\"Deploy the templateazure group deployment create -f azure_arm_csr_nano_template.json -e azure_arm_csr_nano_parameters.json -g rg-csr-lab -n CSR01Find the template, parameters file and more detailed information for deployment at my GitHub: https://github.com/tomtorgglerSo, once the template is prepared, deployment is just a piece of cake! That’s how deploying labs just got a lot quicker, don’t you think?Enjoy,— Tom\",\n  \"url\": \"https://onprem.wtf/post/deploying-labs-using-azure-resource-manager/\"\n},{\n  \"id\": \"post-veeam-direct-restore-to-azure\",\n  \"title\": \"Veeam direct restore to Azure\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"Veeam\"],\n  \"content\": \"Today I tried to restore a Veeam backed up VM directory to Microsoft Azure. Veeam gives you a free piece of software to get this done quickly with few easy steps. Lets jump into the configuration First of all we deploy the Veeam Direct Restore to Azure preconfigured VM from the Azure marketplaceWhen the VM starts up, we connect and have to specify some configuration parameter. We click on “Configuration”Veeam asks us to specify the configuration File for the subscriptionWe can download the configuration file with the following lines of codeNow the Veeam Part in Azure is configured and ready to convert Veeam Backup files to Azure virtual machines. We create a backup of a machine and upload the files to the Veeam virtual machine in Azure. After the files are available we start the restore process and specify the BackupFile:We can choose which restore point we want to restoreAfter that we can select the region and size of the virtual machine&nbsp;After we specified the Network and storage account the restore begins&nbsp;After few minutes the machine is restored from a Veeam backup and available in Azure. &nbsp;With Veeam Version 9.5 a direct restore to Azure with API and without a convert VM is also possible. Stay tuned for Version 9.5Greetingdn\",\n  \"url\": \"https://onprem.wtf/post/veeam-direct-restore-to-azure/\"\n},{\n  \"id\": \"post-lync-sdn-api-and-cisco-wlc\",\n  \"title\": \"Lync SDN API and Cisco WLC\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Cisco\",\"en\",\"Skype4B\"],\n  \"content\": \"Some days ago I had the chance to test Cisco’s Wireless LAN Controllers with the Lync Software Defined Networking (SDN) API.For those who don’t know what SDN API is, a quick overview: You can basically think of the SDN API as a little add-on, that can be installed on Lync Front End Servers, and that allows Lync to “let the network know” what’s going on from it’s perspective. The SDN API is made up of two components, the Lync Dialog Listener (LDL) and the Lync SDN Manager (LSM). The LDL component is installed on each Front End Server, and sends information to the LSM. The LSM forwards information to a so called SDN Controller, which, in our case, is the Cisco WLC.More information and the API documentation is available on the MSDN: https://msdn.microsoft.com/en-us/library/office/dn387071.aspxThe WLC SideThe SDN Controller has to accept and process information coming from the LSM, Cisco has built this  functionality into it’s Wireless LAN Controller software from 7.6. We used 8.2 in this example. First we need to define a port, protocol, and enable the “Lync Server” option globally. This can be done using the “Lync Server” option in the “Wireless” tab:Now that the WLC listens for information, we’ll have to tell it, what to do with. Using the “WLANs” tab, we created a new SSID, enabled “Lync Server” and selected the appropriate QoS policy for each type of traffic:A quick excerpt from show wlan shows the QoS settings:Local Policy---------------Policy Name                                       Priority---------------                                   --------  Lync State ...................................... EnabledAudio QoS Policy................................. PlatinumVideo QoS Policy................................. GoldApp-Share QoS Policy............................. SilverFile Transfer QoS Policy......................... BronzeThe Lync SideMeanwhile, we’ve installed the Lync SDN Manager on a dedicated server, as it’s not recommended to run it on the Front Ends (and it didn’t work either). The LSM is configured through a configuration file SDNManager.exe.config, which can be found in the LSM’s installation directory: C:\\\\Program Files\\\\Microsoft Lync Server\\\\Microsoft Lync SDN API\\\\The configuration is quite simple, the value submituri specifies the WLCs IP Address and Port, additionally, the value for backwardcompatibility must be set to true:&lt;appSettings&gt;    &lt;add key=\\\"submituri\\\" value=\\\"http://172.25.81.105:15120\\\"/&gt;    &lt;add key=\\\"backwardcompatibility\\\" value=\\\"true\\\"/&gt;With the LSM configured, we installed the Dialog Listener on the Front End Server. During setup, we are asked for the submituri so we don’t even have to edit the config file in this case. Note that the submit URI for the LDL points to the LSM. The configuration file for the LDL can be found here: C:\\\\Program Files\\\\Microsoft Lync Server\\\\Microsoft Lync SDN API\\\\LyncDialogListener.exe.config:&lt;appSettings&gt;  &lt;add key=\\\"submituri\\\" value=\\\"http://srv01.ccielab.local:9333/LDL/CallInfo\\\"/&gt;The Client SideNow we were ready for some testing and connected our clients to the new SSID. After signing into Lync and making some calls, we were able to verify that they appeared in the WLC’s “Monitoring” tab.Using Wireshark, we were able to verify the DSCP values for incoming packets from the WLAN:Last but not least, we had a look at the POST requests from the LSM to the WLC. As we are not using https, they are sent in clear-text and can be analyzed using Wireshark’s “Follow TCP stream” feature:POST /LDL/CallInfo HTTP/1.1Content-Type: text/xmlAccept: text/xmlHost: srv01.ccielab.local:9333Content-Length: 2823Expect: 100-continue&lt;/p&gt;HTTP/1.1 100 Continue&lt;LyncDiagnostics Version=\\\"1.0\\\"&gt;  &lt;ConnectionInfo&gt;    &lt;FrontEnd&gt;s4b&lt;/FrontEnd&gt;    &lt;CallId&gt;8a5ee59e7f24cc47a8a5e5ef5408164b&lt;/CallId&gt;    &lt;CSEQ&gt;3&lt;/CSEQ&gt;    &lt;ConversationId&gt;AdHItACZ40eYIzsElkmUXxEpJfdLYA==&lt;/ConversationId&gt;    &lt;TimeStamp&gt;2016-06-17T16:36:16.0502033Z&lt;/TimeStamp&gt;  &lt;/ConnectionInfo&gt;  &lt;StartOrUpdate Type=\\\"audio\\\"&gt;    &lt;From&gt;      &lt;Id&gt;1c36b0157b&lt;/Id&gt;      &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;      &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;      &lt;IP&gt;172.25.81.237&lt;/IP&gt;      &lt;Port&gt;21448&lt;/Port&gt;    &lt;/From&gt;    &lt;To&gt;      &lt;Id&gt;94b8a54712&lt;/Id&gt;      &lt;EPId&gt;213808492931&lt;/EPId&gt;      &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;      &lt;Contact&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local;      opaque=user:epid:vaj8zwoldfc0zkl6hghhoaaa;gruu&lt;/Contact&gt;      &lt;IP&gt;172.25.81.238&lt;/IP&gt;      &lt;Port&gt;11616&lt;/Port&gt;    &lt;/To&gt;    &lt;Properties&gt;      &lt;Protocol&gt;UDP&lt;/Protocol&gt;      &lt;EstimatedBandwidth Codec=\\\"SIREN/16000\\\"&gt;        &lt;Low&gt;52600&lt;/Low&gt;        &lt;High&gt;68600&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"PCMU/8000\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"PCMA/8000\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"RED/8000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"CN/8000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"CN/16000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"telephone-event/8000\\\" /&gt;    &lt;/Properties&gt;  &lt;/StartOrUpdate&gt;…&lt;StartOrUpdate Type=\\\"video\\\"&gt;  &lt;From&gt;    &lt;Id&gt;94b8a54712&lt;/Id&gt;    &lt;EPId&gt;213808492931&lt;/EPId&gt;    &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;    &lt;IP&gt;172.25.81.238&lt;/IP&gt;    &lt;Port&gt;15150&lt;/Port&gt;  &lt;/From&gt;  &lt;To&gt;    &lt;Id&gt;1c36b0157b&lt;/Id&gt;    &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;    &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;    &lt;Contact&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local;    opaque=user:epid:a_6tcapa01gtycf5ts8qnqaa;gruu&lt;/Contact&gt;    &lt;IP&gt;172.25.81.237&lt;/IP&gt;    &lt;Port&gt;6490&lt;/Port&gt;  &lt;/To&gt;  &lt;Properties&gt;    &lt;Protocol&gt;UDP&lt;/Protocol&gt;    &lt;EstimatedBandwidth Codec=\\\"x-rtvc1/90000\\\"&gt;      &lt;Low&gt;460000&lt;/Low&gt;      &lt;High&gt;2510000&lt;/High&gt;    &lt;/EstimatedBandwidth&gt;  &lt;/Properties&gt;&lt;/StartOrUpdate&gt;As you can see, the LSM uses simple http POST requests to send information to a network controller. The network controller just has to “listen” for such data and act on it.This concludes our journey into the wireless network for today, hope you enjoyed it as much as I did :)Many thanks to my colleague and fellow call-quality-optimizer KD!Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-sdn-api-and-cisco-wlc/\"\n},{\n  \"id\": \"post-azure-backup-part-three\",\n  \"title\": \"Azure Backup - Part Three\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"In my previous posts I gave you an overview of Azure Backup und explained the “Direct Backup Azure VM to Backup Vault” solution a bit in detail. Lets now focus on the Azure Backup Server option which we can backup Files and Applications like ActiveDirectory, SQL, Sharepoint, Exchange and Hyper-V. InstallationFirst of all you have to access the Backup vault and download the Microsoft Azure Backup Agent.Select a server in your organization that is domain joined where you want to install the Backup software. Before the server uploads the data to the backup vault it saves at least one copy to a local drive. Give the server an empty volume with some space.At the end you pair the server with our backup vault with a vault credential file. The file can be downloaded from the backup vault. Specify a Passphrase to encrypt your backups.The server is now registered in visible in the backup vault.Prerequisites and a more detailed description can be found here: https://azure.microsoft.com/en-us/documentation/articles/backup-azure-microsoft-azure-backup/Backup planThe next step is to define a Backup plan for the servers we want to protect. This task is pretty straight forward, I explain only the most important parts:We specify Disk and online protection. Disk protection represents the short term and online the long term protection.We specify how much restore points we keep on local disk for short term protectionNext step is to define the online Backup schedule and retention policy. In this example we configure the schedule to upload restore points daily at 09:00 PM.&nbsp;Simple restoreThe Backup runs now everyday and uploads the restore point to the backup vault. If we want to restore data we can see where the server recovers them from:&nbsp;Full restoreLets assume we backup our whole infrastructure with the Backup Server and upload the restore points to Azure. The local infrastructure isn’t available due to fire / server damage and we cannot access the backup server (and short term backups) anymore. All of our backups are in the cloud and we want to restore the whole infrastructure.It's a bit more complicated: To get access to the Azure Backups we have to install a Backup Server. To install the Backup Server we need a machine that's domain joined. Because of this prerequisites we have to follow some additional steps to recover the whole environment.Here are the steps we have to do to get the full restore done: Install a new server Create a temporary domain and make the server its domain controller Install a second new server Join the server to the temporary domain Install Azure Backup Server on the second server Join the Backup Server to the Azure Backup vault. We have now access to the restore points Restore the system state backup from a domain controller to a network location Throw away everything except the restored backup Install a new server, this will be the domain controller Restore the system state backup on the new domain controller Verify that the restored AD is working properly Install a new server as the Azure Backup Server Join the new Azure Backup Server to the restored domain Install Azure Backup Server and connect it to the Azure Backup vault Restore the DPM database Start restoring everything else according to your DR plan&lt;/ul&gt; Greetings\",\n  \"url\": \"https://onprem.wtf/post/azure-backup-part-three/\"\n},{\n  \"id\": \"post-lost-found-nano-server-github-psgallery-pester\",\n  \"title\": \"lost & found: Nano Server, GitHub, PSGallery, Pester\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"PowerShell\"],\n  \"content\": \"Nano Server status updateIt would be about time for the next post in the series about hyper-converged-infrastructure with Nano Server. Over the past few days I deployed Nano on some real hardware and I can't wait to share my findings. But, unfortunately I'm facing a few issues, probably related to hardware, with the lab servers and I didn't have a lot of time to investigate further. As TP5 should be out any day now, I decided to wait for that before wasting too much time. GitHubIn the meantime I have started to move some of my PowerShell scripts to GitHub for source control and publish them to the PowerShell Gallery for easy installation. I thought it might be interesting to share my process, so here we go.First of all, I’m not your typical developer, so I had a general idea about source control and I knew GitHub existed but never really used it, much less with PowerShell. The ongoing discussions about Continuous Integration and DevOps and what not, sparked my interest and so I decided to give it a try. The benefits of putting scripts under version control are obvious, the more you commit, the more history you get and the easier it gets to track code changes and errors. Additionally I really enjoy the community that has formed around PowerShell and publishing code to GitHub is one of many ways to contribute and give back to said community.Should you like to get started with git and don’t now where to start, this article helped me a lot when setting it up on my machines.And you can find my stuff at: https://github.com/tomtorgglerPowerShell GalleryIn case you didn’t know, Windows 10 (actually WMF5) comes with package management, yes that’s right, kind of like you know it from Linux or OSX. OneGet was introduced a while ago and eventually evolved into the PackageManagement module that is now included in WMF5. The PSGallery is already configured as a PackageSource and can therefore be used right away. Just try Find-Script or Find-Module and install whatever you find interesting with Install-Script or Install-Module. Now anyone can publish scripts to this PSGallery thing, which is exactly what I did with Invoke-SEFAUtil.ps1 and Restore-VMPermission.ps1.Other Package Sources can obviously be added, find out more at: https://msdn.microsoft.com/en-us/powershell/wmf/oneget_cmdletsPesterAlong with the move to GitHub I started to write some Unit Tests for my code. So what does that mean? Well I told you, I’m not your typical developer so I’m still figuring this thing out :) The basic idea of unit testing is to write additional code that tests your code automatically. So when you change something in a script, you run the tests and if everything is green, the script is ready to go into production. Pester is a unit testing framework for PowerShell, that can be used to achieve exactly that. Once I have found out enough to explain it in a better way, there might be a dedicated post :)&nbsp;With that, have a great weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-nano-server-github-psgallery-pester/\"\n},{\n  \"id\": \"post-azure-storage-explorer\",\n  \"title\": \"Azure Storage Explorer, the easy way to manage your storage\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"Today I gave a try to the new Azure Storage Explorer. Its actually in preview but already amazing. You can download the Explorer from the official website.When you open Azure Storage Explorer the first time the program asks for an subscription:After you specify username and password you are able to see your storage accounts.Within the explorer you can manage all of your Azure Storage Accounts, copy Blob containers, delete VHD’s or copy them to another location and much more:&nbsp;&lt;/p&gt; &lt;/code&gt; Give it a tryGreetings\",\n  \"url\": \"https://onprem.wtf/post/azure-storage-explorer/\"\n},{\n  \"id\": \"post-azure-backup-part-two\",\n  \"title\": \"Azure Backup - Part Two\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"Let’s focus on Option 1 the direct Azure VM Backup:The Backup TasksWe are now going to Backup an Azure VM from the Web interface. First of all, you have to start a discovery search.When the discovery search is completed you can select the VM you want to Backup. Keep in mind: Today it’s not possible to Backup VM’s that's located on the Azure premium storage (SSD) or VM’s in created with the Resource Manager model.  The next step is to create a Backup policy. You can have a single policy that works for all servers or multiple policies with different settings regarding Backup Windows and retention period. This step should be known from other Backup solutions.  On the retention range page you specify how long protected VM’s are kept.  We have created the Backup policy and can now assign it to our VM. From now a VM Backup will be started on a daily basis. Lets restore a VM To restore a VM you basically highlight the VM in the Backup Vault and select the Restore function.   After you selected the restore point you want to restore, the wizard asks you some information. This step is important because you can specify the name and VNET the VM will belong to. Be careful to not place you restores VM in the same Network as the productive one as this is only a test.   A nice log shows the progress and result of the restore request.  When the restore is done a new VM with the specified name is visible in the Virtual Machine section of Azure. We can start this VM, restore our files or put the VM into production if this was a real restore. Greetings          \",\n  \"url\": \"https://onprem.wtf/post/azure-backup-part-two/\"\n},{\n  \"id\": \"post-azure-backup-part-one\",\n  \"title\": \"Azure Backup - Part One\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"en\"],\n  \"content\": \"On Azure you can choose basically between two different Backup Options:1. Direct Backup Azure VM to Backup Vault2. Backup Applications like SQL, Sharepoint… and Files, System State through Microsoft Azure Backup ServerToday I will give you a short overview of the service.  &lt;/a&gt; Prerequisites - Backup Vault: First of all you have to create a Backup Vault (Thomas described this already in a former post)- If you use Microsoft Azure Backup Server a Internet Connection is needed Costs The costs are counted by instance and space used. An instance is either a Azure VM Server using Backup Option 1 or a Server to Backup specified with Microsoft Azure Backup Server using Option 2. (Price table from 12.2015)  When you create the Backup Vault you can choose between LRS or GRS. This can only be specified at the beginning.If you started already some Backups the GRS storage cannot be switched to LRS anymore. You have to recreate the backup vault.   &nbsp; For the Backup Data Azure Block Blob Storage is used. The costs can be seen from the following price table from 12.2015  &nbsp; In Part 2 I create a Backup Plan for some Azure VM’s and restore a Test-VMPart 3 covers a OnPrem Backup using Option 2 with Microsoft Azure Backup Server. I make a full Backup and full restore assuming the VM’s don’t exist anymore. Greetings\",\n  \"url\": \"https://onprem.wtf/post/azure-backup-part-one/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-part-3\",\n  \"title\": \"Hyper-Convergence with Nano Server: Part 3\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"en\"],\n  \"content\": \"In this post we are going to configure the Hyper-V part of our hyper-converged Nano-Server-Cluster. We already deployed the VMs in part 1 an configured Storage Spaces Direct in part 2.Hyper-VWhen creating the Nano Server VHD files, I installed the Hyper-V role by selecting the –Compute parameter. As we have already created the cluster and the virtual disk, we could simply go ahead and create VMs now. Before doing that, I wanted to configure the Hyper-V Servers to&nbsp; store VM configurations and VHD files on the Cluster Shared Volume and I created a virtual Switch that can be used by the VMs:As you can see, I’m using the $cimSessions variable from part 1 again. This variable contains CIM Sessions to my four Nano Servers, so that the above lines do configure all servers at once. Here’s how I’ve created those sessions: $cimSessions = New-CimSession -ComputerName n01,n02,n03,n04VMsNow we are ready to create the VMs and add them to the cluster. I copied the “win2012r2.vhdx” file over to the ClusterStorage and used this as a parent disk for my VMs: That was pretty easy, so lets have a look at what our current environment looks like in the Failover Cluster Manager.We see all the VMs that were added to the cluster and we can go ahead and move them around between nodes using the Failover Cluster Manager. The same goes for the “nodes”, we see all four Nano Servers participating in the cluster and we can control the nodes status:In the storage folder of the FCM we see the virtual disk and some information about health status and capacity:&nbsp;Ok, that is pretty basic stuff if you just look at the Hyper-V part. The interesting point however, is that those same servers do also provide the shared storage that the hypervisors use.Stay tuned for more Tom\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-3/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-part-2\",\n  \"title\": \"Hyper-Convergence with Nano Server: Part 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"en\"],\n  \"content\": \"In this post, we build on the Nano Servers that were set-up in the part one, we are going to create a Failover Cluster and enable Storage Spaces Direct.Cluster NetworkWhen creating the Nano Server vhd files, I did add the package for failover clustering by using the –Clustering parameter of New-NanoServerImage. So now that the servers are running, I can use remote server management tools or PowerShell to create a cluster. But, before doing that, I went ahead and configured the second network adapter with static IP addressing. Remember that I created the Nano VMs with two network adapters, one connected to my lab network – where DHCP provides addressing – the other connected to an internal vSwitch, as it’ll be used for cluster communication only.Failover ClusterBefore creating a cluster I run the “Cluster Validation Wizard” to make sure my configuration checks out. We could run that wizard using the GUI tools or using the following line of PowerShell:Test-Cluster –Node n01,n02,n03,n04&nbsp; –Include “Storage Spaces Direct”,Inventory,Network,”System Configuration”Some summary information as well as the location of the html report will be printed to the screen. In the report we can actually see the results of the tests that were run. Problems are pointed out and some level of detail is provided.The only warning I got was the following: Failed to get SCSI page 83h VPD descriptors for physical disk 2. This was because my VMs originally used the default “LSI Logic SAS” controller for the OS disk, while the additional, 100GB disks were connected to the SATA Controller. To fix this, I did connect the OS disk to the SATA Controller as well.All green, so we can go ahead and create the cluster:New-Cluster -Name hc01 -Node n01,n02,n03,n04 –NoStorageThis will create another html report at a temporary location, the path will again be printed to the screen. My cluster has an even number of nodes, so I decided to use a File Share Witness. Using the following commands, I created a quick share on my management server (tp4):New-Item -ItemType Directory -Path c:\\\\hc01witness New-FileShare -Name hc01witness -RelativePathName hc01witness -SourceVolume (Get-Volume c) -FileServerFriendlyName tp4Get-FileShare -Name hc01witness | Grant-FileShareAccess -AccountName everyone -AccessRight FullAfter that, I used the following to update the cluster quorum configuration:Set-ClusterQuorum -Cluster hc01 -FileShareWitness \\\\\\\\tp4.vdi.local\\\\hc01witness Storage Spaces DirectAt this point, we have a running cluster and we can go ahead and configure storage spaces.But again, before doing that, I want to point something out. If we open the Failover Cluster Manager at this point, we can connect to the cluster just as we are used to. If we expand the “Storage” folder in the newly created cluster, we can see there are no Disks, no Pools and no Enclosures present at this time.Using the following command, I enabled storage spaces direct for the cluster:Enable-ClusterS2D -S2DCacheMode Disabled -Cluster hc01And using the following command, I create a new storage pool using the “Clustered Windows Storage” subsystem:If we go back to the Failover Cluster Manager after the above steps, we can see that now there is a Pool as well as four Enclosures, one representing each server:Ok, so far it is looking quite good, and we can go ahead an create a volume (or virtual disk):Our new virtual disk will automatically be added to the Cluster Shared volumes, we can verify that using:Get-ClusterSharedVolume -Cluster hc01Alright, we are getting close. In the next post, we are going to configure the Hyper-V roles and create some virtual machines. Sounds great? Stay tuned :)&nbsp;Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-2/\"\n},{\n  \"id\": \"post-azure-file-services\",\n  \"title\": \"Azure File Services\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"Today I mapped an Azure File Share to my local computer  First you have to create a Storage account and a File ServiceWithin the Webinterface you can create folders and upload filesWhen you click on “Connect” you can get the commands to map the volume. Its basically a normal Network drive.The access key can be taken from the Settings / Key sectionIf you execute the command or simply mount the network volume you have the Azure File Service connected as Volume.Greetingsdn\",\n  \"url\": \"https://onprem.wtf/post/azure-file-services/\"\n},{\n  \"id\": \"post-re-register-azure-mfa-server\",\n  \"title\": \"Re-register Azure MFA Server\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"If you also installed the Azure MFA Server with a MSDN Subscription and now want to switch to another subscription without re-installing the Server, you have to do the following. (Please keep in mind you loose all the settings you made within the MFA console) Export your users Make some screenshots of you configuration (Radius, Company settings ect..) Make a Backup of this folder: C:\\\\Program Files\\\\Multi-Factor Authentication Server\\\\Data Stop the service “MultiFactorAuthSvc” Delete the folders content Start the service “MultiFactorAuthSvc” When you open the console the registration wizards starts and you can register the server with another subscriptionGreetings\",\n  \"url\": \"https://onprem.wtf/post/re-register-azure-mfa-server/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-part-1\",\n  \"title\": \"Hyper-Convergence with Nano Server: Part 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"In this post I’m walking through the steps creating the images for my Nano Servers and then deploying them. Like in this post, I’ll use WDS for the deployment, so some steps might already be familiar.Create Nano Server ImagesI installed a Windows 2016 TP4 Server with full desktop experience that serves as DHCP, WDS and management machine. I’ll run all of the scripts from there, you might as well use Windows 10 for it. So the first step is to create a new image, which is really quite similar as described in the post mentioned above.What’s different, is that I’m creating an image for each node and I’m using the DominBlobPath parameter, so before creating the images, I have to harvest the blobs using “djoin.exe”. My servers are going to be named n01 trough n04, so I’m using a little foreach loop to get all four blobs and build the four images:As noted in the intro post to this series, I’m running the first version of this lab on virtual machines, as I’m using ESXi as hypervisor, I needed to add the OEMDrivers as well as drivers for vmxnet3 NICs to the image. Those vmxnet3 drivers are located at DriversPath. I do also add Compute, Storage and Clustering packages, as we need them to provide Hyper-V and Storage Spaces Direct.Do note that the boot image needs to include drivers for vmxnet3 as well, they can be added using the WDS admin console quite easily.Once the images are created, we need to import them into WDS.Import into WDSAgain, I’m going to use the foreach loop to import all VHD files as WDS install images:Now we are ready to create the Nano Server VMs and deploy from WDS.VMsI create four VMs with the following specs on my lab ESXi host:NumCPU = 2;MemoryGB = 16;DiskGB = 20;DiskStorageFormat = 'Thin';GuestID = 'windows9Server64Guest'Then I remove the default NIC and add two of the Type ‘vmxnet3’ and make sure they are connected at startup. Finally, I add two hard disks to the VMs:StorageFormat = 'Thin';CapacityGB = 100;DiskType = 'Flat'Once again, please note that I had to use the SATA controller for these data disks, using default LSA or even the VMware paravirtual controllers, resulted in the following error in the Cluster Validation Wizard:  Disk partition style is GPT. Disk has a Microsoft Reserved Partition. Disk type is BASIC. The required inquiry data (SCSI page 83h VPD descriptor) was reported as not being supported.Using a SATA controller, and attaching the hard disks to that controller, solved the problem.To install the Nano Servers, all I need to do now, is to boot the VMs, press F12 and select the right image on the Windows Deployment Service. About a minute later my server is ready :)Yes, I did also create the VMs with PowerShell, look for a post on that soon…ish.Verify VMsOnce the VMs are installed, I create a CIM session and test connectivity by getting the system uptime like this. As all commands above, these are issued on my management machine (tp4):\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-1/\"\n},{\n  \"id\": \"post-install-office-web-apps-server-2013-on-server-2012-r2\",\n  \"title\": \"Install Office Web Apps Server 2013 on Server 2012 R2\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"A quick hint about installing WAC Server. As it happens, Office Web Apps Server&nbsp;2013&nbsp;only added support for 2012R2 with SP1, and even though SP1 is about 3x the file size of RTM, you cannot install it without RTM;&nbsp;RTM setup fails and that’s where I found myself this morning. Copy SP1 files to ‘updates’ folder Download the service pack 1 for WAC Server from this link: http://go.microsoft.com/fwlink/p/?LinkId=510097 Then extract the service pack using /extract to a folder on the disk. Like this:  wacserversp2013-kb2880558-fullfile-x64-glb.exe /extract:C:\\\\temp\\\\wacsp1 Now copy all the extracted files into the “updates” folder of the RTM install files. Once the updates are there, RTM setup works on 2012R2 and automatically installs SP1, too. Note: Make sure to follow other requirements, as listed on TechNet Enjoy, Tom \",\n  \"url\": \"https://onprem.wtf/post/install-office-web-apps-server-2013-on-server-2012-r2/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-intro\",\n  \"title\": \"Hyper-Convergence with Nano Server: Intro\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"This is the first post of a series about building a hyper-converged solution with Nano Server in Windows Server 2016 Tech Preview 4. Over the next weeks, I’m going to cover the following parts of my journey:   building the nano servers  creating a cluster and setting up storage spaces direct  bringing in hyper-v  testing and breaking stuff&lt;/ul&gt;   Hyper…what? Before we get started, my quick introduction to hyper-converged, just in case you’ve never heard about it. The basic idea is to bring storage closer to the CPU and so minimize delay. This is achieved by creating groups of servers with local discs and, through the magic of software, pool all the disks into volumes that span the entire group. Such a solution does offer some benefits when we think about scale: adding nodes to the cluster gives you more storage as well as more processor/memory capacity. Obviously we will also see some interesting problems introduced by the complexity of said solutions where troubleshooting will require a great deal of knowledge in multiple fields. While in the old days we had storage, network and compute as cleanly separated silos, hyper-convergence brings all of that together.  So, what I’m going to build and test in this lab is cluster of four Nano Servers running Storage Spaces Direct as well as Hyper-V. The local disks of all Nano Servers will be used to create a virtual disk, that will then be used to store the virtual machines.   Building blocks In the first parts of the series I will build the solution using virtual machines, it’s all about proof-of-concept and learning the basics before getting access to lab equipment. Later I’d like to apply the topics and test the setup on actual hardware, measuring performance data and pulling some disks :)  The requirements for my lab are quite simple, I need an Active Directory domain, one 2016 TP4 Server where I can build and deploy the Nano Server images and later manage the cluster, and four VMs that will be running Nano Server.  DC01: Domain Controller, DNS, Certificate Authority  TP4: DHCP Server, Windows Deployment Services  N01..4: Nano Servers&lt;/ul&gt; I took to visio for a quick diagram, kindly think of the database symbols as disks:  So in the first post of the series, I’m going to build the Nano Server images and deploy them to my virtual machines using Windows Deployment Services. &nbsp; so long,Tom\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-intro/\"\n},{\n  \"id\": \"post-lost-found-onyx\",\n  \"title\": \"lost & found: Onyx\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Another version of lost and found, another fling I’d like to share: &nbsp;https://labs.vmware.com/flings/onyx\",\n  \"url\": \"https://onprem.wtf/post/lost-found-onyx/\"\n},{\n  \"id\": \"post-happy-holidays-and-some-numbers\",\n  \"title\": \"Happy holidays and some numbers\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\"],\n  \"content\": \"It’s this time of the year again, everybody is trying to relax a bit and maybe making some plans for the coming year. Well at least that’s what I’m up to these days.NumbersI thought this would be a good opportunity to share some statistics of our blog. So a little more than a year ago, we moved to azure and cloudflare, I took the following numbers mostly from cloudflare.We are blogging here since July 2009, that’s almost six and a half years or around 2350 days. wow.In this time, we produced 250 posts, some in german, some in english. Even though there have been some times with lower activity, that’s still about one post every 10 days.All of this started over a few beers, and neither of us would have thought that it might last this long. Yet here we are, making plans for 2016 and beyond.Now according to cloudflare around&nbsp;8000 unique visitors are stopping by our little site each month, around 300 every single day. Not really mind-blowing, but also not bad.Greetings With that said, we’d like to wish all of you a happy new year and we do certainly hope to see you around.&nbsp;Cheers, Tom\",\n  \"url\": \"https://onprem.wtf/post/happy-holidays-and-some-numbers/\"\n},{\n  \"id\": \"post-lost-found-openlivewriter-rackhd-ehc-diskspd\",\n  \"title\": \"lost & found: OpenLiveWriter, RackHD, EHC, diskspd\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\",\"Server\",\"VMware\"],\n  \"content\": \"Another quick and dirty edition of “lost &amp; found”, just sharing stuff that I thought is interesting. Open Live WriterSo this is the first post published (and written) using the open-sourced version of Live Writer. I always liked Live Writer, so I am very happy to have it back. More info at Github: https://github.com/OpenLiveWriter/OpenLiveWriterEMC RackHDAnother open source project I stumbled upon the other day is RackHD from EMC {code}. This comes a vendor independent management and orchestration solution for the datacenter. Now I know, that sounds a lot like everything and nothing but why not have a look: http://blog.emccode.com/2015/12/08/introducing-rackhd-automate-bare-metal/VMware Embedded Host ClientThis is especially awesome for the MAC users out there, as you no longer need a Windows VM to run the C# vSphere Client. So you simply install a VIB package on your ESXi (lab) servers and point your browser to https://hostname/ui to manage the host. More Info: https://labs.vmware.com/flings/esxi-embedded-host-clientInstallation is simple and doesn’t require a reboot.esxcli software vib install -v /tmp/esxui-signed.vibThe same is true for removal:  esxcli software vib remove -n esx-ui And a quick look at what you’ll get.  DiskSpd Heard of SQLIO? Meet it’s sequel, DiskSpd. A handy little tool that generates synthetic workload to help asses storage performance. There is a good post on TechNet going into quite a bit of detail. Get the tool and documentation in the TechNet Gallery. &nbsp; Thats all for tonight, so long Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-openlivewriter-rackhd-ehc-diskspd/\"\n},{\n  \"id\": \"post-domain-joining-the-vcenter-server-appliance-6\",\n  \"title\": \"Domain-joining the vCenter Server Appliance 6\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\",\"VMware\"],\n  \"content\": \"In this post, we started out by deploying the VCSA to a new environment, today we'll see how to join the VCSA to an Active Directory domain and authenticate using domain accounts.&nbsp;&nbsp;PrepareTo join a domain we need the distinguished name of the organizational unit where we want the VCSA's computer object to be created, as well as an account with the required permissions to join a machine to the domain.To get the DN use your tool of choice, like PowerShell: Get-ADOrganizationalUnit -Filter {Name -like \\\"servers\\\"} | Select-Object -ExpandProperty DistinguishedName &nbsp;&nbsp;Before joining the vCenter Server Appliance to the domain, make sure DNS is working perfectly, that includes reverse lookup.&nbsp;&nbsp;JoinNow sign-in to the vCenter using the local SSO domain created during setup and go to Administration/System Configuration/Nodes. Select the VCSA from the list of Nodes and in the right pane, go to Manage/Active Directory and click the \\\"Join\\\" button on the right.&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Specify the domain name and DN of the organizational unit as well as the credentials to use.&nbsp;&nbsp;\\t&nbsp;&nbsp;After joining the domain, a restart is required. To perform a restart, either use SSH or use the \\\"Reboot\\\" button in the \\\"Actions\\\" menu.&nbsp;&nbsp;Once the VCSA is restarted we can see that a Computer object has been created in AD. Now we log-in again, still using the local account, and go to Administration/Configuration where we select \\\"Identity Sources\\\" in the right pane, using the \\\"+\\\" button, add a new Identity Source. &nbsp;&nbsp;\\t&nbsp;&nbsp;Configure PermissionsOnce the Identity Source has been added, we can configure roles and permissions for AD accounts. This can be done using Administration/Global Permissions. Using the \\\"+\\\" button, we assign an AD user or group to a vCenter Role.&nbsp;&nbsp;Alternatively, we can add AD users or groups to the preconfigured groups that can be found in the \\\"Single Sign-On\\\" section of the Administration menu.&nbsp;&nbsp;\\t&nbsp;&nbsp;Verify Finally we can log-out of the local admin account and log-in using our AD user, which should be able to access resources, as specified by the assigned roles. Note: Users with no assigned roles will also be able to log-in, obviously they won't see any objects.&nbsp;&nbsp;TroubleshootNow if some of the steps don't work, for example you cannot log-in or you cannot access AD users or groups in the configuration, double-check DNS and have a look at the following log files:/var/log/vmware/sso/vmware-sts-idmd.log&nbsp;/storage/log/vmware/sso/ssoAdminServer.log&nbsp;I got \\\"Cannot load the users for the selected domain\\\" in the Web Client and found the &nbsp;following lines in the above mentioned logs:&nbsp;Failed to get non-GC connection to domaincom.vmware.identity.idm.IDMException: Failed to establish server connection\",\n  \"url\": \"https://onprem.wtf/post/domain-joining-the-vcenter-server-appliance-6/\"\n},{\n  \"id\": \"post-azure-backup-restore\",\n  \"title\": \"Azure Backup: Restore\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\",\"de\"],\n  \"content\": \"In diesem Post habe ich beschrieben, wie man Daten mit Azure Backup sichert, nun wollen wir diese wiederherstellen.&nbsp;&nbsp;Backup AgentDie Wiederherstellung wird über den Azure Backup Agent gestartet, im ersten Schritt wählt man aus, welcher Server wiederhergestellt werden soll.&nbsp;&nbsp;\\t&nbsp;&nbsp;Anschließend werden die wiederherzustellenden Dateien über die Suche oder einen Filesystem Browser ausgewählt. &nbsp;&nbsp;\\t&nbsp;&nbsp;\\t&nbsp;&nbsp;Wie üblich kann man die Dateien am ursprünglichen Ort wiederherstellen, oder einen anderen Pfad angeben. Außerdem kann ausgewählt werden, ob die Berechtigungen (ACL) wiederhergestellt werden sollen. &nbsp;&nbsp;\\t&nbsp;&nbsp;Nach der Bestätigung wird der Wiederherstellungsprozess gestartet, dieser wird auch im Azure Portal angezeigt und protokolliert.&nbsp;Weitere Infos und Doku: https://azure.microsoft.com/en-us/documentation/services/backup/\",\n  \"url\": \"https://onprem.wtf/post/azure-backup-restore/\"\n},{\n  \"id\": \"post-installing-nano-server-using-wds-and-pxe\",\n  \"title\": \"Installing Nano Server using WDS and PxE \",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"Technical Preview 4 of Windows Server 2016 brings along new \\\"packages\\\" for Nano Server, it can now run DNS and IIS along other roles. See TechNet for a complete list. So to get started with Nano, I tried to deploy it via WDS.&nbsp;&nbsp;PrepareNano Server is not installed like other editions of Windows Server, one has to build a customized image with the roles and packages one needs. This underscores the very nature of Nano Server, being a minimal install with minimal overhead.Now to create this image we have to mount the Windows 2016 TP4 ISO on our workstation. In the NanoServer folder right at the root of the ISO, we find the .wim along with two PowerShell scripts. There is quite a detailed guide available on TechNet so I am not going into to much detail here:&nbsp;&nbsp;First import the Module: ipmo .\\\\NanoServerImageGenerator.psm1&nbsp;&nbsp;As I ran the New-NanoServerImage cmdlet before, it already converted the WIM to VHD (that's the VHD you'll find at the \\\"BasePath\\\") so I can omit \\\"MediaPath\\\" for subsequent runs and save a little time:&nbsp;&nbsp;New-NanoServerImage -BasePath C:\\\\nanotemp -TargetPath C:\\\\Nano\\\\Nano_dns.vhd -OEMDrivers -Packages Microsoft-NanoServer-DNS-Package -ComputerName nano_dns -DomainName tomt.it -Language en-us&nbsp;&nbsp;\\t&nbsp;&nbsp;Note: I had to specify the Language parameter as I my system is not using en-us. I am planning to run the VHD on VMware, that's why I included \\\"OEMDrivers\\\" and not \\\"GuestDrivers\\\".&nbsp;&nbsp;WDS The steps above created a VHD at the target path and in the next step I am adding this VHD as an install image to WDS:&nbsp;&nbsp;\\t&nbsp;&nbsp;I changed the name to avoid confusion :)&nbsp;&nbsp;\\t&nbsp;&nbsp;The same can be achieved using PowerShell:&nbsp;&nbsp;Import-WdsInstallImage -Path C:\\\\nano\\\\Nano_dns.vhd -NewImageName \\\"Nano_dns_10.0.10586\\\"&nbsp;&nbsp;That's basically it, now we have to create a new VM an pxe-boot from the WDS.&nbsp;&nbsp;InstallI created a new VM using the \\\"Windows 2016\\\" template in Fusion, but before installing I reduced the size of the new virtual disk to 10G, which still is way to much ;)&nbsp;&nbsp;\\t&nbsp;&nbsp;\\t&nbsp;&nbsp;Very few miutes later our new DNS server is ready.&nbsp;&nbsp;\\t&nbsp;&nbsp;There is nothing really to be done on the server console, the \\\"Emergency Console\\\" can be used to configure networking, the rest is done with RSAT or PowerShell remoting.&nbsp;&nbsp;DNSTo test the functionality of my newest Nano Server, I actually set up DNS:&nbsp;&nbsp;So first of all, using Get-WindowsFeature I checked which features were installed and which ones were available. As you can see from the screenshot, there are not very many features available:&nbsp;&nbsp;\\t&nbsp;&nbsp;Using the following command, I installed DNS Server role: Add-WindowsFeature -ComputerName nano_dns -Name DNS&nbsp;&nbsp;After that, I was able to add the Server to the DNS Management console and configure DNS zones:&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Oh, and of those of you who care, the size of the virtual harddisk is 626,6MB. Awesome, right? :)&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Enjoy, Tom\",\n  \"url\": \"https://onprem.wtf/post/installing-nano-server-using-wds-and-pxe/\"\n},{\n  \"id\": \"post-lost-found-tp4-th2-win32-openssh-vs-code\",\n  \"title\": \"lost & found: TP4, TH2, Win32-OpenSSH, VS Code\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\",\"Server\"],\n  \"content\": \"Tech Preview 4The latest preview of Windows Server 2016 has been released, it brings many new features including options for Containers and Nano Server.Download it from the Evaluation Center: http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview\\tWindows 10 1511Aka. Threshold 2 was released, pulled, and re-released, apparently because of some privacy settings. Windows Insiders got it a little earlier and so it landed on my Surface Pro 3. It leaves much more of a stable impression than \\\"RTM\\\" and fixed most of the problems I had.OpenSSH comes to WindowsYes, that's right, some folks at Microsoft heard the calls and started a project on GitHub, aiming to bring OpenSSH to the Windows-world. The wiki page at GitHub has some info about installing, which is quite simple:Once downloaded, run the following commands from an administrative PowerShell:Expand-Archive .\\\\OpenSSH-Win32.zipcd .\\\\OpenSSH-Win32\\\\OpenSSH-Win32\\\\.\\\\ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key.\\\\sshd.exe installStart-Service sshdAnd don't forget to create a firewall rule: New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSHThen I was able to connect from my MacBook: \\tFind more info, a wiki and the download over at GitHub: https://github.com/PowerShell/Win32-OpenSSH\\tVisual Studio CodeA free, cross platform code editor with interesting language support.https://code.visualstudio.com\\t&nbsp;Have fun,Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-tp4-th2-win32-openssh-vs-code/\"\n},{\n  \"id\": \"post-getting-started-with-vcenter-server-appliance-6\",\n  \"title\": \"Getting started with vCenter Server Appliance 6\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\",\"VMware\"],\n  \"content\": \"So I’ve done some work with VMware in the past and even got certified on vSphere 4, but then I changed jobs and ended up working, almost exclusively, with Microsoft software. That included a little bit of Hyper-V but mostly I worked “higher up” in the stack, with applications like Exchange and Lync, that is. As I changed jobs again and find myself focusing on Datacenter technologies now, I decided it was time to reactivate some VMware skills and get to know the latest version.I deployed a vCenter Server Appliance in a new environment the other day, and thought it might be a good starting point.PrepareYou may have heard that VMware want’s to ditch the good ol’ vSphere client and switch to a Web Client kind of a thing, this has been going on for a while, but in every release they are getting more serious about it. New features almost always come “web only”. Unfortunately they decided to make this a flash-based client, yeah, it’s almost as bad as java, but that’s another story.So get yourself a machine with a web browser and install/enable the flash plugin. I had troubles with Safari, Chrome and IE11 so I ended up using Firefox (think about that for a sec…).&nbsp;Download the VCSA from vmware.com, it comes as an ISO image that you will have to mount on your management machine. The idea is, basically, to use a website to deploy an OVF template to one of your vSphere hosts.Install&nbsp;Inside the ISO you’ll find the Web Client Plugin, which is required to deploy the OVF template, it’s located at: \\\\vcsa\\\\VMware-ClientIntegrationPlugin-6.0.0.exeOnce the Client Plugin has been installed, open the \\\\vcsa-setup.html file and follow the wizard.Most steps are straightforward, first select the target ESXi host and configure the VM name and a password for the root account.Then select how the Platform Services Controller is deployed. As far a I know, this is a new role in vCenter 6, which controls Licensing, SSO and Certificates. I selected to deploy an embedded PSC.&nbsp;The next step is to configure Single Sign-On. In my case I created a new SSO domain, as this was the first vCenter Server in the environment. Remember the “SSO Domain name” you use, it will be required to log on later. The SSO domain name must be different than the Active Directory domain name.&nbsp;Note: Make sure to check documentation when upgrading an existing vCenter, as the SSO configuration has changed quite a bit.Select an appliance size and which datastore to use for the VCSA appliance.Finally you can configure network settings. When entering a FQDN for the vCenter appliance, make sure it is already configured in DNS and the VCSA can reach the DNS server you specify. Deployment will fail if DNS doesn’t check out. As I had no NTP Server handy, I selected to synchronise the VCSA’s time with the ESXi host. And no, I would not recommend this.Now after the deployment of the OVF finishes, we should be able to logon to the vSphere Web Client using a browser, or to the classic vSphere Client installed on Windows. Make sure to logon using the administrator@ssodomain account, you wont be able to do much configuration as root!Stay tuned for more :)Tom\",\n  \"url\": \"https://onprem.wtf/post/getting-started-with-vcenter-server-appliance-6/\"\n},{\n  \"id\": \"post-netscaler-as-adfs-proxy\",\n  \"title\": \"Netscaler as ADFS Proxy\",\n  \"author\": \"dni\",\n  \"tags\": [\"ADFS\",\"Citrix\",\"en\"],\n  \"content\": \"I decided to use Netscaler to publish my ADFS server to the internet instead of a dedicated server in the DMZ. I checked several blogs and the official Citrix documentation but this looked overloaded. Citrix documentation: NetScaler as ADFS Proxy Deployment Guide - CitrixBlogs: http://blogs.citrix.com/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/, http://cividan.blogspot.it/2015/02/use-citrix-netscaler-as-replacement-for.htmlSo I searched a way to:- Publish ADFS to the Internet with URL filter- Do not pre-authenticate with Netscaler (Customizing multiple pre-authentication Websites can be very time consuming per tenant)- Modify the Header that ADFS server understands the request comes from externalThere was no blog post that explained the whole configuration, so I decided to write down the required steps:1. The serviceFirst create the service and specify to forward the Client IP (Header: X-MS-Forwarded-Client-IP)&nbsp;2. The vServer&nbsp;Create the vServer not directly addressable to not trash an IP address and bind the certificate3. Content switch policyCreate a content switch policy to forward only /adfs and the exact hostname to the vServer4. Content Switch vServerCreate the content switch vServer and apply the content switch policy5. Rewrite ActionsYou want to let the ADFS know that the request comes from extranet. So you can apply different authentication methods in the different zones. You have to add the header X-MS-Proxy to the request. Therefore you create a rewrite actionCreate also a rewrite action to rewrite URL /mex 6. Rewrite Policy7. Bind the PoliciesNow bind the policies to the vServer. Both are rewrite policies for requests. Be careful with the GoTo expression to the Header transformation, this must be “NEXT”8. The MonitorADFS has a probe check build in. If you check /adfs/probe you get a 200 message if everything is OK. Create the monitor and add it to the service    &lt;p&gt;&lt;a href=\\\"/assets/archive/image_684.png\\\"&gt;&lt;img width=\\\"265\\\" height=\\\"339\\\" title=\\\"image\\\" style=\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_682.png\\\" border=\\\"0\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Netscaler configuration is done. You can test now the authentication if you access the URL &lt;a href=\\\"https://portal.office.com\\\"&gt;https://portal.office.com&lt;/a&gt; through Netscaler. Then you will be redirected to the ADFS website for authentication:&lt;/p&gt; &lt;p&gt;&lt;a href=\\\"/assets/archive/image_685.png\\\"&gt;&lt;img width=\\\"438\\\" height=\\\"156\\\" title=\\\"image\\\" style=\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_683.png\\\" border=\\\"0\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For internal requests use split DNS to forward the authentication directly to the ADFS server and not to the Netscaler ADFS proxy. So the Proxy Header is missing and your client will use internal authentication.&lt;/p&gt; &lt;p&gt;Stay tuned for my post series about configuring Exchange in Hybrid mode with Office 365.&lt;/p&gt; &lt;p&gt;Greetings&lt;br&gt;ND&lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/netscaler-as-adfs-proxy/\"\n},{\n  \"id\": \"post-azure-backup\",\n  \"title\": \"Azure Backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\",\"de\"],\n  \"content\": \"Seit einiger Zeit bieten die Recovery Services in Microsoft Azure die Möglichkeit, virtuelle Maschinen oder ganze Rechenzentren zu sichern. Das ist vor allem für Unternehmen interessant, die sich kein DR Rechenzentrum leisten können/wollen.Mit Azure Backup gibt es dazu auch&nbsp;die Möglichkeit einzelne Server, Clients oder nur bestimmte Daten in die Cloud zu sichern. So kann jeder an den Luxus eines off-site Backups kommen. Im folgenden Beispiel konfiguriere ich Azure Backup für meinen Windows 10 Client.&nbsp;Backup VaultAls Grundvoraussetzung benötigt man natürlich eine Azure Subscription, hier kann man sich das Ganze im Free Trial anschauen: https://azure.microsoft.com/en-us/pricing/free-trial/&nbsp;\\tIn der Subscription wird ein Backup Vault benötigt, dort werden die Backups gespeichert. Um ein Backup Vault zu erstellen, ist nach wie vor das \\\"alte\\\" Management Portal nötig, dieses erreicht man über: https://manage.windowsazure.com&nbsp;\\tUnter New, Data Services, Recovery Services erstellt man das Backup Vault.Einmal angelegt muss man nur noch die \\\"Vault credentials\\\" herunterladen, diese findet man im Dashboard des neu angelegten Vaults.Backup AgentDer Backup Agent wird auf dem Client/Server installiert, welcher in das Azure Backup Vault gesichert werden soll. Der aktuelle Backup Agent kann hier heruntergeladen werden: http://aka.ms/azurebackup_agent&nbsp;\\tEinmal installiert, kann man die lokale Maschine über \\\"Register Server\\\" hinzufügen, in dem Wizard werden die \\\"Vault Credentials\\\" importiert. Diese verwendet der Agent um das Vault zu finden und sich zu authentifizieren. Die Daten werden lokal verschlüsselt und über eine https Verbindung übertragen. Der Benutzer erstellt ein Kennwort für diese Verschlüsselung, die auch in der Cloud erhalten bleibt (at rest). Das Kennwort wird in einer Textdatei gespeichert und sollte sicher aufbewahrt werden.&nbsp;\\tSobald der Client/Server registriert wurde, kann man das Backup konfigurieren. Im ersten Schritt wählt man die Daten aus, welche gesichert werden sollen.\\t\\t&lt;p&gt;Dann gibt man unter Backup Scheduleand Retention Policy an, wann Backups erstellt werden sollen und wie dieseaufbewahrt werden.&lt;/p&gt;&lt;p&gt; \\t&lt;/p&gt;&lt;p&gt;That’s it. Das Backup kann mit Backup Now gestartet werden, oder man wartet bis der geplante Task das erledigt.&lt;/p&gt;&lt;p&gt; \\t&lt;/p&gt;&lt;p&gt;Kosten&lt;/p&gt;&lt;p&gt;Die Kosten für das Backup Vault können unter folgendem Link nachgelesen werden:&lt;/p&gt;&lt;p&gt;http://azure.microsoft.com/en-us/pricing/details/backup/ \\t&lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/azure-backup/\"\n},{\n  \"id\": \"post-getting-started-with-osx\",\n  \"title\": \"Getting started with OSX\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\"],\n  \"content\": \"Well yes, I amswitching to OSX on my work machine. I'm still using my Surface Pro 3 at homeand for meetings, but my primary work computer will be a 13\\\" MacBook Profrom now on. As I had no experience whatsoever working with OSX, here are mynotes on getting started:&nbsp;GetOneNoteOne of the mostimportant productivity tools,for me, is OneNote. Everything from screenshots, recipes, drafts, ideas,writing, learning, to meeting notes goes there. I am simply not functionalwithout it :) so just go to onenote.com and grab the latest version. It's free,too.&nbsp;GetBrew and CaskA package managerfor OSX, once installed you can easily install packages (includingdependencies) just like this:$brew search nmap$brew install nmap&nbsp;And, importantly,updating packages is straightforward to. No more updating all individualapplications, just run (Caution: this will update all packages!):$brew update &amp;&amp; brew upgrade &nbsp;Simple as that. Caskextends brew, and brings along many more packages.&nbsp;KeyboardshortcutsThis was reallyimportant for me, as I am using keyboard shortcuts a lot on windows. There is agood list of possible shortcuts at apple.com.Another importantpart, at least for me, in getting around in OSX are trackpad gestures. The mostimportant can be found in the Trackpad section of \\\"SystemPreferences\\\".&nbsp;PythonThere's noPowerShell on the Mac. Bummer. I decided to look into Python and found a couplegood sites for beginners.&nbsp;Moretools...I use KeePass on myWindows machines, a lot. There are multiple possible solutions on OSX, the onethat worked best for me is MacPass. Itopens kdbx files and there is an autotype feature.As I work a lot withconsole/command-line tools, a decent terminal emulator is key. A colleaguepointed me to iTerm2, and I love it :)Atom is a great, customizable text editor.&nbsp;Whatelse?Am I missingsomething, do you have any suggestions? Comments are highly appreciated :) &nbsp;LinksOneNote: http://onenote.comHomebrew: http://brew.shKeyboard Shortcuts: https://support.apple.com/en-us/HT201236Learn Python thehard way: http://learnpythonthehardway.org/book/Coursera: https://www.coursera.org/course/pythonlearnPython: https://docs.python.org/2/library/index.htmlMacPass: http://mstarke.github.io/MacPass/iTerm2: http://iterm2.comAtom: https://atom.io\",\n  \"url\": \"https://onprem.wtf/post/getting-started-with-osx/\"\n},{\n  \"id\": \"post-moving-on!\",\n  \"title\": \"Moving on!\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\"],\n  \"content\": \"Wie der Eine oder Andere vielleicht weiß, habe ich die vergangenen zwei Jahre in Paderborn verbracht. Dort durfte ich einige sehr spannende Projekte im Bereich Unified Communications umsetzen und konnte sowohl beruflich wie auch persönlich viel lernen. Ein großer Dank gilt hier meinem ehemaligen Arbeitgeber, meinen Vorgesetzten und den lieben Kollegen! ;)Der Ruf der Heimat (=Berge) wurde mit der Zeit immer lauter und so entschied ich mich Anfang des Jahres, wieder nach Südtirol zu gehen. Nachdem ich den Sommer für persönliche und kulturelle Weiterbildung (und viel Urlaub) genutzt habe, geht es für mich nun auch beruflich wieder weiter. Ich bleibe dem Leben als Dienstleister treu, freue mich aber sehr in einen neuen Bereich einzusteigen und somit meinen Horizont zu erweitern. In nächster Zeit geht es für mich weg von UC und hin zu Datacenter, Netzwerk und Storage.Hier im Blog möchte ich, soweit es die Zeit zulässt, weiterhin&nbsp;aus der Praxis erzählen.Bis bald!Tom\",\n  \"url\": \"https://onprem.wtf/post/moving-on!/\"\n},{\n  \"id\": \"post-how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you\",\n  \"title\": \"How to prepare for Exchange 2013 PF migration and what the Microsoft Guide doesn’t tell you\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"I’m currently preparing my Exchange 2010 / 2013 environment for the public folder migration from 2010 to 2013. I created a test lab to simulate the migration before I do it on the productive servers. During the test migration I noticed some problems that have to been fixed before you get into the migration.1. Fix wrong aliasesIf you have mail enabled folders with aliases containing special characters like spaces or “@” you get an error when you start the first migration part and Exchange wants to create the hierarchy.You can enumerate mailbox folders with, for example, spaces in aliases with the following query:Get-MailPublicFolder | where{$_.Name -match &quot; &quot;}If you have just less than 10 folders to fix you can do it manually. But if you have more than 50 to correct you can use the script written by Johan Veldhuis (http://www.johanveldhuis.nl/tools/scripts/fix-aliasv20.ps1)2. Set the storage quota for the public folder mailboxes on 2013 to unlimitedDuring migration, I recommend to set the storage quota for the public folder mailboxes to unlimited. I saw very strange problems with hierarchies on 2013 not comparing to 2010 if a folder is over quota. You can change the storage limit after migration is done.3. Set the legacy public folder – folder quota to unlimitedDuring migration I had some problems with mail enabled public folders. On the 2010 side the PF are mail enabled, on the 2013 not all PF’s are mail enabled but the PF’s are able to receive mails. You cannot manage the folders with EAC or porwershell. In my case, this problem was related to a PF quota set on a folder. I have many folders with content that reached the maximum limit. For all of these folders the mail enabled option was not enabled after migration. I recommend setting the PF Quota on PF Database basis to unlimited before migration. Please keep in mind to set the quota for all folders to “use database defaults”. You can do this with the following line of powershell:Get-PublicFolder -Recurse | where{$_.UseDatabaseQuotaDefaults -eq $false} | Set-PublicFolder -UseDatabaseQuotaDefaults $trueAdjust the new storage quotas later on a mailbox basis.Greeting   dn\",\n  \"url\": \"https://onprem.wtf/post/how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you/\"\n},{\n  \"id\": \"post-netsh-trace-and-the-message-analyzer\",\n  \"title\": \"netsh trace and the Message Analyzer\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"en\"],\n  \"content\": \"This is just a quick post about a cool feature of netsh and the successor to Microsoft’s NetMon.netsh traceWith Windows 7 / Server 2008R2 and newer versions a cool feature has been added to netsh: the possibility to capture network traces without the need to install any third party software.All you need to do is to start an elevated command prompt (run as Admin) and type the following command:netsh trace start capture=yesThen do the stuff you want to capture and stop the trace by using:netsh trace stopAn .etl trace will be generated and the file path is displayed. Note: if you use the persistent=yes parameter when starting the trace, you can even trace system reboots. Microsoft Message AnalyzerSo NetMon has been around for a while and IT pros around the world still love it, well at least I do ;) Some time ago, Microsoft introduced its successor, a tool by the name of “Message Analyzer”. This tool can to a lot more than just network traces, find some information on the MessageAnalyzer Blog.So I just captured a trace using netsh, copied the .etl file to my machine and then opened it in Message Analyzer. As you can see in the screenshot, the layout is quite a bit different from what we’re used from NetMon but the important things are still there. Filtering is quite intuitive, either write an expression into the text box at the right-hand side, or load a filter from the library. Alternatively, just right-click a property of a packet and select “Add to Filter” Well that’s about all I know about Message Analyzer for now. I was able to verify that packets got tagged with the DSCP values I expected and I did not have to install additional software to capture a trace.Happy tracing,Tom\",\n  \"url\": \"https://onprem.wtf/post/netsh-trace-and-the-message-analyzer/\"\n},{\n  \"id\": \"post-considerations-when-planning-for-directaccess\",\n  \"title\": \"Considerations when planning for DirectAccess\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012-R2\"],\n  \"content\": \"I’ve seen a fair share of DirectAccess installations recently. Here are some quick questions to ask before you or your customer start getting into the technical titbits. Licensing: DirectAccess requires the Enterprise Edition of Windows on the Client side!  Version:   Client: DirectAccess works with Windows 7 and later, Windows 8.1 i preferred as the technology has evolved  Server: DirectAccess works with Windows Server 2008R2 and later, but Windows 2012 is highly recommended as NAT64 and DNS64 have been included.&lt;/ul&gt; IPv6: Yep, DirectAccess is an IPv6 technology. Make sure your applications support IPv6 and make sure applications always use DNS names to connect to the Servers. If the client is configured to connect to an IPv4 address directly, DirectAccess will not work.  Windows Firewall: It’s sad but I do still see many organizations disabling Windows Firewall via Group Policy. Well in that case, not only are you putting your users at risk, DirectAccess will also not work. Windows Firewall must be enabled as DA uses Connection Security Rules.  Dual NIC: The DircetAccess Server should be configured with to NICs, one for external/dmz connectivity and one for connectivity to the internal network.  Static Routing: As you set the the default gateway to the external NIC, static routes will have to be created for internal networks. Make sure to use “New-NetRoute” as “route add” is no longer recommended.  Firewall: DirectAccess requires tcp/443 to be allowed from the Internet to the external network adapter of the DA server.  Public DNS: A name must be registered in the public DNS zone, clients will use this name to connect to the corporate network.  Public Certificate: A certificate issued by a publicly trusted Certification Authority is highly recommended for the DirectAccess server’s public DNS name. The DA Client checks the Certificate Revocation List before connecting, so if you are using an internal CA, make sure the CRL is available without connectivity to the corporate network.  No Schema or AD changes required: The only requirement for DirectAccess is a Windows Server 2012 (preferably 2012R2) member server. As long as you are on a 2003 or later domain level, you are good to go.  Probe Host: Clients try to connect to a “Probe Host” do determine whether or not a DirectAccess connection should be attempted. This host should, obviously, only be accessible from inside the corporate network. The DirectAccess Wizard resolves name in the Probe Host certificate’s subject, if there is no DNS record, or the DNS record points to an incorrect IP address, the Wizard will fail. Also if the probe host fails, Clients will attempt DA connections even if they are connected to the corp. network, which may lead to problems.  2FA: DirectAccess can be configured for two-factor authentication. Force Tunnelling is not supported in that scenario.  High Availability: Multiple DirectAccess Servers can be deployed for high availability. Windows Network Load Balancing can be used but I’d recommend you use an external Load Balancer.  VPN: The Remote Access Server can be configured for VPN as well.&lt;/ul&gt; &nbsp; Phew. I don’t like bullet lists… Whatever, with those in mind you should be able to plan your remote access strategy :) Tom\",\n  \"url\": \"https://onprem.wtf/post/considerations-when-planning-for-directaccess/\"\n},{\n  \"id\": \"post-wmf-5-preview-update-is-not-applicable-to-your-computer\",\n  \"title\": \"WMF 5 Preview: Update is not applicable to your computer\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"PowerShell\"],\n  \"content\": \"I just stumbled upon this one on a new machine I was working with:&nbsp;&nbsp; Are you trying to install the Windows Management Framework 5 Preview, to get all the new PowerShell stuff, and see an error like this one?\\\"The update is not applicable to your computer\\\"    This preview actually requires the system local to be set to \\\"en-US\\\", you can easily check this using Get-Host within PowerShell:    In my example, the CurrentUICulture was set to \\\"en-GB\\\" and, apparently, that's why the update failed to install. Once I changed my regional settings and downloaded the \\\"en-US\\\" language pack, the update installed just fine.  In case you haven’t heard of the preview as of yet, you can grab it here: http://www.microsoft.com/en-us/download/details.aspx?id=44070  The issue is also listed in Connect: https://connect.microsoft.com/PowerShell/feedback/details/877188/update-is-not-applicable-to-your-computer-windows-management-framework-5-0-preview-may-2014  &nbsp; Have fun,Tom \",\n  \"url\": \"https://onprem.wtf/post/wmf-5-preview-update-is-not-applicable-to-your-computer/\"\n},{\n  \"id\": \"post-windows-10-vhd-boot\",\n  \"title\": \"Windows 10 VHD Boot\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Seit einigen Tagen ist die Technical Preview von Windows 10 verfügbar. Auf meinem Notebook nutze ich Windows 8.1 und habe das Hyper-V Feature aktiviert um virtuelle Maschinen betreiben zu können. In so einer VM habe ich auch Windows 10 installiert und getestet.Nach ersten erfolgreichen Tests, wollte ich dann doch mein Notebook mal mit Windows 10 booten, also habe ich mit “bcdedit” einen neuen Eintrag im Bootloader erstellt und die virtual Hard Disk der Windows 10 VM als “device” und “osdevice” angegeben.Wichtig: Vor einer Änderung sollte man die aktuelle Konfiguration immer sichern:bcdedit /export \\\"C:\\\\Users\\\\thomas\\\\Documents\\\\bcdedit\\\"Dieser Befehl kopiert den Boot Configuration Eintrag für das aktuelle Betriebssystem. Der neue Eintrag erhält eine eigene GUID, diese wird gleich ausgegeben und wird in den darauffolgenden Befehlen verwendet.bcdedit /copy {default} /d \\\"Win10 Preview”Mit folgenden Befehlen werden die Einstellungen für den neuen Eintrag angepasst, die virtuelle Festplatte der Windows 10 VM wird als “device” konfiguriert, die GUID des oben erstellten Eintrags muss verwendet werden: bcdedit /set {&lt;new-GUID&gt;} device vhd=[C:]\\\\temp\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} osdevice vhd=[C:]\\\\temp\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} detecthal on&lt;/code&gt; Wenn das Notebook jetzt neu gestartet wird, kann ich im Bootloader zwischen Windows 8.1 und der Tech Preview von Windows 10 wählen. Auch die virtuelle Maschine kann nach wie vor verwendet werden. Viel Spaß,Tom&nbsp; \",\n  \"url\": \"https://onprem.wtf/post/windows-10-vhd-boot/\"\n},{\n  \"id\": \"post-lost-found-windows-tech-preview-delve-sway-and-keybaseio\",\n  \"title\": \"lost & found: Windows Tech Preview, Delve, Sway and Keybase.io\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"WindowsSome days ago, on September 30, @tmyerson and @joebelfiore introduced Windows 10 and announced the availability of a Technical Preview. The announcement and some demos are on YouTube. Some interesting new features such as snap for 4 windows and continuum, which switches between the start menu and the start screen based on whether or not a keyboard is connected, are coming to Windows 10.The preview can be downloaded at: http://windows.microsoft.com/en-us/windows/previewAlong with the tech preview of Windows 10 came the preview for the next version of Windows Server. A ton of new features will come to the next gen server OS, a notable one might be the SDN controller role, which provides a interface between higher layer applications (think SCVMM) and the software defined networking stack in Windows.The preview for Windows Server can be downloaded at: http://technet.microsoft.com/evalcenter/dn781243DelveThe long rumored and previously shown “Office Graph” aka “Oslo” has started rolling out to Office 365 customers under the new name: “Office Delve”. To get a chance to test new features before regular users get them, one needs to enable “First Release” in the Office 365 Admin Center. SwayAnother addition to the Office family, by the name of “Sway”, started a limited preview a couple of days ago. More information and some demos can be found here: https://sway.com/Keybase.ioAfter signing up some time ago, I finally received an invite for https://keybase.io. Keybase is an interesting approach to make public key cryptography more accessible to users, among many other features it provides&nbsp; a simple way of finding someone’s public key, based on their social media and web identities, in order to be able to encrypt messages for them. It is available as a command-line tool but the website works as client, too.View my publicly-auditable identity here: https://keybase.io/tomt So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-windows-tech-preview-delve-sway-and-keybaseio/\"\n},{\n  \"id\": \"post-scvmm-hyperv-script-to-reboots-vms-with-powershell\",\n  \"title\": \"SCVMM–HyperV Script to reboots VM’s with powershell\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Today I wondered that with Hyper-V there is no option to „reboot“ a VM with right clicking on it. With ESX I have the option to reboot the guest and so I created a script to schedule the reboot with the help of VMWare Powershell and VMWare tools.   The Hyper-V modules on SCVMM gives you the option to shut down and start a VM. Therefore I wrote a simple script that shutdown all VM machines in a specified list (you can use an argument if you want to work with multiple lists). The shutdown is initiated with the “-RunAsynchronously“ switch so that the Powershell command does not wait until the vm is powered off. Immediately after sending the shutdown command a “do while” loop begins to work and waits until one of the machines is powered off. If a machine is switched off the loop powers the VM machine on. The loop ends when all machines are started up.As I have also a VMWare vCenter connected in SCVMM I only touch VM machines with a filter: VirtualizationPlatform = “HyperV”   &#160;# Import Module   Import-Module -Name &quot;virtualmachinemanager&quot;# Clear Variables   [String[]] $VMsToStart = $Null# Get List of VM's to reboot   $VMsToReboot = Get-Content &quot;C:\\\\Program Files\\\\Scripts\\\\ServerList.txt&quot;# Shutdown each VM   Foreach($VMToShutdown in $VMsToReboot){    &#160;&#160;&#160; $VMToShutdownObject = Get-SCVirtualMachine $VMToShutdown    &#160;&#160;&#160; If ($VMToShutdownObject -ne $Null){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToShutdownObject.VirtualizationPlatform -eq &quot;HyperV&quot; -and $VMToShutdownObject.VirtualMachineState -eq &quot;Running&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Shutdown-VM -VM $VMToShutdownObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart += $VMToShutdown    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }Else{    &#160;&#160;&#160; Write-Verbose (&quot;Machine &quot; + $VMToShutdown + &quot; not found&quot;)    &#160;&#160;&#160; }    }# Start each VM after graceful shutdown   Do{    &#160;&#160;&#160; ForEach($VMToStart in $VMsToStart){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMToStartObject = Get-SCVirtualMachine $VMToStart    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToStartObject.VirtualMachineState -eq &quot;PowerOff&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Start-VM -VM $VMToStartObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart = $VMsToStart | ? {$_ -ne $VMToStart}    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }    }while($VMsToStart.Count -ne 0)    \",\n  \"url\": \"https://onprem.wtf/post/scvmm-hyperv-script-to-reboots-vms-with-powershell/\"\n},{\n  \"id\": \"post-lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode\",\n  \"title\": \"Lync 2013 backend on SQL Cluster with mixed authentication mode\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"en\",\"Skype4B\"],\n  \"content\": \"So I came across this issue at a customer’s site the other day. EnvironmentThe customer runs multiple Lync 2013 Front End Servers in an enterprise pool with the backend and monitoring databases being hosted on a SQL 2008R2 Cluster (default instance) that is also used for other applications and, thus, uses mixed authentication mode.A SQL admin was present during the initial installation of the Lync Pool, and his credentials were used to perform the DB installation.ProblemSo far so good, but when the SQL admin was gone and the Lync Admins (members of RTCUniversalServerAdmins) tried to access the databases with cmdlets like Test-CsDatabase, Update-CsAdderssbook or Install-CsDatabase, they got a nasty little error like:Command execution failed: Property DefaultSchema is not available for Database '[LcsCDR]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.We verified the Logins and permissions on the SQL cluster and everything looked OK, meaning the logins and permissions for all the RTCUniversal… groups were there, just as expected. Still, the error would not go away.  The problem seems to be, that Active Directory groups cannot be used with mixed mode authentication??  Solution? The only solution we found, was to add the user account of the Lync Admin as a login on the SQL cluster and assign permissions directly to the user. Once the user was granted permissions directly (and not through an AD group membership), the error disappeared and the cmdlets worked just fine. This, by the way, explains why the initial setup worked just fine: The SQL admin, whose account was used during setup, had a login and permissions configured for his AD user. The solution is OK for a temporary workaround, but is not very feasible for an enterprise deployment. If anyone has a better solution, I’d love to hear from you :) &nbsp; Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode/\"\n},{\n  \"id\": \"post-moving-to-azure\",\n  \"title\": \"Moving to Azure…\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"… well there is not much more to say. We have been using aruba.it as hosting provider since the beginning of ntSystems info|tech in 2009. On the upside, their simple “hosting windows” plan worked pretty OK and was very affordable, on the downside, they didn’t really care to update the servers and were not able to provide us with IPv6 or a possibility to manage the DNS zone for ntsystems.it.So after testing out various platforms and providers Daniel and I decided to move the blog to Windows Azure. It’s simple, up to date and the new “shared infrastructure” pricing tier is not to expensive, either. We are now in control of the DNS zone and use CloudFlare to improve the sites performance and easily enable IPv6.As you may already have noticed, we took advantage of Azure’s up-to-date hosting platform to migrate to the latest version of the .NET blog engine. &nbsp;We hope you enjoy the new design as much as we do and continue to find our postings helpful and interesting :)Cheers!Tom \",\n  \"url\": \"https://onprem.wtf/post/moving-to-azure/\"\n},{\n  \"id\": \"post-noop-and-nat-traversal\",\n  \"title\": \"NoOp and NAT Traversal\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"In a recent Lync project I came across an interesting issue with SIP Trunks, fortunately we had an AudioCodes SBC so there was a simple solution to the problem. Problem In some call-forwarding scenarios no audio connection could be established, a debug trace on the gateway would show no RTP packets at all.&nbsp;Signaling was working just fine, all the right IPs and Ports were listed within the SDP messages, as you see in the screenshot, though, no RTP packets can be seen.SolutionApparently the SIP provider used some kind of NAT or security device in front of their SIP equipment, and pinholes were only opened when this device received any incoming packets from our side of the communication.That’s when I learned about the “NoOpEnable” parameter which is designed for problems, just like this one. Once the “NoOpEnable” parameter is set to “True”, the SBC will send one RTP packet (with payload No-Op) to each IP involved in the session (retrieved from SDP). The following Screenshot shows another debug trace, please note the first to RTP packets:This did the trick, whatever device the remote side was using, it let RTP packets through once it received an incoming packet.For more Information on the No-Op Payload Type, check out the following IETF Draft: A No-Op Payload Format for RTPEnable NoOpThe NoOpEnable parameter can be configured using the devices AdminPage, which can be found at: https://&lt;IPAddress&gt;/AdminPage Another way, the one I prefer nowadays, is to use the SSH command-line interface, simply connect to the device using PuTTY or TeraTerm and use the following syntax:configure voip    media RTP-RTCP    &nbsp; no-operation-enable 1    &nbsp; activate&nbsp;Lessons learnedAlways use an SBC if dealing with SIP trunks :) &nbsp;Tom\",\n  \"url\": \"https://onprem.wtf/post/noop-and-nat-traversal/\"\n},{\n  \"id\": \"post-ipv6-im-unternehmen\",\n  \"title\": \"IPv6 im Unternehmen\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Network\"],\n  \"content\": \"In diesem Artikel versuche ich ein paar Argumente für IPv6 in Unternehmensnetzwerken zu erklären, die meisten Netzwerker und Admins mit denen ich zu tun habe sind verunsichert oder schlecht informiert und versuchen aus diesen und anderen Gründen IPv6 als unwichtig oder gar unnötig abzutun.Warum?Diese Frage hört man immer wieder, dabei gibt es einige Gründe die für IPv6 sprechen. Ich teile diese Frage in zwei Bereiche auf, IPv6 im Unternehmensnetzwerk und IPv6 im Internet. IPv6 im InternetViele neuen Trends in der IT haben eines gemeinsam: immer mehr Geräte wollen immer mehr Informationen an immer mehr Teilnehmer senden. Dazu werden immer mehr Verbindungen und immer mehr Adressen benötigt. Das Internet of Things, immer-online Smartphones und viele Cloud Produkte sind ohne IPv6 bereits jetzt schon nicht mehr denkbar. Facebook stellt derzeit sogar das interne Netzwerk wegen Adressmangel auf IPv6 um.Aus der Sicht eines Unternehmens ist IPv6 spätestens dann interessant, wenn man Geschäftspartner in Regionen mit wenigen öffentlichen IPv4 Adressen hat. So werden z.B. in Asien, Afrika und Osteuropa nur noch IPv6 Anschlüsse verkauft, nur selten ist es möglich einige IPv4 Adressen zu ergattern. Durch Übergangstechnologien (transition technology) bietet der Provider zwar die Möglichkeit weiterhin auf IPv4 Inhalte zuzugreifen, aber will man sich als Unternehmen wirklich darauf verlassen, dass potentielle Kunden und Partner die Website schon irgendwie erreichen werden? Dass Emails mit Aufträgen schon irgendwie ankommen werden?Um Problemen mit Übergangstechnologien (Tunneling, CGN…) aus dem Weg zu gehen, sollten bestimmte Dienste aus dem nativen IPv6 Netzwerk erreichbar sein. Die bereits angesprochenen Aufträge oder Webzugriffe sind dabei nur ein Grund, Mitarbeiter (und Führungskräfte) reisen in Regionen in denen IPv6 Internet bereits Normalität ist und auch von dort wollen diese auf das Firmennetzwerk zugreifen und Emails abrufen.Wegen des einfachen (und für den Benutzer kaum merkbaren) Fallbacks ist E-Mail ein Dienst, der relativ einfach über IPv6 erreichbar gemacht werden kann, hier profitiert man sofort von einer besseren Erreichbarkeit und kann den Umgang mit der Technologie lernen.IPv6 im internen NetzwerkBei der Entwicklung von Windows Vista und Server 2008 wurde der Netzwerkstack komplett neu geschrieben, dabei wurde großer Wert auf die Implementierung von IPv6 gelegt. So ist IPv6 ab Windows Vista/2008 nicht nur standardmäßig aktiv, es wird auch bevorzugt. Bekommt ein Client also sowohl ein IPv4 als eine IPv6 Adresse für eine DNS Abfrage zurück, versucht dieser die Verbindung über IPv6 zuerst.Da Windows XP hoffentlich nicht mehr zum Einsatz kommt, kann man davon ausgehen, dass in den meisten Unternehmen bereits jetzt IPv6 großflächig ausgerollt wurde! Leider passiert das häufig ohne detaillierte Planung und manchmal sogar ohne das Wissen der Admins bzw. Netzwerkverantwortlichen. Während das IPv4 Netzwerk genau geregelt wird, Firewalls und IPS Systeme in regelmäßigen Audits gecheckt werden, hat man einen zweiten, nicht berücksichtigen, nicht verwalteten Netzwerkstack. Aus Sicht der Netzwerksicherheit ist dies deshalb kritisch, weil Windows teilweise automatisch Tunnel aufbaut welche dem Client einen ungefilterten Zugriff auf das wachsende IPv6 Internet geben. Da IPv6 bevorzugt wird, kann man mit einem IPv6 “Router Advertisement” einfache Man-in-the-Middle Attacken ausführen und z.B. den gesamten Traffic eines Subnets über einen Proxy umleiten. Security Features wie DHCP Snooping und ARP Inspection sind weiterhin wichtig um das IPv4 Netzwerk zu schützen, in diesem Fall sind diese aber nutzlos.Spätestens zu diesem Zeitpunkt sollte man sich Gedanken über IPv6 machen! Man muss nicht gleich das gesamte Netzwerk umstellen, wichtiger ist eine genaue Planung und die Übertragung der bestehenden Sicherheitsrichtlinien auf IPv6.MigrationDas (langfristige) Ziel einer IPv6 Einführung ist die komplette Migration des Netzwerkes auf natives IPv6, trotzdem wird man IPv4 über eine lange Zeit weiter betreiben. Wie bei jeder Einführung oder Migration ist auch hier die Planung ein wichtiger, erster Bestandteil.Dabei sollten folgende Punkte berücksichtigt werden:   Adressplan: Welche IP Adressen, Subnets? Im Enterprise Umfeld Providerunabhängige Adressen    Übergangstechnologie: Nativ, Tunnel oder eine Mischung?    Bestehendes Equipment: Können benötigte Features abgebildet werden? Firmware Update nötig? Der erste Schritt bei der Einführung ist das Aktivieren des IPv6 Zugriffes am Übergangspunkt des Netzwerkes, hier muss in der Regel mit dem ISP gearbeitet werden. Sind Routing und Sicherheitsrichtlinien eingerichtet, kann IPv6 von außen nach innen ausgerollt werden. Beginnen sollte man mit einer Labor oder Testumgebung, diese kann in einer DMZ, nahe am Übergangspunkt angesiedelt werden, so kann man Erfahrungen sammeln ohne IPv6 ans letzte Ende des Netzwerkes zu transportieren.Nach ausgiebigem Test bieten sich E-Mail und DNS als erste Dienste an, die in einer produktiven Umgebung für IPv6 aktiviert werden können. Beide fallen ohne Probleme auf IPv4 zurück, sodass Benutzer im Problemfall nicht betroffen sein sollten.Ein weiterer interessanter Punkt sind Load Balancer oder Application Delivery Controller, diese veröffentlichen bereits jetzt Systeme und stellen eine Verbindung zwischen öffentlichem und privatem Netzwerk dar. In aktuellen Versionen bieten viele dieser ADCs die Möglichkeit auch über IPv6 mit dem öffentlichen Netzwerk zu kommunizieren. Verwendet der ADC eine Technologie wie NAT64 ist dies für den veröffentlichten Dienst (SharePoint, Exchange, Web…) transparent und dieser muss nicht geändert werden.Möglichkeiten und VorteileDie Einführung von IPv6 bietet, neben der Vielfalt an Adressen weitere Vorteile, so können Router z.B. schneller arbeiten da der IP Destination Header immer an derselben Stelle im Paket zu finden ist. Außerdem erledigen sich die Themen ARP und Broadcasts, für die Auflösung der L2 Adressen wird ICMPv6 verwendet, die sogenannte Neighbor Discovery findet immer über Multicast statt.Ein weiterer Punkt der in IPv4 Netzwerken häufig zu Problemen führt ist MTU und Paketfragmentierung, auch das gibt es in IPv6 Netzwerken nicht mehr. Über ICMPv6 wird die Path MTU ermittelt, so weiß der Client wie groß seine Pakete für den Server sein dürfen, bevor er diese losschickt.Die Automatische Konfiguration von Clients wird oft als Vorteil genannt, dies kann in kleineren Netzwerken sicher interessant sein, im Unternehmen wird es weiterhin DHCP und statische Adressierung für Server geben.Eine der größten Krücken und der Grund aus dem viele immer noch an IPv4 festhalten, ist NAT oder Network Address Translation. Diese Technologie hat es überhaupt erst ermöglicht die Einführung von IPv6 so lange hinaus zu zögern, gleichzeitig hat sie aber auch jede Menge Probleme für Applikationen mit sich gebracht. Mit einem global skalierbaren IPv6 Adressplan wird eine End-to-End Kommunikation von Geräten endlich möglich, das wechseln zwischen Netzwerken kann so für den Benutzer einfacher werden. In einer mobile-first Welt ein nicht unwichtiger Punkt ;)Natürlich ist auch Sicherheit ein wichtiger Aspekt und auch da bietet IPv6 einige Vorteile, so ist IPSEC z.B. standardmäßig implementiert und jeder Host kann (theoretisch) verschlüsselt kommunizieren. Allerdings sieht man auch hier, dass es sich schon um ein älteres Protokoll handelt, einige Standardheader gelten heute als unsicher und es gibt schon einen Nachfolger für Neighbor Discovery, SEND oder SEcure Neigbor Discovery.ProblemeWie bei jeder neuen Technologie gibt es auch bei der Einführung von IPv6 bestimmte Fallstricke, so kann es z.B. sein dass Clients zwar die IPv6 Verbindung bevorzugen, das Routing dafür aber einen weniger optimalen Pfad wählt und die Verbindung deshalb langsamer ist. Aktives Monitoring, saubere Dokumentation und gutes Configuration Management sind wie bei IPv4 unerlässlich. Hier gilt es bestehende Prozesse an die neue Technologie anzupassen. &#160;Einige hilfreiche Links zum Thema hab ich hier gesammelt: IPv6 Learning Resources&#160;Ich hoffe in diesem Artikel das Interesse an IPv6 geweckt zu haben :)Happy hacking!   Tom\",\n  \"url\": \"https://onprem.wtf/post/ipv6-im-unternehmen/\"\n},{\n  \"id\": \"post-work-folders-demo-mit-microsoft-azure\",\n  \"title\": \"Work Folders Demo mit Microsoft Azure\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Vor einigen Tagen wollte ich in einer Demo das neue Windows Feature “Work Folders” zeigen, da ich gerade keine passende Umgebung hatte, habe ich kurzerhand zwei virtuelle Maschinen in Microsoft Azure IasS gestartet.ÜbersichtDa es sich um eine einfache Demo handelt verwende ich nur zwei Server die ich aus dem Windows 2012R2 Image in Azure erstelle. Auf dem ersten werden die Rollen Domain Controller, ADFS, Zertifizierungsstelle und Work Folders installiert, der zweite wird als Web Application Proxy für die Veröffentlichung verwendet. Da die beiden Server miteinander kommunizieren sollen, verwende ich ein virtuelles Netzwerk in welches die beiden Server ausgerollt werden. Work FoldersWork Folders ist ein Feature von Windows 2012R2 und kann mit OneDrive/Dropbox verglichen werden. Work Folders bieten dem Benutzer eine einfache Möglichkeit auf Daten zuzugreifen und diese über mehrere Geräte zu synchronisieren. Leider gibt es derzeit nur Unterstützung für Windows 7 und 8/8.1, Clients für mobile Geräte wurden noch nicht angekündigt.Im ersten Schritt stufe ich den ersten Server zum Domain Controller hoch und installiere/konfiguriere die Zertifizierungsstelle. Eine spezielle Konfiguration dieser Rollen ist nicht notwendig, die einzige Anpassung ist das Erstellen eines neuen Zertifikattemplates welches später für die ADFS und WAP Zertifikate verwendet wird.DNSVor der Konfiguration der AD FS Rolle überlege ich mir einen Namen über welchen die Federation Services später erreichbar sein sollen, hier entscheide ich mich für adfs.uclab.eu. Damit ich interne Anfragen direkt zum AD FS Server leiten kann, erstelle ich ein DNS Zone für diesen Eintrag: Der A-Record verweist auf meinen Domain Controller und AD FS Server.AD FSNach der Installation der Active Directory Federation Services sind folgende Schritte für die Konfiguration notwendig.Ein Zertifikat mit dem Namen für die Federation Services sowie dem internen Servernamen wird angefordert. Hier verwende ich ein Kopie des WebServer Templates als Zertifikatsvorlage. Sobald das Zertifikat installiert wurde, kann die AD FS Farm installiert werden, dafür wird der Thumbprint der Zertifikates benötigt, diesen kann man sich per PowerShell einfach anzeigen lassen:Get-ChildItem Cert:\\\\LocalMachine\\\\my -DnsName adfs*Außerdem wird ein Service Account für den AD FS Dienst benötigt, dafür verwende ich ein normales AD User Account. Jetzt kann die Farm installiert werden, dabei wird das Service Account mit Get-Credential abgefragt:Install-ADFSFarm -CertificateThumbprint 9EA51F4DAA939C077602DF0B7EE7426F61E2DE0A -FederationServiceDisplayName \\\"Uclab Demo\\\" –FederationServiceName adfs.uclab.eu -OverwriteConfiguration -ServiceAccountCredential (Get-Credential) -ErrorAction Stop In der AD FS Management Konsole sehen die Federation Service Properties folgendermaßen aus:&nbsp;AD FS Relying TrustJetzt wird ein Relying Party Trust hinzugefügt, dazu klickt man in der AD FS Management Konsole mit rechts auf “AD FS” und wählt “Add Relying Party Trust”. Die Daten müssen manuell eingegeben werden, ein Name wird für den Trust gewählt. Das AD FS Profil wird verwendet, die Auswahl des Zertifikates für Token Signierung sowie die Konfiguration der URLs für WS-Federation und SAML können übersprungen werden.Als Identifikation muss “https://windows-server-work-folders/V1” verwendet werden. Multi Faktor Authentifizierung ist in meiner Demo nicht nötig und wird auch übersprungen. Der letzte Schritt kann auch übersprungen werden, anschließend wird der Trust erstellt. Jetzt müssen noch “Claim Rules” definiert werden. Folgende Attribute werden definiert: Jetzt müssen per PowerShell noch folgende Eigenschaften konfiguriert werden:Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -EnableJWT:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” –Encryptclaims:$false Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -AutoupdateEnabled:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -IssueOAuthRefreshTokensTo:’AllDevices’Der AD FS Server ist jetzt soweit bereit für die Authentifizierung der Work Folders.File and Storage Services: Work FoldersJetzt kann die Work Folders Rolle installiert werden, das geht am schnellsten per PowerShell:Install-WindowsFeature –Name FS-SyncShareServiceNach der Installation erfolgt die Konfiguration der Work Folders über den Server Manager, die Konfiguration ist (wie die Server Rolle) unter “File and Storage Services” zu finden.Ein neuer “Sync Share” wird angelegt, hier wird ein lokaler Pfad für die synchronisierten Daten angegeben. Anschließend wird ausgewählt wie die Ordner auf dem Server benannt werden sollen: Dann können die Berechtigungen vergeben werden, Standardmäßig wird die NTFS Vererbung unterbrochen und der Benutzer erhält exklusiven Zugriff auf sein Sync Share. Über Client Richtlinien kann geregelt werden ob die Work Folder Dateien lokal verschlüsselt werden müssen und ob das Gerät mit einem Passwort gesperrt wird. Nachdem der Sync Share erstellt wurde, muss die Authentifizierung auf ADFS geändert werden, dazu muss man im Server Manager auf Server klicken und den lokalen Server auswählen, dann kann mit einem Rechtsklick “Work Folders Settings” ausgewählt werden:Ich gebe die vorher erstellte AD FS Farm für Authentifizierung an.  Web Application ProxyJetzt ist es an der Zeit den Reverse Proxy auf meinem zweiten Server zu installieren, dieser ist nicht Mitglied der AD Domain, die Authentifizierung erfolgt über AD FS.Noch auf dem Domain Controller fordere ich ein Zertifikat für den Proxy an, hier verwende ich wieder den Namen der AD FS Farm sowie einen weiteren Namen über den ich die Work Folders veröffentlichen werde: Dieses Zertifikat exportiere ich am Domain Controller und importiere es auf dem Reverse Proxy, da dieser nicht Mitglied der Domain ist, muss auch das Root Zertifikat importiert werden.Jetzt kann die Rolle Web Application Proxy installiert werden, diese geht wieder am schnellsten per PowerShell:Install-WindowsFeature –Name Web-Application-ProxyAnschließend wird die Rolle konfiguriert, dafür kann die “Remote Access Management Console” verwendet werden, da sich diese aber nach pre-Beta anfühlt bevorzuge ich auch hier PowerShell. Ein guter Tipp für unbekannte oder selten verwendete cmdlets ist “Show-Command” so kann man sich seinen Befehl einfach zusammenstellen: Der Befehl für die Konfiguration des Web Application Proxy ist dann:Install-WebApplicationProxy -CertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -FederationServiceName adfs.uclab.eu -FederationServiceTrustCredential (Get-Credential)Nun kann die Work Folder Applikation erstellt werden, auch dafür verwende ich wieder “Show-Command” um den PowerShell Befehl zu erstellen.Der Befehl für das veröffentlichen der Applikation ist:Add-WebApplicationProxyApplication -BackendServerUrl https://wfdemo.intra.uclab.eu -ExternalCertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -ExternalUrl https://workfolders.uclab.eu -Name WorkFolders -ADFSRelyingPartyName WorkFolders -ExternalPreauthentication ADFS –UseOAuthAuthenticationNachdem die Applikation über den WAP veröffentlich wurde, muss diese nur noch von außen erreichbar gemacht werden. Dazu werden in der öffentlichen DNS Zone zwei CNames erstellt, einen für die AD FS Farm den anderen für den Namen der Work Folders. Diese CNames zeigen auf den Cloud Service der Reverse Proxy VM in Microsoft Azure. Der Reverse Proxy bekommt einen HTTPS Endpunkt und wird somit erreichbar gemacht: DEMONach all diesen Schritten wird es Zeit die AD FS Authentifizierung zu testen, dazu kann folgende URL verwendet werden:https://adfs.uclab.eu/adfs/ls/idpinitiatedsignon.htm  Das sieht schon mal gut aus, also können wir die Work Folders testen, diese finden sich in der Systemsteuerung: Die URL für die veröffentlichte Applikation wird angegeben, es gibt die Möglichkeit diese in der Registry oder einem AD Attribut für Auto Discovery zu hinterlegen, beide Varianten sind aber nur auf Domain Clients interessant. Für die Anmeldung werde ich auf AD FS umgeleitet: Dann kann ich einen lokalen Speicherort auswählen und werde auf die Richtlinien hingewiesen:  In der Übersicht sieht man Status der Synchronisation und den verfügbaren Speicherplatz am Server. Viel Spaß mit den Work Folders und ein schönes, langes Wochenende :)Tom\",\n  \"url\": \"https://onprem.wtf/post/work-folders-demo-mit-microsoft-azure/\"\n},{\n  \"id\": \"post-activedirectory-displayname-mit-umlauten-und-audiocodes-isdn\",\n  \"title\": \"ActiveDirectory DisplayName mit Umlauten und AudioCodes ISDN\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Vor einigen Tagen bin ich in einem Lync Projekt auf das Problem gestoßen, dass bestimmte Benutzer keine Anrufe in das PSTN (ISDN E1) tätigen konnten. Der Kunde setzt ein AudioCodes Gateway ein, die Syslogs des Gatways sind zur Fehlersuche sehr gut geeignet. Das Gateway bekommt die SIP Signalisierung von Lync sowie die Q.931 Signalisierung aus dem ISDN mit.Nach kurzer Suche hat sich herausgestellt, dass Benutzer welche keine Anrufe tätigen konnten, folgenden Fehler verursachten:&lt;132&gt;[S=831454] Error Indication: Last Command (Primitive) was not performed due to cause 100  [Trunk:0 Bchannel:1 ConnID:2] [Code:0x23127] &lt;133&gt;[S=831455] (   lgr_psbrdex)(833974    )   recv &lt;-- UnHandled event: EV_ISDN_ERROR_INDICATION (317) &lt;133&gt;[S=831456] [SID:766997237] (   lgr_psbrdex)(833975    )   pstn recv &lt;-- CALL_RELEASED Trunk:0 Conn:2 RetCause:73 NetCause:255 &lt;132&gt;[S=831457] REPORT_TYPE_ERROR_IN: ErrorCauseString = Incorrect parameter type, DiagnosticString= Condition unknown, ErrorCause = d, Diagnostic =  [Trunk:0 Bchannel:-1 ConnID:-1] [Code:0x23127] &lt;133&gt;[S=831458] [SID:766997237] (   lgr_psbrdif)(833976    )   pstn send --&gt; PlaceCall: Trunk:0 BChannel:1 ConnID:2 SrcPN=xxx SrcSN= DstPN=151xxxxxxxx DstSN= SrcNT=4 SrcNP=1 SrcPres=0 SrcScrn=0 DstNT=2 DstNP=1 ServiceCap=M RdrctNum= RdNT=0 RdNP=0 RdPres=0 RdScrn=0 RdRsn=-1 Excl=1 Display=Müller, Max IE= UUIE=0, RawData:0 CLIRReason:-1 OrigPN= OLI=-1 OffhookInd=0 &lt;133&gt;[S=831462] [SID:766997237] (   lgr_psbrdif)(833980    )   Abnormal Disconnect cause:255#?reason(255)? Trunk:0 Conn:2Die Normalisierung der Nummern ist bei allen Benutzern identisch, daran konnte es nicht liegen, nach einiger Zeit ist mir aufgefallen, dass Benutzer die keine Anrufe tätigen konnten einen Umlaut im Active Directory Anzeigenamen hatten… Dieser Namen wurde bei einem Benutzer zu Testzwecken umbenannt und schon konnte dieser auch telefonieren.LösungDas Attribut DisplayName bei allen Benutzern zu ändern kam natürlich nicht in Frage, glücklicherweise gibt es eine Einstellung auf dem AudioCodes Gateway mit der man das Verhalten steuern kann.Eine Möglichkeit ist es, den Calling Name nicht ins ISDN zu signalisieren, dazu kann man den Parameter Remove Calling Name auf dem entsprechenden Trunk auf Enable setzen.Alternativ kann über die AdminPage (oder die INI Datei) der Parameter ISO8859CharacterSet auf “0” gesetzt werden, dieser ändert die Umlaute in Latin-Only Zeichen, so wird “ä” zu “a”, “ö” zu “o” usw…Dieser Parameter kann auch über das CLI gesetzt werden, dazu verbindet man sich per SSH auf das Gateway. Die Einstellung versteckt sich hier:configure voip  gw digitalgw digital-gw-parameters   iso8859-charset no-accentedTom\",\n  \"url\": \"https://onprem.wtf/post/activedirectory-displayname-mit-umlauten-und-audiocodes-isdn/\"\n},{\n  \"id\": \"post-app-v-and-the-start-menu-folder-redirection-issue\",\n  \"title\": \"App-V and the start menu folder redirection issue\",\n  \"author\": \"dni\",\n  \"tags\": [\"AppV\",\"en\"],\n  \"content\": \"If you are using redirected start menu and App-V you might get into some issues with the management of the App-V application shortcuts. First let&rsquo;s start with some background information.Start Menu The Windows start menu is located in the following folder&hellip;. If you are using folder redirection, you can redirect the folder to a fileserver. This is a very often seen scenario in RDS and Citrix deployments.App-V and the Start Menu When you publish an application for a group of users, App-V can create the folder and shortcuts in the start menu. You can manage this in the management website from App-V.App-V and the System Account After you install the App-V Client on your desktop or terminalserver machine, you can find the following service &ldquo;Microsoft App-V Client&rdquo; in the services. The App-V Client services runs with the local system account. If you change this account to a domain user account with the needed permissions, you get errors when publishing / un-publishing applications.The issue: You are using redirected start menu and remove an user from an App-V publishing group. The App-V Client does not delete the programs folder and shortcuts in the users start menu.The reason is, that the local System account, under which the App-V Client services runs, doesn&rsquo;t have the permissions to delete the folder and shortcuts from the fileserver where your start menu is located.There are 2 work around1. Don&rsquo;t redirect the start menuIf you don&rsquo;t use start menu redirection, you don&rsquo;t run into this issue2. Redirect the start menu and use a script to delete death program shortcutsI don&rsquo;t want to disable the start menu redirection and wrote a script to find &ldquo;death&rdquo; shortcuts and delete them with the appropriate folder. You can specify the following script as user logon script:Start-Sleep -Seconds 10$ErrorActionPreference = \\\"SilentlyContinue\\\" $StarMenuPath = \\\"REDIRECTED_FOLDER\\\" + [Environment]::UserName + \\\"\\\\Start Menu\\\"$Shortcuts = gci $StarMenuPath -Recurse -Filter \\\"*.lnk\\\" ForEach ($Shortcut in $Shortcuts) { &nbsp;&nbsp;&nbsp; $WshShell = New-Object -ComObject WScript.Shell &nbsp;&nbsp;&nbsp; $LocalAppDataPath = $env:LOCALAPPDATA &nbsp;&nbsp;&nbsp; $Link = $WshShell.CreateShortcut($Shortcut.Fullname) &nbsp;&nbsp;&nbsp; $PathToApp = $Link.TargetPath &nbsp;&nbsp;&nbsp; $PathToApp = $PathToApp.replace(\\\"C:\\\\Windows\\\\system32\\\\config\\\\systemprofile\\\\AppData\\\\Local\\\",$LocalAppDataPath) &nbsp;&nbsp;&nbsp; IF((!(Test-Path $PathToApp)) -and ($PathToApp.Contains(\\\"AppV\\\"))){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-item -LiteralPath $Shortcut.Fullname -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = $Null &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = gci $Shortcut.Directory.FullName -Recurse &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If($RemainingFiles -eq $Null){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Item $Shortcut.Directory.FullName -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } }Microsoft will fix this I opened a MS call and last week I got an email that the issue for this problem will be fixed in the upcoming Spring release.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/app-v-and-the-start-menu-folder-redirection-issue/\"\n},{\n  \"id\": \"post-lync-sip-inter-domain-federation-with-cisco-unified-presence-2\",\n  \"title\": \"Lync: SIP inter-domain federation with Cisco Unified Presence - 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"In my last post I went through the required configuration steps on the Cisco Unified Presence Server, in this post I will cover the Lync Server configuration as well as some troubleshooting aspects.Lync configurationOn the Lync server side we have to create a trusted application pool along with a trusted application in order for Lync to accept SIP requests from the CUPS. This is done using the Lync Server Management Shell:New-CsTrustedApplicationPool -Identity cups.tomt.local -Registrar lync01.tomt.local -ThrottleAsServer $true -TreatAsAuthenticated $true -OutboundOnly $false -RequiresReplication $false -Site 1 New-CsTrustedApplication -TrustedApplicationPoolFqdn cups.tomt.local -Port 5062 -ApplicationId CUPSAfter that we need a static route pointing to the CUP Server so that Lync knows where to find Users within a certain address space (@tomt.local in our case).$r = New-CsStaticRoute -TLSRoute -Destination cups.tomt.local -Port 5062 -MatchUri tomt.local -UseDefaultCertificate $true      Set-CsStaticRoutingConfiguration -Route @{Add=$r}Note: As we are using TLS as transport protocol, we create a new TLSRoute, the destination parameter specifies where requests for a certain domain (MatchUri) are routed to, as always with TLS, the common name of the certificate must match the FQDN entered as destination. I am using Port 5062 because that is the default port for the “Peer Authentication Listener” on CUP. Once this configuration is in place, we need to make sure the Lync Server trusts the certificate used on the CUPS, so I made sure the CA that issued the CUPS certificate was present in the Lync Servers “Trusted Roots” store.Nice work, Lync users can now see Cisco users presence states and they can even chat with each other :) &#160; Ok, now that we have a working configuration, let’s have a look at troubleshooting.Problem PointsNote: This post is in progress, I will add more troubleshooting steps over the next couple of days.I will list some of the more problematic points here, so just in case you have a half working configuration, make sure to check for the following issues:Unsupported CertificateIf the Lync Server certificate does not include the Enhanced Key Usage of “Client Authentication”, the TLS handshake fails. As the error occurs before the two systems are speaking SIP, we will have to rely on NetMon or Wireshark to troubleshoot the TLS Handshake, sure enough it shows an “Encrypted Alert”:&#160; In the Binary data of the handshake we can see the alert value is 2B (hex) which translates to decimal 43 an means: unsupported certificate. So to fix this, re-issue the Lync Server certificate (Default, Web Services don’t matter here) and make sure the template includes the Client Authentication enhanced key usage.Lync Client signs out when searching for federated userThis is one of the oddest behaviors of the Lync 2013 clients that I have ever seen. A Lync user searches for another user which is homed on the Cisco Unified Presence server. As soon as the user completes the entry of the sip address (and the Lync Server sends a SUBSCRIBE message to the CUPS) the Lync user is signed out of the client.Same thing happens if a CUPS user sends an IM to the Lync user. The Lync client log shows that CUPS is trying to do MD5 authentication (yes md5 in 2014….) and that the Lync Clients handles this by signing out.### client error log ###Check the ACL configuration on the CUP Server, all Lync Servers and Clients must be excluded from MD5 authentication. Also check that your static Route on Lync points to the Peer Authentication listener.&#160;So long,    Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-2/\"\n},{\n  \"id\": \"post-lync-sip-inter-domain-federation-with-cisco-unified-presence-1\",\n  \"title\": \"Lync: SIP inter-domain federation with Cisco Unified Presence - 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"As a consultant I do have the pleasure to be working with new customers on a regular basis. Recently I had the interesting request to make Lync 2013 talk to a Cisco Unified Presence 9.1 server. The goal for the customer was, to provide Lync users with the presence information available in the Cisco world.Luckily the configuration was setup with multiple domains, Lync using the public (tomt.it) and Cisco Unified Presence using an internal only (tomt.local) domain. What’s possible?Before you get your hopes to high, here goes a quick list of what functionality will be available, once the federation is in place.   Presence     Contact List (users from both domains can add each other)     IM (Peer to Peer only)  That’s it. Sure you can use Jabber to make your Cisco Desk Phone call a Lync endpoint, if you have a SIP trunk configured between the two systems, but that’s got nothing to do with the presence federation.Basic TopologyThe topology I was working with, consisted of a single Lync 2013 Standard Edition Front End Server with an associated Edge server. Lync was completely configured and operational, the SIP domain I’m going to use in this example is: @tomt.itThe Cisco Unified Presence Server was a standalone box, too. It was hooked up to a clustered CUCM installation, though that should not matter in this example. The SIP domain on the CUPS was @tomt.localAll of my test VMs are located in the 10.1.1.0/24 subnet.CUPS configurationThere are a couple of requirements on the Cisco side of things. First let’s talk certificates.The recommended configuration uses TLS as transport for the federation, not only is it more secure, it’s interesting enough that it’s easier to setup, too.So we need a certificate on the Unified Presence server, to complete this step, log in to the “OS Administration” website of the CUP Server, to connect to the OS Administration website, use /cmplatform. Once signed-in, go to Security, Certificate Management and:    Import the internal certification authority’s certificate to CUPS. Select the Type: “cup-trust”     Create a new certificate signing request (CSR). Select the Type: “cup”     Issue the certificate using a template that uses Server Authentication and Client Authentication as “Enhanced Key Usage”. Note: You’ll need a CA running on Windows Server Enterprise Edition for that, the default WebServer template does not include Client Authentication.     Import the issued certificate on the CUPS. Select the Type: “cup”  After that, my Certificate Management looked like this: The next step is setting up the SIP Federation, this requires you to log-in to the “IM and Presence Administration” website, it can be found at /cupadmin.Using Presence, Inter-Domain Federation, SIP Federation, Federated Domain we add the Lync Servers SIP Domain (tomt.it) as inter-domain federation:Note: Some documentation state that you need to check the “Direct Federation” box, I found that it will work either way. If someone with CUP knowledge reads this, please do get in touch.The next step is setting up a static route from the CUP Server to Lync. This is done using the Presence, Routing, Static Routes menu. We configure a destination pattern with an associated next hop and transport protocol, do note the notation used for the destination pattern! Important: Select TLS as “Protocol Type” and User as the “Route Type”. 5061 is the default port on which a Lync Server will listen for TLS requests.While we are in the “IM and Presence Administration” there are another couple of things to configure:The Lync Servers FQDN (i.e the Common Name on the Lync Pools Certificate) must be added as TLS Peer Subject using System, Security, TLS Peer Subjects:Then, using System, Security, Peer Auth Security Context add the newly created TLS Peer Subject: Also make sure to check the “Disable Empty TLS Fragments” box and add the TLS_RSA_WITH_3DES_EDE_CBS_SHA cipher to selected ciphers.Still in System, Security we need to configure ACLs. The ACLs are not traditional ACLs which allow or block IP:Port combinations, these are used to configure whether or not a communication partner has to be authenticated using MD5. Neither Lync Servers nor Lync Clients support SIP Digest authentication using MD5, so we need to make sure that they will not be prompted for authentication:The following show my incoming and outgoing ACL entries:The last configuration step on the CUP Server is to update the public FQDN using System, Service Parameters, Federation Routing Parameters:Note: The documentation and help context for this parameter state that it should not be changed, although I found the Federation Routing FQDN will be used in the Record-Route Header (maddr field) and if Lync does not have a Trusted Application Pool for this FQDN, communication will fail.Lastly we’ll have to restart some services on the CUP Server in order for the configuration changes to become active. To do this, we need to log-in to the “IM and Presence Serviceability” website, which can be found at /ccmservice.Navigate to Tools, Control Center, Feature Services and restart SIP Proxy Service, then navigate to Tools, Control Center, Network Services and restart the XCP Router Service.Ok, so that’s it on the Cisco side of things. Click here for the Lync Server Configuration.Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-1/\"\n},{\n  \"id\": \"post-lync-conf-2014-keynote\",\n  \"title\": \"Lync Conf 2014 Keynote\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Gestern wurde die zweite Lync Conference in Las Vegas er&ouml;ffnet. In der Keynote gab es einige interessante Ank&uuml;ndigungen:Skype und MobileUnter anderem hat Derek Burney die lange erwartete Video Kommunikation mit Skype demonstriert. Weitere Infos dazu gibt&rsquo;s auf dem Skype Blog und auf dem Offical Microsoft Blog, hier schreibt der neue (alte) Pr&auml;sident der Lync &amp; Skype Engineering Gruppe, Gurdeep Singh Pall auch &uuml;ber weitere Ziele. Die Unterschiede in Bedienung und Funktion der Technologien die wir im privat- bzw. Arbeitsleben einsetzen, sollen wegfallen. Der Fokus liegt auf Work-Life-Balance und sogenannten Digital Natives.All diese &Auml;nderungen und Ziele werden unter dem neuen Schlagwort Universal Communications zusammengefasst.In einer weiteren Demonstration wurde das Lync Mobile App f&uuml;r Android Tabled vorgestellt, dieses soll in den n&auml;chsten Monaten ver&ouml;ffentlicht werden. Damit gibt es mobile Clients f&uuml;r:Windows Phone 8Windows 8.1 / Windows RTiOS: iPhone und iPadAndroid: Phone und TabletInteropInteressant f&uuml;r viele Kunden mit bestehenden Videokonferenzsystem d&uuml;rfte der &ldquo;Interop Server&rdquo; sein, dieser soll als Bestandteil der n&auml;chsten Lync Server Version ausgeliefert werden und erm&ouml;glicht u.a. die Anbindung von Tandberg VTC an Lync.VideoSeit einiger Zeit wird das Thema WebRTC mehr oder weniger hei&szlig; diskutiert, es w&auml;re sicher interessant wenn anonyme Benutzer ganz ohne Plug-in an einer Konferenz teilnehmen k&ouml;nnten. Nun konnte sich die Industrie allerdings noch nicht wirklich auf einen gemeinsamen Weg einigen, dementsprechend wenig Informationen gab es &uuml;ber die Demo eines Video Gespr&auml;ches direkt im Browser.Bei der Technologie handelt es sich um einen Javascript Wrapper f&uuml;r die Unified Communications Web API (http://ucwa.lync.com), welche Codecs verwendet wurden und ob ein Plug-in ben&ouml;tigt wird, hat Derek allerdings nicht angesprochen.Lync OnlineAuch f&uuml;r das Cloud Angebot hat Microsoft ein neues Feature angek&uuml;ndigt, so soll es Unterst&uuml;tzung f&uuml;r Meetings mit bis zu 2000 Teilnehmern geben. Die Unterst&uuml;tzung f&uuml;r Enterprise Voice in der Cloud wurde erneut angek&uuml;ndigt, auch hier fehlen weitere Details.Die Keynote wurde aufgezeichnet und kann hier angesehen werden.http://www.lyncconf.comNa dann, willkommen im Zeitalter der Universal Communications :)Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-conf-2014-keynote/\"\n},{\n  \"id\": \"post-exchange-2010-update-hybridconfiguration\",\n  \"title\": \"Exchange 2010 Update-HybridConfiguration\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Office365\",\"de\"],\n  \"content\": \"Ein schneller Tipp für Hybrid-Admins ;)Beim ausführen des Hybrid Configuration Wizard auf einem Exchange 2010 Server tritt folgender Fehler auf:Fehler beim Aktualisieren der Hybridkonfiguration: 'System.Management.Automation.Remoting.PSRemotingTransportException: Beim Ausführen von Daten vom Remoteserver ist folgender Fehler aufgetreten: [ClientAccessServer=DB3PR05CAXXX,BackEndServer=db3pr05mbXXX.eurprd05.prod.outlook.com, RequestId=ce4f8474-2bcc-4b3b-b4e4-5089f60f2372,TimeStamp=2/11/2014 10:11:28 AM] The request for the Windows Remote Shell with ShellId FC244D6B-C78E-4605-B7E1-91A480CD914B failed because the shell was not found on the server. Possible causes are: the specified ShellId is incorrect or the shell no longer exists on the server. Provide the correct ShellId or create a new shell and retry the operation. Weitere Informationen finden Sie im Hilfethema &quot;about_Remote_Troubleshooting&quot;.&lt;/p&gt;    Weitere Informationen zur Fehlerbehebung finden Sie in der Protokolldatei &quot;Update-HybridConfiguration&quot; unter C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\Logging\\\\Update-HybridConfiguration\\\\HybridConfiguration_2_11_2014_10_10_45_635277102457617512.log.&lt;/code&gt;  Wieder mal hat das Problem mit den unterschiedlichen Datumsformaten zu tun, der Server hatte deutsche Regionaleinstellungen.      Diese müssen auf English (USA) geändert werden und schon läuft der Wizard ohne Probleme durch.  Gruß,   Tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-update-hybridconfiguration/\"\n},{\n  \"id\": \"post-lync-2013-hosting-pack-v2-and-skype-federation\",\n  \"title\": \"Lync 2013 Hosting Pack v2 and Skype federation\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"With the hosting pack v2 for Lync 2013 Microsoft made the Skype federation available for hosting environments. To configure the federation, follow the official Microsoft guide.If you have configured Skype federation, you have to enable Federation on to tenant:Import-Module LyncOnline Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowFederatedUsers $true Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowPublicUsers $trueIf you try to send some IM&rsquo;s to a Skype user, you get the following error message in the OCS loggerms-diagnostics: 27000;reason=\\\"To-Uri Domain is not in the sender-tenant allow list\\\";To get the federation working, you have to add the following domains to the tenant allow list. This is the way Microsoft do this on Office 365.$d1 = New-CsEdgeDomainPattern -Domain \\\"br.live.com\\\" $d2 = New-CsEdgeDomainPattern -Domain \\\"hotmail.ch\\\" $d3 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.il\\\" $d4 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.jp\\\" $d5 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.th\\\" $d6 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.uk\\\" $d7 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com\\\" $d8 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com.ar\\\" $d9 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com.tr\\\" $d10 = New-CsEdgeDomainPattern -Domain \\\"hotmail.es\\\" $d11 = New-CsEdgeDomainPattern -Domain \\\"hotmail.de\\\" $d12 = New-CsEdgeDomainPattern -Domain \\\"hotmail.fr\\\" $d13 = New-CsEdgeDomainPattern -Domain \\\"hotmail.it\\\" $d14 = New-CsEdgeDomainPattern -Domain \\\"live.at\\\" $d15 = New-CsEdgeDomainPattern -Domain \\\"live.be\\\" $d16 = New-CsEdgeDomainPattern -Domain \\\"live.ca\\\" $d17 = New-CsEdgeDomainPattern -Domain \\\"live.cl\\\" $d18 = New-CsEdgeDomainPattern -Domain \\\"live.cn\\\" $d19 = New-CsEdgeDomainPattern -Domain \\\"live.co.in\\\" $d20 = New-CsEdgeDomainPattern -Domain \\\"live.co.kr\\\" $d21 = New-CsEdgeDomainPattern -Domain \\\"live.co.uk\\\" $d22 = New-CsEdgeDomainPattern -Domain \\\"live.co.za\\\" $d23 = New-CsEdgeDomainPattern -Domain \\\"live.com\\\" $d24 = New-CsEdgeDomainPattern -Domain \\\"live.com.ar\\\" $d25 = New-CsEdgeDomainPattern -Domain \\\"live.com.au\\\" $d26 = New-CsEdgeDomainPattern -Domain \\\"live.com.co\\\" $d27 = New-CsEdgeDomainPattern -Domain \\\"live.com.mx\\\" $d28 = New-CsEdgeDomainPattern -Domain \\\"live.com.my\\\" $d29 = New-CsEdgeDomainPattern -Domain \\\"live.com.pe\\\" $d30 = New-CsEdgeDomainPattern -Domain \\\"live.com.ph\\\" $d31 = New-CsEdgeDomainPattern -Domain \\\"live.com.pk\\\" $d32 = New-CsEdgeDomainPattern -Domain \\\"live.com.pt\\\" $d33 = New-CsEdgeDomainPattern -Domain \\\"live.com.sg\\\" $d34 = New-CsEdgeDomainPattern -Domain \\\"live.com.ve\\\" $d35 = New-CsEdgeDomainPattern -Domain \\\"live.de\\\" $d36 = New-CsEdgeDomainPattern -Domain \\\"live.dk\\\" $d37 = New-CsEdgeDomainPattern -Domain \\\"live.fr\\\" $d38 = New-CsEdgeDomainPattern -Domain \\\"live.hk\\\" $d39 = New-CsEdgeDomainPattern -Domain \\\"live.ie\\\" $d40 = New-CsEdgeDomainPattern -Domain \\\"live.in\\\" $d41 = New-CsEdgeDomainPattern -Domain \\\"live.it\\\" $d42 = New-CsEdgeDomainPattern -Domain \\\"live.jp\\\" $d43 = New-CsEdgeDomainPattern -Domain \\\"live.nl\\\" $d44 = New-CsEdgeDomainPattern -Domain \\\"live.no\\\" $d45 = New-CsEdgeDomainPattern -Domain \\\"live.ph\\\" $d46 = New-CsEdgeDomainPattern -Domain \\\"live.ru\\\" $d47 = New-CsEdgeDomainPattern -Domain \\\"live.se\\\" $d48 = New-CsEdgeDomainPattern -Domain \\\"livemail.com.br\\\" $d49 = New-CsEdgeDomainPattern -Domain \\\"livemail.tw\\\" $d50 = New-CsEdgeDomainPattern -Domain \\\"messengeruser.com\\\" $d51 = New-CsEdgeDomainPattern -Domain \\\"msn.com\\\" $d52 = New-CsEdgeDomainPattern -Domain \\\"passport.com\\\" $d53 = New-CsEdgeDomainPattern -Domain \\\"sympatico.ca\\\" $d54 = New-CsEdgeDomainPattern -Domain \\\"tw.live.com\\\" $d55 = New-CsEdgeDomainPattern -Domain \\\"webtv.net\\\" $d56 = New-CsEdgeDomainPattern -Domain \\\"windowslive.com\\\" $d57 = New-CsEdgeDomainPattern -Domain \\\"windowslive.es\\\" $d58 = New-CsEdgeDomainPattern -Domain \\\"outlook.com\\\" Greetings nd\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-hosting-pack-v2-and-skype-federation/\"\n},{\n  \"id\": \"post-lync-client-certificate-warning-exchange-autodiscover\",\n  \"title\": \"Lync Client certificate warning Exchange Autodiscover\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"I’ve seen this problem at a customer the other day, even though I had a solution to fix it, I do still not fully understand why it happens. So I’m going to document it here, we’ll see if that sheds more light… :)The Problem As the title implies, the problem is similar to this one I described earlier, it does however also affect Lync 2010 clients. Once signed-in, the Lync Client will show a certificate warning, indicating that it wants to connect to some Exchange Server but the certificate was not ok, only after double (triple) checking, the certificate really was ok.BackgroundSure enough, the problem only appears in certain environments, the one I was in used different domains for the SIP address and the users primary SMTP address. So, here goes an example:UserPrincipalName: user@contoso.com     PrimarySMTPAddress: user@contoso.com     msRTCSIP-PrimaryUserAddress: user@fabrikam.comWhen this users signs into Lync, the client will perform an Exchange Autodiscover request, in order to retrieve the Exchange Web Services Endpoint. The certificate used on the Exchange Server had the following attributes:CN=exchange.contoso.com    DNS=exchange.contoso.com     DNS=exchange.fabrikam.com     DNS=….Now the warning in the Lync Client says there was a problem connecting to exchange.contoso.com, even though the certificates CN was exactly the same name, that the client tired to reach. Makes sense? Not to me…WorkaroundThe workaround I described in the earlier article still applies, just add the Exchange Servers domain to the clients TrustModelData registry entry. The registry key locations change depending on the client version:            Lync 2010                 HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Communicator\\\\TrustModelData                         Lync 2013                 HKEY_CURRENT_USER\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync                         Type        Reg_SZ                  Value        contoso.com contoso.eu        So if anyone has more information on this one, please do get in touch.Cheers,    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-client-certificate-warning-exchange-autodiscover/\"\n},{\n  \"id\": \"post-migration-ntsystems-mail-von-aruba-nach-office-365\",\n  \"title\": \"Migration: ntSystems Mail von Aruba nach Office 365\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Office365\"],\n  \"content\": \"Nachdem einigem &uuml;berlegen haben wir uns entschieden Mail f&uuml;r die Domain ntsystems.it nach Office 365 zu migrieren. Wir verwenden einen E1 Plan, dieser bietet f&uuml;r 6,5&euro; pro User und Monat eine Exchange Mailbox, Lync, SharePoint und SkyDrive sowie Yammer.ArubaDer aktuelle Provider (und auch Hoster dieser Seite) ist Arbua. An dieser Stelle muss ich sagen, dass wir bisher zwar keine gr&ouml;&szlig;eren Probleme mit unseren Mails hatten, das Mail System allerdings nicht mehr wirklich zeitgem&auml;&szlig; ist, so fehlen z.B. Features wie Kalender, Active Sync und die Anmeldung erfolgt standardm&auml;&szlig;ig &uuml;ber http (ja richtig, unverschl&uuml;sselt. Im Jahr 2014.). Freundlicherweise wird ein Link zu einer &ldquo;Secure Version&rdquo; angezeigt&hellip;DNSEs gibt leider kein Angebot von Aruba, bei dem WebHosting und das Verwalten der DNS Zone m&ouml;glich w&auml;ren. Nach einigem hin und her, konnte ich den Support schlie&szlig;lich dazu bewegen, die ben&ouml;tigten DNS Eintr&auml;ge f&uuml;r Office 365 zu erstellen. Damit die Domain zu Office 365 hinzugef&uuml;gt werden kann, muss zun&auml;chst ein TXT Record mit einem von Microsoft vorgegebenen Wert erstellt werden:Type: TXT Name: @ TXT Value: MS=ms93664998 TTL: 1 HourJetzt kann die Domain verifiziert werden, sobald dieser Vorgang abgeschlossen ist, k&ouml;nnen Benutzer hinzugef&uuml;gt werden. Diesen Schritt habe ich &uuml;bersprungen und stattdessen der Domain ein Verwendungszweck zugewiesen. In unserem Fall: Exchange Online.Sobald der Verwendungszweck ausgew&auml;hlt ist, werden weitere DNS Eintr&auml;ge ben&ouml;tigt, diese sind:&nbsp;Auch diese Eintr&auml;ge hat der Support freundlicherweise erstellt, wichtig ist hierbei, dass Office 365 die Eintr&auml;ge &uuml;berpr&uuml;ft, der MX Eintrag muss also die Priorit&auml;t 0 haben und auch der TTL Wert muss &uuml;bereinstimmen, damit die Domain hinzugef&uuml;gt werden kann.MailEine serverseitige Migration der Inhalte war nicht m&ouml;glich, Inhalten konnten &uuml;ber einen Client (Outlook) oder &uuml;ber das &ldquo;Connected Account&rdquo; Feature von Office 365, &uuml;bernommen werden. Mit diesem Feature kann ein Benutzer bis zu f&uuml;nf Postf&auml;cher zu seinem Office 365 Konto hinzuf&uuml;gen. Unterst&uuml;tzt werden Konten die POP oder IMAP unterst&uuml;tzen.Viele Gr&uuml;&szlig;e aus der Cloud :) Tom\",\n  \"url\": \"https://onprem.wtf/post/migration-ntsystems-mail-von-aruba-nach-office-365/\"\n},{\n  \"id\": \"post-connect-to-office-365-with-powershell\",\n  \"title\": \"Connect to Office 365 with Powershell\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Office365\"],\n  \"content\": \"In this Post I explain how to connect to Office 365 with Powershell and manage Exchange and Lync.1. Install Microsoft Online Services Sign-In Assistant for IT Professionals BETA http://www.microsoft.com/en-us/download/details.aspx?id=392672. Install the Office 365 cmdlets http://go.microsoft.com/fwlink/p/?linkid=2362973. Set Execution Policy to Remote Signed Set-ExecutionPolicy RemoteSignedExchange Online4. Connect to Exchange OnlineImport-Module MSOnline $ExchangeOnlineCred = Get-Credential $ExchangeOnlineSession = New-PSSession &ndash;ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $ExchangeOnlineCred -Authentication Basic -AllowRedirection Import-PSSession $ExchangeOnlineSession -AllowClobber Connect-MsolService &ndash;Credential $ExchangeOnlineCredNow you are connected to Exchange Online:Lync Online4. Install Windows PowerShell Module for Lync Online http://www.microsoft.com/en-us/download/details.aspx?id=393665. Connect to Lync OnlineImport-module lynconlineconnector $LyncOnlineCred = Get-Credential $LyncOnlineSession = New-CsOnlineSession -Credential $LyncOnlineCred Import-PSSession $LyncOnlineSessionGreetings dn\",\n  \"url\": \"https://onprem.wtf/post/connect-to-office-365-with-powershell/\"\n},{\n  \"id\": \"post-import-certificate-to-rd\",\n  \"title\": \"Import Certificate to RD\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2012\",\"en\",\"Server-2012-R2\",\"RDS\"],\n  \"content\": \"With Server 2012 the MMC “Remote Desktop Session Host Configuration” doesn’t exist anymore. If you want to import a specific certificate to the RD Session Host you can do the following:1. Import the certificate to the machines personal store2. Then use the following commands to import the certificate to the Session Host:$pass = ConvertTo-SecureString “CERTIFICATE-PASSWORD” -AsPlainText –Force    $thumbprint = (Import-PfxCertificate -Password $pass -CertStoreLocation cert:\\\\localMachine\\\\my -FilePath '\\\\\\\\LocationToCertificate\\\\certificate.pfx').thumbprint    $path = (Get-WmiObject -class &quot;Win32_TSGeneralSetting&quot; -Namespace root\\\\cimv2\\\\terminalservices -Filter &quot;TerminalName='RDP-tcp'&quot;).__path    Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash=&quot;$Thumbprint&quot;}Now the certificate is imported.Greetings   dn\",\n  \"url\": \"https://onprem.wtf/post/import-certificate-to-rd/\"\n},{\n  \"id\": \"post-pal-performance-analyse\",\n  \"title\": \"PAL: Performance Analyse\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Neulich bin ich über ein interessantes Codeplex Projekt gestolpert, Performance Analysis of Logs (PAL) ToolHier handelt es sich um ein Tool, welches Perfmon Dateien (.blg) auswerten und einen schönen Report generieren kann. Interessant ist die Möglichkeit “Threshold files” zu auszuwählen, diese werden Teilweise mitgeliefert oder können selbst hinzugefügt werden. In diesen XML Dateien sind Performance Counter und entsprechende Schwellwerte hinterlegt.InstallationDie Installation erfolgt typischerweise auf einer Workstation, folgende Komponenten werden benötigt:   .NET Framework 3.5    Microsoft Chart Controls for Microsoft .NET Framework 3.5 (Download) Das PAL Tool selbst ist ein Instsaller der aus Codeplex heruntergeladen werden kann. Die Installation erfolgt nach C:\\\\Program Files\\\\PAL\\\\PAL\\\\ wo auch die mitgelieferten XML Dateien abgelegt werden. Weitere Threshold Files findet man z.B. in der TechNet Gallery, hier der Linkfür den Lync Server 2013.AnalyseInteressant an den XML Dateien ist, dass man daraus Templates für Perfmon Data Collector Sets erstellen. Man muss also nichtmehr mühsam Counter aus der Produtkdoku suchen und diese dann einzeln hinzufügen, es reicht PAL (PALWizard.exe) zu starten und im Reiter “Threshold File” auf “Export Perfmon template” zu klicken.&#160;Aus diesem Template erstellt man dann ein Data Collector Set auf den Systemen die analysiert werden sollen, die Standardwerte für den Dateipfad und die Laufzeit des Sets sollte noch angepasst werden. Ist die Datensammlung abgeschlossen, wird die .blg Datei wieder auf die Workstation mit dem PAL Tool kopiert.Die .blg Datei wird im PAL Tool ausgewählt: Anschließend müssen im Reiter “Questions” noch drei Fragen zu den analysierten Servern beantwortet werden: Unter “Output Options” wird das Verzeichnis angegeben in welchem die Reports erstellt werden sollen.Viel Spaß,   tom\",\n  \"url\": \"https://onprem.wtf/post/pal-performance-analyse/\"\n},{\n  \"id\": \"post-windows-azure-point-to-site-vpn\",\n  \"title\": \"Windows Azure – Point to Site VPN\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Cloud\"],\n  \"content\": \"An interesting feature in Windows Azure is the possibility to expand the local network to the Cloud. This feature comes in two options, a site-to-site tunnel can be created, as well as a simple client VPN, or point-to-site connection. A site-to-site tunnel is configured on a firewall device or router within the corporate network, essentially connecting the Cloud like any other remote site. This post is about clients connecting to the Cloud, so called point-to-site VPN connections. This feature might be of less interest to corporate customers, however, I find it quite cool for lab and dev/test scenarios.Azure Virtual NetworkTo get started we need to configure a virtual network in Windows Azure, chances are that if you have been using Azure virtual machines, you might already have a virtual network configuration. It is required to have VMs communicate with one another.So, in the management portal, create a new virtual network using the “Custom Create” option. After specifying a Name and Affinity Group, configure the DNS Server, this will be the DNS Server for the virtual machines in this virtual network. A quick hint: Azure virtual machines cannot be configured with static IP addresses, but the address assignment always starts with .4, so the first virtual machine that is started will get the .4 address. I do make sure to start my DNS server before starting anything else. Since we are configuring point-to-site VPN, we need to check the corresponding check box. In the next screen we are configuring an IP address range that will be used by the virtual network. This is not yet the subnet for the VM, it is just the address range within which the individual subnets will be created. And in the last screen we are actually configuring the subnets. We need one ore more subnets (within the address range configured before) for the virtual machines, as well as a “Gateway subnet”. This subnet will be used for the gateway. Once the virtual network has been created, we need to add a subnet for the VPN clients that will connect to the virtual network. This is done using the “Configure” tab in the virtual network’s properties. The last step is to create the gateway, using the “Create Gateway” button in the “Dashboard” tab of the virtual network. This process creates the required configuration within Windows Azure, an IP address and a hostname are assigned for clients to connect. Voila, that’s it from a network configuration point of view. AuthenticationNow when Clients are connecting to a VPN some form of authentication is required, in our case of point-to-site VPN, the Azure virtual network uses an SSTP connection with certificates for authentication.The first step is to upload the Certification Authority’s certificate (public key) to the virtual network. Certificates issued by this CA can then be used to authenticate and connect to the VPN. I am using my lab CA and had to install the CA certificate in my clients “Local Machine” trusted root store. After uploading the CA certificate, I requested a new certificate for my user account (using the “User” template). In order to connect to the virtual network in the Azure Cloud one last step is required, we need to download the Client VPN package which is available in the “Dashboard” tab in the virtual network configuration. The installation is simple and once installed, a new VPN connection will be available. And that’s it. Now I am able to connect my notebook to the Azure virtual network, making it possible to connect “directly” to the VMs running in the Cloud :)A quick ipconfig shows that my client got an IP address from the address range I configured earlier, the DNS servers have been assigned, too.&#160;&#160;Ok, enough for tonight, time to get my head out of the clouds :-)    Tom\",\n  \"url\": \"https://onprem.wtf/post/windows-azure-point-to-site-vpn/\"\n},{\n  \"id\": \"post-cng-certificates-and-lync-tmg\",\n  \"title\": \"CNG Certificates and Lync/ TMG\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"The other day I had a problem assigning certificates to a Lync 2013 Edge Server, today I had the same thing with TMG 2010. Here’s a quick summary, and the solution ;)ProblemI tried to assign an existing certificate to a Lync Edge Server. It did not work using the Deployment Wizard, I tried the PowerShell command and it didn’t work, either.Every time I tried to “Set-CsCertificate” I would get the following error:„Set-CsCertificate: Command execution failed: The buffer supplied to a Function was too small.”Kind of the same thing happened with TMG Server, I tried to assign a certificate to a Web Listener and it would not show up in the Wizard. When I unchecked the “Show only valid Certificates” checkbox, the certificate in question would show with an Error saying:“Incorrect Key Type”SolutionThe solution is to export the certificate, including private key, to a .pfx file. Copy the .pfx file to some workstation with Firefox installed and import the certificate in Firefox. Now use Firefox to “backup” the certificate, this will create a .p12 file, again containing the private key. Copy the .p12 file back to the Server delete the existing certificate and then import the .p12 file using MMC Certificates.Warning: Before deleting the certificate from the Server, make sure you have a working backup (like the .pfx file) or you will have to get a new one.Try to assign the Certificate to a Lync Service or a TMG Web Listener and enjoy.I realize that this sounds pretty silly at first, if you want more detail, keep on reading :)BackgroundIf you are still reading, there is a little more information for you. The certificates in question were using something called “Cryptography Next Generation”, which seems to be some new set of APIs that was introduced in Windows Vista and Server 2008. When creating a custom certificate request, one can select the “Template” to use, this is not the certificate template, but the “Crypto Provider” if you will.The certificates that I mentioned, have all been requested using the CNG Template. Importing/ Exporting them in Firefox seems to fix this, maybe because Firefox prefers CAPI over CNG? If you have any information on this topic, please leave a comment.More info on Crypto Next Generation is available on TechNet: http://technet.microsoft.com/en-us/library/cc730763(WS.10).aspxCheers,   tom\",\n  \"url\": \"https://onprem.wtf/post/cng-certificates-and-lync-tmg/\"\n},{\n  \"id\": \"post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-2\",\n  \"title\": \"How to build an UAG 2010 Array for Exchange publishing–Part 2\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"uag\",\"Skype4B\"],\n  \"content\": \"Finally I finished Part 2 of the UAG 2010 publishing post. I spent days with the UAG configuration to publish Exchange 2013 in the right way but with no success. There are some problem with Lync and OWA that I cannot fix. I decided to disable URL filters. Now my Exchange publishing works and in this final post I explain how my configurations looks like.First step is to create a new Trunk for Exchange publishingThen you have to create the Applications for Exchange. First create the Outlook Web Access Application:Select the Exchange CAS Servers or the CAS Server VIP.Configure the authentication and authorize all users.Next step is to rerun the Wizard to publish Outlook Anywhere and Exchange Active Sync.Configure Authentication, Kerberos for OWA and Basic for AutodiscoverDon&rsquo;t forget to configure SPN&rsquo;s and delegation in ActiveDirectory for Kerberos to work. You can export the settings needed into an LDIF File with the &ldquo;Export KCD settings&rdquo; wizard in UAG and import it in AD. Or you can set the SPN&rsquo;s manually:You can check the SPN&rsquo;s and export the file:When you created the applications you have an application list like this:Configure Portal Homepage Change the Portal Home page and uncheck display Home Page within portal frameDisable component installation To prevent UAG installing the client, disable component installation.Redirect HTTP to HTTPSTo redirect HTTP connections to HTTPS create the redirection Trunk in the &ldquo;HTTPS Connections&rdquo; section and select the Exchange Trunk.&nbsp;The basic configuration is done and Exchange is now published via UAG. But there are some issues:Lync: Lync Clients cannot get autodiscover settings In my environment Lync clients couldn&rsquo;t get the autodiscover configuration from Exchange. After checking the UAG logs I noticed that UAG has a problem when Lync announces his Client Agent.Solution: Disable scripting on the trunkOWA: 500 error message when you open another mailbox from OWA In my environment it was not possible to open another users mailbox without getting the following 500 error message:Solution: Disable &ldquo;verify URLs&rdquo; on the OWA ApplicationConclusionI&rsquo;m sure with deeper troubleshooting there must be exist a better way to fix this errors but in my opinion UAG is not the right product for publishing Exchange. Better you use a load balancer or II ARR. I my next publishing post I explain how to publish Exchange 2013 with Citrix Netscaler.\",\n  \"url\": \"https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-2/\"\n},{\n  \"id\": \"post-connect-sharepoint-2013-with-exchange-2013-to-sync-tasks\",\n  \"title\": \"Connect Sharepoint 2013 with Exchange 2013 to sync tasks\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\",\"Sharepoint\"],\n  \"content\": \"To sync Tasks with Exchange and Sharepoint 2013 some base functionality has to be prepared:- Running user profile synchronization - Work management service deployed - SSL for the Web Application with valid certificateUser profile synchronization There are some nice how to&rsquo;s how to get this service running. In simple words you need an user account that has &ldquo;Replicating Directory Changes&rdquo; rights in ADThen you have to start the User Profile Service Application in the Sharepoint Central Administration.If everything works both ForeFront Services are running and you can configure the user profile service.&nbsp;Work management The Work management Service application doesn&rsquo;t need extra configuration. It only has to be deployed and working. On Technet is a short description how to create this service application.http://technet.microsoft.com/en-us/library/fp161254.aspxSSLThe Web Application needs to be SSL enabled. This can be done easily in IIS by enabling the HTTPS binding:To verify that this works you can check if the Exchange server can access the AuthMetadataUrl with the browser. AuthMetadataUrl: https://intranet.domain.local/_layouts/15/metadata/json/1If you can access the 1.json file without authentication this step worked.Tip: If you have to enter credentials, check the authentication methods in IIS for the Web Application. Anonymous needs to be activated:&nbsp;Now you can connect Sharepoint with Exchange:On Sharepoint 2013 1) Download EWSManagedAPI.msi from http://www.microsoft.com/en-us/download/details.aspx?id=35371 2) Install the EWS API with the following switches: msiexec /i EwsManagedApi.msi addlocal=\\\"ExchangeWebServicesApi_Feature,ExchangeWebServicesApi_Gac\\\" 3) Reset IISOn Exchange 2013 1) Switch to the following directory: C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\Scripts 2) Configre Enterprise Partner Application .\\\\Configure-EnterprisePartnerApplication.ps1 -ApplicationType Sharepoint -AuthMetadataUrl https://intranet.domain.local/_layouts/15/metadata/json/1You should get the following outputNow you are able to sync Tasks with Sharepoint and Exchange 2013:Tip: If this does not work and - you are not in the same Domain with Exchange (maybe in a subdomain) - you have an error with Exchange Autodiscover in the Sharepoint logs - you have authentication errors with Exchange in the Sharepoint logs  check that your subdomain (for example subdomain.domain.local) is added to the accepted domains in Exchange.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/connect-sharepoint-2013-with-exchange-2013-to-sync-tasks/\"\n},{\n  \"id\": \"post-activesync-devices-ask-for-authentication\",\n  \"title\": \"ActiveSync devices ask for authentication\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"One of the first steps in an Exchange 2010 to 2013 migration is to make Exchange 2013 internet facing to handle the requests from external and internal clients.After my first attempt to switch from Exchange 2010 CAS and TMG to UAG and Exchange 2013 CAS servers on the frontend I noticed that some Android and iPad ActiveSync users got authentication requests.First thing I checked was the eventlog on the CAS machines and if the inheritance was enabled on the user accounts. Both were ok so I began to check the IIS logs first on the 2013 and then on the 2010 machine because the 2013 CAS proxies the requests to the 2010 CAS.On the 2013 CAS I could see that this users tried to logon but the session ended with a HTTP 401 (Unauthorized) Error:On the CAS 2010 I checked the logs and filtered users and time when they tried to logon. The result was that in the IIS logs the domain of the users that did not sync was different from the users that worked.User1 &ndash;&gt; domain\\\\User1 User2 &ndash;&gt; domain.local\\\\User2 User3 &ndash;&gt; domain.local\\\\User3I checked the devices of User2 and User3 and find out that the domain was missing in the account settings. Previously when Exchange 2010 with TMG were internet facing, TMG made this stuff working.To get this fixed with Exchange and UAG you can set the default domain in IIS on the Exchange 2013 CAS servers if the device does not send the domain.After an IIS reset the devices can successfully connected.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/activesync-devices-ask-for-authentication/\"\n},{\n  \"id\": \"post-lync-2013-survivable-branch-server-installation\",\n  \"title\": \"Lync 2013 Survivable Branch Server – Installation\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"de\",\"Skype4B\"],\n  \"content\": \"Nach dem Planen und Veröffentlichen der Topologie kann der Server installiert werden. Wie bereits erklärt, werden nicht alle Lync Rollen installiert, weshalb die Liste der Systemvoraussetzungen deutlich kürzer ausfällt:Windows 2012 SystemvoraussetzungenAdd-WindowsFeature Windows-Identity-FoundationSobald die Windows Identity Foundation installiert ist, kann das Lync Setup wie gewöhnlich ausgeführt werden. Dafür wird der Deployment Wizard verwendet und im ersten Schritt der lokale “Configuration Store” installiert.Anschließend werden im Schritt zwei und drei die Lync Komponenten installiert und ein Zertifikat zugewiesen. Das Zertifikat fällt auf dem Survivable Branch Server deutlich einfacher aus, was wieder auf die reduzierten Serverrollen zurückzuführen ist. Webservices und Lyncdiscover werden nicht installiert, je nach DNS Konfiguration muss man allerdings den Eintrag für SIP berücksichtigen. In meinem Lab sieht das sieht das Zertifikat so aus:CN = ly15-sba.tomt.local      DNS Name = ly15-tomt.local       DNS Name = sip.tomt.itIst das Zertifikat zugewiesen, können die Dienste gestartet werden, der Erfolg wird am Besten per PowerShell überprüft:Get-CsWindowsServiceInfrastrukturDie Verfügbarkeit von Infrastrukturdienste wie DNS und DHCP muss in Außenstellen natürlich auch berücksichtigt werden.Gibt es in der Außenstelle Telefone mit Lync Phone Edition sollte der DHCP Dienst lokal verfügbar sein, sonst verlieren diese Telefone bei Ablauf der Leases die Verbindung.Die DHCP Optionen werden dabei folgendermaßen konfiguriert:Option 42 (NTP): lokaler NTP Server, z.B. Router      Option 43 (Certificate Provisioning): Front End Server, ly15.tomt.local       Option 120 (SIP Registrar): SBS, ly15-sba.tomt.local&lt;/p&gt;    DHCPUtil -SipServer ly15-sba.tomt.local -WebServer ly15.tomt.local&lt;/code&gt;  Bei DNS kann man nicht immer eine separate Konfiguration darstellen, gibt es einen Domain Controller in der Außenstelle, stellt dieser für gewöhnlich die Active Directory integrierte Zone zur Verfügung. Das ist für Lync allerdings kein Problem, für das WebTicket benötigt der Client ohnehin eine Verbindung zum Front End Server. Wird der Benutzer dann auf den SBS verschoben, teilt der Lync Front End Server das im Anmeldeprozess mit.  Benutzer  Wenn der Survivable Branch Server einsatzbereit ist, können Benutzer auf diesen verschoben werden um von der höheren Verfügbarkeit zu profitieren. Dies kann über das Lync Server Control Panel oder die Lync Management Shell gemacht werden:  Move-CsUser –Identity user10@tomt.it –Target ly15-sba.tomt.local  Dieser Befehl verschiebt den Benutzer user10 auf den SBS. Der Anmeldeprozess am Client sieht jetzt folgendermaßen aus:  Das Erste REGISTER geht an den Lync Front End Server (10.1.1.27), dieser wurde über DNS Autokonfiguration ausgewählt, der Dienst Eintrag für _sipinternaltls.tomt.it zeigt nach wie vor auf diesen Server.     Der Front End Server antwortet mit einem “301 Redirect” und teilt dem Client seinen Home Server für die Anmeldung mit. Der Client sendet dann erneut ein REGISTER an diesen neuen “Home Server” (10.1.1.21).     Nach der erfolgreichen Anmeldung sehen wir in den Konfigurationsinformationen, dass der Client mit dem SBS Pool verbunden ist (Connected Lync Server). Außerdem fällt hier auf, dass der Client nach wie vor die Web Services des zentralen Lync Pools (Front End Server) nutzt.    Fällt die WAN Verbindung (oder der Lync Pool) aus, wechselt der Client in einen Modus mit eingeschränkter Funktionalität und zeigt eine Warnung an. Diese erinnert den Benutzer, dass er zwar seine Buddy Liste verliert, allerdings nach wie vor telefonieren kann. In diesem Fall ist es vorteilhaft wenn der Client ein lokales Adressbuch hat, die Client Policy für Benutzer auf dem SBS sollte entsprechend konfiguriert werden.    Natürlich kann auch der SBS ausfallen, in diesem Fall meldet sich der Lync Client wieder am Front End Server an und kann weiterhin die kompletten Features nutzen.  &#160;  Grüße,    Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-survivable-branch-server-installation/\"\n},{\n  \"id\": \"post-hyper-v-general-access-denied-error\",\n  \"title\": \"Hyper-V General access denied error\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Hyper-V\"],\n  \"content\": \"Like many others in the ITPro world, I am using many VMs to demo, learn, troubleshoot all different kinds of products and customer scenarios. I also mess with the disk files a lot. Every now and then I get the following error when trying to start a VM:Hyper-V Manager &lt;/p&gt;    An error occurred while attempting to start the selected virtual machine(s).     'dc02' failed to start. (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02' Microsoft Emulated IDE Controller (Instance ID 83F8638B-8DCA-4152-9EDA-2CA8B33039B4): Failed to Power on with Error 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02': IDE/ATAPI Account does not have sufficient privilege to open attachment 'C:\\\\Users\\\\Public\\\\Documents\\\\Hyper-V\\\\Virtual hard disks\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02':&#160; Account does not have sufficient privilege to open attachment 'C:\\\\Users\\\\Public\\\\Documents\\\\Hyper-V\\\\Virtual hard disks\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708) &lt;/code&gt;  Problem  The problem is rather simple, and since Hyper-V has been around for some time now, it should also be well-known to most of us: The VM does not have the necessary (read, write) permissions to use the assigned .vhd or .vhdx disk. So how do you restore the permissions?  Solution  As always, there are many solutions, one could use Hyper-V manager, remove the disk from the affected VM and then add it again. You could even use icacls to somehow get the ACLs right.  Or, simply use my Restore-VMPermission script :)  It’s a PowerShell script that can be used to easily restore permissions for a specific VM (or all VMs) on your Lab Host, it requires the Hyper-V PowerShell Module to get the VMId and then builds the required ACE and adds it to the virtual disk file’s ACL.  As always, please don’t use this in production without thoroughly testing. This is meant for Lab environments.  Verify  Just try to start your VM again, or have a look at the .vhd or .vhdx files security settings and find a similar looking entry:     &#160;  so long,    tom \",\n  \"url\": \"https://onprem.wtf/post/hyper-v-general-access-denied-error/\"\n},{\n  \"id\": \"post-lync-2013-survivable-branch-server-planung\",\n  \"title\": \"Lync 2013 Survivable Branch Server – Planung\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Immer häufiger ersetzen Unternehmen klassische Telefonanlagen (PBX) mit Unified Communications Lösungen wie Microsoft Lync. Da Telefonie immer schon gute Verfügbarkeit hatte, müssen in der Lync Umgebung Konzepte her um diesen hohen Anforderungen gerecht zu werden.Für das Rechenzentrum In Außenstandorten sieht das meist anders aus, durch die Zentralisierung der IT-Dienste gibt es wenige (oder gar keine) Server und kein Personal das sich um die Wartung einer komplexen Umgebung kümmern kann. Die Clients in der Außenstelle hängen also von einer zuverlässigen Verbindung zum Rechenzentrum ab. Fällt diese Verbindung aus, ist der Lync Pool nicht mehr erreichbar und somit auch Telefonie nicht mehr verfügbar.Survivable Branch…?Genau in diesen Szenarien kommen Survivable Branch Server oder Applicances ins Spiel. Diese werden eingesetzt um Telefonie in Außenstellen unabhängiger von der Verbindung in das Rechenzentrum zu machen.Folgendes Schaubild habe ich im TechNet gefunden, Benutzer die sich in der “Branch Site” aufhalten sollen weiterhin telefonieren können, wenn die WAN Verbindung (und dadurch der Lync Pool) nicht verfügbar ist. Features wie Konferenzen, Response Groups oder die Buddy List sind bei einem Ausfall der WAN Verbindung trotz SBS nicht verfügbar, es geht hier nur um Telefonie.Quelle: http://technet.microsoft.com/en-us/library/gg398095.aspxDie Grundvoraussetzung ist natürlich eine Verbindung in das Telefonnetz, die von der WAN Verbindung unabhängig ist. Üblicherweise hat man dafür einen Amtsanschluss und ein passendes Media Gateway in der Außenstelle. Appliance oder Server?Eine Survivable Branch Appliance ist, wie der Name schon sagt, eine Hardware Appliance. Diese kommt entweder direkt mit dem PSTN Gateway oder wird nachträglich eingebaut. Auf der Appliance läuft ein Windows Server, bei der Einrichtung werden die benötigten Lync Rollen installiert.Ein Survivable Branch Server ist ein “normaler Server” (auch virtuell) auf dem die benötigten Lync Rollen installiert werden.Bei beiden varianten, SBA und SBS, wird kein vollständiger Lync Front End Server, sondern “nur” die Rollen Mediation Server und Registrar, installiert. So erklärt sich auch, warum ein SBS zwar die Telefonie aufrechterhalten, aber z.B. keine Konferenzen hosten kann.Eine SBA kann für Außenstellen mit bis zu 1000 Benutzern verwendet werden, während ein SBS bis zu 5000 Benutzer bedienen kann.Beide Varianten benötigen keine Lync Server Lizenz, Windows muss natürlich entsprechend lizenziert werden.VorbereitungWie immer bei Lync, muss man die Konfiguration erst mal im Topology Builder planen, bevor es an die Installation geht.Wir erstellen also eine neue “Branch Site” in der Topologie, dabei vergeben wir einen Namen und weitere Eigenschaften wie City, State und Country. Die Branch Site wird immer einer Central Site zugewiesen:Die Checkbox für “Open the new SBA wizard…” ist Standardmäßig aktiv. Für die Lync Topologie gibt es den Unterschied zwischen SBS und SBA nicht, wir legen also im nächsten Schritt den FQDN für unseren SBS fest: Clients in der Branch Site benötigen Zugriff auf einen Front End und Edge Pool für die meisten Funktionen, diese Pools werden im Wizard angegeben: Im letzten Schritt wird das Gateway angegeben, welches in der Außenstelle für Telefonie verwendet wird:&#160;Die Topologie muss veröffentlich werden, bevor der Survivable Branch Server installiert werden kann, auch dieser holt sich die Informationen über die zu installierenden Rollen aus dem Central Management Store. Achtung: Das Computerkonto für den SBS sollte vor dem veröffentlichen der Topologie existieren, da einige Active Directory Berechtigungen gesetzt werden. Gibt es das Konto noch nicht, protokolliert der Topology Builder eine Fehlermeldung. Sobald der SBS Mitglied der Domain ist, muss die Topologie erneut veröffentlicht werden.Im nächsten Beitrag installieren wir die Lync Rollen auf dem Survivable Branch Server und schauen uns die Funktionalität der Clients an.   Schönes Wochenende!    Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-survivable-branch-server-planung/\"\n},{\n  \"id\": \"post-lync-private-line\",\n  \"title\": \"Lync Private Line\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"I was at a customer’s site the other day when we he received the following request.ProblemUser A (the Boss) forwards his phone to User B (the Assistant). As someone calls the Boss, obviously the Assistants phone rings and she picks it up, it turns out the caller is important and needs to talk to the Boss. The Assistant transfers the call to the Boss… and that’s it. Since the Bosses phone is forwarded, nobody will be able to reach him.Interestingly, in the ancient PBX world there was a “feature” (I’d call it bug) where the Assistant could “break through” the forwarding setting and therefore transfer calls to the Boss.After bouncing some ideas we came up with a pretty simple solution. As the title implies, it makes use of Private Line feature in Lync 2013.SolutionAfter some testing we configured a Private Line on the Bosses account and again, set up call forwarding to the Assistant in his Lync client.Now, if someone calls the Boss, the Assistants phone would ring. If the caller wants to talk to the Boss, the Assistant can now simply forward the call to the Bosses private line. Call forwarding settings are not applied to this line, so his client would ring and he would be able to take the call. Alternative solutionsSure enough, there is no “one” solution, other possibilities would be the use of the Delegate or even Team Call features. In this particular case, though, we decided to use the Private Line.Update: Another solution for this particular problem would be to have the Boss configure the Assistant as his delegate, and the configure “Forward to Delegate” in her Lync Client. This enables User B to put calls through to User A, even though User A’s client is configured to forward calls. You can use my wrapper script for SEFAUtil to configure this, too..\\\\Invoke-SefaUtil.ps1 –Server ly15.tomt.local –UserName boss@tomt.it –AddDelegate assistant@tomt.it –FwdToDelegates Thanks to @jpborth for pointing this out!ConfigurationThe Private Line feature requires Lync Server 2013, and is not exposed in the Lync Control Panel. The Set-CsUser cmdlet is used to configure a private line for a user:Set-CsUser –Identity boss@uclab.eu –PrivateLine “tel:+39123123”Note: TechNet says, private line is new in Lync 2013, next time I’m in a pure 2010 environment, I’ll check if this feature can be configured on Lync 2010, too.&#160;so long,    tom \",\n  \"url\": \"https://onprem.wtf/post/lync-private-line/\"\n},{\n  \"id\": \"post-updated-invoke-sefautil\",\n  \"title\": \"date_modified: Invoke-SEFAUtil\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"PowerShell\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Some weeks ago, I’ve written about my PowerShell wrapper function for SEFAUtil.exe, the original post can be found here: /post/Invoke-SEFAUtil-a-PowerShell-wrapper-function.aspxGUIFirst of all, in case you haven’t seen it yet, MVP Johan Veldhuis created an AWESOME GUI wrapper. Check it out: http://johanveldhuis.nl/en/sefautil-gui/If you still want to run it via PowerShell, keep on reading ;)Updated ScriptAfter playing around with my script I figured it would be cool if it would return more “PowerShell like” objects instead of the plain text returned by sefautil.exe. I also wanted it to take pipeline input and updated the related links to point to a help page instead of the blog article. Turning a bunch of strings into a PowerShell objectLooking at the text output of the tool, we can see it has a format of “description : value”. Sample output:User Aor: sip:ttorggler@uclab.eu      Display Name: Thomas Torggler       UM Enabled: True       Simulring enabled: False       User Ring time: 00:00:30       Call Forward No Answer to: voicemailAs they have the same structure, this does immediately bring PowerShell dictionaries (hashtables) to mind. I simply used the –split method to split the strings at “: “ (colon space) and saved the result to a new array.$SEFAResultSplit = $SEFAResult -split ': 'This worked as expected, so I went ahead and created my custom object like this:$data =&#160; @{$SEFAResultSplit[0] = $SEFAResultSplit[1];      $SEFAResultSplit[2] = $SEFAResultSplit[3];       }After testing it in the lab, I realized, even though this worked, it was less then ideal. Sefautil returns a dynamic amount of strings depending on which features are configured for the given user. So while it was reasonably sure that ”$SEFAResultSplit[0]” would always be “User Aor”, I would have no way of knowing the value of the next strings. And, more importantly, I would not know how many strings to expect, a more dynamic approach was needed.This is what I came up with after some serious head scratching:for ($i = 0; $i -lt $SEFAResultSplit.Count; $i++) {      &#160;&#160;&#160; if ([bool]!($i%2)) {       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $j = $i + 1       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $outData += @{$SEFAResultSplit[$i] = $SEFAResultSplit[$j]}       &#160;&#160;&#160; }       }And here is what it does: The array that contains the split strings would always contain the “description” at an even number while the actual values would be found at odd numbers. So, the script loops through the array, and for each even number it creates a new “Key : Value” pair that is saved to a hash table. Whatever object in the array is at the even index number would be used as key, and that even number +1 would be used as value. Sweet.Why?Well, first of all, because it’s cool ;)Then, think about this:Get-CsUser –OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\Invoke-SEFAUtil.ps1 –Server ly15.tomt.local | Where-Object {‘Simulring enabled’ –eq $true}First the Get-CsUser cmdlet is used to get all users within a specified organizational unit, the user objects are then piped into my wrapper script and the output can be filtered just like any other PowerShell output. Of course it could also be converted to html or exported to csv, the point is returning objects instead of text.Sure enough, we can now also take advantage of pipeline input processing to set call forwarding settings for multiple users:Get-CsUser -OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate user1@tomt.itAgain, we use Get-CsUser to get some Lync Users and pipe them to the script, which adds user1@tomt.it as a delegate to the every one of the users. DownloadI’ve updated the script on my Sky Drive, find a link at the new help page.Cheers,    tom\",\n  \"url\": \"https://onprem.wtf/post/updated-invoke-sefautil/\"\n},{\n  \"id\": \"post-exchange-unified-messaging-sprachauswahl\",\n  \"title\": \"Exchange Unified Messaging Sprachauswahl\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Exchange\",\"Skype4B\"],\n  \"content\": \"Seit Exchange 2007 integriert die Unified Messaging Rolle klassische Anrufbeantworter in Exchange und schafft so eine neue, “unified” Mailbox für Benutzer.Seit es die Exchange Unified Messaging Rolle gibt, kann man diese durch die Installation von Sprachpaketen anpassen. In diesem Post beschreibe ich eine Änderung in der Funktionsweise die mir in den vergangen Tagen einiges an Kopfzerbrechen bereitet hat.SzenarioAnhand folgender Test Benutzer versuche ich das Verhalten in den jeweiligen Exchange Versionen zu erklären. “Bekannt” und “Unbekannt” bezieht sich hier auf die Exchange Umgebung, “bekannt” heißt der Benutzer hat eine Mailbox, die für UM aktiviert wurde, in der Exchange Umgebung, “unbekannt” heißt er hat keine Mailbox.In dem Beispiel wurde das Sprachpaket für Deutsch auf dem Exchange UM Server installiert, außerdem gibt es einen Exchange Dial Plan, die Standardsprache des Dial Plans ist Deutsch.Benutzer A = bekannt, Regionaleinstellung: Deutsch    Benutzer B = bekannt, Regionaleinstellung: Englisch     Benutzer C = Unbekannt, z.B. Partner, KundeSubscriber Access: Ein bekannter Benutzer ruft eine in Exchange konfigurierte Nummer an, um auf seine Mailbox zuzugreifen.Call Answering: Ein bekannter oder unbekannter Benutzer wird auf ein UM Postfach weitergeleitet, da der ursprünglich Angerufene Teilnhemer das Gesrpäch nicht annehmen konnte.Exchange 2010 SP2 und neuerRuft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B oder C auf die UM Mailbox von Benutzer A weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Wenn Benutzer A oder C auf die UM Mailbox von Benutzer B weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Exchange 2007 bis 2010 SP1Ruft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer A auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer C auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)Wenn Benutzer C auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)UnterschiedeDas mag in Textform etwas verwirrend wirken, der Unterschied ist für mich jedoch beträchtlich:Bis Exchange 2010 SP1 benötigt man einen Dial Plan um alle Sprachen abzudecken, da Exchange rücksichft auf die Sprache der Mailbox nimmt.Ab Exchange 2010 SP2 benötigt man für jede Sprache die unterstützt werden soll einen eigenen Dial Plan, da die Sprache der Mailbox ausschließlich für Subscriber Access berücksichtigt wird.&#160;Tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-unified-messaging-sprachauswahl/\"\n},{\n  \"id\": \"post-lync-server-backup\",\n  \"title\": \"Lync Server Backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"As with all systems a sound backup and recovery strategy is key when deploying Lync. This post will cover some basic ideas about what (and how) to backup in a Lync Topology. Lync, being essentially a SIP proxy, does not store a lot of data. It cannot be compared to the likes of Exchange or SQL, systems that are all about storing stuff. With Lync, we need availability, the rest is real time traffic/ presence information, only interesting in the moment when it happens.What?So what does Lync store then?Topology, Policies, Configuration The topology contains all relevant information about Lync Servers and applications. Once the servers are set up, administrators start configuring voice and client policies, trunk settings and all the other good stuff.We can export all of this configuration settings using the cmdlet: Export-CsConfiguration.User Settings, Buddy Lists After configuring the server side of things it’s time to enable some users for Lync, as the admin does so, configuration about the users, like their RegistrarPool ,SipAddress and LineUri are saved within the Lync system. Once the user logs on and starts to add contacts to their buddy list, those get stored on the Lync Servers as well.We can export all of this information using the cmdlet: Export-CsUserDataResponse GroupIf Lync Response Groups are configured there is some configuration information to store for them as well. This can be exported using the cmdlet: Export-CsRGSConfigurationLocation ServiceThe same idea applies to the Location Services, if configured, the configuration can be exported using the cmdlet: Export-CsLisConfigurationLync File StoreSure enough, the Lync file store needs to be included in the backup plan as well. This is not stored inside Lync, it typically resides on a highly available fileserver.Now if that external fileserver is backed up regularly, just make sure it is included in your backup/recovery documentation and try to restore it regularly. If it is not included in existing backup strategies consider using robocopy.Monitoring and Archiving DataMonitoring and Archiving data are not really stored inside Lync, either. Data is stored within the LcsCDR, QoEMetrics and LcsLog databases on a SQL server. There are no Lync tools available to backup this data, it is typically backed up using existing backup software for SQL or through SQL Management Studio.As with the Lync file store, make sure to include backup/restore dependencies and scenarios in the Lync documentation.Persistent Chat DataLync 2013 introduced the persistent chat feature, now for the first time we really do store instant messages and attachments sent by users.Data is stored within the Persistent Chat Database and can be exported using the cmdlet: Export-CsPersistentChatData. If existing backup software for SQL is available, the persistent chat database is typically backed up like any other application database.How?Now that we know what there is to backup, let’s have a look at how. I did point out the Export-* cmdlets and they’re the tool of choice for backing up Lync configuration information and settings.  Note: The account used to run the Export-* cmdlets needs to be member of the RTCUniversalServerAdmins group.I’ve come up with a quick script that invokes the mentioned Export-* cmdlets. The script can be found on my Github.Find more information about the script on the help page.Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-server-backup/\"\n},{\n  \"id\": \"post-outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013\",\n  \"title\": \"Outlook Autodiscover and what to do when migrating from Exchange 2010 to 2013\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Outlook Clients &gt;= 2007 use Autodiscover to detect the connection settings to connect to the Exchange Server.When a CAS Server is installed, the server hosts a virtual directory in IIS named &ldquo;Autodiscover&rdquo;.Outlook and mobile phones contact this virtual directory and download the autodiscover.xml file if one of the following condition occurs:- When you configure a mailbox - When the mailbox is already configured but Outlook or the mobile phones is unable to connect to the Exchange server - Outlook contacts periodically the Autodiscover service to update the connection settings if neededThe client discovers and connects to the Autodiscover service in a different way if located internal and external.If Outlook is externalWhen the Outlook Client is outside the cooperate network it uses DNS to discover the Autodiscover URL by searching an A Record with autodiscover.domain.com or an SRV record that points to the public name.If Outlook is internalWhen the Outlook Client is inside the cooperate network it searches in AD for a SCP (service connection point) object. The SCP object is an entry for each CAS server in ActiveDirectory that contains the Autodiscover URL. You can check the SCP object by using the cmdlet Get-ClientAccessServer or ADSIedit. If you want to update the SCP records, use the cmdlet instead of ADSIedit.What do I have to do if I&rsquo;m upgrading from Exchange 2010 to 2013?When you upgrade from Exchange 2010 to 2013 one of the first steps is to make the CAS 2013 internet facing. So clients get the autodiscover.xml file and settings via the Exchange 2013 servers. The CAS knows if the mailbox is hosted on an Exchange 2013 server, then the CAS sends you the settings to connect to the 2013 environment, or on the old 2010, then the CAS sends you the settings to connect to Exchange 2010 (CAS 2013 proxies the requests to 2010).This is OK for external Clients. But for internal clients connections you have to update the SCP object from the old 2010 Exchange CAS server to point to the new 2013 CAS server. This is necessary because Exchange 2013 servers provide additional AutoDiscover information to clients to improve the discovery process. From this time when internal clients connect to the Autodiscover service they contact every time the 2013 CAS and get the connection settings. You can update the SCP object and so updating the URL by using the cmdlet Set-ClientAccessServer like in the following example:Set-ClientAccessServer CAS2010SERVER -AutoDiscoverServiceInternalUri https://cas2013server.domain.local/Autodiscover/Autodiscover.xmlGreetings dn\",\n  \"url\": \"https://onprem.wtf/post/outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013/\"\n},{\n  \"id\": \"post-troubleshooting-sharepoint-error-messages\",\n  \"title\": \"Troubleshooting Sharepoint Error Messages\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Sharepoint\"],\n  \"content\": \"When you get a Sharepoint error message, they are sometimes not very helpful and it can be tricky to figure out what’s going wrong.At this point the Sharepoint EventLog can help you getting more details. With the Powershell commandlet get-splogevent you can search the corresponding exception message. The correlation ID is the key.If I’m searching the corresponding exception message from the error shown on the printscreen above, I execute following command:get-splogevent | where-object {$_.Correlation -eq &quot;88ab369c-71dd-108f-df09-ea6c74999562&quot;} | flGreetings    dn\",\n  \"url\": \"https://onprem.wtf/post/troubleshooting-sharepoint-error-messages/\"\n},{\n  \"id\": \"post-lync-music-on-hold-wartemusik\",\n  \"title\": \"Lync: Music on Hold / Wartemusik\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Nach einiger Zeit mal wieder ein Artikel in deutscher Sprache :)Heute wollen wir uns die Music On Hold Thematik in einer Lync Enterprise Voice Umgebung anschauen. In diesem Artikel betrachten wir nur den Lync Client, MoH Konfiguration für IP Phones und Gateways werden in einem eigenen Artikel beschrieben.Was ist Music on Hold?Das kennt eigentlich jeder, trotzdem zur Erklärung: Teilnehmer A spricht mit Teilnehmer B, B möchte A weiterleiten und ruft C an. Bevor B ein neues Gespräch aufbauen kann, muss das aktuelle Gespräch gehalten werden. Damit A sich gut aufgehoben fühlt bekommt er Musik oder einen Text (“Sie werden mit dem gewünschten Teilnehmer verbunden…”) vorgespielt.Wer spielt die Musik?Jetzt wird das Thema interessant: Woher kommt die Musik? In der klassischen Telefonie wird für gewöhnlich ein “Medienserver” dafür verwendet, dieser hängt zentral an der TK Anlage und stellt Music on Hold für alle Gegenstellen zur Verfügung.In einer End-to-End Infrastruktur wie Lync ist das nicht mehr so einfach, der Medien Datenstrom (Sprache) zwischen Teilnehmer A und B ist direkt, auch für die Signalisierung sind die User Agenten zuständig. Will also Teilnehmer B das aktuelle Gespräch halten, muss er dies Teilnehmer A irgendwie mitteilen und diesem dann, wenn gewünscht, Musik vorspielen.In einer Lync Umgebung ist also der Lync Client von Teilnehmer B für die Musik zuständig.Welche Musik?In den Einstellungen des Lync Clients kann eine Audio Datei, die als Music on Hold gespielt wird, ausgewählt werden.  Möchte man sich für diese Aufgabe nicht auf seine Benutzer verlassen, kann man dies in einer CsClientPolicy vorgeben.New-CsClientPolicy &quot;MusicOnHold&quot; -EnableClientMusicOnHold:$true –MusicOnHoldAudioFile:&quot;C:\\\\Program Files (x86)\\\\Microsoft Office\\\\Office15\\\\MEDIA\\\\DefaultHold.wma&quot;&lt;/p&gt;    Grant-CsClientPolicy –Identity “Username” –PolicyName “MusicOnHold”&lt;/code&gt;  Diesen Pfad bekommt der Lync Client per in-band provisioning mit, das sieht im Log so aus:     Achtung: Das setzen von EnableClientMusicOnHold:$true alleine ist nich ausreichend, der Benutzer muss hier nach wie vor die Datei selbst auswählen.  Dateipfad  Der aufmerksame Leser hat das Problem in der obigen Konfiguration sicher bereits gesehen, der Dateipfad für die Musik liegt im Installationsverzeichnis des Lync Clients. Dies unterscheidet sich allerdings von Lync 2010 zu Lync 2013 sowie bei 32 und 64 Bit Installationen.  Standardpfad Lync 2013: &quot;C:\\\\Program Files (x86)\\\\Microsoft Office\\\\Office15\\\\MEDIA\\\\DefaultHold.wma&quot;   Standardpfad Lync 2010: &quot;C:\\\\Program Files (x86)\\\\Microsoft Lync\\\\MEDIA\\\\DefaultHold.wma&quot;  Dies kann problematisch werden, wenn Benutzer sich an mehreren Geräten mit unterschiedlichen OS oder Lync Client Versionen anmelden. In diesem Fall empfiehlt es sich einen “allgemein gültigen“ Pfad in die CsClientPolicy zu schreiben. Dies kann wiederum problematisch werden wenn Benutzer sich von Unternehmensfremden Endpunkten anmelden, diese finden dann am personalisierten Pfad keine Datei, oder können nicht auf eine Freigabe zugreifen… Die aktuell Verfügbaren Konfigurationsmöglichkeiten erlauben es nicht wirklich alle Szenarien abzudecken.  Ausnahme: Response Group Service  Natürlich gibt es eine Ausnahme in der die Musik vom Lync Server kommt, ruft Teilnehmer A eine RGS Nummer an, kommt die Wartemusik vom Lync Server, allerdings nur bis zu dem Zeitpunkt an dem ein Agent das Gespräch entgegen nimmt. Jetzt liegt die Verantwortung beim Lync Client des Agenten, wird das Gespräch vom Agenten gehalten, kommt die Musik vom Client desselben.  Hintergrund: Auf folgender Seite habe ich die SIP Kommunikation zwischen Teilnehmer A und B aus diesem Artikel genauer beschrieben. SIP: Anruf halten     Schönes Wochenende!     Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-music-on-hold-wartemusik/\"\n},{\n  \"id\": \"post-sip-anruf-halten\",\n  \"title\": \"SIP: Anruf halten\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"An dieser Stelle möchte ich einen Blick auf die SIP Kommunikation in einem Anruf halten Szenario werfen. Die Informationen aus der SIP Kommunikation die ich im folgenden zeige sind auf das absolute Minimum beschränkt, ein wirkliches SIP Paket enthält viel mehr Informationen. Im folgenden Beispiel ruft Teilnehmer A (+49151xxxxxxxx) Teilnehmer B (+39047xxxxx) an, Teilnehmer B nimmt das Gespräch an. Anschließend hält Teilnehmer B das Gespräch. Die Frage die sich stellt ist natürlich wie signalisiert ein Teilnehmer (B) dem anderen (A) dass er das Gespräch halten möchte?INVITE / OKBevor ein Gespräch gehalten werden kann, muss dieses aufgebaut werden. Dazu sendet Teilnehmer A eine INVITE Anfrage an Teilnehmer B. Der Header beschreibt die SIP Sitzung, im Body wird mit SDP die Medien Sitzung beschrieben. Die interessanten Felder fasse ich hier zusammen:Invite Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37     CSeq: 24467 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Invite Body:      c=IN IP4 192.168.1.100     m=audio 54720 RTP/AVP 0 8 115 13 118 97 101Der Lync Client des angerufenen Teilnehmers (B) muss die empfangene Anfrage beantworten und macht dies mit einem 200 OK. In diesem schickt er SDP Informationen mit, welche die RTP Sitzung aus seiner Sicht beschreiben:Ok Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 24467 INVITEOk Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101re-INVITE / OKUm eine existierende SIP Sitzung (Dialog) zu ändern, schickt Teilnehmer B ein INVITE bei dem die Werte für Call-ID sowie From und To Tag identisch mit denen aus der bestehenden Sitzung sind. Man spricht in diesem Fall von einem re-Invite. Das Ziel dieses erneuten Invites ist es die RTP Sitzung zu ändern, also schickt der User Agent des Teilnehmer B neue SDP Informationen an Teilnehmer A, diese enthalten die Beschreibung der RTP Sitzung aus sicht von Teilnhemer B.re-Invite Header:     From: &quot;&quot; &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     To: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 1 INVITEre-Invite Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101     a=sendonlyAuch diese Anfrage muss der Lync Client beantworten, in diesem Fall erhält Teilnehmer A die Invite Nachricht, Teilnehmer B möchte das Gespräch halten.Ok Header:      From: &quot;&quot;&lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;tag=4f75d0c634;epid=ea6d933f37     To: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     CSeq: 1 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Ok Body:      c=IN IP4 192.168.1.100     m=audio 6190 RTP/AVP 8 13 101     a=recvonly\",\n  \"url\": \"https://onprem.wtf/post/sip-anruf-halten/\"\n},{\n  \"id\": \"post-invoke-sefautil-a-powershell-wrapper-function\",\n  \"title\": \"Invoke-SEFAUtil – a PowerShell wrapper function\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"PowerShell\",\"Skype4B\"],\n  \"content\": \"I had to use SEFAUtil to get some tasks done the other day. As I prefer using PowerShell over just another command line tool, I decided to come up with a quick wrapper function that is intended to make my life a little easier.If you don’t know what SEFAUtil is and how to configure it, check out this great post or this one if you prefer German ;) In a nutshell, it’s a command line tool to configure Skype for Business (Lync) Voice Features (like call forwarding, team call) on behalf of end-users.Warning: I do not recommend using this in production without understanding what it does, although I did test it in my lab, it may break something!Ok, having that said, how do I use thins thing? First of all you will need a copy of this script on the computer where you have been running SEFAUtil until now. As the computer is authenticated using a certificate (it must be configured as a trusted application), you will not be able to run this from anywhere. Once you’ve downloaded the script, start a Skype for Business Management Shell and use like in the following examples:EXAMPLE 1.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\"OU=users,OU=tomt,DC=tomt,DC=local\\\" | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThe complete online help can be found hereWhat I did in this script, is basically wrap PowerShell around SEFAUtil.exe, I did add some parameter validation, it can only run against Lync users for example. It does write a logfile to the $temp directory and supports PowerShells common parameters like Verbose and WhatIf.Download &amp; Source for Invoke-SEFAUtil – a PowerShell wrapper functionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell      Note: The script requires the Lync Module to be available on the Computer where it will be run, it does also require PowerShell version 3.  Note: Changing the CallAnswerTime only does not work, a limitation of the SEFAUtil.exe does not allow this setting to be changed without also configuring CallForwardingso long,Tom\",\n  \"url\": \"https://onprem.wtf/post/invoke-sefautil-a-powershell-wrapper-function/\"\n},{\n  \"id\": \"post-your-windows-phone-does-not-support-this-server-version\",\n  \"title\": \"Your Windows phone does not support this server version…\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"This is just a a quick post about an interesting issue I&rsquo;ve seen today, interesting it was, at least to me. I was at a customer&rsquo;s site publishing Exchange 2010 using a Sophos &ldquo;Unified Threat Management&rdquo; box. Well, we all have to live in a post TMG world, don&rsquo;t we?After installing the certificate on the box we configured the &ldquo;virtual web servers&rdquo; and the corresponding &ldquo;real web servers&rdquo;. Outlook Web App worked straight away so we went ahead and tried to connect a Windows Phone 8 using ActiveSync.That didn&rsquo;t go so well, the Phone would not connect and instead give a strange error message saying:Error 85002028: Your Windows phone does not support this server version.Ok, that&rsquo;s where the interesting begins. I quickly fired up Remote Connectivity Analyzer which provided a much clearer error description along with a link to this KB article.It turned out that we had not installed the intermediate CA certificate on the Sophos box. As the Winodws Phone requires the Reverse Proxy to send the whole chain down for verification, this simply didn&rsquo;t work. Here comes a quote from the above KB article.Windows Mobile-based devices do not generally contain intermediate CA certificates in their certificate store. Internet Information Services (IIS) sends the whole certificate chain to the device. However, IIS does this only if it can verify the whole chain. By default, the device does not contain these certificates. Therefore, the server must send them. The device must contain only the root certificate in its certificate store.Makes sense, finally.until next time, tom\",\n  \"url\": \"https://onprem.wtf/post/your-windows-phone-does-not-support-this-server-version/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-5\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 5\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Welcome to the last post in this series, we did migrate all mailboxes in part 4, the only thing that is still missing is public folder. So let&rsquo;s go ahead and migrate legacy public folders over to modern public folders.Modern Public Folders, huh?Public folders have been around for quite a while now, and for some time they have been written off, even by Microsoft. Exchange 2007 RTM&rsquo;d without management features, 2010 came along with no real improvements to replication and high availability.Everything changed, Exchange 2013 introduces the shiny, new &ldquo;Modern Public Folders&rdquo;. This shows that the Exchange Team is actually listening to customers, this, and the availability of public folders in Exchange Online (Exchange Team Blog) tells us that modern public folders are here to stay. So what&rsquo;s changed?No more public folder databases, modern public folders are stored in the mailbox database, within special public folder mailboxes. This gives the administrator more flexibility (think DAG) and reduces a lot of the additional complexity that came with managing PF replication. Other nice side effects are that clients do not need to connect to the mailbox servers anymore, CAS is now able to handle ALL incoming connections.The hierarchy is stored within a root public folder mailbox but every public folder mailbox has a read-only copy, so all clients get quick access to it. The root mailbox can be shown using the following cmdlet:Get-OrganizationConfig | select RootPublicFolderMailboxMigrationOnce you are ready to migrate public folder to Exchange 2013, head over to Microsoft&rsquo;s Download Center and download the Public Folder Migration Scripts. I downloaded these scripts to the Exchange 2010 server, as they will be run there. The first script to run is Export-PublicFolderStatistics.ps1, it takes to parameters as input, the first one is a filename the second one is your Exchange 2010 mailbox server..\\\\Export-PublicFolderStatistics.ps1 sizemap.csv EX14.tomt.localThis script creates a file called sizemap.csv in the current directory, this file contains public folder statistics gathered from the server EX14.tomt.local. It&rsquo;s actually a simple list of public folder names and their respective sizes in bytes.The second script, PublicFolderToMailboxMapGenerator.ps1 reads the output file generated by the first one, and takes two additional parameters. The first parameter is the maximum mailbox size in bytes, then comes the sizemap.csv generated by the first script, the last parameter specifies a new file, which will contain a public folder to mailbox mapping based on the maximum mailbox size parameter..\\\\PublicFolderToMailboxMapGenerator.ps1 1073741824 sizemap.csv mailboxes.csvThis example specifies a 1GB mailbox limit, it reads the sizemap.csv from the previous script, and creates a new mailbox to home public folders every time the mailbox size will reach 1GB.As my little lab does not have a huge public folder structure, everything will be placed into the first mailbox. Note that I changed the name of the first &ldquo;TargetMailbox&rdquo; as the default was something like &ldquo;Mailbox1&rdquo;.So now that we have created the mailboxes.csv file, we need to copy it over to the Exchange 2013 mailbox server. In the next step we are going to import the mailboxes.csv file and create the target public folder mailboxes with a little bit of PowerShell:Import-Csv .\\\\mailboxes.csv | select -expand TargetMailbox | foreach {New-Mailbox -Name $_ -PublicFolder -HoldForMigration:$True -IsExcludedFromServingHierarchy:$true}The two parameters HoldForMigration and IsExcludedFromServingHierarchy are used to prevent users from accessing the public folder mailbox for now. To verify that the mailboxes have actually been created use the following cmdlet:Get-Mailbox &ndash;PublicFolderOk, so now that we have created the target mailboxes we can go ahead and start moving data. Again, we will need the mailboxes.csv file, as the New-PublicFolderMigrationRequest cmdlet takes it as input:New-PublicFolderMigrationRequest -SourceDatabase (Get-PublicFolderDatabase -Server ex14.tomt.local) -CSVData (Get-Content .\\\\mailboxes.csv -Encoding Byte)In this example I am getting public folder database information from the server EX14.tomt.local and then reading the content of mailboxes.csv, which has to be in the current location. As the name implies, a new Public Folder Migration Request is generated, it copies data at about two to three GB per hour. The request is created with the PreventCompletion parameter set to $true, that means, once the data has been copied, the request will be AutoSuspended.Users should not have noticed anything about this public folder migration until now, they continue working on the 2010 public folder as usual. Before we can complete the public folder migration request, though, we will need to block user access to the legacy public folders. We will need some time to synchronize the already moved data with latest changes during this window of downtime.So once you&rsquo;ve informed your users, we are going to prevent access to legacy public folders, remember that because of HoldForMigration:$true, we are also preventing access to the modern public folders!Set-OrganizationConfig -PublicFoldersLockedForMigration:$trueThis setting prevents users to access public folders, be sure to allow some time for it to replicate if you have more than one public folder database. Now that no one is able to make changes to the legacy public folders, we can go ahead and set the PreventCompletion flag to $false, and then resume the public folder migration request to finally move all data.Set-PublicFolderMigrationRequest -Identity \\\\PublicFolderMigration -PreventCompletion:$false Resume-PublicFolderMigrationRequest -Identity \\\\PublicFolderMigrationOnce this is done, it is recommended to test access to modern public folders with a few users, before allowing everybody to make changes again. This is the last point in time where you do have a way back without data loss!To test access to the modern public folders, we use the following cmdlet:Set-Mailbox &ndash;Identity user1 &ndash;DefaultPublicFolderMailbox PFMailbox001This overrides the IsExcludedFromServingHierarchy and allows the user user1 to access public folders on the new Exchange 2013 server. Outlook Connection Status will show something like this:If everything is fine, we can finally remove the IsExcludedFromServingHierarchy flag and set the PublicFolderMigrationComplete property to $true.Get-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy:$false Set-OrganizationConfig -PublicFolderMigrationComplete:$trueOk, one last thing: You may have noticed that the Proxy Server in the screenshot above shows the external server name for the connection to Exchange Public Folders. This is due to a bug in Outlook, before a fix becomes available, make sure internal clients can access the external hostname by creating a split DNS record. There is a KB article available, here.Nice, that completes this series on migrating Exchange 2010 to Exchange 2013. Thanks for following along :)&nbsp;so long, see you next time!tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-5/\"\n},{\n  \"id\": \"post-web-application-proxy-in-windows-2012-r2-preview\",\n  \"title\": \"Web Application Proxy in Windows 2012 R2 preview\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"The preview of the next version of Windows Server 2012 has been released very recently. Let&rsquo;s have a quick look at some of the features.The taskbar properties feature a new &ldquo;Navigation&rdquo; pane, we can configure stuff like &ldquo;Boot to Desktop&rdquo;, yay :)Web Application Proxy and ADFSAnother desperately needed feature is the new Web Application Proxy server role, many people (including me) think this is going to be the replacement for TMG. So, very keen to play with the new toy I went ahead and added the server role, found underneath &ldquo;Remote Access&rdquo;.&nbsp;Adding &ldquo;Web Application Proxy&rdquo; as a role service.Like in Windows 2012 the server manager kindly reminds me to configure the newly added role:Just in case you want to run this wizard again but can&rsquo;t find it anymore, it can be started from the Remote Access Management Console.The first step in the Wizard asks for a federation service name, now until this moment I didn&rsquo;t really bother researching anything about this new server role. Not the smartest move&hellip; As documentation is still pretty thin for Windows Server 2012 R2 I decided to simply set up an ADFS server in my lab and try to connect the Web Application Proxy to that federation service.Active Directory Federation ServicesThe first step is to add the Active Directory Federation Services server role to an machine in the domain.Again, the Server Manager reminds me to configure the new role, the first thing I do is supplying credentials which are used to perform the configuration:In the next step I select a certificate for the federation service and set a name for it. Obviously I do have to create a DNS record that resolves the federation service name to the IP address of the server that&rsquo;s actually hosting it.Now I have to select a service account for the federation service, note that the federation service name must be added as Service Principal Name to the account. This can be done using &ldquo;setspn &ndash;F &ndash;S host/adfs.tomt.local adfssvc&rdquo;In the last step I select the database to use for the federation service, as I am using only one server I&rsquo;ll give the Windows Internal Database a go.Ok, no we do have a federation service running, so we can go ahead and configure the Web Application Proxy.Web Application ProxyOk, picking up where we left for a quick excursion to ADFS, we are now back on the Web Application Proxy machine and specify the newly created federation service name.&nbsp;&nbsp;A certificate is required on the proxy, too. So after requesting a certificate from my internal CA, I can go ahead and select it here. Make sure that the certificate&rsquo;s subject alternative names include the federation service name!Ok, the last step shows the PowerShell code that get&rsquo;s executed and if everything works out, you&rsquo;ll see a message that the Proxy was configured successfully.A few caveats: Make sure DNS resolution is ok, the proxy must be able to resolve the federation service, and the ADFS server must me able to resolve the proxy. The certificate on both servers must include the federation service name.Publishing a serviceAfter having configured ADFS and the Web Application Proxy, which also acts as ADFS Proxy, we can finally proceed and publish a server. This is done using the Remote Access Management Console.I hit publish in the tasks pane and in the wizard that comes up, I am asked to select if I want to use pre-authentication or simply pass-trough the requests. After all that pain with installing and configuring ADFS I do definitely want to use pre-authentication :)Ok, so I have to select the ADFS relying party, whatever that is:After that I am prompted to enter a name for the publishing rule, an external and internal URL as well as a certificate.Again, we get to see the actual PowerShell code just before the publishing rule is created. Niiice, we have just successfully configured our first \\\"post TMG&rdquo; publishing rule.TestingNow to make sure that this is really working, let&rsquo;s fire up a client and browse to the published URL, owa.tomt.it in my case. Browsing to a published web site that requires pre-authentication, redirects the client to the AD FS Proxy service.After successfully authenticating against the Web Application Proxy the client gets redirected back to it&rsquo;s intended destination web site.Note: Make sure the client actually behaves like an external client, it must resolve the federation service name to the Web Application Proxy for this to work!Port mappingAnother application that I do publish using TMG frequently is Lync, sure enough I have to map the external web services port from 443 to 4443. This can be done using Web Application Proxy, too. For Lync we don&rsquo;t use pre-authentication:The internal URL contains the port to use:Awesome, that gives us a new possibility to publish web services, obviously we are not yet able to use it in production and time will tell if it get&rsquo;s a few additional features in RTM, all in all, for no additional cost, I think it is already a nice tool to use.Wish list,or: What would be nice to have in the RTM Version of Windows Server 2012 R2:Publish multiple servers for a particular external URL (think load balancing) Health checking of internal servers Maybe some additional authentication possibilities That&rsquo;s it for today, so long tom\",\n  \"url\": \"https://onprem.wtf/post/web-application-proxy-in-windows-2012-r2-preview/\"\n},{\n  \"id\": \"post-lync-and-exchange-2013-owa-integration\",\n  \"title\": \"Lync and Exchange 2013 OWA integration\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"content\": \"I configured Lync 2013 to work with Exchange 2013 these days, as it took me a while to get the &lsquo;Online Meeting request&rsquo; up and running, I thought I&rsquo;d post a quick post here.CertificatesThe first thing to consider when thinking about integration between Exchange 2013 and Lync is certificates. The servers use OAuth and TLS connections and we need the certificate common names to match the names that the servers use to access the resource. In my simple environment I do have the CN ly14.ntsystems.local on my Lync server&rsquo;s certificate, the Exchange server&rsquo;s certificate has a CN of ex14.ntsystems.local.Exchange 2013 - Enterprise Partner ApplicationThe first thing we configure, if it&rsquo;s not already set up, is Exchange Autodiscover service. What we actually care about is the internal URI used:Get-ClientAccessServer | fl AutoDiscoverServiceInternalUriIf it looks good, we go ahead and use the following script shipped with Exchange to set up an Enterprise Partner Application.&amp; $exInstall\\\\Scripts\\\\Configure-EnterprisePartnerApplication.ps1 &ndash;AuthMetaDataUrl https://ly15.ntsystems.local/metadata/json/1 -ApplicationType LyncThe &ldquo;&amp;&rdquo; sign tells PowerShell to start the script located at the Scripts folder in the Exchange 2013 installation directory. With the AuthMetaDataUrl we specify the Lync 2013 Pool&rsquo;s Auth Metadata document, this includes public key information for the Partner Application.Lync 2013 - Trusted Application PoolSo next up we have to configure Lync to trust the Exchange Server 2013.New-CsTrustedApplicationPool -Identity ex15.ntsystems.local -Registrar ly15.network.local -Site Bolzano -RequiresReplication $FalseNew-CsTrustedApplication -ApplicationId OutlookWebApp -TrustedApplicationPoolFqdn ex15.ntsystems.local -Port 5199&lt;/p&gt;New-CsPartnerApplication -Identity Exchange -ApplicationTrustLevel Full -MetadataUrl https://autodiscover.ntsystems.local/autodiscover/metadata/json/1Set-CsOAuthConfiguration &ndash;Realm ntsystems.localEnable-CsTopology&lt;/code&gt;Ok, so first we create a new Trusted Application Pool withing Lync, the Identity of the application pool is the Exchange 2013 server, the registrar is the Lync standard edition server. Then we create a Trusted Application and assign it to the trusted application pool configured before. The third thing we configure is a Partner Application and set the OAuth configuration, we need those last steps for the Online Meeting request in OWA, make sure that you actually use the Autodiscover URL, this didn&rsquo;t work if I used the server name instead.Ok, once the configuration is done, publish the topology.Exchange 2013 - Enable Instant MessagingBack on the Exchange side of things we need to configure the OwaVirtualDirectory to enable Instant Messaging.Get-OwaVirtualDirectory | Set-OwaVirtualDirectory &ndash;InstantMessagingEnabled $True -InstantMessagingType OCSNow comes the nasty part, we have to update OWA&rsquo;s web.config file to include the Exchange Servers certificate thumbprint. So first, we use the following cmdlet to get the certificate&rsquo;s thumbprint:Get-ExchangeCertificateCopy the thumbprint of the certificate that is assigned to the IIS service and fire up notepad to open the web.config file of the Owa virtual directory, located here:C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\ClientAccess\\\\OWA\\\\web.configNo we need to Include the following Lines underneath the &lt;AppSettings&gt; node:&lt;add key=\\\"IMCertificateThumbprint\\\" value=\\\"Exchange Cert Thumbprint\\\"/&gt; &lt;add key=\\\"IMServerName\\\" value=\\\"ly15.tomt.local\\\"/&gt;So, after updating that web.config file, there is one step left, we need to actually allow users to use instant messaging in OWA. This is controlled in the Owa mailbox policy, to keep it simple I&rsquo;ll just update the default policy which will enable IM for everybody.&nbsp;Set-OwaMailboxPolicy -Identity \\\"Default\\\" -InstantMessagingEnabled $True -InstantMessagingType \\\"OCS\\\"Wow, now that all configuration is done, I like to do a quick iisreset to make sure all the configuration changes are picked up, obviously this should not be done on production machines&hellip;If users sign in to webmail, they will be able to sign into Lync, set their state and participate in IM chats.And, as a nice little addon, we can now also create Online Meeting requests from OWA:Note, Exchange 2013 CU1 is required for Online Meeting requests and Lyncdiscover has to be set up, too.&nbsp;Enjoy,tom\",\n  \"url\": \"https://onprem.wtf/post/lync-and-exchange-2013-owa-integration/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-4\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 4\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Hello everybody, after thinking about installation, client access and mail routing, we are getting ready to move some mailboxes.So, we talked about Exchange 2013 CAS being a pretty smart proxy, that&rsquo;s why we had to append ?ExchClientVer=15 to the ECP URL in order to get to the new Admin Center while the Mailbox was still on Exchange 2010. Obviously, once the mailbox gets moved to Exchange 2013 this is no longer required. Another thing that will change as we move mailboxes from Exchange 2010 to 2013 is the Outlook Profile, it does no longer show the RPCClientAccess endpoint as Server, instead it gets updated to show the &lt;Mailbox GIUD&gt;@&lt;Primary SMTP domain&gt;.Moving mailboxes&nbsp;There are a couple of things to take into consideration before moving mailboxes to the 2013 server. As we learned in part two of this series, it is essential to move the namespaces used by Exchange to the new CAS prior to moving mailboxes, users would not be able to access mailboxes if the names would still point to an Exchange 2010 CAS. Another important check is whether new mailbox servers have been provisioned with enough disk space to accommodate the moved users, and if the properties of the mailbox database, such as ProhibitSendReceiveQuota and OfflineAddressBook have been set to desired values. Assuming that everything is fine, we go ahead and create some move requests, very much the same way as we did in Exchange 2010.New-MoveRequest &ndash;Identity user3@tomt.it &ndash;TargetDatabase mbd01This command moves the mailbox of user3 to the target mailbox database mdb01 which is hosted on Exchange 2013. Like in 2010, the move is performed online, so the user is able to work in his mailbox until the move request is finished. Once the move request completes, the user will be prompted to restart Outlook, this is when the Profile gets updated to show the GUID instead of the server name or RPCClientAccessServer property.Note that this is the users mailbox GUID, as that is the user&rsquo;s unique identifier within the Exchange Organization, it will be different for every user. This GUID is used to locate the active mailbox database copy, in Exchange 2013 all protocols are provided to the user by the server that is hosting the active mailbox database copy.Batch movesIn Exchange 2010 we had the ability to do batch move requests, but it was more like creating many move requests and assigning the same BatchName to them, Get-MoveRequest was used to retrieve information about the move requests. Now Exchange 2013 comes with some new cmdlets that are dealing with batch migrations: *-MigrationBach.Honestly I do think those new cmdlets are a little complicated, I guess they were primarily introduced to make hybrid or cloud move requests easier, in an on-premises world they might not be that useful. I created a New-MigrationBatch and then started the migration. The first thing we need is a CSV file with a column called EmailAddress, so let&rsquo;s get all users homed on the Exchange 2010 server, and export them to CSV:Get-Mailbox -Server ex14 | select @{n=\\\"EmailAddress\\\";e={$_.PrimarySmtpAddress}} | Export-Csv -NoTypeInformation -Path .\\\\BatchMove.csvNow we can use this CSV file to create a new MigrationBatch, you see what I mean with a little complicated&hellip;New-MigrationBatch -Local -Name BatchMove -CSVData ([System.IO.File]::ReadAllBytes(\\\".\\\\BatchMove.csv\\\")) -TargetDatabases mdb01It&rsquo;s looking like that in PowerShell:Ok, once we have created the MigrationBatch, we can go ahead and start the migration to actually move data over to the new Exchange.Get-MigrationBatch | Start-MigrationBatchThe Get-MigrationStatistics cmdlet can be used to get information about the ongoing migrations, once all mailboxes are moved, TotalCount and SyncedCount should show the same value. Get-MigrationUser can be used to get information about the individual mailboxes being moved. The Get-MigrationBatch cmdlet includes a Report property containing links to CSV reports about the MigrationBatch.Note that the Start-MigrationBatch does not complete the move requests, use the Get-MoveRequest cmdlet to show the individual move requests and their state, it will be AutoSuspended. The Complete-MigrationBatch cmdlet is used to complete the move requests:Get-MigrationBatch | Complete-MigrationBatchIf we run the Get-MoveRequest cmdlet again, we will finally see that mailboxes have been moved to Exchange 2013.Since there is not much documentation available, yet, I will stick with the &ldquo;old&rdquo; way and just use New-MoveRequest to move mailboxes for now.&nbsp;&nbsp;&nbsp;Outlook ProfileOk so now that we have migrated our users over to the new Exchange it&rsquo;s time to have a look at Outlook, as mentioned above, the profiles will be updated and no longer show a server name, but it will also be using RPC over HTTP on the internal network:The proxy settings of the Outlook profile is updated, too, it will now select &ldquo;On fast networks, connect using HTTP first&hellip;&rdquo; by default.The AutoDiscover.xml file now contains more information for clients, while Exchange 2010 had the following three Type nodes &lt;EXCH&gt;,&lt;EXPR&gt; and &lt;WEB&gt; the new AutoDiscover.xml contains two &lt;EXHTTP&gt; nodes for internal and external OutlookAnywhere settings.It is very important to update Outlook to the minimum required version by Exchange 2013 before moving mailboxes, as older Outlook versions will not be able to interpret the new xml file.Well, and that&rsquo;s it for part four. We do have one big thing left for part five, public folders.&nbsp;Stay tuned,tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-4/\"\n},{\n  \"id\": \"post-exchange-2013-open-public-folder-on-exchange-2010\",\n  \"title\": \"Exchange 2013, Open Public Folder on Exchange 2010\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"You may notice that with the Exchange 2013 defualt settings on Outlook Anywhere you are unable to open public folders located on you &ldquo;old&rdquo; Exchange 2010 server. You get an authentication pop up and the following error:Microsoft has released a KB (http://support.microsoft.com/kb/2834139/en-us) article how to get that work.Simply change your Outlook Anywhere settings to use internal and external NTLM with requirement of SSL:Get-OutlookAnywhere &ndash;server ex01 | Set-OutlookAnywhere -ExternalClientAuthenticationMethod NTLM -InternalClientAuthenticationMethod NTLM -ExternalClientsRequireSsl $true -InternalClientsRequireSsl $trueThe next time the client gets the Autodiscover File, it sets the Logon Network Security Settings of the Outlook Profile from &ldquo;Anonymous Authentication&rdquo; to &ldquo;Negotiate Authentication&rdquo; and you can open the public folders located on Exchange 2010.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2013-open-public-folder-on-exchange-2010/\"\n},{\n  \"id\": \"post-configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa\",\n  \"title\": \"Configure Exchange 2013 CAS Array with WNLB and enable Kerberos support for OA\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Like Tom described in his Post Migrating from Exchange 2010 to 2013 &ndash; part 2 the major changes in the Exchange 2013 CAS role, I explain in this post how to configure high available CAS Array with WNLB.First you have to install WLNB on both CAS nodes and create the Cluster and VIP. The CAS Servers need only one NIC, we use the Multicast operation mode.Next we create the Port Rules. In this example I create a port rule for the whole port range. Because there is not need of Affinity we can safely disable the the feature:Now create the Host A Record for the Cluster name excararray01 to point to the VIP.Remember to change the internal URL&rsquo;s of the virtual directories of both CAS servers to use the Cluster name and not the CAS computername.Kerberos supportI have 2 UAG servers that are publishing the Exchange 2013 CAS servers. On the UAG servers I don&rsquo;t want to publish both CAS servers and use the UAG load balancing. I want to publish the CAS Cluster Name and let the WNLB do the load balancing. If you don&rsquo;t configure an alternate service account for the CAS Cluster Name you will no be able to use NTLM authentication for Outlook Anywhere.To use Kerberos authentication you have to create a computer account in AD (the name don&rsquo;t have to match the array FQDN):Then run the following script that is located in C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\Scripts to configure the Alternative Service Account.\\\\RollAlternateServiceAccountPassword.ps1 -ToArrayMembers excasarray01.domain.local -GenerateNewPasswordFor \\\"domain\\\\EXCASARRAY01ASA$\\\" &ndash;Verboseexcasarray01.domain.local stands for the FQDN of the CAS array domain\\\\EXCASARRAY01ASA$ stands for the created computer accountAfter the script has finished configuring we have to register some spn&rsquo;s with the CAS Array FQDNsetspn -s exchangeMDB/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s exchangeRFR/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s exchangeAB/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$Now we can publish the CAS Array FQDN with uag and use NTLM as authentication method for Outlook Anywhere.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-3\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 3\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Hello again and welcome back to the third part of our journey to Exchange 2013. In the previous two posts (part 1, part 2) we covered preparing and installing Exchange 2013, as well as some news with the Client Access Server role and some design considerations. Now in this part we will try to cover some key aspects of transport in the new Exchange.Hub Transport RoleAs you already know, there is no Hub Transport server role in Exchange 2013, the transport pipeline has been split into three services, one of which is running on the CAS, the other two on the MBX role.Front End Transport serviceThis service is running on the CAS role, like all other CAS services, it is nothing more than a stateless (but smart) proxy for inbound and outbound SMTP connections. Neither message queuing, nor message filtering happens here. The front end transport service talks to the transport service on the MBX server role.Transport serviceThis service runs on the Mailbox server role, like the hub transport role in Exchange 2010, this service performs message queuing, inspection, categorization and so on. Very much NOT like in Exchange 2010, though, this service never talks to a mailbox database. This service routes messages between the front end transport service, the transport service and the mailbox transport service.Mailbox Transport serviceThis service runs on the Mailbox server role, too. It receives messages via SMTP from the transport service and connects via RPC to the mailbox database to deliver the message. It also connects to mailbox databases via RPC to retrieve messages and forward them to the transport service, again using SMTP.This shows one thing very clearly, through the use of SMTP, Exchange 2013 is able to break the close relationship between server roles that existed in previous versions. The front end transport role in CAS does no longer use RPC, an thus, could be running a different software version than the mailbox server, communication between mailbox servers, specifically between the mailbox transport service and the transport service, also uses SMTP and has no requirement to be on the same software version.I used Wireshark to capture an incoming mail proxied through the CAS:The Client (10.1.1.10) connects to the CAS (10.1.1.21) using TCP 25, all SMTP messages are exchanged between those two nodes. Note, that the CAS does only send the &ldquo;250 Queued Mail for delivery&rdquo; after connecting to the transport service on the Mailbox Server (10.1.1.25), since the Front End Transport service does not queue mails locally, this &ldquo;smart proxy&rdquo; functionality ensures that the message gets stored in the mailbox servers queue, before sending an OK to the client. The connection between CAS and MBX uses TCP 2525 and is encrypted using TLS, this is why Wireshark is not able to encode it as SMTP.There is whole section on Transport on TechNet: http://technet.microsoft.com/en-us/library/aa996349.aspxMigration Send and Receive connectorsNow that we know (a little bit) how transport works in Exchange 2013, we can start to include Exchange 2013 servers to the send connectors and configure the appropriate receive connectors.To add Exchange 2013 servers as sources to the existing send connectors, use the Exchange Admin Center and navigate to &ldquo;mail flow, send connectors&rdquo;. Then select the send connector to edit and add the new source server under &ldquo;scoping&rdquo;We could also use PowerShell to add additional SourceTransportServers to the connector, be aware though, that the existing servers have to be included in the command.Set-SendConnector &ndash;Id ToInternet &ndash;SourceTransportServers ex14,ex15Another interesting flag sits under the &ldquo;general&rdquo; node of the send connector&rsquo;s properties: Proxy though client access server&rdquo;So what&rsquo;s that all about? If this flag is checked, outbound mails are not sent directly by the mailbox server&rsquo;s transport role, but are proxied through a Client Access Server. This could be interesting if only a subset of Exchange Servers (CAS) were allowed to connect to the internet via SMTP. With multi role servers, which are recommended for many environments, this flag will have no effect.Ok, so now we have got our outbound mail flow configured, what about incoming mails? Receive connectors are per-server settings, so we have to check the configuration of existing connectors and configure the new server accordingly.Get-ReceiveConnector &ndash;Server ex14 | ft Identity,Enabled,Bindings,RemoteIpRangesThis command shows all receive connectors on the 2010 server, along with the Ports used and the remote IP addresses that are allowed to use this connector. Obviously, if there are custom AD permissions or authentication methods defined, those have to be configured on the new server, too.Nice, now we have got client access and transport covered, the next post will finally include moving some mailboxes to the new Exchange server.&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-3/\"\n},{\n  \"id\": \"post-exchange-2013-clean-install-but-many-msexchange-common-106-errors\",\n  \"title\": \"Exchange 2013 clean install but many MSExchange Common 106 errors\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Update: 09.06.2013 Updated the PowerShell script and some additional information about event logs. /tomToday I installed 4 Exchange 2013 servers. All of them have many &ldquo;MSExchange Common&rdquo; 106 errors in the Application Log indicating&nbsp;that Performance Counters could not be updated:Performance counter updating error. Counter name is LDAP Queries Issued by Expanded Groups., category name is Expanded Groups Cache. Optional code: 3. Exception: The exception thrown is : System.InvalidOperationException: The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnlyThe problem is that the performance counters are not registered correctly. I wrote a simple script to re-register all the Exchange 2013&nbsp;performance counters. Now the Application log looks much better First open Powershell in Admin Mode, then execute the following code:Note that New-PerfCounters actually deletes and re-creates the performance counter, there is no need to use Remove-PerfCounters first. The script might throw some errors if performance counters cannot be created or files are invalid, other than that no information is displayed, no news is good news, I guess ;) For more information check the Application Log of the server, two events are logged for every performance counter. Event ID 1001 indicates that the counter has been removed, while Event ID 1000 is logged as soon as the counter has been loaded again.If an antivirus software is running on the server, it could be disabled temporarily to improve performance.Special thanks to @msxfaq&nbsp;:)&nbsp;Greetings nd\",\n  \"url\": \"https://onprem.wtf/post/exchange-2013-clean-install-but-many-msexchange-common-106-errors/\"\n},{\n  \"id\": \"post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-1\",\n  \"title\": \"How to build an UAG 2010 Array for Exchange publishing–Part 1\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"content\": \"As TMG is not &ldquo;available&rdquo; anymore, I decided to use UAG 2010 with SP3 for the Exchange / Lync 2013 publishing. UAG SP3 supports Exchange 2013 and Lync 2013. In Part 1 of the Post I&rsquo;m going to explain how to build the UAG 2010 Array.First we have to prepare 2 Windows Server 2008 R2 Server each of them with 2 NIC&rsquo;s and at least 4GB RAM. The NIC&rsquo;s should be configured in this way:INTERNALDefault Gatewayshould not be definedDNS Serversshould be definedRegister this connection&rsquo;s address in DNSEnabledFile and Printer Sharing for Microsoft NetworksEnabledClient for Microsoft NetworksEnabledNetBIOS over TCP/IPEnabledLMHOSTS lookupEnabled&nbsp;EXTERNAL&nbsp;&nbsp;Default Gatewayshould be definedDNS Serversshould not be definedRegister this connection&rsquo;s address in DNSDisabledFile and Printer Sharing for Microsoft NetworksDisabledClient for Microsoft NetworksDisabledNetBIOS over TCP/IPDisabledLMHOSTS lookupDisabledThe order should modified that NIC INTERNAL becomes the first NIC used:The Next steps are to install NLB (without configuring it) and UAG on both nodes. Install UAG in the following order:UAG 2010 SP1 Update 1If Update 1 fails, download and install it manuallyUAG 2010 SP1 Updat 1TMG 2010 SP2UAG 2010 SP2UAG 2010 SP3When UAG is fully installed, we have to configure it. Lets start on the node that becomes the Array Manager.Open UAG and select the Network SettingsThen we have to define the Topology: Select the node as Array Member and specify credentialsBefore you join the 2nd node as the array member, open the TMG console and add the 2nd server to the &ldquo;Managed Server Computers&rdquo; group. Install the Policy.Open the UAG console on the 2nd server and join him to the arrayTIP: If the UAG services on the 2nd node don&rsquo;t start, copy the content of folder C:\\\\Program Files\\\\Microsoft Forefront Unified Access Gateway\\\\von\\\\Conf from the manager to the member server. Then start the services.Now we have to configure the NLB from the UAG console. Open Network Load Balancing from the Admin menu and add the first VIP IP:Next you have to save and activate the configuration. UAG is now building the NLB cluster with both nodes. You can check the activity with the UAG Activation Monitor:Finally we have to open the WebMonitor and navigate to the Array Monitor section. There we have to start the NLB nodes:After you have started the nodes, the NLB status changes to &ldquo;Converged&rdquo;INFO: When you open the NLB manager, you will get RPC errors. The reason is that DCOM does not work with TMG/UAG. But don&rsquo;t worry, the cluster is OK if the Web Monitor doesn&rsquo;t show errors.In Part 2 I will explain how to publish Exchange 2013 OWA / OA and ActiveSync.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-1/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-2\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 2\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Updated: 08.06.2013: The original post had some errors regarding RPC over TCP and the RPCClientAccessServer namespace. You would never want to move this namespace&#160; to CAS 2013 as the new CAS does not understand RPC over TCP.Welcome back, this is the second part of my series on migration to Exchange 2013. I covered prerequisites, installation and a little bit of management in the first post, now we’ll have a look at namespaces and certificates.Namespaces in Exchange 2013After installing Exchange, it’s time to start getting into the planning phase :) Ok, just kidding, I’ll use the newly installed Exchange server to walk through some planning steps, though.First of all, let’s make some assumptions. We do have an Exchange 2010 server and a CAS array with the RpcClientAccessServer endpoint configured to outlook.tomt.local. For OWA, EWS, OAB, EAS and Outlook Anywhere there is only one namespace, mail.tomt.it. Outlook Anywhere is configured with NTLM authentication, more on that later. Internal Outlook clients would connect (via MAPI) to outlook.tomt.local, external clients would use Outlook Anywhere (HTTPS) and connect to mail.tomt.it. The certificate on Exchange 2010 has a Subject of CN=ex14.tomt.local and the following SANs: ex14.tomt.local, mail.tomt.it. Ok, so far so good. Now when migrating to Exchange 2013, it is recommended that the new server takes over the namespace and deals with all incoming client connections. For incoming connections with a mailbox homed on Exchange 2013, our new CAS would simply proxy the request to the mailbox server hosting the mailbox. For mailboxes hosted on Exchange 2010, though, the 2013 CAS would act as HTTP proxy and connect the client with the Outlook Anywhere endpoint (/rpc) of the Exchange 2010 CAS. So what does that mean? First of all, this does not apply for internal, RPC over HTTP clients, the RPCClientAccessServer namespace is not moved to CAS 2013. If you are in the unfortunate situation to have the RPCClientAccessServer namespace match your OutlookAnywhere namespace, there is a very good post over at the Exchange Team Blog.For RPC over HTTP connections, OutlookAnywhere must be enabled on the Exchange 2010 CAS before Exchange 2013 CAS can take over the namespace, and the IIS Authentication methods must include the NTLM. The Exchange 2013 CAS is authenticated by Exchange 2010, this does not work with basic authentication. To make sure Outlook Anywhere is configured, and the IIS Authentication method includes NTLM use the following cmdlet on Exchange 2010.Get-OutlookAnywhere –Server ex14 | fl ExternalHostname, ClientAuthenticationMethod, IISAuthenticationMethodsTo add NTLM as an IIS Authentication method, use the following cmdlet. Note that the ClientAuthenticationMethod does not matter in this case.Set-OutlookAnywhere –Identity ex14\\\\rpc* –IISAuthenticationMethods Basic,NTLMNice, now Exchange 2010 CAS is ready and we can start thinking about the certificate request for Exchange 2013. We want the new CAS to take over the namespace, so we do already know which name to include: mail.tomt.it, but is that enough? Well, the answer is, it depends ;)Protocol specific namesExchange 2013 introduces some radical changes, including how client connections are handled. In 2010, client affinity was everything. Clients would always need to be redirected to the same CAS for a specific session, if that CAS would become unresponsive or if the client would connect to another CAS, re-authentication would occur. When talking about load-balancing, an expensive Layer 7 capable load-balancer was required. The load-balancer would intercept the traffic and make sure client A would always reach server A for a particular session. This had one clear advantage, though, because the load-balancer was L7 aware (knows which endpoint the client asked for), it could check if a particular endpoint was reachable on a CAS, and if not redirect the client to a CAS where it was reachable. This is not the case in 2013 anymore, client to CAS sessions are stateless and a less-expensive Layer 4 load-balancer (or DNS round-robin) could be used with 2013. A L4 load-balancer, on the other hand, would have no idea of what endpoint the client was looking for, it would only see and forward encrypted (https) packets. Protocol specific namespaces are here to solve that problem. If we created a virtual IP and a distinct name for each endpoint on the CAS (OWA, EWS, EAS…) the L4 load-balancer would be aware of what endpoint the client was looking for.So, long story short, we are going to include more names in that certificate. The subject is CN=ex15.tomt.local and the SANs are: ex15.tomt.local, oa.tomt.local, mail.tomt.it, owa.tomt.it, eas.tomt.it, ews.tomt.it, oab.tomt.it. In the DNS configuration we need a CName for all of these names pointing to our new CAS, or an A record pointing to the load-balancers virtual IP. Next, we’ll use the Exchange Management Shell to update the ExternalUrl properties of the virtual directories.Set-OwaVirtualDirectory –Identity ‘ex15\\\\owa (Default Web site)’ –ExternalURL https://owa.tomt.it/owa      Set-EcpVirtualDirectory –Identity ‘ex15\\\\ecp (Default Web site)’ –ExternalURL https://owa.tomt.it/ecp       Set-OabVirtualDirectory –Identity ‘ex15\\\\oab (Default Web site)’ –ExternalURL https://oab.tomt.it/oab       Set-WebServicesVirtualDirectory –Identity ‘ex15\\\\ews (Default Web site)’ –ExternalURL https://ews.tomt.it/ews/exchange.asmx       Set-ActiveSyncVirtualDirectory –Identity ‘ex15\\\\microsoft-server-activesync (Default Web site)’ –ExternalURL https://eas.tomt.it/Microsoft-Server-ActiveSyncAnd last, but not least we configure Outlook Anywhere on the new Exchange 2013 CAS.Set-OutlookAnywhere –Identity ‘ex15\\\\rpc (Default Web site)’ –InternalHostname oa.tomt.local –InternalClientAuthenticationMethod NTLM –InternalClientsRequireSsl:$true –ExternalHostname mail.tomt.it –ExternalClientAuthenticationMethod NTLM –ExternalClientsRequireSsl:$true –IISAuthenticationMethods Basic, NTLM, NegotiateNow that Outlook Anywhere command was pretty long, let’s break it into smaller pieces. First we are setting the InternalHostname, as Exchange 2013 uses Outlook Anywhere for all client connectivity (internal and external) we don’t use the RpcClientAccessServer anymore. Along with that we set the authentication method for internal clients as well as the requirement for SSL. Next we set that same pieces of information for external clients, and the last property is configuring the supported authentication methods by IIS.Wow, now we should finally be able to take over that namespace with our brand new Exchange 2013 CAS. I updated the DNS records for mail.tomt.it to point to the new CAS and created a new CName oa.tomt.local for the internal OutlookAnywhere used in Exchange 2013. Nothing really changes for Outlook when it connects to an Exchange 2010 mailbox from inside the network, it will still use the RPCClientAccessServer endpoint to connect to the mailbox using RPC over TCP.If the mailbox is on Exchange 2013, though, Outlook will use RPC over HTTP and connect to the internal OutlookAnywhere endpoint: From a OWA point of view, all users do log on using the new CAS now:Exchange 2010 mailboxes get proxied to the Exchange 2010 CAS for OWA. After this text heavy post we have a nice little overview of CAS in Exchange 2013, I wanted to cover mail routing in this post, given the length I reckon it be better to save that for the next one.I hope this has been informative for you as the reader, at least it was extremely so for me :)so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-2/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-1\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\",\"Server\"],\n  \"content\": \"This is my first post about migrating from an existing Exchange 2010 environment to Exchange 2013. I&rsquo;ll try do cover everything that seems important to me, if I miss something that you think should be covered&hellip; well, that&rsquo;s what comments are for :)Preparing for Exchange 2013All servers in the Exchange 2010 organization must be running service pack 3, if you haven&rsquo;t already installed SP3, as always it&rsquo;s a very good idea to start with reading the release notes. On the Exchange 2013 side of things, we need Cumulative Update 1, there is a very good post at the Exchange Team Blog about that.Ok, so assuming we are running Exchange 2010 SP3 and have downloaded CU1, let&rsquo;s get started with preparing the first Exchange 2013 server. All the required Windows Features can be installed with the InstallWindowsComponent.ps1 script located in the Setup\\\\ServerRoles\\\\Common directory of the CU1 install files. The script takes several parameters, in this case I&rsquo;ll be installing a multirole server, I want the AdminTools to be installed as well as the Remote Server Admin Tools for Active Directory..\\\\InstallWindowsComponent.ps1 AdminTools, MailBox, ClientAccess -ADToolsNeeded:$TrueNote that the script has no parameter for source files, the server needs internet access to download the required files. That&rsquo;s not always practical, so I edited the script and simply added &ldquo;&ndash;Source wim:d:\\\\sources\\\\install.wim:4&rdquo; to the Add-WindowsFeature cmdlet within the script.After the required reboot, we need to install Unified Communications Managed API 4.0 Runtimethe Office Filter Pack is not mandatory and can be installed later on, it still produces a warning during setup, though.Now that we have the new, designated Exchange 2013 server ready, we need to prepare Active Directory. Obviously, if you don&rsquo;t know what all this is about, don&rsquo;t do it! So, that said, from an elevated command prompt change to the directory containing the Exchange 2013 installation files. You&rsquo;ll need Schema, Enterprise and Domain Admin rights to run the following tasks.In the first step, setup will extend the schema, this is done using:.\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareSchemaThe next step is to prepare the Active Directory Forest, this creates the Microsoft Exchange container (if it doesn&rsquo;t already exist) and universal groups used by Exchange..\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareAD /OrganizationName tomtAnd the last step is to prepare the Domain, this needs to be done for every Domain that will contain Exchange servers or Mail-Enabled users, alternatively use /PrepareAllDomains:.\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareDomainEach step relies on Active Directory to replicate changes throughout the topology, you should absolutely wait for the changes of each step to be replicated before continuing with the next step. In a distributed environment such a change needs to be properly planned and would typically take place during a maintenance window.&nbsp;Installing Exchange 2013With all prerequisites checked, we can now continue with the installation of our first Exchange 2013 server. Easy as it is, I&rsquo;m not going to walk through graphical setup screens, you basically just select the server roles to be installed and click next. There is a command line version of the setup, too. Try setup.exe /help:Install for a list of parameters that can be used to customize the installation. The Exchange setup is pretty smart, meaning that it keeps track of the installation and if errors occur, you will be able to continue right from where the error happened, no need to click through all the windows again. It also provides a lot of information in the ExchangeSetupsLogs folder, located at the root of the drive on which Exchange is installed.Something new with setup is that you cannot remove server roles anymore, the only way to do that would be to completely uninstall Exchange and re-install the role of choice.So, installing Exchange 2013 was pretty easy, let&rsquo;s move on the the more interesting stuff.Managing Exchange 2013The first thing I wanted to see after the setup completed, was the shiny new Exchange Admin Center, so I went straight to IE and typed https://localhost/ecp, I entered my credentials on the neat, new login screen only to see the good, old Exchange Control Panel from 2010. It took some time, but then I realized that that was exactly correct behavior. The Exchange 2013 Client Access Role is a stateless proxy and no longer responsible for rendering OWA (or anything for that matter) and my mailbox was still on Exchange 2010, so my request got proxied to 2010. There are two solutions for this, move your admin mailbox to 2013, or less troublesome, simply add ?ExchClientVer=15 to the URL. https://localhost/ecp?ExchClientVer=15 takes you right to the Admin Center. This is also the only way (I found) to access the Admin Center with a user that has no mailbox.From an Exchange Management Shell point of view, everything is very similar to the way we are used from Exchange 2010, a new remoting session can simply be created using:$Session = New-PsSession &ndash;ConnectionURI &lsquo;http://ex15.tomt.local/PowerShell&rsquo; &ndash;ConfigurationName 'Microsoft.Exchange&rsquo; Import-PsSession $SessionThat&rsquo;s it for the first part, in the second part I&rsquo;ll try to cover the basics of namespace planning, mail routing and maybe move some mailboxes.I see some real world projects coming closer and I know Daniel is working hard on the topic, I&rsquo;m sure there is more content coming&hellip; :)so long, enjoy your weekend!tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-1/\"\n},{\n  \"id\": \"post-whats-happening-these-days\",\n  \"title\": \"What’s happening these days…\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"It has been quiet around here for some time, so what have I been up to?Well, on one side, I’m having fun at the Scripting Games (http://scriptinggames.org/) where I learn quite a bit (more from reviewing other entries, than from my own coding) and try to to improve my PowerShell skills. I’ll point out some of the things I’ve learned later on.On the other side, I’ve decided to quit my job in the heart of the Italian Alps and accepted a role in Germany, in the nice city of Paderborn. So the last few weeks have been pretty busy for me, moving my stuff from northern Italy way up to northern (at least for me) Germany. Right now I am trying to get used to my new surroundings and I do learn something every day :)So, what are my key takeaways from the Scripting Games so far?   Standard cmdlet parameter names: While I did know that there was a list of allowed Verbs (Get-Verb), I wasn’t aware that there was something similar for parameter names and types, too. Check out MSDN for more information.    Help and comments should be nested under the function, so if you are used to just press “Ctrl+J” to insert a new “empty” function and start from there, remember to move the help inside the function { } block.    ConvertTo-HTML has some really neat parameters like –Head, –PreContent and –PostContent so you can enhance and customize the HTML report generated by the cmdlet.    I started to use splatting to set parameter values and think this is really useful, basically you assign common values for parameters to a hash table and pass it to the cmdlet. I’ll post quick example later.    Filter, I tend to get every possible bit of information and then use Where-Object to select the few properties I really need, that’s not really efficient as most cmdlets provide a way to filter or just ask for the properties you need. And here comes the example for splatting:if ($Credential) {     &#160;&#160;&#160; $wmiParam = @{'Credential'=$Credential; 'ErrorAction'=&quot;Stop&quot;}      } else {      &#160;&#160;&#160; $wmiParam = @{'ErrorAction'=&quot;Stop&quot;}      }       Get-WmiObject @wmiParam –ComputerName “myComputer” –Class “Win32_Processor”This passes a hash table (wmiParam) to the Get-WmiObject cmdlet, so I don’t have to set the ErrorAction every time and the Credential parameter is only used when a $Credential object exists.&#160;Yeah, and that’s what’s new with me :)tom\",\n  \"url\": \"https://onprem.wtf/post/whats-happening-these-days/\"\n},{\n  \"id\": \"post-joining-wifi-before-login-on-mac-os-x-108\",\n  \"title\": \"Joining WiFi before login on Mac OS X 10.8\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\"],\n  \"content\": \"We had an interesting problem at work recently, as the solution was a little complex I decided to write about it here. So, as the title suggests, we are talking Wireless networking, authentication and Mac OS X today. It’ll be fun, trust me :)Some prerequisites: We use EAP-TLS as the authentication protocol for WiFi and SCEP for certificate enrollment. I’ve written about SCEP before, in a different context, though. We also use the iPhone Configuration Utility to deploy configurations to devices, more on that later. The ProblemWe join our MACs to the Active Directory domain and want our users to be able to login using their domain credentials. Obviously you need some sort of connectivity to the AD in order to login, we used to configure Wireless Networks as “System Profile” in OS X in the past. Unfortunately, that GUI went away in more recent versions of that operating system.This is a screenshot of 10.5, simple enough. As we tried to configure that same thing on 10.8, though, we realized that this little option was gone. All Wi-Fi networks would be started AFTER the used login, no AD login was possible. Oops.After scratching our heads for a while, we found a workaround other than installing Windows ;)The SolutioniPhone Configuration Utility was used ever since we had the requirement to connect iOS devices to the wireless network, it can be used to create configuration files that can be deployed to iOS devices. It has been possible for some time to deploy these same configuration files to OS X, too. As they are simple XML files, we took a deeper look into them. Wwith some help from Google we found that we could change the Wi-Fi payload to be a “System Profile” instead of a “User Profile”, and thus be started BEFORE user login.So, first thing is to create a configuration profile using iPhone Configuration Utility. Choose a name, identifier and description for the profile. Add the certification authorities certificate, so we trust certificates issued by our internal CA.  Configure SCEP, the iPhone or MAC is going to connect to the SCEP URL to enroll a certificate using the specified subject. Add the Wi-Fi payload, specifying the SSID and authentication protocol. As we use EAP-TLS we use the SCEP certificate to authenticate.Once the profiles is configured, export it: We get a .mobileconfig file from the export, it can be edited using a simple text editor. Here comes the fun part, we have to add the following lines to the configuration file:&lt;key&gt;SetupModes&lt;/key&gt;      &lt;array&gt;       &lt;string&gt;System&lt;/string&gt;       &lt;/array&gt;       &lt;key&gt;PayloadScope&lt;/key&gt;       &lt;string&gt;System&lt;/string&gt;This part goes just underneath the PayloadOrganization in the AutoJoin section.And we have to change “Configuration” at the very end of the file from:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;Configuration&lt;/string&gt;to “SystemConfiguration”:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;SystemConfiguration&lt;/string&gt;As it is quite important where you change/add the lines, I’ll paste a complete file for reference.&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      &lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;       &lt;plist version=&quot;1.0&quot;&gt;       &lt;dict&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AutoJoin&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPClientConfiguration&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AcceptEAPTypes&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;13&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPACAnonymously&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTUsePAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateAnchorUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EncryptionType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WPA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;HIDDEN_NETWORK&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures wireless connectivity settings.&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WiFi (MYSSID)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.wifi1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SetupModes&lt;/key&gt;        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadScope&lt;/key&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.wifi.managed&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;2CD56B1A-068C-4F3C-AC43-9D4E2115260F&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServer&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;proxy.ntsystems.it&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServerPort&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;8080&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Manual&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SSID_STR&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;MYSSID&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateFileName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MIIDYzCCAkugAwIBAgIQL1CM7d+PQrhAgO7UcdHbyDANBgkqhkiG&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bnBODc20wZMRDAhWuA==       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Provides device authentication (certificate or identity).&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.credential2&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.root&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Challenge&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;4F20EACEDE479165&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Type&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;RSA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Usage&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;0&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Keysize&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;2048&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Name&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Retries&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;3&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;RetryDelay&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;10&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Subject&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;CN&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;macbookair$&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;URL&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;https://scep.tomt.it/certsrv/mscep/mscep.dll&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures SCEP&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;SCEP (tomt-DC01-CA)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.scep3&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.scep&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt-wlan&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadRemovalDisallowed&lt;/key&gt;       &#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160; &#160; &lt;string&gt;SystemConfiguration&lt;/string&gt;        &#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;B58A2BCB-7617-421B-B0C8-12DE22B5A2B1&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &lt;/dict&gt;       &lt;/plist&gt;Now, if we copy that file to the MAC OS X machine, we can import the wireless configuration and it will be a system profile. Phew.(In this case we need some sort of connectivity in order to enroll for a certificate over SCEP, this could be via LAN or an open guest Wi-Fi)SummaryIt might be though to get your head around this if EAP-TLS and SCEP are new, yet the same idea holds through for a Username/Password or even pre-shared key authentication protocol. The problem remains the same, Wi-Fi user profiles are started after the user logs on, rendering Active Directory logins impossible. We couldn’t find a solution to change that behavior without the iPhone Configuration Utility.Would be happy to hear about others experiences with this stuff.Special thanks to my mate @eduriz :)&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/joining-wifi-before-login-on-mac-os-x-108/\"\n},{\n  \"id\": \"post-patching-office-web-apps-server\",\n  \"title\": \"Patching Office Web Apps Server\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Today I started my day with an Office Web Apps Farm that was not working anymore. After reviewing the Event Log I figured something strange happened… :)The Event Log was basically full with .Net Runtime and Application Errors, I’ll paste some for reference:Log Name: ApplicationSource: .NET RuntimeEvent ID: 1026Application: ppteditingbackendwatchdog.exeFramework Version: v4.0.30319Description: The process was terminated due to an unhandled exception.Exception Info: System.TypeInitializationExceptionStack:&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.ServiceInstanceFinder.GetLocalAgentInstance(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.PrepareRegistrations(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.WatchMachines(Microsoft.Office.Web.Common.OfficeServiceType, CheckServiceInstance, Microsoft.Office.Web.Common.OfficeServiceType, System.String)&amp;#160;&amp;#160; at Microsoft.Office.Server.Powerpoint.Watchdog.EditingBackend.Program.Main(System.String[])...Log Name: ApplicationSource: Application ErrorEvent ID: 1000Faulting application name: ppteditingbackendwatchdog.exe, version: 15.0.4481.1000, time stamp: 0x50ee5a9eFaulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988aa6Exception code: 0xe0434352Fault offset: 0x000000000003811cFaulting process id: 0x94cFaulting application start time: 0x01ce2b83409e789aFaulting application path: C:\\\\Program Files\\\\Microsoft Office Web Apps\\\\PowerPointEditingServicesWatchdog_App\\\\ppteditingbackendwatchdog.exeFaulting module path: C:\\\\Windows\\\\system32\\\\KERNELBASE.dllReport Id: 7e88e5ec-9776-11e2-93f3-0050569e79e3Faulting package full name:Faulting package-relative application ID: There would be the same errors for all of the Web Apps (Excel, Word…) Needless to say, neither SharePoint 2013 nor Lync 2013 would be able to leverage features that required Web Apps Server. So, what’s next?Well I continued digging through the Event Log and realized that the Server was patched and restarted very recently, as part of the patching someone applied KB2760445. Sweet.So I started searching TechNet for information on that Update for Office Web Apps and found a nice article on how to Apply software updates to Office Web Apps Server. Basically it goes like this: After patching the Server, you will have to re-create the Office Web Apps Farm. In my case, I simply removed the farm usingRemove-OfficeWebAppsMachineand then re-used the same cmdlet I used to create the Web Apps Farm initially.New-OfficeWebAppsFarm -InternalUrl \\\"https://myOWAserver.tomt.local\\\" -ExternalUrl \\\"https://office.ntsystems.it\\\" –CertificateName \\\"ntSystems OfficeWebApps\\\" –EditingEnabledAll set.If there is one take-away from this, it is very likely: Read that documentation, oh, and please, do test!Tom\",\n  \"url\": \"https://onprem.wtf/post/patching-office-web-apps-server/\"\n},{\n  \"id\": \"post-prepare-windows-server-2012-for-lync-2013\",\n  \"title\": \"Prepare Windows Server 2012 for Lync 2013\",\n  \"author\": \"dni\",\n  \"tags\": [\"Lync\",\"Skype4B\"],\n  \"content\": \"To prepare a Windows Server 2012 for a Lync 2013 installation, install the following features manually before you run the Lync setup:.Net Framework 3.5Windows Identity Foundation 3.5   Media Foundation    HTTP Activation    Use the Powershell to speed up the installation:Install-WindowsFeature –name NET-Framework-Core –source D:\\\\sources\\\\sxs (the Windows 2012 Disk is mounted on D: )Install-WindowsFeature –name Windows-Identity-Foundation,Server-Media-Foundation,NET-HTTP-ActivationIf you have to prepare the AD schema, install also the AD DS Administration Tools.\",\n  \"url\": \"https://onprem.wtf/post/prepare-windows-server-2012-for-lync-2013/\"\n},{\n  \"id\": \"post-installing-lync-2013-updates\",\n  \"title\": \"Installing Lync 2013 Updates\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Server\",\"Skype4B\"],\n  \"content\": \"A few days ago, Microsoft released a bunch of updates for Lync 2013. I will walk through the required steps to upgrade a Lync 2013 Standard Edition server in this post. The February updates for Lync 2013 enable some new features including Lync 2013 mobile Clients, Group Call pick-up and many more…Get Files and read documentationHead over to the download center and download the update files: http://www.microsoft.com/en-us/download/details.aspx?id=36820Make sure you read the corresponding KB article as there are some manual steps required after the update: http://support.microsoft.com/kb/2809243InstallPrior to installing the updates stop the Lync Services, you can use the –Graceful parameter:Stop-CsWindowsService –GracefulYou can use Get-CsPoolUpgradeReadinessState to check if the pool you are going to update is ready.Copy all the files from the download to a local folder on the Lync Server, open LyncServerUpdateInstaller.exe and install the updates by clicking “Install Updates”&#160;After installing the updates, check the folder with the update files for logs. If everything installed correctly, reboot the server.Update DatabasesAfter the reboot, the databases need to be updated, too. On a standard edition front end server, the databases are installed locally, so you can update them using the following cmdlets:Install-CsDatabase -ConfiguredDatabases -SqlServerFqdn lyncfe.ntsystems.local –VerboseThe Central Management Store needs an update too, it is also co-located on the standard edition server:Install-CsDatabase -CentralManagementDatabase -SqlServerFqdn lyncfe.ntsystems.local -SqlInstanceName rtc –VerboseAfter that, the newly published topology needs to be enabled, this can be done using the Enable-CsTopology cmdlet.Enable-CsTopologyNow the last step is to run the Bootstrapper on the updated front end servers, it can be found on the Lync Server in the following path:&quot;%ProgramFiles%\\\\Microsoft Lync Server 2013\\\\Deployment\\\\Bootstrapper.exe&quot;That should be it and the Lync 2013 February updates have been installed.so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/installing-lync-2013-updates/\"\n},{\n  \"id\": \"post-activesync-forefront-tmg-and-accountlockoutthreshold\",\n  \"title\": \"ActiveSync, ForeFront TMG and AccountLockoutThreshold\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\",\"Security\"],\n  \"content\": \"The use of smartphones and other mobile email clients has been increasing for quite some time. With ActiveSync being one of the widest-used protocols comes the need to manage another set of devices. As users are forced to change their domain account&rsquo;s passwords from time to time, some might forget to update their smartphones as well.The ProblemSo, as a user changes their password, the mobile device will continuously try to sync with a wrong set of credentials. Now depending on the rate at which it tries to sync, this might very well lock-out the users AD account, depending on the Domains Password Policy.Another possibility to consider is an attacker who could create quite a disturbance by locking out accounts intentionally, using any published Web Site with Forms Base Authentication.The SolutionForefront TMG 2010 SP2 comes with a new feature, called AccountLockoutThreshold. Forefront TMG keeps track of failed logons and locks the account locally, after a specified amount of failures. After that, any other attempt to authenticate via TMG is not forwarded to Active Directory/LDAP, so that the users account does not get locked-out continuously .The AccountLockoutThreshold feature is local to the Forefront TMG server, so if there is an array of publishing servers, it has to be configured on each of them. It can only be configured for Web Listeners using Forms Based Authentication.To configure AccountLockoutThreshold we need to use PowerShell, there is no GUI that exposes this setting. A great script to control the settings is available in the Script Center. So, we copy the script and save it to a *.ps1 file on the Desktop of the TMG Server, then we use dot-sourcing to load it into an administrative PowerShell session.Example: I saved the script to AccountLockout.ps1 on the Desktop. Use &ldquo;. .\\\\Desktop\\\\AccountLockout.ps1&rdquo; to import the script.The Get-AccountLockoutSetting cmdlet is used to retrieve the current settings.&nbsp;The Set-AccountLockoutSetting cmdlet is used to configure the feature.Example: I use &ldquo;Set-AccountLockoutSetting -WebListener OWA -EnableAccountLockout $true -AccountLockoutThreshold 5 -AccountLockoutResetTime 300&rdquo; to enable the AccountLockout feature, accounts will get locked out for 300 seconds if there are 5 consecutive failed attempts.Once configured, the following event will be logged to the Application Log of the TMG server if an account gets locked out locally:Source: Microsoft Forefront TMG Web Proxy Event ID: 32581 Level: Error Text: limit for consecutive logon failures has been reached. Additional logon attempts by domain.local\\\\user.name will be automatically rejected for the next 300 secondsUnfortunately TMG has been discontinued and is no longer available for customers, but for anyone already using it, this should help you dealing with Account Lockout Policies and ActiveSync devices.&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/activesync-forefront-tmg-and-accountlockoutthreshold/\"\n},{\n  \"id\": \"post-lync-2013-(client)-and-lyncdiscoverinternal\",\n  \"title\": \"Lync 2013 (Client) and LyncDiscoverInternal\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Client\",\"Skype4B\"],\n  \"content\": \"Daniel and I have been quite busy implementing Lync 2013 these days. One interesting gotcha thing we knew, but didn’t give a lot attention about the Lync 2013 client is, that it makes use of the LyncDiscover and LyncDiscoverInternal DNS records. These records were introduced with Lync 2010 Mobility and were used by the mobile clients to locate a sign-in server. Lync 2010 Clients don’t look for them, they use _sipinternaltls._tcp and _sip._tls records for auto sign-in.With the Lync 2013 Client that changed. The new client now queries for the following DNS records in order to sign-in automatically:   LyncDiscoverInternal.ntsystems.it    LyncDiscover.ntsystems.it    _sipinternaltls._tcp.ntsystems.it    _sip._tls.ntsystems.it    sipinternal.ntsystems.it    sip.ntsystems.it    sipexternal.ntsystems.it  So, as you can see, even before trying to locate the SRV records, the 2013 Client tries to connect to the AutoDiscover Web Service. That works just fine, in most situations.But… in a configuration like the following you might run into this bug get a certificate warning when signing into Lync for the first time from the internal network.   You have a disparate namespace (like ntsystems.local for your Lync Servers while ntsystems.it is your SIP domain) AND    You use internal certificates on the Front End Servers AND    You have Split DNS configured (ntsystems.it on the internal DNS servers) AND    You set LyncDiscoverInternal.ntsystems.it DNS record (for public zone on internal DNS server) The certificate warning shows the server name to which Lync is attempting to connect, it also shows the certificate subject and you can view the certificate. You double (triple) check the certificate, subject alternate names, dates, DNS, basically everything and it seems to be just fine. Still, you continue to get the warning.WorkaroundFirst of all, I have to say that I do not fully understand why this happens. The way I see it, is that Lync 2013 connects to the internal Web Service (using LyncDiscoverInternal) and all certificate parameters are fine… As you are probably not going to get a certificate for ntsystems.local from a public CA I wonder what the right solution looks like…The good news: There is a workaround for this, you can use Group Policy to configure Lync 2013 to configure the Trusted Domain List. According to TechNet, this “Lists the trusted domains that do not match the prefix of the customer SIP domain.” – nice. So, I added ntsystems.local to the Trusted Domain List that can be found in User and Computer Configuration under: Administrative Templates/Microsoft Lync 2013/Microsoft Lync Feature PoliciesYou can download the admx/adml files for Office 2013 here. The Group Policy adds the domain to the either “HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync\\\\TrustModelData” or “HKEY_CURRENT_USER\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync\\\\TrustModelData” depending on what you choose in the Group Policy Object. Another workaround would be to simply remove the LyncDiscoverInternal record from the internal DNS zone, which breaks mobile clients (including Lync Windows Store App) on the internal network (Wireless). Not really a solution…Again, I don’t fully understand the problem, this is what I found during my research. If you have a better solution, please drop me a line :)&#160;Happy New Year and have a nice weekend,    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-(client)-and-lyncdiscoverinternal/\"\n},{\n  \"id\": \"post-lync-2013-installation-and-certificates\",\n  \"title\": \"Lync 2013 – Installation and Certificates\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Server-2012\",\"Skype4B\"],\n  \"content\": \"This post is the follow-up to the one about AD and topology preparation and I will again use screenshots to walk through the Installation and Certificate request and assignment processes.DNS RecordsThe last post ended with publishing the Topology, after that, the wizard provides a simple To-Do list, summarizing the next steps. Creating the DNS records for our Simple URLs was one of them. So, using DNSmgmt.msc I created CNames for the meet, dialin and lyncadmin URLs, all pointing to the Lync Front End Server.The DNS Records used for automatic sign-in are not mentioned in said To-Do list, though. I created the sip.tomt.local record as just another alias pointing to the Lync FE Server. Automatic Sign-in also needs the following Service Location Record (SRV)_sipinternaltls._tcp.tomt.local SRV service location:     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; port&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 5061      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; svr hostname&#160;&#160; = lyfe01.tomt.localAll in all, I do now have the following DNS Records:            HostName        RecordType        RecordData                  _sipinternaltls._tcp        SRV        [0][0][5061][lyfe01.tomt.local.]                  lyfe01        A        10.1.1.11                  dialin        CNAME        lyfe01.tomt.local.                  meet        CNAME        lyfe01.tomt.local.                  sip        CNAME        lyfe01.tomt.local.                  lyncadmin        CNAME        lyfe01.tomt.local.        Server PrerequisitesThe next step is to install the prerequisites on the Lync Server, for more information check TechNet. I use the following PowerShell cmdlet to install Lync Server prerequisites, make sure you specify a “–Source”.   Add-WindowsFeature NET-Framework-Core, NET-Framework-45-Features, RSAT-ADDS, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Redirect, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Http-Tracing, Web-Windows-Auth, Web-Client-Auth, Web-Basic-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, Web-Mgmt-Console, Web-Scripting-Tools, Web-Request-Monitor, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Mgmt-Compat, Desktop-Experience, Telnet-Client, BITS, Windows-Identity-Foundation –Source ‘D:\\\\sources\\\\sxs’ –Restart&lt;/code&gt;  Now after the reboot open Lync Deployment Wizard again and click &quot;Install or Update Lync Server System&quot;    After installing Local Configuration Store and Lync Server Components, we need to request and assign Certificates for Lync to use.    If you use an online (enterprise) CA, select send request immediately, if you intend to send the request to a public CA, select the offline certificate request option. As I have ADCS installed in my test forest, I use the enterprise CA for this.    Optionally specify credentials and a certificate template, if your current user has permissions to request a certificate using the “WebServer” template, click next. Then specify the friendly name for and the key length for the certificate.    Lync automatically includes the required Alternative Names along with Simple URLs and external pool name. Other details (such as City, Country, Region) typically used in certificate requests can be specified too.    Select the SIP Domains, so that they are included, too. You can optionally add additional SANs, I didn’t need any more than the ones included by the wizard.  Request the Certificate and tick the “Assign this certificate…” checkbox.    If you plan to use Server-to-Server authentication (Office Web Apps, Exchange, SharePoint) also request an OAuth Certificate. The procedure is the same as for the Server certificate.    The OAuth Certificate is a &quot;Global&quot; Certificate, that means that Lync Central Management Store replicates it to all Lync Servers, and all Lync Servers will use the same Certificate for OAuth.  Starting the Services  Phew, now after all those steps, we can finally go ahead and start the services. Give it some time, and check if all services are started using services.msc.  Now, we can use Lync Server Control Panel to check out our work. I prefer to use the Control Panel on my client PC, as it requires Silverlight to be installed. So, on a Computer sporting Silverlight, open the Simple Administration URL specified before.     I will continue to test some features of Lync 2013, stay tuned for more!  &#160;  so long, have a nice weekend!   tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-installation-and-certificates/\"\n},{\n  \"id\": \"post-lync-2013-prepare-ad-and-build-topology\",\n  \"title\": \"Lync 2013 – Prepare AD and build Topology\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Server-2012\",\"Skype4B\"],\n  \"content\": \"In this post I use the screenshots taken in my test environment to walk through the steps of setting up a Lync 2013 Standard Edition Front End Server in a test environment.Install Deployment ToolsFirst of all we need to install the Lync Deployment Wizard on a server, this doesn’t necessarily have to be the Lync Server, although it’s a good idea to use this server. So, start Setup and select a location for the installation files.&#160;After that installation finishes, we we start the Deployment Wizard and install the administrative tools. Preparing Active DirectoryWarning: This is going to update the AD schema, make sure you are in test environment.From the Lync Server Deployment Wizard click “Prepare Active Directory” and update schema, prepare the forest as well as the current domain. The following cmdlets can be used to check domain/forest readiness.Get-CsAdDomain: If Domain is ready: LC_DOMAINSETTINGS_STATE_READY    Get-CsAdForest: If Forest is ready: LC_FORESTSETTINGS_STATE_READYNow preparing the current domain created some AD groups used by Lync. Add the account used to administer Lync to the CSAdministrator group.Define TopologyAfter preparing Active Directory we are ready to create a new Topology using the Topology Builder. So we start Topology Builder and create a new TopologySpecify a primary SIP domain, additional SIP domains can be specified in the next step.The first thing we need to create is a new Site within our new topology, specify a name and some details for the first Lync SiteStart the New Front End Pool wizard after finishing the New Topology wizard and enter the FQDN of your Lync Standard Edition Server. Specify the Lync Server Features to be installed on this serverAs we add Enterprise Voice and Conferencing we need a Mediation Server, tick the check box to Collocate the Mediation ServerDefine the SQL Store for the front end pool, as we install a Standard Edition Server we cannot change this Select a File Share that has already been added to the Topology builder or create a new one Specify the external URL, this URL will be used by external clientsAssociate an Office Web Apps Server that has already been added to the Topology or add a new one, if you have oneIf you selected the Monitoring on the features page, specify a SQL instance with Reporting Services. This can be installed locally or on a remote SQL server After finishing the new Front End Pool wizard, configure Simple URLs and Associate Central Management Server by right clicking “Lync Server” and selecting Edit Properties in the Topology BuilderCheck the Configured Settings and publish the Topology by selecting Action from the menu and clicking “Publish Topology”Ok, nice work. We have just created and published our Lync 2013 Topology. Time to get the Server ready.In the next post I will walk through the actual installation of the Lync 2013 Standard Edition Front End Server.so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-prepare-ad-and-build-topology/\"\n},{\n  \"id\": \"post-lync-2013-voicemail-escape\",\n  \"title\": \"Lync 2013 – Voicemail Escape\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Lync\",\"Skype4B\"],\n  \"content\": \"With the availability of all Office Wave 15 products, Lync 2013 piloting has begun. Exciting times :)So, this is a quick post about a new feature in Lync Server 2013, voicemail escape. What this does is, essentially providing a &ldquo;too soon&rdquo; timer for PSTN calls. Ok, you might say, why do I need such a thing?Well, if an enterprise voice user configures simultaneous ringing on her mobile phone, and that phones battery died or she wandered into an area with no network coverage, her provider&rsquo;s voicemail would answer. Now, even if she was sitting on her desk, she might never get the call, as the caller would always go to her voicemail. Voicemail escape defines a timer using the &ldquo;Set-CsVoicePolicy&rdquo; cmdlet, if a call is answered before that timer elapsed, Lync would ignore that answer and keep the call on premises.Enable the VoicemailEscapeTimer:Set-CsVoicePolicy -EnableVoicemailEscapeTimer:$true -PSTNVoicemailEscapeTimer:5000EnableVoicemailEscapeTimer enabled the timer. PSTNVoicemailEscapeTimer sets the timer (in ms) used to determine whether or not a call has been answered &ldquo;too soon&rdquo;.MonitoringThe Lync Monitoring server shows those ignored answers with a SIP Response Code of 480 and a Reason of: &rsquo;Terminating call as it is answered earlier than the specified voicemail escape timer&rsquo;The Lync Server Logging tool (Component: S4, Level: All) shows the timer in the SIP INVITE packet as:ms-vm-escape-timer: 5000You may have to tune the timer depending on your setup and the providers you are using. I had to set it pretty high to actually see an effect.so long, tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-voicemail-escape/\"\n},{\n  \"id\": \"post-windows-server-2012-virtualized-domain-controller\",\n  \"title\": \"Windows Server 2012 – Virtualized Domain Controller\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"Hello, welcome and a very happy new year!During Windows Server 8 Beta times, I wrote about virtualizing Domain Controllers and the VM-GenerationID attribute, since the old post was in German and about the beta version, this will be an updated translation.ProblemThe problem in Active Directory versions before 2012 was, that the restore of a snapshot would introduce a condition known as USN-Rollback, breaking replication between Domain Controllers. For that reason, DCs could not leverage all features of a modern, virtualized environment. Cloning a DC was pretty much unthinkable. Until now!VDC Safe RestoreThe Active Directory replication model assigns an ongoing number to every transaction (Update Sequence Number). DCs keep track of these numbers, along with a unique identifier (Invocation ID) for each replication partner. If a DC was rolled back in time (applying a snapshot), that DC would start reusing aged USNs and, therefore, replication partners would refuse the updates and terminate the replication partnership. The only resolution for this problem was to manually remove the DC from the Active Directory.Now, Windows 2012 introduces a feature to tackle that problem. The Hypervisor exposes a VM-Generation ID through the ACPI table, this ID is saved in the Domain Controllers memory. If the VM-Generation ID changes (e.g. when a snapshot is applied), the restored DC knows that something happened and resets it’s invocation ID.&#160;As replication partners have never heard of the new Invocation ID before, they don’t care about USN reuse and replicate like it was a new relationship. Apart from resetting the Invocation ID, the DC also, non-authoritatively restores SYSVOL and logs the following Event to the “Directory Services” Event Log.The new Active Directory attribute used to store the VM-Generation ID is ms-DS-Generation-Id, find more information about that attribute on MDSN.There is no need (and no way) to configure VDC Safe Restore, as long as the Hypervisor supports VM-Generation ID, it automatically works. In a recent blog post VMware announced support for VM-Generation ID for it’s vSphere platform, so now you can choose Hyper-V 2012 and VMware’s ESXi as Hypervisor for your Domain Controllers.A word of caution at the end, never, and I mean NEVER, stop taking regular (AD aware) backups! The feature discussed in this post is meant just to solve the USN-Rollback issue, it is in no way a replacement for a backup as the DC is restored in a non-authoritative way.Stay tuned for DC cloning :)&#160;so long, have a nice weekend!   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-2012-virtualized-domain-controller/\"\n},{\n  \"id\": \"post-powershell-v3-invoke-webrequest\",\n  \"title\": \"PowerShell v3 Invoke-WebRequest\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Today I have a quick function to download the current Sysinternals Suite from http://live.sysinternals.com. I created this mainly to learn/try some concepts of PowerShell, if you have any hints/ideas feel free to drop me a mail.This function leverages the new &lsquo;Invoke-WebRequest&rsquo; cmdlet, available in PowerShell v3, so, obviously V3 is required.Example use:Update-SysinternalsSuite -Path C:\\\\tools\\\\sysinterals &ndash;AsJobThis downloads the Sysinternals Tools to C:\\\\tools\\\\sysinternals. If the specified folder does not exist, the script creates it. It also makes use of background jobs, so you can keep using PowerShell during the download.I&rsquo;ve posted the Function to PoshCode:&nbsp;enjoy, tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-v3-invoke-webrequest/\"\n},{\n  \"id\": \"post-microsoft-ndes-and-cisco-ios-part-2\",\n  \"title\": \"Microsoft NDES and Cisco IOS – part 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Network\"],\n  \"content\": \"This is part two of my article about NDES and Cisco. In the first article, I configured the Windows 2012 NDES role, in this part I will walk you through the enrollment process on a Cisco IOS router.RSA keySo what are we going to do here? We will be leveraging SCEP to obtain a digital certificate from a CA. As a prerequisite to this, the router needs a key-pair, that is, private and public keys. The public key will be sent to the CA (using SCEP), the CA will sign that public key and send the certificate (signed public key) back to the router.If you are already using services like “ssh” or “ip http secure-server” you can use the existing keys. If no keys exist, the router will create a new set of keys as we enroll for a certificate. This auto generated key-pair is only using a 512 bit key, that is not considered secure anymore.To create a new key-pair, using a reasonable secure key length:&#160;TrustpointHaving the keys in place, we need to get the CA certificate. The router will use the CAs public key to authenticate the CA and other digital certificates issued by that same CA.To download the CA certificate we define a new trustpoint and set to enrollment URL to the SCEP URL, if you have no name resolution configured, be sure to use the IP address of the SCEP server instead of the name.The SCEP URL defaults to: http://servername:80/CertSrv/mscep/mscep.dll After configuring the trustpoint, we tell the router to download the CA certificate: ´IOS shows the Thumbprint (fingerprint) of the digital certificate, so one could verify that this is the correct certificate using an out-of-band method.A quick look at the running-config shows that the key was received.EnrollNow that the router does trust our CA we can go ahead and request a digital certificate: IOS prompts for a password that would be used to revoke the certificate, and you can choose to add the IP address or serial number to the certificate. The request gets signed by the CA and the certificate is sent back to the router, you should see the following messages in the log or on “terminal monitor”CRYPTO_PKI:&#160; Certificate Request Fingerprint MD5: 4C9C472F 605AA33F 869EB167 9F097C56    CRYPTO_PKI:&#160; Certificate Request Fingerprint SHA1: E943141D 19A5C4EB 6B5EE5D2 B87AAF57 B829FFED     %PKI-6-CERTRET: Certificate received from Certificate AuthorityThe IIS Log on the SCEP server shows the successful transaction like this:2012-11-30 18:58:19 192.168.1.21 GET /CertSrv/mscep/mscep.dll/pkiclient.exe operation=PKIOperation&amp;message=MIIJUgYJKoZIhvcNAQcCoIIJQzCCCT8CAQExDjAMBggqhkiG…   …2Bw6Q1AJGzQs4wl7jA4GvWvikdP1wnPzAkVP7KZ%2FZ1%2Fz4hCYNpP4%3D%0A 80 - 192.168.1.1 - - 200 0 0 277In the “Certificate Authority” MMC Snap-In you see the certificates that have been issued:  &#160;That was the second, and final part on NDES and IOS routers.so long,tom\",\n  \"url\": \"https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-2/\"\n},{\n  \"id\": \"post-microsoft-ndes-and-cisco-ios-part-1\",\n  \"title\": \"Microsoft NDES and Cisco IOS – part 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"Cisco\",\"Security\"],\n  \"content\": \"With digital certificates being the de-facto standard for authentication, a handy enrollment model is key (pun intended). Microsoft included it’s NDES or Network Device Enrollment Service as a Role in Windows 2008, it has been available as add-on for Windows 2003, too. NDESSo, NDES sounds pretty cool, but what is it, you may wonder. It’s Microsoft’s implementation of SCEP or Simple Certificate Enrollment Protocol, which is a PKI communication protocol that leverages existing PKCS#10 and #7 technology over HTTP. It provides a simple means of requesting and issuing digital certificates across different devices and vendors.&lt;/p&gt;Installing NDES on Windows Server 2012To use SCEP with your existing ADCS based PKI simply add the Role to the Server that provides CA Web Enrollment. I’m not going through the details of setting up a ADCS based PKI here, that might very well be a topic for a future post, though.Add the Role using ServerManager or Windows PowerShell:Install-WindowsFeature –Name ADCS-Device-EnrollmentConfiguring NDESAfter successful installation of the Role, ServerManager informs you that there is some sort of configuration required for the newly added feature.An AD user account is required for the NDES service to use. That account must be member of the local IIS_IUSRS group on the NDES Server. I created a user with the name of scep and added it to the group before starting the configuration wizard.Select the Service Account:Fill in information required for the RA certificate. What happens here, is that the NDES Server is issued two Registration Authority certificates, which are then used for SCEP:Configure cryptographic settings for the RA keys:After reviewing the settings, and clicking Configure you will see the RA certificates in the personal store of the NDES Server: &lt;/p&gt;Configure NDES CA settingsThe certificate template used by NDES defaults to IPSECIntermediateOffline, that can be changed by modifying the following registry keys:HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\\\\MSCEPEncryptionTemplateGeneralPurposeTemplateSignatureTemplateI decide to go with the WebServer template, so I update the registry and restart the certsvc service. Keep in mind, that the service-user account (TOMT\\\\scep, in my lab) needs permissions to enroll for the selected certificate template. This can be configured using the Certificate Templates MMC Snap-In:NDES requires a challenge for every certificate transaction, unfortunately there seems to be no such setting in Cisco’s SCEP implementation. That default can be changed by setting the following registry key to 0:HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\\\\MSCEP\\\\EnforcePassword\\\\EnforcePasswordWarning: This disables the need for a challenge, so that essentially anyone with knowledge of your NDES server can enroll for certificates.Restart the certsvc service after modifying the registry:Get-Service certsvc | Restart-ServiceConfigure NDES IIS settingsIIS request filtering sets the value for MaxQueryString to 2048 by default, a reasonable key length is at least 1024, more often 2048. You see the problem, that value needs to be changed in order to support strong keys.Use appcmd to change the value for MaxQueryString:%systemroot%\\\\system32\\\\inetsrv\\\\appcmd.exe set config /section:system.webServer/security/requestFiltering /requestLimits.maxQueryString:\\\"4096\\\" /commit:apphostIf you don’t update MaxQueryString you will see error 404.14 Query string too long in the IIS log.There is a really good guide to NDES on TechNet Wiki.That’s it for the first part, our NDES on Windows Server 2012 is configured and ready to go. Stay tuned for part 2.— Tom\",\n  \"url\": \"https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-1/\"\n},{\n  \"id\": \"post-get-access-to-a-windows-2012-server-without-a-password\",\n  \"title\": \"Get access to a Windows 2012 Server without a password\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2012\"],\n  \"content\": \"In this article, I will explain how you get access to a Windows Server without a password.When the server boots up you have a nice feature “Easy access” on the logon screen. In the next steps, we change the “Easy Access” function with a cmd command prompt:1. Boot with the Server 2012 CD and select “Repair your computer”2. Select “Troubleshooting” and “Command prompt”       3. Get the drive letter of your System Volume with diskpart4. Rename the utilman.exe file to utilman.old and copy cmd.exe to utilman.exe5. Reboot the server and start the “Easy Access” feature. You will get a command prompt. Now type whoami and you will see that you can run commands under the local system accountND\",\n  \"url\": \"https://onprem.wtf/post/get-access-to-a-windows-2012-server-without-a-password/\"\n},{\n  \"id\": \"post-sharepoint-2013-change-default-settings-of-upload-image-pop-up\",\n  \"title\": \"Sharepoint 2013 change default settings of “Upload Image” Pop-Up\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"When you upload files or images in Sharepoint you have get a pop-up that asks you about the file, destination library and an option to overwrite extsting files.When the pop-up appears the checkbox “Overwrite existing files” is checked. To change the default setting we have to change 2 aspx files:   Navigate to C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Web Server Extensions\\\\14\\\\TEMPLATE\\\\Layouts    Make a backup of the following files: upload.aspx and uploadex.aspx    Edit the upload.aspx file    Locate the line which contains: &lt;asp:CheckBox id=”OverwriteSingle” Checked=”true” Text=&lt;%$Resources:wss,upload_document_Overwrite_file%&gt;” runat=”server” /&gt;    Change the Checked=”true” to Checked=”false“    Edit the uploadex.aspx file and make the same changes on the same lines    Save the files    Perform an IISRESET The checkbox is now not selected default anymore.Greetings   nd\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2013-change-default-settings-of-upload-image-pop-up/\"\n},{\n  \"id\": \"post-exchang-2013-offline-owa\",\n  \"title\": \"Exchang 2013, Offline OWA\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"In the last time I worked a lot on my Exchange 2013, SQL 2012 and Sharepoint 2012 lab. A really nice feature is the Exchange 2013 Offline OWA.You can start using OWA offline from the OWA Website:OWA informs you to that it will save some content of your mailbox on the computer.What you can see now is that OWA safes mailbox content on your local disk under C:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Microsoft\\\\Internet Explorer\\\\Indexed DB&nbsp;Like Exchange also the offline files are some edb an log files.There is a full list of all offline OWA features: http://technet.microsoft.com/en-us/library/aa997437(v=exchg.80).aspxGreetings nd\",\n  \"url\": \"https://onprem.wtf/post/exchang-2013-offline-owa/\"\n},{\n  \"id\": \"post-windows-server-2012-directaccess\",\n  \"title\": \"Windows Server 2012 – DirectAccess\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Server\"],\n  \"content\": \"DirectAccess is a feature that has been introduced in Windows Server 2008R2 and Windows 7. It allows secure access to enterprise resources, without requiring a manual VPN connection. A DirectAccess enabled computer establishes a secure connection to the DirectAccess server every time the computer is connected to the internet.Windows Server 2012 and Windows 8 really simplify the configuration required for DA, making it much easier to deploy a remote access solution.RequirementsThe only requirement is the installation of a Windows Server 2012 member server, providing the “head end” of the connection. No Active Directory, schema, forest, domain-level updates are required.The DA Server needs two network adapters, one connected to the internal LAN, the other one connected to a DMZ or public network.&#160;If the DA Server is located behind a firewall, https (tcp/443) has do be allowed from the internet to the “public” network adapter.DirectAccess relies on IPv6 technology, the only hosts that require an IPv6 address are the DirectAccess Server and clients, though. The DA server performs NAT64 and DNS64 in order to enable the DA client to access IPv4 only servers.InstallationUse ServerManager or PowerShell to install the Remote Access server role on the designated DirectAccess server. Once installed, use the “Getting started” wizard to configure DirectAccess. The wizard can be started from ServerManager or from within the “Remote Access Management Console”.Select “Deploy DirectAccess only” in the wizard. Select the network topology to be used, in this example I am using a server with two network adapters, one connected to a DMZ and one connected to my LAN. Specify the name (or public IP) that clients will be using to connect.  And that’s all there is about it, it’s called “simplified deployment”. The Wizard goes ahead and creates Group Policies for DA Servers and Clients, creates DNS records for Network Location. Pretty cool, eh?To modify the settings, click the “here” link on the last page of the wizard, for my test environment I go with the defaults.As the wizard finishes, it shows some information about what it did.DirectAccess Server The DirectAccess Configuration can be shown and changed in the Remote Access Management Console. The Dashboard and Operations Status panels do provide information about the servers status, required services and connected clients. DirectAccess ClientsThe wizard created a Group Policy Object, named “DirectAccess Client Settings” and a WMI Filter, to apply that GPO to Notebooks running Windows 7 or 8 Enterprise editions. So all I had to do was to update the group policies on the notebook (gpupdate). As long as it was connected to the LAN nothing changed, if I connected the notebook to the internet, the DA (Workplace Connection) was established automatically and I was able to access internal resources as if I was on the LAN. I think this “simplified deployment” really does make it easier to get started with DirectAccess, to deploy it in an enterprise network, one should be a little more familiar with the technology :) So this post was meant to be a quick-and-dirty intro, stay tuned for more in-depth information.so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-2012-directaccess/\"\n},{\n  \"id\": \"post-windows-8-windows-to-go\",\n  \"title\": \"Windows 8 – Windows To Go\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\"],\n  \"content\": \"Windows to Go (WTG) is a new feature available in the Windows 8 Enterprise Edition. It enables the deployment of Windows 8 to USB thumb drives so that an End User can really plug in their USB drive and boot their Enterprise environment on any machine. Now, for security reasons the thumb drive can be encrypted using BitLocker and the User has no access to local hard disks of the &ldquo;host&rdquo;.HardwareWTG requires a &ldquo;fixed drive&rdquo;, that is, you cannot use any USB drive, it must be &ldquo;Certified&rdquo;. I am using a Kingston DataTraveler Workspace (www.kingston.com/wtg) other supported devices are listed on TechNet: Windows To Go: Feature OverviewEven though its not required USB 3 is highly recommended to speed things up. If you have no WTG certified drive handy, try using a USB hard disk.DeployDeployment is really simple, simply open &ldquo;Windows To Go&rdquo; from Control Panel. The WTG Wizard starts, and the first thing you have to select is which drive to use.In the next step you select the Windows 8 Image, for testing I mounted a Windows 8 Enterprise DVD. In a real-world scenario you would use your customized Image for deployment.Set a password to BitLocker the device (highly recommended).Obviously all data on the drive is lost, so if that is not a problem, click &ldquo;Create&rdquo;.Yeah, that&rsquo;s it. In the last step you can choose to reboot the machine or just finish and close.Boot and WorkSo now you have created a new WTG Workspace that can be used to boot Windows from almost any PC. If the PC can run Windows 7 or 8, it almost certainly will run Windows to Go. The first time you boot WTG it takes some time, just as every new Windows installation takes some time. After the quick, first steps you can start working, you&rsquo;ll notice that there is no access to the hard drives of the host computer. If local access is needed, simply open &ldquo;Disk Management&rdquo; and make the disks available (Requires Administrative permissions).If you shut down Windows To Go and remove your USB drive, the local Computer starts, absolutely unaffected by WTG. BYOD just got a lot simpler, IT just needs to hand out USB drives and doesn&rsquo;t need to be supporting all kind of different environments Users might have on their devices.On the other hand, Users do not have to worry about IT enforcing policies on there private-owned devices.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If you ask me, that&rsquo;s pretty cool :) tom\",\n  \"url\": \"https://onprem.wtf/post/windows-8-windows-to-go/\"\n},{\n  \"id\": \"post-sharepoint-2013-search-center-windows-8\",\n  \"title\": \"SharePoint 2013 Search Center – Windows 8\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Sharepoint\"],\n  \"content\": \"SharePoint 2013 Enterprise Search Center provides powerful indexing and search, not only for the local SharePoint instance but for file shares and other SharePoint farms as well.More info: What's new in search in SharePoint Server 2013Federated SearchWindows 7 and later support the connection of external sources through OpenSearch, which essentially is a Web Service that receives search queries by the client and returns results in either RSS or Atom XML format. This allows users to search remote data and view search results within Windows Explorer.More info: Federated Search in WindowsCreate OSDX FileNow to get SharePoint search into Windows Explorer you need to create an OSDX (OpenSearch Description) file and deploy it to your clients.Here is an example file that works for my SharePoint 2013 and Windows 8:&lt;?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?&gt; &lt;OpenSearchDescription xmlns=\\\"http://a9.com/-/spec/opensearch/1.1/\\\"&gt; &lt;ShortName&gt;SharePoint Search&lt;/ShortName&gt; &lt;Description&gt;Search the SharePoint Search Center&lt;/Description&gt; &lt;Url type=\\\"application/rss+xml\\\" template=\\\"http://intranet.ntsystems.local/sites/searchcenter/_layouts/srchrss.aspx?k={searchTerms}&amp;amp;web.count=50\\\"/&gt; &lt;Url type=\\\"text/html\\\" template=\\\"http://intranet.ntsystems.local/sites/searchcenter/Pages/results.aspx?k={searchTerms}\\\"/&gt; &lt;/OpenSearchDescription&gt; &nbsp;Simply create a new file using notepad, adjust the URLs to point to your SharePoint Enterprise Search Center and save it with the .osdx extension.There are many possibilities for customization within the OSDX specification, check out MSDN to learn more about Creating an OpenSearch Description File.To test the OSDX files, double-click it and click \\\"Add\\\" to add the search connector to Windows Explorer.This adds a link to \\\"Favorites\\\" so you can easily search SharePoint from there.Deploy OSDXNow, to deploy this to more than one client, you could publish a link to the OSDX file and have your users click on that link to add the search provider.Alternatively Group Policy Preferences can be used to deploy the search connector:Copy the .searchConnector-ms file from your Client (%UserProfile%\\\\Searches\\\\) to a share that is available to the clientsCreate a GPO and use the 'Files' GPP to copy the searchConnector-ms file from the share to %UserProfile%\\\\Searches&nbsp;&nbsp;Use the 'Shortcuts' GPP to create a Shortcut in the \\\"User Profile, Links\\\" folder, remember to select a nice Icon&hellip; ;)&nbsp;&nbsp;So that's how to get results from SharePoint into Windows Explorer.&nbsp;So long, tom\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2013-search-center-windows-8/\"\n},{\n  \"id\": \"post-office-2013-web-apps\",\n  \"title\": \"Office 2013 Web Apps\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Sharepoint\"],\n  \"content\": \"So October has been pretty quiet around here, but I have some cool stuff to share with you today.Office 2013 RTM'd some time ago and so did all the server products. So with SharePoint 2013 available on TechNet I decided to set up some demo sites to get a feel for the product, after looking for a new version of the Office Web Apps I realized that there was some change coming here.Office Web Apps ServerOffice 2013 Web Apps are no longer installed on SharePoint servers directly, it became a stand-alone product instead. Not only does that stand-alone product bring new design and scalability possibilities, it is also possible to share the Web Apps with Exchange and Lync 2013.PrerequisitesTo install Office Web Apps Server on a Windows Server 2012 box the following roles and features must be installed as a prerequisite:Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices If you want to use https for the Web Apps a proper certificate must be available on the server, too. To display the certificates installed on a computer try the following command:Get-ChildItem Cert:\\\\LocalMachine\\\\my | select Subject,FriendlyName The Web Apps Server can also be installed on Windows Server 2008R2, find the prerequisites on TechNet.Installing Office Web Apps Server and creating the farmThe actual installation of the Server is pretty straightforward, just download the ISO and double click it (love that&hellip;). The only thing you can choose during setup is the installation path.Once done with the installation, you can go ahead and use PowerShell to create a new Web Apps Farm. Not surprisingly the cmdlet to be used is New-OfficeWebAppsFarm, the following parameters have to be used to create a farm:-InternalUrl: the URL used for internal Clients-ExternalUrl: the URL used for Clients on the Internet-CertificateName: set the FriendlyName of the certificate to be used for the farm-EditingEnabled: enable editing of files in the browser (SharePoint)The following example creates a farmNew-OfficeWebAppsFarm -InternalUrl \\\"https://myOWAserver.tomt.local\\\" -ExternalUrl \\\"https://office.ntsystems.it\\\" &ndash;CertificateName \\\"ntSystems OfficeWebApps\\\" &ndash;EditingEnabled To verify that the farm has been created successfully, open a browser and go to https://myowaserver.tomt.local/hosting/discovery you should see some XML information about your internal and external URLs.SharePoint 2013Now to connect your SharePoint 2013 farm to the brand new Web Apps farm, fire up an administrative SharePoint Management Shell and use the New-SPWOPIBinding cmdlet. Use the &ndash;ServerName parameter to specify the internal URL of the Web Apps farm:New-SPWOPIBinding -ServerName https://myOWAserver.tomt.local &nbsp;After that you can have a look at the WOPI Zone, if users are accessing the SharePoint from internal and external clients you might want to change the zone from its default value of \\\"internal-https\\\" to \\\"external-https\\\":Set-SPWOPIZone &ndash;zone \\\"external-https\\\" &nbsp;Almost done, if you are using https on your SharePoint web applications you should be ready to go. If you are using http for SharePoint you need to set AllowOAuthOverHttp to true. This needs to be done in the SharePoint Management Shell using the following commands:$config = (Get-SPSecurityTokenServiceConfig) $config.AllowOAuthOverHttp = $true $config.Update() &nbsp;To check if it worked, use:(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp Try it&hellip;Ready to see it? Open a browser, go to your SharePoint 2013 sites and create a new Document or open an existing one, should be looking like that:&nbsp;So long,tom\",\n  \"url\": \"https://onprem.wtf/post/office-2013-web-apps/\"\n},{\n  \"id\": \"post-exchange-2010-and-maxinboundconnectionpersource\",\n  \"title\": \"Exchange 2010 and MaxInboundConnectionPerSource\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Exchange receive connectors do have a setting of MaxInboundConnectionPerSource which limits the maximum number of connections from a single IP address at any moment. So with a default value of 20, there are no more than 20 connections from a specific IP address allowed. The following warning is logged in the transport server's application log if the limit is exceeded:Event ID: 1021Event Source: MSExchangeTransportMessage Text: Receive connector 'Connector Name' rejected an incoming connection from IP address '10.10.10.10'. The maximum number of connections per source ('20') for this connector has been reached by this source IP address.The sender of a mail might receive the following message:Deferred: 421 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel\\\" Status 4.0.0, \\\"Transient failure\\\"According to RFC this is not a permanent error, so the sender's mail server should try to send the message again after some delay.\\\"The command was not accepted, and the requested action did not occur. However, the error condition is temporary, and the action may be requested again.\\\"Set-ReceiveConnectorTo view the configured value of MaxInboundConnectionPerSource use the Get-ReceiveConnector cmdlet, to change the value use the Set-ReceiveConnector cmdlet with the &ndash;MaxInboundConnectionPerSource parameter. The following example increases the value to 100 Get-ReceiveConnector default* | Select Name,MaxInbound*Get-ReceiveConnector default* | Set-ReceiveConnector -MaxInboundConnectionPerSource 100 More info on: TechNet &nbsp;So longtom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-and-maxinboundconnectionpersource/\"\n},{\n  \"id\": \"post-scheduled-jobs-in-powershell-v3\",\n  \"title\": \"Scheduled Jobs in PowerShell v3\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"I am really excited to write about that great feature of PowerShell I started using recently. It's all about scheduling administrative tasks, actually it's more like scheduling everything, to run when I am at home sleeping happily JSo as I have mentioned before I'm no PowerShell expert at all and I'm sure all that stuff can be done many other ways, but then this thing is working for me&hellip;SnippetsIf you have been using PowerShell ISE you might know what Snippets are, if you don't, just open powershell_ise.exe and press 'ctrl+j'. Snippets are code samples that can be added to your script easily. You can create your own snippets like that:$code = @' # this is my sample code '@ New-IseSnippet -Title 'Sample' -Description 'Just a sample' -CaretOffset $code.Length -Text $code -Force &nbsp;This will create a 'Snippets' folder at your Documents\\\\WindowsPowerShell where your new snippet is saved for later use. Having that said let's move on to scheduled jobs.Scheduled JobsUntil now it was quite a pain in the butt to run PowerShell scripts as scheduled tasks, you had to specify the path to powershell.exe and then use some params to make it run the script you choose. You could even pass arguments to those scripts, but it was no real fun. So now we can do all that very easy and directly from within PowerShell.TriggerFor starters we need to create a job trigger, to tell PowerShell when to execute out script.$trigger = New-JobTrigger -At 22:00 &ndash;Once &nbsp;This will create a variable containing our trigger, as you can see the script will be executed today, at 22:00 and it will be executed only once.JobOptionsNext we can define some job options, it's not necessary though$option = New-ScheduledJobOption &ndash;RequireNetwork -StartIfOnBattery -ContinueIfGoingOnBattery &nbsp;Using the New-ScheduledJobOption cmdlet we can specify all kinds of different options, you might already know them from Task Scheduler.ScriptblockNow that we have a trigger and some options we need to define a scriptblock that is going to be executed by our scheduled job.$sb={  param([System.IO.FileInfo]$path,[string]$string)  Add-Content -Path $path -Value $string -Force } &nbsp;This, obviously, is just a simple example. It will simply append a string to a file, should be enough to demo what I mean though.CredentialLast thing we need to specify is the account that should be used to run the task.$cred = Get-CredentialThis will create a variable containing the credential you type in. We will pass this to the &ndash;Credential parameter of the next step.RegisterScheduledJobWe have defined everything we need so we can go ahead and register the job.Register-ScheduledJob -Name \\\"test\\\" -Trigger $trigger -Credential $cred -ScheduledJobOption $options -ScriptBlock $sb -ArgumentList (\\\"c:\\\\temp\\\\test.txt\\\",\\\"abcde\\\") &nbsp;This creates a scheduled task at \\\\Microsoft\\\\Windows\\\\PowerShell\\\\ScheduledJobs, it can be viewed using Task Scheduler or using the Get-ScheduledJob cmdlet.If you want to specify a script file instead of a scriptblock, simply change the &ndash;ScriptBlock param and use &ndash;FilePath.UnregisterScheduledJobThe job can be deleted in Task Scheduler or by using the Unregister-ScheduledJob cmdlet.&nbsp;&nbsp;I hope you will find this feature as exciting as I do, I'll provide you with the code snipped so you can easily use 'crtl+j' to create a task the next time. Just copy the ps1xml file to your Documents\\\\WindowsPowerShell\\\\Snippets folder and enjoy. JScheduled Job.snippets.ps1xml (1.35 kb)&nbsp;&nbsp;So long, have a nice weekend!tom&nbsp;\",\n  \"url\": \"https://onprem.wtf/post/scheduled-jobs-in-powershell-v3/\"\n},{\n  \"id\": \"post-exchange-2010-attachments\",\n  \"title\": \"Exchange 2010, Outlook doesn’t show attachments\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Last Week I had into the problem that Outlook 2010 didn’t show some attachments. After a research on technet I found out that this attachment was a not referenced inline-attachment.To fix this behavior and make Outlook showing the attachment you have to do the following:- Stop the Exchange Transport service.    - Locate the EdgeTransport.exe.config file. This file is located in the following path:     C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\Bin\\\\ In the EdgeTransport.exe.config file, add the following entry between the &lt;appSettings&gt; element and the &lt;/appSettings&gt; element: &lt;add key=&quot;TreatInlineDispositionAsAttachment&quot; value=&quot;true&quot; /&gt; - Start the Transport serviceGreetings    dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-attachments/\"\n},{\n  \"id\": \"post-gal-photos-reloaded-batch-import\",\n  \"title\": \"GAL Photos reloaded–batch import\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"About two years ago I&rsquo;ve posted an article about Exchange 2010 and GAL Photos. Now this is not great news anymore, there are two great articles on the Exchange Team Blog, that explain how to configure this, too. Find them here: aka.ms/galphotosand aka.ms/galphotosfaqKey points are the the minor schema change and the maximum file size of 10KB. Images can be max. 96x96 pixels in size.Now in the last couple of days I wrote a &ldquo;cmdlet&rdquo; to make batch importing images easier. For starters, the cmdlet gets all *.jpg files in folder, then it uses the files BaseName to find corresponding Exchange Mailboxes. After that the image&rsquo;s physical dimensions as well as file size are verified, if they are ok, the image is imported using Import-RecipientDataProperty.The folder containing the images can be set using the cmdlet&rsquo;s &ndash;FilePath parameter, the cmdlet takes pipeline input from Get-ChildItem too.Here are two examples of how the cmdlet could be used:PS C:\\\\&gt; Import-GalPhoto -FilePath 'c:\\\\temp\\\\pics' &nbsp; PS C:\\\\&gt; dir 'c:\\\\temp\\\\pics' | Select-Object -First 2 | Import-GalPhotoI&rsquo;ve pasted the function to PoshCode, here it goes:enjoy, tom\",\n  \"url\": \"https://onprem.wtf/post/gal-photos-reloaded-batch-import/\"\n},{\n  \"id\": \"post-server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten\",\n  \"title\": \"Server 2008 R2, Disk Management und DiskPart lässt sich nicht starten\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008-R2\"],\n  \"content\": \"Mit Windows Server 2008 R2 kommt es manchmal vor, dass ich Volumes nicht extenden konnte und der Wizard folgenden Fehler anzeigt: “Unable to connect to Virtual Disk Service”&#160; Mit Diskpart sieht das dann so aus: “Diskpart encountered an error starting the COM service”&#160; Im EventLog ist folgender Fehler zu finden:Unable to start a DCOM Server: {9C38ED61-D565-4728-AEEE-C80952F0ECDE}. The error:        &quot;1260&quot;         Happened while starting this command:         C:\\\\Windows\\\\System32\\\\vdsldr.exe –EmbeddingWorkaroundHierzu habe ich einen kleinen Workaround um die Disk schnell zu extenden: CMD öffnen und folgendes Kommando starten: C:\\\\Windows\\\\System32\\\\vdsldr.exe –Embedding Nun funktioniert Diskpart und die Disk kann extended werden. Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten/\"\n},{\n  \"id\": \"post-my-powershell-profile\",\n  \"title\": \"My PowerShell Profile\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Today I am going to walk you through my PowerShell Profile and try to explain the basics of what a Profile is and how it can be used.So what is a Profile, and where is it?Well, basically a profile is a PowerShell script file (.ps1) that is stored in a preconfigured location and that gets executed every time PowerShell starts. This script enables you to customize your PowerShell session and predefine settings as you find them useful. There is a built-in variable, $Profile, which stores the location of the script that is executed every time PowerShell starts. The profile file is located in the WindowsPowerShell folder in every users “My Documents” folder. It has to be named Microsoft.PowerShell_profile.ps1.By default there is no profile and everything is left to their defaults, to create the profile script you can create the WindowsPowerShell folder and then use notepad to save a file containing some PowerShell commands in that folder. You can also use the New-Item cmdlet to create the folder and an empty file by typing:New-Item –Path $Profile -Type File –Force Example profileNow that we know what a profile is and where it is located we can go on and take a look at an example profile, it’s actually my profile so if you have any tips for me, feel free to leave a comment.I am starting my Profile with setting some variables, some are predefined and some are custom, I use them for the following settings:$MaximumHistoryCount is used to set the number of commands that are stored in History. Defaults to 64. Maximum 32767.    $Transcript is used to set the path for Start-Transcript     $env:PSModulePath is an environment variable (‘env:’) and it is used to customize the path where PowerShell will look for modules to import.     $cert is a variable I use to store my CodeSigningCert to sign scripts.After that I use Get-Host to figure out which version of PowerShell is running in the current session, if version 3 is detected, I set some DefaultParameterValues using $PSDefaultParameterValues. After that I check if the current session was started with “Run as administrator” if it was, the Update-Help cmdlet is run.Since I am writing a module I have a short function to just make my life a little easier, it signs the module file using Set-AuthenticodeSignature and then copies the file to some network share for my coworkers.At the end I am creating a new PSDrive of the FileSystem PS provider, after creating the drive the current location is set to that drive. This is my working directory, it contains all the scripts and test files I need.I pasted the file to http://poshcode.org, I really like their “embed code” feature.&#160;Now again, this is my profile, I use it to simply show what can be done, since I am still a beginner I appreciate ideas and tips from anyone!tom\",\n  \"url\": \"https://onprem.wtf/post/my-powershell-profile/\"\n},{\n  \"id\": \"post-vbnet-powershell-script-starten\",\n  \"title\": \"VB.Net PowerShell Script starten\",\n  \"author\": \"dni\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Vor einigen Tage habe ich versucht ein PowerShell Script über ein VB.Net Programm zu starten.    Hat mich ein wenig Zeit gekostet :)Anbei der Code:Public Function RunCreatePasswordPowerShell(ByVal script As String) As Integer    &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim execProcess As New System.Diagnostics.Process     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim psScriptTextArg = &quot;-Command &quot;&quot;&amp; &quot; + script + &quot; &quot; + &quot;'&quot; + System.Environment.CurrentDirectory + &quot;'&quot; + &quot;&quot;&quot;&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.WorkingDirectory = Environment.SystemDirectory &amp; &quot;\\\\WindowsPowershell\\\\v1.0\\\\&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.FileName = &quot;powershell.exe&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.Arguments = psScriptTextArg     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.UseShellExecute = True     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Return execProcess.Start     &#160;&#160;&#160; End FunctionErklärung:Die Funktion RunCreatePasswordPowerShell wird mit einer String Variable als Argument aufgerufen (script). Diese String Variable beinhaltet den Pfad zu unserem PowerShell Script.    In meinen speziellen Fall geben ich beim zusammenstellen der Argumente noch die den aktuellen Pfad mit. Eventuell noch interessant: Dieses PowerShell Script welches ich hier aufrufe erstellt verschlüsselte PasswordFiles, welche dann über die PowerShell weiter verwendet werden können. Anbei der Code dazu:param(    &#160;&#160;&#160; [parameter(Mandatory = $true)]     &#160;&#160;&#160; [string]$CurrentDirectory     )     $PasswdFilename = read-host &quot;Filename&quot;     $Passwd = read-host &quot;Password&quot; -assecurestring | convertfrom-securestring     $PasswdPathFile = $CurrentDirectory + $PasswdFilename + &quot;-Pass.txt&quot;     $Passwd | Out-File $PasswdPathFileGrüße    dn\",\n  \"url\": \"https://onprem.wtf/post/vbnet-powershell-script-starten/\"\n},{\n  \"id\": \"post-nps-migration-von-server-2003-nach-2008-r2\",\n  \"title\": \"NPS Migration von Server 2003 nach 2008 R2\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008-R2\"],\n  \"content\": \"Den IAS Server von Server 2003 zu Server 2008 R2 zu migrieren ist eine sehr einfache Migration:Zunächst muss das Migrationstool iasmigreader auf den Windows Server 2003 kopiert werden.Das Migrationstool befindet sich entweder auf der Server 2008 R2 CD unter D:\\\\sources\\\\dlmanifests\\\\microsoft-windows-iasserver-migplugin oder auf dem Server 2008 R2 unter C:\\\\Windows\\\\SysWow64Über die Kommandozeile wird das Tool aufgerufen um auf dem 2003 Server die Konfiguration in das vordefinierte Textfile ias.txt zu exportieren.ACHTUNG: Beim Import von 32BIT zu 64BIT Systemen muss folgendes vorher gemacht werden. Sonst gibt es Probleme mit der PEAP Authentifizierungsmethode:Import File öffnen den Wert 0 in SystemInfo auf 0000000009 ändern:  Nun kann das File auf dem 2008 Server importiert werden:    Netsh nps import filename=&quot;paht\\\\ias.txt&quot;Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/nps-migration-von-server-2003-nach-2008-r2/\"\n},{\n  \"id\": \"post-automatic-ios-configuration-backup\",\n  \"title\": \"Automatic IOS configuration backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\"],\n  \"content\": \"If you are like me you frequently forget to backup router and switch configurations before making changes. Ok, maybe not so frequently but it happens… There are some ways to prevent this from happening, we can make manual backups or use the automatic archiving feature which is built into IOS.Manual backupA manual backup can always be taken using the ‘copy startup-config' command, typing a question mark ‘?’ after that command lists possible backup destinations:RT#copy startup-config ?      &#160; archive:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to archive: file system       &#160; flash:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to flash: file system       &#160; ftp:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to ftp: file system       &#160; http:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to http: file systemSo to backup a routers current startup-config to a FTP server you would simply type something like this:RT#copy startup-config ftp://user:pass@10.10.10.1The username and password can also be configured so that you don’t need to type them in every time you are performing a backup.RT(config)#ip ftp username tom      RT(config)#ip ftp password secretOk, that’s better but since the backup still has to be started manually chances are that one could forget it…Automatic archiveThe archive feature allows for automatic configuration backup that is triggered by a timer and the ‘write memory’ command. The following example configures the archive feature on router RT to create a backup once every 24 hours and additionally every time someone enters the ‘write-memory’ command, that is, every time someone makes a configuration change and decides to save that change:RT(config)#archive      path ftp://10.10.10.1/History/rt-config-       write-memory       time-period 1440The time-period keyword simply configures how often a scheduled backup runs, if the write-memory command is configured a configuration backup is performed every time someone saves the config. The ‘show archive’ command displays the 10 latest configuration files:RT#show archive      The maximum archive configurations allowed is 10.       The next archive file will be named ftp://10.10.10.1/History/rt-config--&lt;timestamp&gt;-50       Archive #&#160; Name       &#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-51-57.153-47       &#160;&#160; 2&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48       &#160;&#160; 3&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-53-57.337-49Obviously other backup destinations such as tftp or flash can be configured. IOS does not take care of the removal of old files, so even though only the 10 latest configuration versions are shown in the ‘show archive’ output, there might be more on the server.Restoring configurationIf a configuration change needs to be rolled back the ‘configure replace’ command can be used. So if a configuration change had unintended consequences the ‘configure replace ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48’ command could be used to restore the current running-config from a backup.&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/automatic-ios-configuration-backup/\"\n},{\n  \"id\": \"post-steve-ballmer-on-exciting-times-office-2013\",\n  \"title\": \"Steve Ballmer on Exciting Times–Office 2013\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Update: Beta versions of all Server Products are now available, check out the link on the bottom. Added a link to the webcast.Microsoft hold a live webcast today where they kicked off the new Office 15 wave.Ballmer gave a quick overview of the latest announcements, including Surface, Windows Phones 8, Windows 8 and some Server products, before he gets going with the introduction of Office 2013.He calls the new version of Microsoft Office the “most ambitious release of office” ever. It’s was designed for cloud and touch enabled devices, a full featured version of Office 15 will also be available on ARM devices.View the recorded webcast: http://www.microsoft.com/en-us/news/presskits/office/liveevent.aspxBallmer talked about Microsoft’s recent acquisitions, namely Yammer and PPI. Yammer provides integration to all kind of social media for Office 15 client and Server products. PPI build huge, high definition displays which could be great for meetings and collaboration.One of the most important points Ballmer makes is the ability of ink and touch support in every application, so that one can take digital annotations through the new generation of hardware. It seems like a big effort to finally move away from pen and paper.After that, Ballmer introduced Kirk Koenigsberger for some live demo of the product. Kirk is very excited too and shows some sneak peaks of what is to come with a focus on consumer usage. Office 15 is heavily integrated into Skydrive and stores all content in the cloud by default, if you install the Office preview you will soon notice that you can sign-in with you Windows Live ID directly into Office.Office 15 features integration with social networking, multimedia, Skype and Lync offer presence information for the People Card (kind of an evolution from that thing we know from Outlook 2010).Really neat is the “last location” feature, where a toast notification brings you back to the section of the document that you have been editing when you left one device and switched to another.SharePoint 2013 comes with fully featured enterprise social networking, with mentions, #hashtags and like buttons all packed into a sleek, new design. A Newsfeed will provide the user with “Facebook” style updates from co-workers and friends, again using Yammer to aggregate news from different sources into one feed. Office documents and multimedia content can be previewed directly from the new timeline, the People Card quickly shows all contact information and presence status of the team members.Try it nowThe next generation of Office can be downloaded from Office.com.Server ProductsWhat is at least as exciting as the new version of Office client products is that the Server products are already listed on the website. Can’t wait to get my hands dirty on that stuff… http://www.microsoft.com/office/preview/en/try-more-productsso that’s it for now,    tom\",\n  \"url\": \"https://onprem.wtf/post/steve-ballmer-on-exciting-times-office-2013/\"\n},{\n  \"id\": \"post-why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too\",\n  \"title\": \"Why am I learning PowerShell? And why do I think you should give it a try, too?\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"To be frank, I am kind of a beginner when it comes to PowerShell or scripting in general, I was working for really small businesses for some time and I didn’t really bother scripting. There were simply not too many repeating tasks and so I went and did most everything manually.So obviously things have changed, for starters I’m not working for said small businesses any more. There are now a lot of tasks that would take hours to be completed manually. And there is this shiny, new toy out there, called Windows PowerShell. Ok, it’s not really new, but a lot of people still stick to there old tools as they knew how they worked for years, so why change something that got the job done in the past? Well, here are my key points:Automation prevents errorsThis is the most important point for me, think about some task where you have to repeat a configuration change for like 8 times. It’s not that scripting or automating is that much faster than making the change manually, that would be the case if it were 100 times or more, but 8, come on. The one key thing is, that by using automation the configuration is exactly the same every single time you have to do it. Sure, you have to spend a little more time in planning your steps (instead of just clicking your way through), you have to write a few lines of script, or just chain together some commands. Once your little tool is complete and tested, you can use it over and over again, it will produce the same result every time you run it. So we are getting to my second point.Create reusable toolsPowerShell enables you to create reusable tools very easily, if you are typing some commands into the command line interface, the exactly same commands can be saved to a ps1 file and executed by a co-worker, a scheduled task or... you get the point. The first point still applies here, if you create a tool and share it with your colleagues or co-workers not only are you simplifying certain tasks, you are again eliminating a common source of error.DocumentationThe transcript feature simply writes anything you type and all output of the current command line window to a file, this file can easily be used to document configuration changes.ResourcesSo where do I start? First of all, remember one key command: Get-Help. It’s simple, it comes with PowerShell and the help content is very, very well written! Try this: ‘Get-Command | Get-Random | Get-Help –Full’A good place to start is the Windows PowerShell Survival Guide on the TechNet Wiki.There are some good books on the topic available, I’m looking forward to PowerShell in Depth by three of the most well-known PowerShell gurus: Don Jones, Richard Siddaway, and Jeffery Hicks.&#160;Have fun!   tom\",\n  \"url\": \"https://onprem.wtf/post/why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too/\"\n},{\n  \"id\": \"post-activesync-organization-settings-mobile-device-management\",\n  \"title\": \"ActiveSync Organization Settings–Mobile Device Management\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"The growing number of mobile devices requires some sort of mobile device management policy to be in place. Now there are different approaches to enforce such a policy, there are some software vendors offering more or less sophisticated tools and there is Exchange 2010 which comes with basic device management capabilities built-in.If a mobile device connects to an Exchange Server the following sequence evaluates the access state of the device (from TechNet: http://technet.microsoft.com/en-us/library/ff959225.aspx)   Is the mobile device authenticated?&#160;&#160; If not, challenge the mobile device for the correct credentials. Otherwise, go on to the next step.     Is Exchange ActiveSync enabled for the current user?&#160;&#160; If not, return an &quot;access restricted&quot; error to the device. Otherwise, go on to the next step.     Are the mobile policy enforcement criteria met by the current mobile device?&#160;&#160; If not, block access. Otherwise, go on to the next step.     Is this mobile device blocked by a personal exemption for the user?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device allowed by a personal exemption for the user?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Is this mobile device blocked by a device access rule?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device quarantined by a device access rule?&#160;&#160; If so, quarantine the device. Otherwise, go on to the next step.     Is this mobile device allowed by a device access rule?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Apply the default access state per the Exchange ActiveSync organizational settings.&#160;&#160; This grants access, blocks access, or quarantines the current device, depending on the organizational settings.  Default Access StateThe last step in the above list determines the ‘default access level’ organizational setting. This setting defaults to ‘Allow’ so if no other device access rules are configured, all ActiveSync devices (which meet enforcement criteria) are allowed. That means, any user with an ActiveSync enabled mailbox (another default) is able to connect up to 10 devices using ActiveSync.To change this behavior the ‘default access level’ setting can be modified using the ‘Set-ActiveSyncOrganizationSettings’ cmdlet. Other than ‘Allow’ this can be set to ‘Quarantine’ or ‘Block’. Quarantine: Enables devices to connect to the Server but grants only limited access to the device. Users will be able to add content to their calendar, tasks and notes folders, however no content can be retrieved from the server. The user will receive an email stating that the mobile device has been quarantined, that email can be retrieved by the mobile device and will be available in the users mailbox through Outlook and OWA. If a device is quarantined an administrative email address is notified too, so that they can decide to allow or block the device.An admin (or any user with the required privileges) who receives the notification can use the Exchange Control Panel to allow or block the device:Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.Block: Simply blocks all new or unknown devices. Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.If users are already using ActiveSync to access their mailboxes the Exchange Management Shell can be used to add the DeviceID of currently used ActiveSync devices to the ActiveSyncAllowedDeviceIDs property.Set-ActiveSyncOrganizationSettings The following command sets the recipient of the admin notification to support@ntsystems.local. Every time a device is quarantined that email address is notified.Set-ActiveSyncOrganizationSettings –AdminMailRecipients support@ntsystems.localThe following command sets the ‘default access state’ to quarantine.Set-ActiveSyncOrganizationSettings –DefaultAccessLevel QuarantineNeed to scale? Try Device Access Rules!Manual approval might not work for environments with many users or when users change their mobile devices frequently. Device Access Rules can be used to allow or block devices based on Family or Model so that users can connect approved device types without the need to be manually allowed by an admin:Using Device Access Rules allows for some amount of scalability, even though it’s not perfect – it comes with Exchange.&#160;so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/activesync-organization-settings-mobile-device-management/\"\n},{\n  \"id\": \"post-passing-an-array-to-a-scriptblock\",\n  \"title\": \"Passing an array to a {scriptblock}\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Some Friday PowerShell fun today.I created a PowerShell script the other day where I was passing a variable to a scriptblock. As long as the variable was a simple string everything was just fine, but when the variable was of the type System.Array only the first item would have been passed to the scriptblock.[more]Example 1 shows what I mean.$myArray = \\\"a\\\",\\\"b\\\",\\\"c\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock -ArgumentList $myArrayThis example would produce an output of &ldquo;a&rdquo; even though I assumed it would output &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.So I was scratching my head for a while and then tried to do it that way:$myArray = \\\"a\\\",\\\"b\\\",\\\"c\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock &ndash;ArgumentList (,$myArray)This one works as expected, so it produces an output of &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.&nbsp;have a nice weekend!tom&nbsp;&nbsp;\",\n  \"url\": \"https://onprem.wtf/post/passing-an-array-to-a-scriptblock/\"\n},{\n  \"id\": \"post-we-are-still-out-there-somewhere\",\n  \"title\": \"We are still out there, somewhere…\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"It has been a while since our last post, but then we are both really busy getting our work done and studying for some certification and other stuff. I’d like to promise that we will publish cool stuff on a more regular basis, not sure if we can keep it though. What I DO promise is that I am going to try!&quot;One must have a good memory to be able to keep the promises that one makes&quot; - F. NietzscheSo, having that said, what was going on that we have not been blogging about:Windows 8 and Windows Server 2012 Release Previews are out!Go, give it a try. And check out all the cool content over at Windows Server Blog and Building Windows 8. Really.Windows Phone 8 has been announced.I’m personally looking forward to that, I came to love my Windows Phone 7 and I think this is going to be even better. Read more on the Windows Phone Blog.        Device encryption: To help keep everything from documents to passwords safe, Windows Phone 8 includes built-in technology to encrypt the entire device, including the operating system and data files.       Better security: Windows Phone 8 supports the United Extensible Firmware Interface (UEFI) secure boot protocol and features improved app “sandboxing,” so the phone is better protected from malware with multiple layers of security.       Remote management: With Windows Phone 8, IT departments can manage apps and phones remotely, with tools similar to ones they now employ for Windows PCs.       Company Hub and apps: Companies can create their own Windows Phone 8 Hub for custom employee apps and other critical business info.    Microsoft Surface has been announced.Hm, looks nice… but we will see.Get more (well, not too much more) at surface.comMoving away from MD5 and keys under 1024 bits.Some efforts are made to put more trust into the struggling SSL Certificate business and I guess it also gives us more security. Personally I think that education is the key point when it comes to “trust” and SSL and IT security in general. People should really be aware of what it means to just ignore Certificate warnings… Its up to us IT Pros to make (our) internal servers trustworthy and sort of train users to rely on SSL and watch out for it.Lets get back to MD5. So, recently there has been a some media coverage of the so called “Flame” malware which used phony certificates to make a man-in-the-middle attack against Windows Update possible. Whoever created the malware used a flaw in Microsoft's Terminal Server Licensing certificate infrastructure to create a code signing certificate that chained up to Microsoft's Root CA. In essence this was possible because of the TS Licensing certs using MD5 hashes which are prone to collision attacks.More information about Flame on: NakedSecurity; Remote Desktop Services Blog; Security Research &amp; Defense; the Security Advisory can be found here.Some days after that I (and other customers) received an email from RapidSSL stating that MD5 is to be abandoned by June 1, that is all (RapidSSL) certificates that have been using the MD5 hashing scheme have been revoked. They did also revoke any certificate using a key size under 1024 bits.Microsoft is also going to release an update that blocks certificates with keys less than 1024 bits. More information on this on the Windows PKI Blog.Exchange 15 rumorsExchange 2010 has been available for little more than two years when Microsoft kicked off the “Office 15” technical preview (for few, select people) back in January 2012. Not much information has been published since then, although a beta is expected for “late summer”. Since the Exchange Conference happens to take place by the end of September I suppose we all will know more by then.&#160;That’s it for now. Have a nice weekend!tom\",\n  \"url\": \"https://onprem.wtf/post/we-are-still-out-there-somewhere/\"\n},{\n  \"id\": \"post-wireless-sniffing-mit-netmon-34\",\n  \"title\": \"Wireless Sniffing mit NetMon 3.4\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\"],\n  \"content\": \"Damit mit Wireshark unter Windows Wlan Traffic analysiert werden kann benötigt man einen speziellen Adapter (AirPcap), der auch im Promiscuous Mode (oder Monitor Mode) betrieben werden kann.Mit Microsoft Network Monitor 3.4 und Windows 7 kann man jetzt auch “normale” Adapter im Monitor Mode betreiben um Wireless Frames zu sniffen.NetMonDazu die entsprechende Version von NetMon herunterladen (x86 oder x64) und installieren.NetMon öffnen und unter “Select Networks” den Wireless Adapter auswählen. Alle anderen Adapter deaktivieren.Dann auf “Properties” klicken und die “Scanning Options” konfigurieren.Der “Monitor Mode” muss aktiviert werden, außerdem kann man den Frequenzbereich sowie den Kanal auswählen. Wählt man keinen Kanal aus, scannt NetMon alle Kanäle.Mit “Apply” werden die Einstellungen übernommen, das Fenster “Scanning Options” muss man offen lassen, der “Network Interface Configuration” Dialog kann mit “OK” geschlossen werden.Jetzt kann man auf “New Capture” klicken und mit “Start” einen neuen Trace starten.AnalyseDie Analyse des Traffics ist mit NetMon etwas ungewohnt, es hilft allerdings sehr wenn man sich von&#160; http://nmparsers.codeplex.com/ die aktuellsten Parser installiert.Alternativ kann man das Ergebnis aus NetMon als “.cap” Datei speichern und mit Wireshark öffnen.&#160;btw. das funktioniert genauso mit Windows 8 Beta &#160;have fun!tom\",\n  \"url\": \"https://onprem.wtf/post/wireless-sniffing-mit-netmon-34/\"\n},{\n  \"id\": \"post-windows-server-8-virtualized-domain-controller\",\n  \"title\": \"Windows Server 8–Virtualized Domain Controller\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\"],\n  \"content\": \"In bisherigen Version von Windows Server und Active Directory hatte das Betreiben von virtuellen DCs einige Nachteile im Vergleich zu anderen virtuellen Servern. So konnten Domain Controller z.B. nicht von der Snapshot F&auml;higkeit des Hypervisors profitieren, das zur&uuml;cksetzen eines DCs auf einen Snapshot hatte fatale Auswirkungen auf die Gesamtstruktur.VDC Safe RestoreIm Active Direcotry Replikationsmodell wird jede Transaktion mit einer fortlaufenden Nummer (Update Sequence Number) versehen. Domain Controller &ldquo;merken&rdquo; sich diese Nummern sowie eine eindeutige ID des Replikationspartners (Invocation ID) von dem sie die jeweilige &Auml;nderung erhalten haben. Wird ein DC auf einen fr&uuml;heren Zeitpunkt zur&uuml;ckgesetzt (Snapshot) k&ouml;nnte er bereits verwendete USNs wiederverwenden, seine Replikationspartner akzeptieren diese Transaktionen nicht mehr, sie haben diese bereits erhalten. Der wiederhergestellte DC kann nicht mehr replizieren und wird in den sogenannten &ldquo;USN Rollback Protection&rdquo; Status gesetzt. Der DC muss jetzt manuell aus dem AD entfernt werden.In Windows Server 8 Active Directory gibt es ein Feature das dieses Problem verhindern soll. &Uuml;ber die ACPI Table stellt der Hypervisor die VM-Generation ID zur Verf&uuml;gung, diese wird im RAM des jeweiligen Domain Controllers gespeichert.Wird ein Snapshot angewandt, wird diese VM-Generation ID zur&uuml;ckgesetzt, so merkt der Domain Controller dass er wiederhergestellt wurde.&nbsp;Der wiederhergestellte DC setzt seine Invocation ID zur&uuml;ck und da seine Replikationspartner diese ID noch nicht kennen kann die Replikation wieder aufgenommen werden. Au&szlig;erdem wird der SYSVOL Ordner &ldquo;nicht autorisierend&rdquo; wiederhergestellt und folgendes Ereignis wird im &ldquo;Directory Service&rdquo; Event Log protokolliert.Folgendes Active Directory Attribut wird f&uuml;r die VM-Generation ID verwendet. Hier geht&rsquo;s zum entsprechenden Eintrag im MSDN.ms-DS-Generation-IdVDC Safe Restore muss (und kann) nicht konfiguriert werden, sofern der Hypervisor das VM-Generation ID Feature unterst&uuml;tzt ist es automatisch aktiv. Aktuell unterst&uuml;tzt nur Windows Server 8 Hyper-V dieses Feature, andere Herstellen werden hoffentlich bald nachziehen.Achtung, dieses Feature soll die USN Rollback Problematik l&ouml;sen, es ist auf keinem Fall ein Ersatz f&uuml;r ein konsistentes Backup! Der DC wird &ldquo;nicht autorisierend&rdquo; wiederhergestellt.&nbsp;so long,tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-virtualized-domain-controller/\"\n},{\n  \"id\": \"post-exchange-2010-send-on-behalf-for-distribution-groups\",\n  \"title\": \"Exchange 2010 Send on behalf for distribution Groups\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Tipp: Damit man die “send on behalf” Berechtigung einem Benutzer für eine Verteilergruppe geben kann, ist ein einfacher Powershell Befehl nötig:Set-DistributionGroup GroupName -GrantSendOnBehalfTo UserName&#160;Grüßedn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-send-on-behalf-for-distribution-groups/\"\n},{\n  \"id\": \"post-windows-8-to-go\",\n  \"title\": \"Windows 8 to Go\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"de\"],\n  \"content\": \"Mit Windows 8 kommt ein neues Feature \\\"Windows 8 to Go\\\", welches bereits in der CP verf&uuml;gbar ist. Damit ist es m&ouml;glich die Windows Umgebung per USB-Stick oder anderen Datentr&auml;ger mitzunehmen.Als erstes muss der USB Stick bootf&auml;hig gemacht werden. Diese Prozedur ist dieselbe, die Thomas bereits in folgenden Post erkl&auml;rt um Windows 7/8 vom USB Stick zu installieren.Anbei nochmal kurz die Befehle:- diskpart- list disk- select disk X (USB Datentr&auml;ger ausw&auml;hlen)- create partition primary- format fs=ntfs quick- active&nbsp;Jetzt muss noch der PC neu gestartet werden und Windows 8 installiert werden. Als Datentr&auml;ger empfiehlt sich hier ein USB 3.0 Speichermedium.&nbsp;Gr&uuml;&szlig;edn\",\n  \"url\": \"https://onprem.wtf/post/windows-8-to-go/\"\n},{\n  \"id\": \"post-forefront-tmg-2010-sp2-nlb-kerberos\",\n  \"title\": \"Forefront TMG 2010 SP2–NLB Kerberos\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"Seit kurzem ist das Service Pack 2 f&uuml;r den Nachfolger von ISA 2006 verf&uuml;gbar. Neben Bugfixes und verbesserten Fehlerseiten ist vor allem die M&ouml;glichkeit den Firewall Service als Domain User zu starten interessant. Dadurch erh&auml;lt man die M&ouml;glichkeit den SPN f&uuml;r die virtuelle IP Adresse des NLB Custer auf eine Benutzerkonto zu binden, wenn der Firewall Service dann mit diesem Konto gestartet wird, funktioniert Kerberos Authentifizierung auch im NLB.&nbsp;&nbsp;NLB und KerberosF&uuml;r ein erfolgreiche Kerberos Authentifizierung muss der Service Principal Name den der Client verwendet um sich mit dem Server zu verbinden im Active Directory Account des Servers registriert sein. Der SPN muss im gesamten Forest eindeutig sein, d.h. nur ein Account kann den SPN f&uuml;r die NBL IP Adresse verwenden. Verbinden sich Clients mit anderen Knoten im Cluster schl&auml;gt die Kerberos Authentifizierung fehl, da der SPN nicht stimmt.Bisher konnte der &ldquo;Microsoft Forefront TMG Firewall Service&rdquo; nur als Network Service laufen, d.h. f&uuml;r Kerberos Authentifizierungen wurde das Computerkonto jedes TMG Servers verwendet.Mit Service Pack 2 kann man den Firewall Dienst als Dom&auml;nenbenutzer starten, registriert man auf diesen Dom&auml;nenbenutzer die ben&ouml;tigten SPNs funktioniert die Kerberos Authentifizierung im Clusterbetrieb.Service Account SicherheitAus Sicherheitsgr&uuml;nden sollte man ein eigenes Benutzerkonto f&uuml;r den TMG Service anlegen, dieses Benutzerkonto sollte ausschlie&szlig;lich f&uuml;r TMG verwendet werden und keine weiteren Berechtigungen in der Domain haben. Au&szlig;erdem sollte man das Konto aus der Gruppe &ldquo;Domain Users&rdquo; entfernen, und eine andere Gruppe als prim&auml;re Gruppe definieren. Auch dieses Gruppe sollte kein Berechtigungen in der Domain oder auf einem anderen System haben.Forefront TMG erteilt dem Benutzerkonto automatisch die minimal ben&ouml;tigten Berechtigungen wenn man den Firewall Service f&uuml;r dieses Konto konfiguriert. Auch auf dem TMG ist somit keine Konfiguration von Berechtigungen f&uuml;r das Service Account notwendig.KonfigurationNach der Installation von Service Pack 2 kann man in den Eigenschaften des Arrays, im Reiter &ldquo;Credentials&rdquo; das Konto ausw&auml;hlen unter dem der Firewall Service in Zukunft laufen soll.SPN hinzuf&uuml;genUm einen Serivce Principal Name zum Service Account hinzuzuf&uuml;gen, kann man z.B. das Tool &ldquo;setspn&rdquo; verwenden.Registrierte SPNs anzeigen:setspn &ndash;L benutzername&lt;/p&gt;setspn &ndash;L computername&lt;/code&gt;Neuen SPN registrieren:setspn -S http/myArray.ntsystems.local tmgSvcUsrDer Parameter &ndash;S &uuml;berpr&uuml;ft zuerst ob der SPN nicht bereits von einem anderen Konto verwendet wird, anschlie&szlig;end wird er zum Konto hinzugef&uuml;gt.Verify Kerberos AuthenticationMit einem Netzwerk Analyse Tool sieht man dass vor der Registrierung des SPN NTLM f&uuml;r Proxy Authentifizierung verwendet wird.Wurde der Firewall Service als Domain User gestartet und der ben&ouml;tigte SPN registriert, wird Kerberos verwendet.Der Client verwendet jetzt GSS-API, also Kerberos, um sich zu authentifizieren. Mit &ldquo;klist&rdquo; kann man sehen dass der Client jetzt ein Ticket f&uuml;r den Array Namen hat.Achtung: Es m&uuml;ssen alle Mitglieder im Array aktualisiert werden, bevor der Firewall Service als Domain User gestartet werden kann. Au&szlig;erdem sollte man den SPN erst dann hinzuf&uuml;gen, wenn der Firewall Service als Domain User l&auml;uft da es sonst zu Authentifizierungsproblemen kommt.&nbsp;Weitere Informationen zu &ldquo;Kerberos authentication on an NLB array&rdquo; im TechNet: http://technet.microsoft.com/en-us/library/hh454304.aspxUm Forefront TMG SP2 installieren zu k&ouml;nnen muss Forefront TMG SP1 Update 1 installiert sein, Download: http://www.microsoft.com/download/en/details.aspx?id=11445&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-tmg-2010-sp2-nlb-kerberos/\"\n},{\n  \"id\": \"post-windows-server-8-cp-dhcp-server-failover\",\n  \"title\": \"Windows Server 8 CP–DHCP Server Failover\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"In Windows Server Versionen bis 2008R2 gab es f&uuml;r eine ausfallsichere DHCP Umgebung zwei M&ouml;glichkeiten, ein sogenanntes Split Scope Deployment oder ein Windows Failover Cluster. Beide Varianten haben Nachteile, im Split Scope Deployment teilen sich mehrere DHCP Server einen Bereich. F&auml;llt ein Server aus, gibt es auf den verbleibenden Servern unter Umst&auml;nden nicht genug freie Adressen, auch Leases bzw. Reservierungen sind nicht konsistent. Ein Failover Cluster hat einen gewissen administrativen Aufwand (Shared Storage) und erfordert Windows Server Enterprise Lizenzen f&uuml;r alle Knoten im Cluster.Windows Server 8 DHCP Server FailoverDHCP Server Failover bietet die M&ouml;glichkeit zwei DHCP Server f&uuml;r einen Bereich zu konfigurieren. Es muss sich dabei um Windows 8 DHCP Server handeln, andere Hersteller oder &auml;ltere Server Betriebssysteme werden nicht unterst&uuml;tzt. Im Load Sharing Modus bedienen beide Server Client Anfragen und replizieren die Lease Informationen. F&auml;llt ein Server aus kann der zweite Server bereits bestehende Leases verl&auml;ngern. Au&szlig;erdem verf&uuml;gen beide Server &uuml;ber den gesamten Bereich, Reservierungen und Optionen werden ebenfalls zwischen den Servern repliziert und sind so konsistent.Load Sharing ModeIm Standard Modus wird ein Failover Relationship im Load Sharing betrieben, das bedeuted Clientanfragen werden gleichm&auml;&szlig;ig auf die beiden DHCP Server verteilt. Die Verteilung der Anfragen kann &uuml;ber den Wert load-balancing ratio konfiguriert werden. Der Load Sharing Mode eignet sich f&uuml;r Server im selben Standort.Hot Standby ModeAlternativ k&ouml;nnen die DHCP Server im Hot Standby Mode betrieben werden, dabei ist ein Server &ldquo;aktiv&rdquo; und bedient Clientanfragen. Der zweite Server &uuml;bernimmt diese Aufgabe sobald er erste nicht mehr verf&uuml;gbar ist. Die Entscheidung ob ein Server &ldquo;aktiv&rdquo; oder &ldquo;standby&rdquo; ist, kann f&uuml;r jeden DHCP Bereich getroffen werden, ein Server kann also standby f&uuml;r einen Bereich sein und gleichzeitig aktiv f&uuml;r einen andern. Der Hot Standby Mode eignet sich f&uuml;r Au&szlig;enstellen oder kleinere Standorte an denen kein zweiter Server vor Ort ist und ein Server im entfernten Rechenzentrum nur im Problemfall &uuml;bernehmen soll.DHCP Rolle installierenDie DHCP Server Rolle wird &uuml;ber den Server Manager hinzugef&uuml;gt, dazu verwendet man den Add Roles and Features Wizard.Die entsprechende Rolle ausw&auml;hlen, und entscheiden ob der Server automatisch neustarten soll, das ist f&uuml;r DHCP nicht notwendig.Nach der Installation wei&szlig;t der Post-Install configuration Wizard darauf hin, dass man den Server noch im Active Directory autorisieren muss.Nat&uuml;rlich kann man die Rolle auch mit der PowerShell hinzuf&uuml;gen, verwendet wird dazu das Modul ServerManager (PowerShell v3 importiert Module automatisch, also kein Import-Module):Auch nach dieser Insatllation wei&szlig;t der ServerManager auf notwendige Post-Install Schritte hinEs sind jetzt zwei DHCP Server verf&uuml;gbar, nun geht es an die Failover Konfiguration.DHCP Server Failover Konfiguration&Uuml;ber einen Rechtsklick auf einen DHCP Server im Server Manager &ouml;ffnet man die bekannte dhcpmgmt Konsole (doch nicht &uuml;berall Metro).Ein neuer Bereich wird, wie immer, mit einem Rechtsklick auf den IPv4 Knoten erstellt. Dabei hat sich mit WS8 nichts ge&auml;ndert, man w&auml;hlt einen Namen, das Subnet bzw. den IP Range sowie Optionen wie Gateway und DNS Server.Jetzt kann man entscheiden ob man DHCP Failover f&uuml;r den gesamten Server oder f&uuml;r jeden einzelnen Bereich konfigurieren will. Je nach dem f&uuml;r welche Konfiguration man sich entscheidet, beginnt man mit der Konfiguration auf dem IPv4 Knoten oder auf dem jeweiligen Bereich.Mit &ldquo;Configure Failover&rdquo; wird die Konfiguration gestartet, als ersten Schritt muss man den Partner-Server angeben.Nach der Auswahl des Partner-Servers werden einige Voraussetzungen f&uuml;r eine erfolgreiche Failover Beziehung &uuml;berpr&uuml;ft, unter anderem wird &uuml;berpr&uuml;ft ob der Server erreichbar ist, ob mindestens Windows Server 8 Beta installiert ist, ob der angemeldete Benutzer &uuml;ber ausreichende Rechte verf&uuml;gt (Mitglied der Gruppe DHCP Administrators) und ob auf dem Partner &uuml;berhaupt ein DHCP Server l&auml;uft. Sind die Vorrausetzungen ok, wird ein Dialog f&uuml;r die Konfiguration des Failover Relationships angezeigt.In diesem Dialog wird der Failover Mode konfiguriert. Au&szlig;erdem kann die Load Sharing ratio hier festgelegt werden. Maximum Client Lead Time gibt die tempor&auml;re Lease Zeit f&uuml;r neue Clients an, deren Anfragen der Failover Server bedient. Auch die Zeit nach der ein Server im Partner-Down-State den gesamten Bereich &uuml;bernimmt wird durch die MCLT gesetzt.Wird der Hot Standby Mode gew&auml;hlt, kann anstelle der Load Sharing ratio die Menge an Adressen Konfiguriert werden, welche f&uuml;r den Standby Server reserviert werden. Sollten keine Adressen reserviert werden, kann der Standby Server erst dann neue Clients bedienen, wenn er den gesamten Bereich &uuml;bernommen hat, das dauert standardm&auml;&szlig;ig eine Stunde (MCTLT).Das Auto State Switchover interval gibt an nach welcher Zeit ein Server vom communication interrupted in den partner down state wechselt. Standardm&auml;&szlig;ig passiert das nach 10 Minuten.Hat man die Optionen konfiguriert wird die Partnerschaft konfiguriert. F&uuml;r die Failover Konfiguration wird TCP Port 647 verwendet.In den Eigenschaften des Bereiches gibt es den neuen Reiter Failover, dort kann man den Status der Failover Partnerschaft und die konfigurierten Optionen sehen.Konfiguration &auml;ndern oder l&ouml;schenUm die Konfiguration zu &auml;ndern, &ouml;ffnet man die Eigenschaften des IPv4 Konten und w&auml;hlt dort unter Failover die entsprechende Partnerschaft aus.Mit Edit kann man die ausgew&auml;hlte Partnerschaft &auml;ndern, mit delete wird diese gel&ouml;scht.Verify FailoverMit einem Netzwerk Analyse Tool sieht man die DHCP Kommunikation, hier ist zu beobachten dass der Client zwei DHCP Offers bekommt. Eine von jedem Server in der Failover Konfiguration.Beide DHCP Offers sind bis auf die angebotene Lease Time identisch, der &ldquo;aktive&rdquo; Server bietet eine Adresse mit der im Bereich konfigurierten Lease Time an (8 Tage).W&auml;hrend die Lease Time im Offer des &ldquo;standby&rdquo; Servers der Maximum Client Lead Time entspricht.&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-dhcp-server-failover/\"\n},{\n  \"id\": \"post-wireshark-und-windows-8\",\n  \"title\": \"Wireshark und Windows 8\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"de\",\"Server-2012\"],\n  \"content\": \"Eines der ersten Tools das auf meinen Ger&auml;ten installiert wird ist das Analysetool Wireshark.Nach der Installation auf Windows 8 konnte ich keine neuen Captures starten, es war kein Interface verf&uuml;gbar.Das Problem scheint am WinPCAP Treiber zu liegen, die L&ouml;sung war einfach. Ich habe den WinPCAP im &ldquo;Kompatibilit&auml;tsmodus&rdquo; Windows 7 neu installiert.&nbsp;Download WinPCAP: www.winpcap.orghave fun!\",\n  \"url\": \"https://onprem.wtf/post/wireshark-und-windows-8/\"\n},{\n  \"id\": \"post-windows-server-8-cp-ad-administrative-center\",\n  \"title\": \"Windows Server 8 CP–AD Administrative Center\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Server\"],\n  \"content\": \"Mit Windows Server 2008R2 wurde das Active Directory Verwaltungscenter oder Administrative Center eingeführt. Es sollte das seit Windows 2000 bekannte Active Directory Users and Computers Snap-in ersetzen. Das Verwaltungscenter in Windows 8 Server Beta kommt im Metro Style daher und ist Teil der ADDS Simplified Administration. Es bietet einige sehr nützliche Funktionen, unter anderem endlich eine grafische Oberfläche für PSO und den AD Papierkorb. Außerdem werden die neuen Dynamischen ACLs über das Verwaltungscenter konfiguriert.Da es auf PowerShell aufsetzt, ist ein PowerShell History Viewer integriert.Metro StyleGeöffnet wird das Administrative Center über “Tools” im Server Manager oder man führt “dsac.exe” aus.“Reset Password” und “Global Search” sind schon aus dem ADAC von 2008R2 bekannt, neu ist die PowerShell History im unteren Bereich. Öffnet man diesen sieht man die PowerShell Befehle welche das ADAC zuletzt ausgeführte. Active Directory Recycle BinAuch der AD Papierkorb wurde mit Windows Server 2008R2 eingeführt, die Verwendung war zwar etwas kompliziert (keine grafische Oberfläche), trotzdem war es eine nützliche Erweiterung. Mit Windows Server 8 gibt es ein GUI um gelöschte Objekte einfach zu finden und wiederherzustellen.Sollte der AD Recycle Bin noch nicht aktiv sein, kann man ihn im ADAC gleich aktivieren. Dafür muss sich der Forest im “Windows Server 2008R2” Functional Level befinden.Einfach auf “Enable Recycle Bin…” klicken und den Dialog bestätigen, schon ist der Recycle Bin aktiv. Natürlich muss die Änderung auf alle DCs repliziert werden, erst wenn dieser Vorgang abgeschlossen ist funktioniert er zuverlässig.Im der PowerShell Histroy sieht man sofort welcher Befehl ausgeführt wurde: Enable-ADOptionalFeature -Confirm:$false -Identity:&quot;766ddcd8-acd0-445e-f3b9-a7f9b6744f2a&quot; -Scope:&quot;ForestOrConfigurationSet&quot; -Target:&quot;tomt.local&quot;Löscht man jetzt ein Objetk aus dem AD wird es in den neu erstellten Container “Deleted Objects” verschoben. Dort bleibt es (mit all seinen Attributen und Links) bis die Deleted Objects Lifetime (msDS-DeletedObjectLifetome)abgelaufen ist, dann wird es zum recycled Object. Nach Ablauf der Recylced Object Lifetime (tombstoneLifetime) wird es vom Garbage Collection Process endgültig aus der AD Datenbank gelöscht.Im “Deleted Obejects” Container findet man gelöschte Objekte die nach aktiveren des Recylce Bin Features gelöscht wurden und deren Deleted Objects Lifetime noch nicht abgelaufen ist. Man kann in dem Container suchen und die Ansicht filtern um die gewünschten Objekte zu finden.Hat man die Objekte gefunden kann man diese einzeln oder mehrere zusammen wiederherstellen. Einfach rechts auf das Objekt klicken und “Restore” oder “Restore To…” auswählen.“Restore” stellt die Objekte an ihrem Ursprünglichen Ort wieder her (lastKnownParent), mit “Restore To…” erhält man folgenden Dialog und kann das Ziel auswählen.Auch hier werden in der PowerShell History die ausgeführten Befehle angezeigt:Restore-ADObject -Confirm:$false -Identity:&quot;bb127a94-277f-4a7d-a09b-5893906cb16b&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot;Fine-Grained Password PolicyFine-Grained Password Policies wurden mit Windows Server 2008 eingeführt, sie waren eine wichtige Neuerung und auch sie waren in der Verwendung nicht ganz einfach.Mit dem neuen ADAC gibt es eine GUII für die sogenannten PSOs oder Password Setting Objects. Um ein neues PSO zu erstellen öffnet man den Container Password Settings (“CN=Password Settings Container,CN=System,DC=tomt,DC=local”) und klickt auf New, Password Settings.Im Dialog “Create Password Settings” kann man die Fine-Grained Password Policy konfigurieren und diese gleich einer Gruppe oder einem Benutzer zuweisen. Ist ein Benutzer Mitglied in mehreren Gruppen auf die ein PSO angewendet wird, hat jenes mit dem niedrigerem Precedence Wert (msDS-PasswordSettingsPrecedence) Vorrang.Und auch hier wieder die entsprechenden PowerShell Befehle:Add-ADFineGrainedPasswordPolicySubject -Identity:&quot;CN=pso_group1,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot; -Subjects:&quot;CN=group1,OU=groups,OU=tomt,DC=tomt,DC=local&quot;      &lt;/p&gt;    New-ADFineGrainedPasswordPolicy -ComplexityEnabled:$true -LockoutDuration:&quot;00:30:00&quot; -LockoutObservationWindow:&quot;00:30:00&quot; -LockoutThreshold:&quot;0&quot; -MaxPasswordAge:&quot;42.00:00:00&quot; -MinPasswordAge:&quot;1.00:00:00&quot; -MinPasswordLength:&quot;7&quot; -Name:&quot;pso_group2&quot; -PasswordHistoryCount:&quot;24&quot; -Precedence:&quot;20&quot; -ReversibleEncryptionEnabled:$false -Server:&quot;WIN8CP-DC1.tomt.local&quot;          Set-ADObject -Identity:&quot;CN=pso_group2,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -ProtectedFromAccidentalDeletion:$true -Server:&quot;WIN8CP-DC1.tomt.local&quot;&lt;/code&gt;  Durch diese neuen grafischen Oberflächen wird das ADAC wahrscheinlich mehr Verwendung finden als sein Vorgänger. Auch an den Metro Style wird man sich gewöhnen (müssen).  &#160;  so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-ad-administrative-center/\"\n},{\n  \"id\": \"post-windows-server-8-cp-remote-group-policy-refresh\",\n  \"title\": \"Windows Server 8 CP–Remote Group Policy refresh\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"Mit Windows Server 8 kann man einen Group Policy refresh auf remote Computern initiieren. Verwendet wird dazu die GPMC oder natürlich PowerShell.Group Policy Management ConsoleMan wählt die OU aus in der sich die Computerkonten befinden auf denen man das Update ausführen möchte. Achtung: Man kann das GP Update nur auf Computerkonten initiieren, es werden aber Computer und Benutzerrichtlinien aktualisiert.Mit einem Rechtsklick auf die OU kann man “Group Policy Update…” auswählen. Der Dialog um das Update zu bestätigen zeigt an um wie viele Computer es sich handelt.Klickt man auf “Yes” wird “gpupdate /force” auf den erreichbaren Computern ausgeführt.Ein kurzer Report wird angezeigt, in dem evtl. Fehler sichtbar sind.PowerShellMit dem cmdlet “Invoke-GPUpdate” aus dem Modul “GroupPolicy” kann man das GP Update auch per PowerShell starten.Invoke-GPUpdate –Computer “win8cp-dc1”FirewallDamit das Remote GP Update funktioniert müssen folgende Windows Firewall Regeln aktiviert sein (Verbindungen akzeptieren)   Remote Scheduled Tasks Management (RPC)    Remote Scheduled Tasks Management (RPC-EPMAP)    Windows Management Instrumentation (WMI-IN) &#160;tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-remote-group-policy-refresh/\"\n},{\n  \"id\": \"post-windows-server-8-cp-servermanager\",\n  \"title\": \"Windows Server 8 CP –ServerManager\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"Seit kurzem die Beta des neuen Servers verfügbar, natürlich musste mal wieder ein neuer Name her: Windows Server “8” Consumer Preview.Der neue Server Manager ist natürlich im Metro Style und ist über die RSAT (Remote Server Administration Tools) auch für das neue Client OS (Windows 8 Consumer Preview) verfügbar.Download RSAT (Beta/CP): http://www.microsoft.com/download/en/details.aspx?id=28972DashboardÜber das Dashboard sieht man eine Zusammenfassung der verwalteten Server und Rollen. Der Status wird automatisch aktualisiert, standardmäßig alle 10 Minuten. Man wird so auf evtl. Probleme hingewiesen.Über “Manage” kann man Server hinzufügen oder Rollen und Features auf bereits verwalteten Server installieren.Fügt man einen Server hinzu, kann man diese aus dem Active Directory suchen oder den DNS Namen angeben, außerdem kann man Textdateien die Servernamen enthalten importieren.Damit man einen Server hinzufügen kann muss die Remoteverwaltung (WinRM) dort aktiviert werden, DCOM wird nicht mehr benötigt.Server GroupsMit Server Gruppen können mehrere Server die z.B. dieselbe Aufgabe erfüllen zu einer Gruppe hinzugefügt werden.&#160;&lt;h1&gt;Add Roles and Features&lt;/h1&gt;  &lt;p&gt;Über den Server Manager können Rollen und Features auf allen verwalteten Server hinzugefügt oder entfernt werden. In folgendem Beispiel füge ich einen weiteren Domain Controller hinzu. Alle Schritte führe ich auf meinem Windows 8 CP Client mit RSAT aus.&lt;/p&gt;  &lt;p&gt;Unter “Manage” klicke ich auf “Add Roles and Features” um den Wizard zu starten.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_377.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_375.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle die Art der Installation und den Zielserver aus.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_378.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_376.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle Active Directory Domain Services aus und bestätige dass ich die nötigen Rollen sowie die Management Tools installieren möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_379.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_377.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_380.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_378.png\\\" width=\\\"234\\\" height=\\\"244\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wurden die ADDS Binaries auf dem Zielserver installiert erhält man eine Notification im Server Manager, hier wird auch gleich der “Task” angezeigt um den Server zum Donain Controller zu machen (zu promoten)&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_381.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_379.png\\\" width=\\\"244\\\" height=\\\"132\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich klicke also auf “Promote this server to a domain controller” und komme so zu folgendem Wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_382.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_380.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wie bereits mit “dcpromo” kann man auch hier auswählen ob man den DC zu einer bestehenden Domain, eine neue Domain in einem bestehenden Forest hinzufügen, oder gleich einen neuen Forest erstellen möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_383.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_381.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Im nächsten Schritt werden die DC Options konfiguriert. Der DC soll DNS sowie Global Catalog sein, außerdem wird hier die Site ausgewählt und das DSRM Passwort gesetzt.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_384.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_382.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Man kann noch die Pfade für die ADDS Datenbank und Log Files sowie den SYSVOL Share setzen.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_385.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_383.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ist die Konfiguration abgeschlossen kommt man zur “Review Options” Seite, man kann die ausgewählten Optionen nochmal überprüfen. Das eigentlich interessante an dieser Seite ist jedoch der Button “View Script” er zeigt das PowerShell Script an, welches auf dem Remote Server ausgeführt wird.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_386.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_384.png\\\" width=\\\"244\\\" height=\\\"211\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der Server Manager erledigt alle Tasks mit PowerShell Befehlen, dcpromo kann noch für “unattended” Insatllationen verwendet werden, die Empfehlung von Microsoft ist es allerdings “dcpromo” nicht mehr zu verwenden.&lt;/p&gt;  &lt;p&gt;Server Manager führt einen prerequisite Check auf dem Zielserver durch, dabei wird überprüft ob der Server zum DC promoted werden kann.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_387.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_385.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nach dem Klick auf “Install” gehts los, der Server wird hochgestuft, und DNS sowie die AD Tools werden installiert. Anschließend wird der Server neu gestartet und ich habe einen neuen DC.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;tom&lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-servermanager/\"\n},{\n  \"id\": \"post-powershell-loves-wmi-os-info\",\n  \"title\": \"PowerShell loves WMI – OS Info\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Mit dem cmdlet Get-WmiObject kann Windows PowerShell auf WMI Objekte zugreifen. Man kann also z.B. die Eigenschaften der Klasse “Win32_OperatingSystem” anzeigen und daraus Informationen über das Betriebssystem erhalten.Die vollständige Liste der Eigenschaften (und Methoden) gibt es im MSDN. Oder natürlich mit folgendem Befehl:Get-WmiObject -Class win32_OperatingSystem -Property * | select *Interessante EigenschaftenOperatingSystemSKU: Enthält die installierte Version des Betriebssystems, z.B. Ultimate, Enterprise, Datacenter Server EditionProductType: Workstation, Domain Controller, ServerBuildNumber: Enthält die Build Nummer des BetriebssystemsOSArchitecture: 32-Bit oder 64-BitFilterMan kann aufgrund dieser Eigenschaften einfache Filter für Scripts erstellen und so z.B. sicherstellen dass ein bestimmtes Script nur auf einem bestimmten Betriebssystem ausgeführt wird.#Variable OS erstellen, enthält alle Informationen der angegebenen Klasse&lt;/p&gt;    $OS = Get-WMIObject –Class Win32_OperatingSystem    if($OS.OperatingSystemSKU -eq &quot;4&quot; -and $OS.Caption -like &quot;*Windows 7*&quot;) {    #Code für Windows 7 Enterprise    } else {    #Code für jedes andere OS    }    if ($os.OSArchitecture -eq &quot;64-bit&quot;){    #Code für x64     } else {    #Code für x86    }&lt;/code&gt;  Das sind natürlich sehr einfache Beispiele, wie mächtig WMI ist kann man sich am besten in der WMI Reference ansehen. Außerdem enthält das Beispiel keine Fehlerüberprüfung, läuft irgendwas schief, wars das.  Remote  Natürlich kann man auch Informationen über einen oder mehrere remote Computer auswerten. Das cmdlet Get-WmiObject hat den Parameter Computername über den man einen oder mehrere Computernamen (getrennt mit Komma) abfragen kann. Über Pipline Input kann man dem cmdlet Computernamen aus einem Textfile oder dem ActiveDirectory übergeben.  Get-WmiObject –Class win32_OperatingSystem –Computer mypc1,mypc2&lt;/p&gt;    Get-ADComputer -Filter 'Name -like &quot;*Server*&quot;'| Get-WmiObject –Class win32_OperatingSystem&lt;/code&gt;  &#160;  so long,  tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-loves-wmi-os-info/\"\n},{\n  \"id\": \"post-powershell-implicit-remoting\",\n  \"title\": \"PowerShell Implicit Remoting\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Eine der wichtigsten Funktionen der PowerShell ist die M&ouml;glichkeit cmdlet&rsquo;s (ScriptBlocks) auf remoten System auszuf&uuml;hren. Dazu wird eine PowerShell Sesion mit dem Remote Computer erstellt, die Befehle werden remote ausgef&uuml;hrt und das Ergebnis lokal angezeigt.Nun gibt es verschiedene Module f&uuml;r das Verwalten von Serverrollen wie z.B. Active Directory, Exchange 2010 oder Lync 2010. Will ich von meinem Client aus diese cmdlet&rsquo;s verwenden muss ich die Module installieren. Oder?Session erstellen und Modul LadenMan erstellt eine neue PSSessoin mit einem Computer auf dem das entsprechende Modul installiert ist.$ADSession = New-PSSession &ndash;ComputerName dc01.domain.localDann wird das Modul in der gerade erstellten Session geladen:Invoke-Command {Import-Module ActiveDirectory}&nbsp; -Session $ADSessionImport-PSSessionBefehle aus einer Session k&ouml;nnen mit Import-PSSession in die aktuelle PowerShell Sitzung &uuml;bernommen werden, man kann entweder alle Verf&uuml;gbaren cmdlet&rsquo;s importieren oder nur einen Teil. In diesem Beispiel interessieren mich die cmdlets aus dem ActiveDirectory Modul, die entsprechenden Nouns beginnen mit AD, ich kann also auf *-AD* Filtern und so nur ActiveDirectory cmdlet&rsquo;s &uuml;bernehmen.Import-PSSession -Session $ADSession-CommandName *-AD*So kann ich in meiner aktuellen PS Sitzung die AD cmdlet&rsquo;s wie Get-ADUser verwenden. Schlie&szlig;e ich das aktuelle PS Fenster wars das mit den AD cmdlet&rsquo;s.Export-PSSessionDamit man sich diese Befehle nicht merken muss und die cmdlet&rsquo;s einfach wiederverwendet kann, erstellt Export-PSSession automatisch ein Modul mit den gew&uuml;nschten remote cmdlet&rsquo;s.Export-PSSession $ADSession -OutputModule AD -CommandName *-AD* &ndash;AllowClobberJetzt kann man das aktuelle PowerShell Fenster schlie&szlig;en, ein Modul wurde erstellt das wie gewohnt geladen werden kann.Import-Module ADDie Befehle aus dem Modul sind jetzt verf&uuml;gbar, allerdings gibt es noch keine PSSession. Diese muss jedoch nicht manuell erstellt werden, f&uuml;hrt man den ersten Befehl aus dem Modul aus (Get-ADUser username) wird automatisch eine PS Session mit dem remote Computer erstellt und das cmdlet ausgef&uuml;hrt.So kann man also auf jedem beliebigen Client (auf dem nur PowerShell v2 installiert ist) cmdlet&rsquo;s ausf&uuml;hren die auf dem Server laufen.Exchange und LyncExchange und Lync bieten einen eigenen Endpoint f&uuml;r PowerShell Verbindungen, man gibt diesen bei der Erstellung der PSSession als ConnectionURI an.$exSession = New-PSSession -ConnectionUri 'http://ex14.domain.local/powershell/&rsquo; -ConfigurationName Microsoft.Exchange -Authentication Kerberos&lt;/p&gt;$lyncSession = New-PSSession &ndash;ConnectionUri &lsquo;https://lync.domain.local/ocspowershell&rsquo;&lt;/code&gt;Hat man die gew&uuml;nschte Session erstellt kann man sie wie gehabt mit Import-PSSession gleich verwenden oder mit Export-PSSession ein Modul erstellen.PrefixDamit man die lokalen und remoten cmdlet&rsquo;s unterscheiden kann, gibt es den Parameter &ndash;Prefix f&uuml;r die cmdlet&rsquo;s Import-Module und Import-PSSession.Import-Module AD &ndash;Prefix &lsquo;r&rsquo;So wird jedem Noun ein &lsquo;r&rsquo; vorgestellt, ich verwende also z.B. Get-rMailbox, Get-rADUser usw.&nbsp;Ich denke diese wenig bekannte Funktionalit&auml;t zeigt wie genial das Konzept der PowerShell ist, mit Windows 8 sollen jede Menge weitere cmdlet&rsquo;s dazukommen. PowerShell wird das ultimative Admin Werkzeug werden.&nbsp;so long, happy hacking!tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-implicit-remoting/\"\n},{\n  \"id\": \"post-exchange-2010-sp2-installation\",\n  \"title\": \"Exchange 2010 SP2 Installation\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Service Pack 2 für Exchange 2010 ist seit über zwei Monaten verfügbar,langsam Zeit sich ernsthaft gedanken über ein Update zu machen. Dabei gibt es ein paar Dinge zu berücksichtigen, hier eine kurze Zusammenfassung.Active Directory SchemaEs gibt ein neues Active Directory Schema, ein paar Infos dazu hier: http://blogs.technet.com/b/exchange/archive/2012/01/17/custom-aka-extension-attributes-in-exchange-2010-sp2-and-their-use.aspxUm das AD Schema zu aktualisieren benötigt man “Schema Admin” Berechtigungen, installiert man Exchange 2010 SP2 mit einem Benutzer der diese Rechte hat wird das Schema automatisch erweitert. Alternativ kann man die Setup Files von SP2 auf den Schema-Master kopieren und mit setup.com /prepareAD das Update durchführen.Die aktuelle Schema Version findet man folgendermaßen:Active Directory Schema:Get-ADObject &quot;cn=schema,cn=configuration,dc=ath,dc=int&quot; -Properties ObjectVersionExchange Schema:Get-ADObject &quot;cn=ms-Exch-Schema-Version-Pt,cn=schema,cn=configuration,dc=domain,dc=local&quot; -Properties RangeUpperGenauere Infos und die genauen Schema Versionsnummern gibt es im TechNet Wiki.Client Access Sever PrerequisiteDie Systemvoraussetzungen für die Client Access Rolle wurden geändert, hinzugefügt wurde IIS 6 Wmi Compatibility oder “web-wmi”. Das Feature kann automatisch installiert werden wenn die entsprechende Option beim Setup aktiviert wird, alternativ kann man es im Servermanager oder per Powershell installieren.Import-Module Servermanager&lt;/p&gt;    Add-WindowsFeature Web-WMI&lt;/code&gt;  Execution Policy GPO  In vielen Umgebungen werden Einstellungen wie z.B. die PowerShell Execution Policy über Gruppenrichtlinien gesteuert. Diese Gruppenrichtlinie führt zu einem Problem bei der Installation des Service Packs das den Server in einem Status zurücklässt in dem Exchange nicht mehr läuft und die Installation nicht fortgesetzt werden kann. Der Fehler “AuthorizationManager check failed” wird angezeigt. Klingt nach Restore.  Um das zu verhindern muss man die Gruppenrichtlinie vor dem Update deaktivieren, überprüft werden kann das so:  Get-ExecutionPolicy –List    Wichtig ist hierbei dass MachinePolicy und UserPolicy auf “Undefined” stehen.  Genaueres gibt es in der Knowledge Base.  Release Notes  Wie vor jedem Update empfehle ich hier auf jeden Fall einen Blick auf die Release Notes zu werfen.  &#160;  so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-sp2-installation/\"\n},{\n  \"id\": \"post-windows-powershell-v30\",\n  \"title\": \"Windows PowerShell v3.0 (CTP 2)\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Schon seit einiger Zeit ist das Community Technology Preview 2 vom Windows Management Framework 3.0 verfügbar, unter anderem enthält es die Windows PowerShell v3.Um in den Genuss der neue Features wie “automatic module loading” und “robust sessions” zu kommen benötigt man ein englisches Windows 7 und das .NET Framework 4. Ist das Betriebssystem in einer anderen Sprache installiert muss man vor der Installation des Management Frameworks das englische Sprachpaket installieren.DownloadAchtung: Es handelt sich um pre-release Code, sollte natürlich nur in Testumgebungen verwendet werden!.NET Framework 4 - http://go.microsoft.com/fwlink/?LinkID=212547Windows Management Framework 3.0 - Community Technology Preview (CTP) #2 - http://www.microsoft.com/download/en/details.aspx?id=27548InstallationDie Installation ist denkbar einfach, zuerst wird das .NET Framework installiert, anschließend je nach Platform WINDOWS6.1-KB2506143-x64.msu oder WINDOWS6.1-KB2506143-x86.msu. Nach einem neustart ist die neue PS verfügbar.Einige FeaturesWie bereits erwähnt enthält die neue PowerShell eineige neue Features sowie jede Menge neue cmdlets. Besonders gut gefallen mir die “Robusten Sessions”, verliert man die Netzwerkverbindung ist eine PowerShell Session mit einem remoten Host für gewöhnlich weg. Mit PS v3 wird die Session automatisch wieder hergestellt.Außerdem angenehm ist das autmatische Laden von Modulen, wer z.B. diverse Admin-Tools (Active Directory, Exchange) installiert hat muss in einer neuen PowerShell Session immer Module nachladen (oder ein entsprechendes Profil erstellen). Mit v3 wird ein Modul automatisch geladen wenn ein cmdlet aus dem Modul verwendet wird.PowerShell v2Man kann natürlich auch mit installierter PS v3 die Version 2 verwenden, da es sich um pre-release Code handelt kann es durchaus zu Problemen kommen. Um v2 zu starten wird die powershel.exe mit dem Parameter “-version 2” gestartet.Weitere InformationenEin guter Start ist das TechNet Wiki: http://social.technet.microsoft.com/wiki/contents/articles/4741.powershell-v3-featured-articles-en-us.aspx&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/windows-powershell-v30/\"\n},{\n  \"id\": \"post-exchange-2010-recovery\",\n  \"title\": \"Exchange 2010–Restore Mailbox Content\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber ein anderes mal mehr.Restore FilesDie Datenbank wird von der Sicherung zurück geholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Wiederherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die .edb Datei (Datenbank) und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Recovery DatabaseIst die Wiederherstellung abgeschlossen wird mit der Exchange Management Shell eine Recovery Database erstellt, diese verwendet die wiederhergestellte .edb Date sowie die wiederhergestellten Log Files. Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server MBX01, X:\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner wiederhergestellt wurden.New-MailboxDatabase RDB01 –Recovery –Server MBX01 –EdbFilePath x:\\\\restore\\\\db.edb –LogFolderPath x:\\\\restore Die Datenbank wurde also erstellt, allerdings wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.EseutilUm die Datenbank in einen sauberen Status zu bringen wird eseutil.exe verwendet. Dabei ist es wichtig die richtigen Parameter zu verwenden.Als erstes kann man überprüfen in welchen Zustand sich die Datenbank befindet:Eseutil /mh x:\\\\restore\\\\db.edbDie Datenbank ist also im “Dirty Shutdown” State und kann so nicht gemounted werden, mit “eseutil /r” wird die DB ohne Datenverlust in einen “Clean Shutdown” State gebracht. Mit dem Parameter /r wird der Präfix der Logs angegeben, also am besten zuerst den Dateinamen den Logs überprüfen. Die Parameter /l und /d geben den Pfad zu den Logs&#160; bzw. zur Datenbank an.Eseutil /r “E01” /l x:\\\\restore\\\\ /d x:\\\\resotreAchtung: Sollte das nicht funktionieren kann mit eseutil /p ein Hard Repair durchgeführt werden, dabei wird die Datenbank ohne Rücksicht auf Verluste in den “Clean Shutdown” State gebracht. Datenverlust ist möglich!Nachdem Eseutil durchgelaufen ist und sich die Datenbank im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick auf die RDB oder mit der Management Shell und folgendem Befehl:Mount-Database RDB01Mailbox Restore RequestWenn die Recovery Database online ist kann man beginnen Mailbox Inhalte wiederherzustellen, dazu verwendet man das cmdlet New-MailboxResotreRequest. Folgendes Beispiel stellt den Inhalt der Mailbox “Test User” in den Ordner Restore derselben Mailbox wieder her.New-MailboxRestoreRequest –SourceDatabase ‘RDB01’ –SourceStoreMailbox ‘test user’ –TargetMailbox ‘test.user@ntsystems.it’ –TargetRootFolder ‘Restore’Folgendes Beispiel stellt den Inhalt aller Mailboxen der Datenbank DB01 wieder her. Es wird für jede Mailbox ein Restore Request erstellt, auch hier wird der Inhalt in den Ordner Restore der jeweiligen Mailbox wiederhergestellt.Get-Mailbox –Database ‘DB01’ |foreach { New-MailboxRestoreRequest -SourceStoreMailbox $_.Guid –SourceDatabase ‘RDB01’ -TargetMailbox $_.Guid –TargetRootFolder ‘Restore’}Bei diesem cmdlet ist zu beachten dass die Parameter –SourceStoreMailbox und -TargetMailbox verschiedene Eingaben unterstützen, am Besten die Mailbox GUID verwenden, diese wird von beiden unterstützt.Weitere Infos zu New-MailboxRestoreRequest gibt es im TechNet: http://technet.microsoft.com/en-us/library/ff829875.aspx&#160;CleanupWenn der Restore Vorgang abgeschlossen ist kann man die Recovery Database wieder entfernen, dazu muss sie zuerst mit folgendem Befehl dismounted werden:Dismount-Database RDB01Anschließend kann man die RDB löschen, dazu verwendet man folgenden Befehl:Remove-MailboxDatabase RDB01Die Datenbank ist jetzt aus der Konfiguration entfernt, die Files sind jedoch nach wie vor auf dem Server. Diese müssen manuell gelöscht werden.&#160;so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-recovery/\"\n},{\n  \"id\": \"post-exchange-2010-unified-messaging-cisco-call-manager-86\",\n  \"title\": \"Exchange 2010 Unified Messaging–Cisco Call Manager 8.6\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Unified Messaging in Exchange 2010 verbindet E-Mail mit Voice Messaging in einer Messaging Infrastruktur. E-Mail und Voice Mail Nachrichten werden in einer “unified” Mailbox verwaltet und der Benutzer erhält neben Outlook und OWA auch über das Telefon (OVA – Outlook Voice Access) Zugriff auf seine Mailbox.Um die Unified Messaging Rolle mit der “traditionellen” Telefonwelt zu verbinden braucht man ein IP Gateway oder eine IP Telefonzentrale wie den Cisco Call Manager.Exchange Unified MessagingDie Unified Messaging Server Rolle kann auf einem bestehenden Exchange Server hinzugefügt werden, alternativ kann man einen separaten UM Server installieren.PrerequisitesDie notwendigen Voraussetzungen müssen auf einem Windows Server installiert werden, dazu verwendet man am besten die Powershell. Folgendes Beispiel installiert die Voraussetzungen für einen Server der nur die UM Rolle betreibt.Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Desktop-Experience –RestartAchtung: Neustart erfolgt automatisch, sollte das nicht gewünscht sein den Parameter –Restart entfernen.UM Rolle InstallierenUm die Exchange UM Rolle zu installieren wird Setup.exe von einer aktuellen Version der Installationsmedien ausgeführt. Auf einem neuen Server wird dann nur die Unified Messaging Rolle installiert, ein bestehender Server wird über den “Maintenance Mode” um diese Rolle erweitert.Wie nach jeder Installation sollte man auch hier Windows Update ausführen und evtl. Updates installieren.UM KonfigurationNach der Installation der Rolle muss diese konfiguriert werden.Organization ConfigurationEin UM Dial Plan muss erstellt werden, dazu unter Organization Configuration auf Unified Messaging klicken und “New UM Dial Plan” wählen, hier wird der URI Type “Telephone Extension” ausgewählt sowie die länge der internen Telefonnummern (Extension) angegeben.Der UM Dial Plan ist die zentrale Komponente der UM Konfiguration und entspricht der Telefonzentrale bzw. Gruppen von Benutzern mit gleichen Telefonnummern (4 stellig) und dem selben URI Type (Telephone Extension).Der Dial Plan wird im Active Directory unter “CN=My 4 Digit DP, CN=UM DialPlan Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” gespeichert.Gleichzeitig mit dem Dial Plan wird eine UM Mailbox Policy erstellt, auch diese wird im AD unter “CN=My 4 Digit DP Default Policy, CN=UM Mailbox Policies, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain,DC=Local” gespeichert.Über die UM Mailbox Policy werden Einstellungen für UM aktivierte Postfächer konfiguriert.&#160;Als nächstes wird ein UM IP Gateway angelegt, das Gateway ist die SIP Gegenstelle. In diesem Fall gebe ich den Cisco Call Manager an. Um ein UM IP Gateway anzulegen klickt man unter Organization Configuration, Unified Messaging auf “New UM IP Gateway”.Für jedes IP Gateway wird im AD unter “CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” ein neuer Container angelegt.Eine Hunt Group verbindet das IP Gateway mit dem Dial Plan, wird beim erstellen des UM IP Gateways ein Dial Plan angegeben wird automatisch die “Default Hunt Group” erstellt. Dieser Default Hunt Group wird kein Pilot Identifier zugewiesen, d.h. alle eingehenden Calls (SIP Invites) werden angenommen.Wird die Hunt Group manuell erstellt kann ein Pilot Identifier angegeben werden, dadurch antwortet Exchange UM nur mehr auf Calls die eine konfigurierte Nummer anrufen. Ich verwende hier 9999 als Pilot Identifier, d.h. der Call Manager muss Anrufe an 9999 über den SIP Trunk routen.Um eine neue Hunt Group zu erstellen wählt man unter Organization Configuration, Unified Messaging das IP Gateway aus und klickt dann auf “New UM Hunt Group”.Die Hunt Group wird im Container des entsprechenden IP Gateways gespeichert, in diesem Fall unter: “CN=MY_CUCM_HuntGroup, CN=CUCM1, CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local”Die Verbindung zum Dial Plan wird im Attribut msExchUMHuntGroupDialPlanLink gespeichert.Die Exchange Unified Messaging Organisationskonfiguration ist somit abgeschlossen.Server ConfigurationIn der Server Configuration wird der Dial Plan mit einem oder mehreren Exchange UM Servern verbunden. Dazu unter Server Configuration auf Unified Messaging klicken und den entsprechenden Server auswählen. In den Eigenschaften “UM Settings” wählen und den Dial Plan hinzufügen.Die Exchange Unified Messaging Serverkonfiguration ist damit abgeschlossen und die Exchange Umgebung ist bereit für die erste “unified” Mailbox.Recipient ConfigurationUm eine Mailbox für UM zu aktivieren wählt man die Mailbox unter Recipient Configuration, Mailboxes aus und klickt auf Enable Unified Messaging.Jedem Benutzer muss eine UM Mailbox Policy zugewiesen werden, außerdem muss er eine eindeutige “Extension” erhalten. Die Extension ist die Telefonnummer unter der die Voice Mailbox antwortet, also die Interne Telefonnummer des Benutzers.Der Benutzer erhält ein Willkommens-E-mail von Unified Messaging in dem sein PIN und seine Extension mitgeteilt werden.Die Extension wird dem Benutzer als “E-Mail Adresse” vom Typ EUM zugewiesen:ProxyAddressString: EUM:1000;phone-context=CUCM1.domain.localSoll ein Benutzer mehrere Extension erhalten kann man diese einfach als zusätzliche “E-Mail Adressen” hinzufügen.&#160;Cisco Call ManagerDamit der Call Manager mit dem Exchange Server verbunden werden kann wird ein SIP Trunk benötigt. Außerdem muss eine Route erstellt werden über die der Call Manager weiß welche Nummern hinter dem SIP Trunk zu finden sind.SIP TrunkDer SIP Trunk wird unter Device, Trunk “Add New” erstellt.Man muss dem Trunk einen Namen geben, den Device Pool auswählen, die IP Adresse des Exchange UM Servers als Destination angeben und ein SIP Profile sowie das SIP Trunk Security Profile auswählen. Sind mehrere Exchange UM Server vorhanden muss ein Trunk pro Server angelegt werden.Wichtig: Für Outbound Calls muss “Redirecting Diversion Header Delivery – Outbound” aktiviert werden, durch die Informationen im Diversion Header kann der Exchange Server das Postfach aufgrund der Extension zuweisen.Für alle anderen Einstellungen sind die Defaults des Call Managers ok. Je nach Umgebung kann es sein dass man “Media Termination Point Required” aktivieren muss.Route PatternDamit der Call Manager Anrufe an 9999 routen kann muss man eine Route Pattern erstellen, dazu unter Call Routing, Route/Hunt auf Route Pattern klicken. Mit Add New kann eine neue Pattern hinzugefügt werden. Auch hier muss ein Device Pool sowie der SIP Trunk als Gateway angegeben werden. In Umgebungen mit mehrere Exchange UM Servern empfiehlt es sich eine Route List für die SIP Trunks anzulegen und die Pattern auf die Route List zu binden.Die minimale Konfiguration ist dadurch abgeschlossen, wenn der UM aktivierte Benutzer mit der Nummer 1000 jetzt die Nummer 9999 anruft erhält er Zugriff auf sein Postfach über OVA. Wenn derselbe Benutzer eine Umleitung auf 9999 einrichtet werden alle eingehenden Calls auf sein Voicemail Postfach umgeleitet.MWI - Message Waiting IndicatorWenn jemand eine Nachricht hinterlässt wird diese in der Inbox angezeigt, zusätzlich kann am Phone ein MWI Status angezeigt werden (rotes LED). Der Benutzer sieht so sofort dass er eine neue Voicemail hat. Um dieses Feature zu aktivieren muss das “SIP Trunk Security Profile” geändert werden. Dazu unter System, Security auf SIP Trunk Security Profile klicken und das Profil auswählen das dem Trunk zugewiesen wurde. Bei diesem Profil muss die Option “Accept Unsolicited Notification” aktiviert werden.Voice Mail ProfileUm den Voice Mail Button am Phone zu konfigurieren muss ein Voice Mail Pilot sowie ein Voice Mail Profile konfiguriert werden.Dazu unter Advanced Features, Voice Mail auf Voice Mail Pilot klicken und mit Add New einen neuen Voice Mail Pilot erstellen.Unter Advanced Features, Voice Mail, Voice Mail Profile kann ein neues Profil angelegt werden.Achtung: Wird “Make this the default…” ausgewählt wird das Profil automatisch auf allen Phones konfiguriert die keine diesbezügliche Konfiguration haben.Nun kann man unter Device, Phone in der entsprechenden Direct Number Configuration ein Voice Mail Profile konfigurieren.&#160;special thanks to pk :)&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-unified-messaging-cisco-call-manager-86/\"\n},{\n  \"id\": \"post-citrix-sprache-des-ica-client-andern\",\n  \"title\": \"Citrix, Sprache des ICA Client ändern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Citrix\"],\n  \"content\": \"Kleiner Tipp: Das Citrix Online Plug-In (ICA Client) wird standardgemäß in der Betriebssystemsprache ausgeführt. Will man die Sprache manuell ändern, lässt sich das über folgenden Befehl unter C:\\\\Program Files (x86)\\\\Citrix\\\\ICA Client realisieren: WFICA32.EXE /UserUILocale&#160;&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/citrix-sprache-des-ica-client-andern/\"\n},{\n  \"id\": \"post-windows-8-installation-in-vhd\",\n  \"title\": \"Windows 8 - Installation in VHD\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Client\"],\n  \"content\": \"In diesem Post (Windows 7 - Nativer VHD Support) habe ich vor einiger Zeit beschrieben wie man Windows 7 in eine VHD installieren kann.Nun, das funktioniert genau gleich f&uuml;r das&nbsp;Windows 8 Developer Preview! Hier nochmal eine kuze Zusammenfassung:VHD erstellen: Diskpart; create vdisk file=\\\"E:\\\\VHD\\\\win8-1.vhd\\\" type=fixed maximum=20480 erstellt eine 20GB VHD vom Typ \\\"Fixed\\\", die Datei belegt also den vollen Speicher auf der FestplatteVon Windows 8 Installationsmedium bootenmit \\\"Shift\\\"+\\\"F10\\\" eine Eingabeaufforderung &ouml;ffnenVHD ausw&auml;hlen: Diskpart; select vdisk file=\\\"E:\\\\VHD\\\\win8-1.vhd\\\"attach vhdDiskpart und Eingabeaufforderung schlie&szlig;en, Windows 8 installieren.Der neue Bootmanager ist &uuml;brigens auch im Metrostyle ;)Wie Windows 7 kann man auch Windows 8 vom USB Stick installieren, auch diese Anleitung funtioniert weiterhin!enjoy!!\",\n  \"url\": \"https://onprem.wtf/post/windows-8-installation-in-vhd/\"\n},{\n  \"id\": \"post-windows-8-developer-preview\",\n  \"title\": \"Windows 8–Developer Preview\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"In Anaheim, Ca findet zurzeit die BUILD Konferenz statt. Diese mehrtätige Veranstaltung richtet sich vor allem an Entwickler und stellt das neue Betriebssystem Windows 8 vor.Seit dem frühen Morgen kann man sich ein “Developer Preview” Build von Windows 8 herunterladen. Verfügbar sind 32 und 64 Bit Images mit oder ohne Entwicklungstools. Hier der Link zur Seite: http://dev.windows.comEinige Neuerungen im ÜberblickDas neue Startmenü im Metro StyleWindows Explorer mit Ribbon, und den neuen Copy/Cut/Paste DialogenAußerdem kann man jetzt ISO und VHD Files direkt im Windows Explorer mounten/öffnen.Auch der Task Manager wurde erneuertHyper-V Support, der Hammer! Hyper-V für den Client mit 64 Bit Guest Support. Außerdem Support für Standby Mode und WLANPowerShell 3&#160;Das ist nur ein schneller Überblick, in den nächsten Tagen gibt es Details. Sehr Empfehlenswert sind folgenden Links:http://www.buildwindows.comhttp://blogs.msdn.com/b/b8enjoy!   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-8-developer-preview/\"\n},{\n  \"id\": \"post-outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender\",\n  \"title\": \"Outlook 2003 / Exchange 2010 Probleme beim Öffnen freigegebener Kalender\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"In einer Umgebung mit Exchange 2010 und Outlook 2003 als Mail Client kann es beim &Ouml;ffnen freigegebener Kalender zu Problemen kommen. Dabei erscheint folgende Fehlermeldung:&nbsp;Anders als &lt; Office 2007 &ouml;ffnet Outlook 2003 die Verbindung direkt zu den Mailboxserver und nicht &uuml;ber den Address-Book Service. Um dieses Problem zu beheben, muss das Verbindungslimit, welches standardgem&auml;&szlig; 20 betr&auml;gt, angehoben werden. Hierzu erstellen wir eine neue ThrottlingPolicy und weisen diese dem Benutzer zu:&nbsp;New-ThrottlingPolicy &ndash;name Outlook2003CalendarSet-ThrottlingPolicy &ndash;identity Outlook2003Calendar &ndash;RCAMaxConcurrency 100Set-Mailbox &ndash;Identity &ldquo;MAILBOX-USER&rdquo; &ndash;ThrottlingPolicy Outlook2003Calendar&nbsp;Gr&uuml;&szlig;e   dn\",\n  \"url\": \"https://onprem.wtf/post/outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender/\"\n},{\n  \"id\": \"post-powershell-rekursiv-nach-anderungsdatum-sortieren\",\n  \"title\": \"PowerShell–Rekursiv nach Änderungsdatum sortieren\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Ganze Ordnerstrukturen oder Laufwerke nach Dateien zu durchsuchen die zuletzt ge&auml;ndert worden sind kann ganz sch&ouml;n m&uuml;hsam sein. Mit der PowerShell geht das in einem Oneliner.PS X:\\\\&gt; Get-ChildItem C:\\\\Windows\\\\Logs -Recurse | Sort-Object -Property LastWriteTime &ndash;Descending | Where-Object {$_.Mode -notlike \\\"d*\\\"} | Select-Object -First 10 | Format-Table -Property LastWriteTime,FullName &ndash;AutoSizeDieses Beispiel durchsucht C:\\\\Windows\\\\Logs rekursiv und sortiert Absteigend nach &ldquo;LastWriteTime&rdquo;. Ordner werden standardm&auml;&szlig;ig auch zur&uuml;ckgegeben, diese werden mit &ldquo;Where-Object&rdquo; gefiltert. Da mich nur die 10 Dateien interessieren die zuletzt ge&auml;ndert wurden verwende ich &ldquo;Select-Object&rdquo;. Anschlie&szlig;end wird die Ausgabe noch Formatiert. Das Ganze sieht dann so aus:M&ouml;chte man das Ergebnis in eine Datei schreiben, bietet sich das cmdlet &ldquo;Export-CSV&rdquo; an, daf&uuml;r &auml;ndert man die &ldquo;Select-Object&rdquo; Abfrage z.B. folgenderma&szlig;en:PS X:\\\\&gt; Get-ChildItem C:\\\\Windows\\\\Logs -Recurse | Sort-Object -Property LastWriteTime -Descending | Where-Object {$_.Mode -notlike \\\"d*\\\"} | Select-Object &ndash;Property FullName,CreationTime,LastWriteTime,LastAccessTime,Length,Attributes | Export-Csv Report.csvDas Ergebnis sieht dann so aus:Durch &Auml;nderungen der Where, Select, Format cmdlets bzw. Parameter l&auml;sst sich eine Vielzahl von Ausgaben erzeugen, f&uuml;r weitere Informationen und Hilfe zu den einzelnen cmdlets:Get-Help cmdlet &ndash;OnlineAchtung: Der Parameter &ldquo;Recurse&rdquo; geht durch alle untergeordneten Verzeichnisse, das kann je nach Struktur ziemlich lange dauern. Au&szlig;erdem gelten Berechtigungen nat&uuml;rlich auch f&uuml;r die PowerShell, man kann also nicht Ordner durchsuchen auf die man keine Rechte hat, das sieht dann so aus:have fun!    tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-rekursiv-nach-anderungsdatum-sortieren/\"\n},{\n  \"id\": \"post-diginotar-nur-ein-zufall!\",\n  \"title\": \"DigiNotar–nur ein Zufall!?\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Client\",\"Server\"],\n  \"content\": \"Vor einigen Tagen wurde bekannt das bereits Anfang Juni(!!) bei einem Hack der niederl&auml;ndischen Zertifizierungsstelle &ldquo;DigiNotar&rdquo; mehr als 500 &ldquo;gef&auml;lschte&rdquo; Zertifikate ausgestellt wurden.Unter den Zertifikaten befinden sich folgende Wildcard Zertifikate:*.*.com *.*.org *.10million.org *.android.com *.aol.com *.azadegi.com *.balatarin.com *.comodo.com *.digicert.com *.globalsign.com *.google.com *.JanamFadayeRahbar.com *.logmein.com *.microsoft.com *.mossad.gov.il *.mozilla.org *.RamzShekaneBozorg.com *.SahebeDonyayeDigital.com *.skype.com *.startssl.com *.thawte.com *.torproject.org *.walla.co.il *.windowsupdate.comEine vollst&auml;ndige Liste der Zertifikate gibt es hier.&nbsp;Der Angriff wurde entdeckt weil in Googles Chrome Browser die g&uuml;ltigen Zertifikate fix hinterlegt sind, der Browser also beim Anzeigen vermeintlich authentischer Google Inhalte gemeckert hat. Wenn die &ldquo;T&auml;ter&rdquo; den &ldquo;User Agent String&rdquo; von Chrome gefiltert h&auml;tten, wer wei&szlig; wann (und ob) dieser Hack &ouml;ffentlich geworden w&auml;re&hellip;Vermutungen wie viele derartige Angriffe bisher unerkannt geblieben sind und wer dahinter steckt &uuml;berlasse ich anderen. Ich hoffe allerdings dass die Debatte um Sicherheit und das &ldquo;Web of Trust&rdquo; weitergef&uuml;hrt wird und durch solche krassen Vorf&auml;lle mehr Aufmerksamkeit bekommt.&nbsp;&nbsp;Betroffene CAsFolgende Zertifizierungsstellen m&uuml;ssen aus allen Browsern, Applikationen und Betriebssystemen verschwinden, sie gelten als NICHT mehr Vertrauensw&uuml;rdig:CertificateIssued byThumbprintDigiNotar Root CADigiNotar Root CAc0 60 ed 44 cb d8 81 bd 0e f8 6c 0b a2 87 dd cf 81 67 47 8cRoot CA G2DigiNotar Root CA G243 d9 bc b5 68 e0 39 d0 73 a7 4a 71 d8 51 1f 74 76 08 9c c3PKIoverheid CA OverheidStaat der Nederlanden Overheid CAb5 33 34 5d 06 f6 45 16 40 3c 00 da 03 18 7d 3b fe f5 91 56PKIoverheid CA Organisatie - G2Staat der Nederlanden Organisatie CA - G25d e8 3e e8 2a c5 09 0a ea 9d 6a c4 e7 a6 e2 13 f9 46 e1 79PKIoverheid CA Overheid en BedrijvenStaat der Nederlanden Overheid CA40 aa 38 73 1b d1 89 f9 cd b5 b9 dc 35 e2 13 6f 38 77 7a f4Windows UpdateMicrosoft hat inzwischen reagiert und ein Windows Update zur Verf&uuml;gung gestellt, genauere Informationen findet man im Microsoft Security Advisory (2607712).Wie an vielen Stellen zu lesen ist soll es mit diesen Zertifikaten m&ouml;glich sein gef&auml;lschte Windows Updates zu verteilen, das ist laut Microsoft NICHT der Fall. Der Windows Update Client installiert ausschlie&szlig;lich Pakete die mit dem &ldquo;Microsoft Root Certificate&rdquo; signiert sind.&nbsp;FirefoxF&uuml;r Mozilla Firefox wir ein Update in k&uuml;rze erwartet, hier empfiehlt es sich die genannten CAs manuell zu entfernen!Unter Einstellungen, Erweitert, Verschl&uuml;sselung klickt man auf &ldquo;Zertifikate anzeigen&rdquo;. Jetzt bekommt man eine Liste der Zertifizierungsstellen und kann das Vertrauen entziehen.Weitere Infos im Mozilla Security Blog.&nbsp;&nbsp;AppleApple hat wohl zur Zeit andere Priorit&auml;ten, MAC Benutzer sollten auf jeden Fall manuell die oben genannten Zertifikate entfernen. Chester Wisniewski von Sophos beschreibt das Ganze so:What about Apple users? Well, apparently they are too busy playing Angry Birds and making pictures in Photoshop to worry about pesky certificate issues.&lt;/p&gt;My advice if you run a Mac? Use BootCamp and Windows 7 until Apple decides to provide a patch. Or I guess you could use Firefox (not Chome, it also uses Apple's KeyChain)...&lt;/code&gt;Ein erster Bericht der Security Consultants Fox-IT zum Thema ist verf&uuml;gbar:http://www.rijksoverheid.nl/ministeries/bzk/documenten-en-publicaties/rapporten/2011/09/05/diginotar-public-report-version-1.htmlstay secure  tom\",\n  \"url\": \"https://onprem.wtf/post/diginotar-nur-ein-zufall!/\"\n},{\n  \"id\": \"post-esxi-persistent-scratch-location\",\n  \"title\": \"ESXi–Persistent Scratch Location\",\n  \"author\": \"tto\",\n  \"tags\": [\"VMware\",\"Server\"],\n  \"content\": \"In diesem Artikel habe ich beschrieben wie man den ESXi Hypervisor auf einem USB Stick installieren kann. Ein Nachteil dieser Installation ist das Fehlen der Scratch Partition, sie wird nicht automatisch erstellt da Flash Medien eine beschränkte Anzahl von schreib/lese Zyklen haben und sich so nicht besonders als Speicherort für Logfiles eignen.&#160;ESXi Scratch PartitionDie Scratch Partition ist optional und wird standardmäßig während der Installation von ESXi auf lokalem Storage angelegt. Wenn lokaler Storage verfügbar ist wird die Scratch Partition mit 4GB angelegt, sie wird verwendet um den Output von “vm-support” zu speichern, gibt es keine Scratch Partition wird dieser wird dieser Output in den RAM geschrieben.Wird die Scratch Partition automatisch erstellt ist es nicht empfohlen die bestehende Konfiguration zu ändern, wird die Scratch Partition nicht automatisch angelegt (z.B. bei Installation auf USB) ist es empfohlen manuell einen Speicherort für “Scratch” zu konfigurieren.Configure Scratch Location – vSphere ClientUm die Scratch Location manuell zu konfigurieren muss man zuerst einen Ordner auf einem Datastore anlegen, der ESXi Host muss natürlich Zugriff auf diesen Datastore haben. Dazu wechselt man im vSphere Client auf “Configuration” und wählt unter “Storage” einen Datastore aus, mit rechtsklick “Browse Datastore” öffnet man den Datastore Browser und legt einen Ordner an. Achtung: Es muss einen eindeutigen Ordner pro ESXi Host geben, man kann nicht einen Scratch Ordner für mehrere Hosts verwenden!Die Scratch Location wird in den “Advanced Settings” unter “Configuration”, “Software” konfiguriert. Dort gibt es einen Abschnitt “ScratchConfig” welcher ein Textfeld für die Einstellung “ScratchConfig.ConfiguredScratchLocation” anzeigt. In dieses Textfeld muss der vollständige Pfad zum Order eingegeben werden, also z.B: /vmfs/volumes/&lt;myDatastore&gt;/.scratch-esx1Achtung: diese Einstellung wird erst nach einem Neustart des ESXi Hosts wirksam.vSphere Client Login– A general system error occuredWird eine Active Directory Domain zur Authentifizierung angegeben und es ist keine Scratch Partition Konfiguriert kann man sich am vSphere Client nicht anmelden und bekommt eine (sehr vielsagende) Fehlermeldung, entweder: “A general system error occured” oder “gss_acquire_cred failed”Der Grund für den Fehler ist offensichtlich dass ESXi versucht Informationen über die Anmeldung in ein Logfile unter /scratch/var/tmp zu schreiben.Genauere Infos zum Thema gibts hier:http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=1033696http://blogs.vmware.com/esxi/2011/04/scratch-partition-best-practices-for-usbsd-booted-esxi.htmlhttp://blogs.vmware.com/esxi/2011/03/ops-changes-part-5-scratch-partition.htmlso long,   tom\",\n  \"url\": \"https://onprem.wtf/post/esxi-persistent-scratch-location/\"\n},{\n  \"id\": \"post-citrix-ima-dienst-startet-nicht-mehr\",\n  \"title\": \"Citrix IMA Dienst startet nicht mehr\",\n  \"author\": \"dni\",\n  \"tags\": [\"Citrix\"],\n  \"content\": \"Lässt sich der Citrix IMA Dienst nicht mehr starten, können keine eingehende Verbindung zum Citrix Server mehr initiiert werden. Versucht man den IMA Dienst zu starten und erhält folgende Fehlermeldung: Windows could not start Citrix Independent Management Architecture on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code –2147483647&#160;&#160;Opening the Event Viewer of the affected server shows this event on the System Log:&lt;/p&gt;    “Failed to load plugin C:\\\\Prgoram Files (x86)\\\\Citrix\\\\System32\\\\Citrix\\\\IMA\\\\Subsystems\\\\RADESessionsSs.dll with error IMA_RESULT_FAILURE”&lt;/code&gt;  &#160;    &#160;  In den meisten Fällen ist die lokale Streaming Offline Datenbank korrupt. Dies lässt sich meist durch den Befehl dsmaint recreaterade beheben.   Lässt sich der IMA Dienst immer noch nicht starten, sind wahrscheinlich die Verbindungseinstellungen im File C:\\\\Program Files (x86)\\\\Citrix\\\\Independent Management Architecture\\\\RadeOffline.dsn korrupt:  Fehlerhafte Konfiguration:    Diese muss durch eine gültige Konfiguration ersetzt werden:    Nun ist es noch notwendig die Streaming Offline Datenbank neu zu erstellen:  dsmaint recreaterade   Der Citrix IMA Dienst sollte sich jetzt normal starten lassen.  &#160;  Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/citrix-ima-dienst-startet-nicht-mehr/\"\n},{\n  \"id\": \"post-citrix-xenapp6-fehler-beim-starten-des-webservice\",\n  \"title\": \"Citrix XenApp6 Fehler beim starten des Webservice\",\n  \"author\": \"dni\",\n  \"tags\": [\"Citrix\"],\n  \"content\": \"Letztens bin ich auf ein seltsamen Problem in XenApp6 gestoßen:Sobald man den Webservice startet und einen Verbindungsversuch unternimmt, beendet sich der ApplicationPool und Verbindungen werden terminiert.Im EventLog wird folgender Fehler protokolliert:&#160;Log Name: Application&lt;/p&gt;    Source: Microsoft-Windows-IIS-W3SVC-WP    Date: 17/06/2011 09:37:36    Event ID: 2307    Task Category: None    Level: Error    Keywords: Classic    User: N/A    Computer: ts1.ntsystems.it    Description:    The worker process for application pool 'CitrixWebInterface5.3.0AppPool' encountered an error 'Failed to decrypt attribute 'password'    ' trying to read configuration data from file '\\\\\\\\?\\\\C:\\\\inetpub\\\\temp\\\\apppools\\\\CitrixWebInterface5.3.0AppPool.config', line number '150'. The data field contains the error code.&lt;/code&gt;  &#160;  Lösung  Um den Fehler zu beheben und das Webinterface richtig starten zu können, müssen in der Datei C:\\\\Windows\\\\System32\\\\inetsrv\\\\config\\\\applicationHost.config die Zeilen zwischen  &lt;configProtectedData&gt; gelöscht werden. Wichtig ist dabei, dass IIS vorher beendet wurde. Danach muss der Service wieder gestartet, der ApplicationPool lässt sich nun auch normal starten. Eingehende Verbindungen zum Webinterface werden nun auch richtig verarbeitet.  &#160;  Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/citrix-xenapp6-fehler-beim-starten-des-webservice/\"\n},{\n  \"id\": \"post-ex2k10-pst-in-archive-importieren\",\n  \"title\": \"EX2k10 PST in Archive importieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Um PST Files in ein Exchange 2010 SP1 Archive-Mailbox zu verschieben muss zunächst sichergestellt werden, dass der Microsoft Exchange Mailbox Replication Dienst gestartet ist. Zudem muss der Gruppe “Exchange Trusted Subsystem Security Group” NTFS und Freigabeberechtigungen für das PST File gegeben werden.&#160;Um den Import durchzuführen muss jetzt das entsprechende Benutzerkonto der neuen Gruppe “Mailbox Import Export Group” hinzugefügt werden:New-RoleGroup &quot;Mailbox Import Export Group&quot; -Roles &quot;Mailbox Import Export&quot;Add-RoleGroupMember &quot;Mailbox Import Export Group&quot; -Member &quot;Administrator&quot;&#160;Nun kann das PST File über den Befehl New-MailboxImportRequest in das Archiv importiert werden. Anbei ein Script, wo man im File Users.csv PST Files den jeweiligen Benutzern zuweisen und den Import Request generieren kann:import-csv &quot;Users.csv&quot;|ForEach{&lt;/p&gt;    New-MailboxImportRequest -Mailbox $_.user -FilePath $_.Path -BadItemLimit 50 -IsArchive    }&lt;/code&gt;  Bsp für Users.csv:  User,Path   daniel.nitz,\\\\\\\\share\\\\daniel-PST.PST  &#160;  Grüße   dn&lt;/td&gt;&lt;/tr&gt;\",\n  \"url\": \"https://onprem.wtf/post/ex2k10-pst-in-archive-importieren/\"\n},{\n  \"id\": \"post-lync-integration-in-outlook-web-app-2010\",\n  \"title\": \"Lync Integration in Outlook Web App 2010\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Seit einiger Zeit ist der Nachfolger des Office Communication Servers verf&uuml;gbar, Lync 2010 vereint Enterprise Voice, Instant Messaging, Presence sowie Live Meeting, weitere Details gibts hier: http://lync.microsoft.com/en-us/Pages/default.aspxAuch Outlook Web App kann als Lync Client konfiguriert werden, folgende Features werden direkt von OWA unterst&uuml;tzt, es wird daf&uuml;r kein Client auf dem PC ben&ouml;tigt:Presence, der Status anderer wird angezeigt, au&szlig;erdem kann man seinen Status &auml;ndern bzw. sich an- und abmelden Die Lync Kontaktliste wird angezeigt Instant Messaging mit einem Web Client PrerequisitesAuf dem Client Access Server m&uuml;ssen die Komponenten f&uuml;r Microsoft Office Communications Server 2007 R2 Web Service Provider installiert werden. Der Common Name im Zertifikat des Client Access Servers muss der FQDN des Client Access Servers sein. Wenn es sich um ein CAS Array handelt muss der Common Name dem FQDN des CAS Array entsprechen. Instant Messaging muss auf dem Client Access Server aktiviert werden In der Lync Umgebung muss ein Trusted Application Pool und eine Trusted Application erstellt und aktiviert werden. Exchange Client Access Server/Array KonfigurationFolgende Pakete herunterladen:Office Communication Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=2310 Hotfix f&uuml;r den OC Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=797 Hotfix f&uuml;r Unified Communication API:      http://www.microsoft.com/download/en/details.aspx?id=7557 Als erstes wird jetzt CWAOWASSPMain.msi installiert, dieses Paket erstellt einen Ordner (Standard: C:\\\\Web Service Provider Installer Package\\\\) und kopiert die ben&ouml;tigten Installationsdateien f&uuml;r den OC Web Service Provider in diesen Ordner. Jetzt in diesen Ordner wechseln und die Pakete in folgender Reihenfolge installierenvcredist_x64.exe UcmaRedist.msi CWAOWASSP.msi Jetzt fehlen noch die Hotfixes aus den Downloads 2 und 3, auch diese Pakete installierenUcmaRedist.msp CWAOWASSP.msp Die ben&ouml;tigte Software ist somit installiert, jetzt muss Instant Messaging noch aktiviert werden. Die Konfiguration daf&uuml;r wird am OWA Virtual Directory gemacht. Der InstantMessagingType wird auf OCS ge&auml;ndert, als InstantMessagingServerName wird der Lync Server angegeben. Au&szlig;erdem muss der Thumbprint des Zertifikates das f&uuml;r TLS verwendet werden soll angegeben werden und InstantMessaging aktiviert werden. Folgende PowerShell Befehl erledigt dieses Schritte:$iiscert = (Get-ExchangeCertificate | Where {$_.Services -like \\\"*IIS*\\\"}).ThumbprintGet-OWAVirtualDirectory -Server ex14.ntsystems.local | Set-OWAVirtualDirectory -InstantMessagingType OCS -InstantMessagingEnabled:$true -InstantMessagingCertificateThumbprint $iiscert -InstantMessagingServerName lync.ntsystems.localAchtung: Wenn bei Get-OWAVirtualDirectory der Parameter Server weggelassen wird werden alle Virtual Directories der Exchange Umgebung konfiguriert. Bei InstantMessagingServerName muss der FQDN des Lync Servers angegeben werden.In einem CAS Array m&uuml;ssen diese Schritte auf allen Servern wiederholt werden.Lync Server KonfigurationMit dem Lync Server Topology Builder wird jetzt unter &ldquo;Trusted Application Servers&rdquo; ein neuer Application Pool angelegt. Dieser Pool wird als Single Computer Pool angelegt, der FQDN muss dabei entweder dem Namen des Client Access Server oder dem Namen des CAS Arrays entsprechen.Jetzt wird der Lync Server Frontend Pool ausgew&auml;hlt, welcher f&uuml;r diese Applikation verwendet werden soll.Der Server ist jetzt erstellt, Standardm&auml;&szlig;ig ist &ldquo;Enable replication of configuration data to this pool&rdquo; aktiviert, das wird nicht ben&ouml;tigt und kann in den Eigenschaften des soeben erstellten Objektes deaktiviert werden.Jetzt kann die &Auml;nderung der Topologie ver&ouml;ffentlicht werden, dazu klickt auf Action, Topology und Publish.Es fehlt noch die CSTrustedApplication, diese wird &uuml;ber die Lync Server Management Shell angelegt. Auch dabei muss wieder der FQDN des Client Access Servers oder des CAS Arrays angegeben werden, au&szlig;erdem wird ein Port f&uuml;r die Applikation angegeben, nat&uuml;rlich muss ein Port verwendet werden der frei ist. (netstat &ndash;an zeigt verwendete Ports an). Mit folgendem PowerShell Befehl wird die Applikation erstellt:New-CsTrustedApplication -ApplicationID OWA -TrustedApplicationPoolFqdn ex14.ntsystems.local -Port 4999Diese Konfiguration muss noch aktiviert werden, das wird mit folgendem PowerShell cmdlet gemacht:Enable-CsTopologyEnjoyDie Konfiguration ist jetzt abgeschlossen, ab jetzt sind die neuen Features in Outlook Web App aktiv&hellip;TroubleshootingFQDN &ndash; Der CN im Zertifikat des Client Access Servers (oder Arrays) muss passen. Mit Get-CsTrustedApplication bzw. Get-CsTrustedApplicationComputer kann man die Lync Konfiguration nochmal &uuml;berpr&uuml;fen Lync Server Logging Tool &ndash; bei vielen Problemen hilft das Log des SIPStack &nbsp;viel Spa&szlig;    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-integration-in-outlook-web-app-2010/\"\n},{\n  \"id\": \"post-cisco-aaa\",\n  \"title\": \"Cisco AAA\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"Server\"],\n  \"content\": \"Nachdem der RADIUS Server konfiguriert ist geht es an die Konfiguration des Clients.Bei Cisco muss dazu das “neue” AAA Model aktiviert werden. Das geht einfach mit folgendem Befehl:aaa new-model      Lokale AuthentifizierungAchtung: nach absetzen dieses Befehls ist das neue Model aktiv, d.h. man kann sich nur mehr mit Benutzername und Passwort anmelden. Man sollte jetzt einen lokalen Benutzer angelegen, dieser kann auch im Fallback Fall, also wenn der RADIUS Server nicht erreichbar ist, verwendet werden. Mit folgendem Befehl legt man einen lokalen User cisco mit Passwort cisco an:username cisco secret cisco Radius ServerBevor man RADIUS als Authentifizierung verwenden kann muss ein RADIUS Server konfiguriert werden. Mit folgenden Befehlen konfiguriert man den RADIUS Server 10.1.1.100 und den entsprechendem Pre-Shared Key. RADIUS verwendet standardmäßig die UDP Ports 1812 und 1813 für Authentifizierung und Accounting, Cisco Geräte verwenden die Ports 1645 und 1646, das kann man evtl. mit “auth-port 1812 acct-port 1813” ändern. Der NPS RADIUS Server antwortet auf beide Varianten, man muss das also nicht definieren.radius-server host 10.1.1.100 key PRE_SHARED_KEYMit “radius-server retransmit x” kann man angeben wie oft eine Anfrage gesendet wird wenn innerhalb des Timeouts keine Antwort kommt. Das Zeitfenster für das Timeout kann mit “radius-server timeout x” auf x Sekunden erhöht werden. Das Interface über welches der Cisco Switch die RADIUS Anfrage schickt kann mit “ip radius source-interface x” angegeben werden.AAA ListenDas AAA Authentication Model arbeitet mit Listen, man definiert eine Liste und weißt diese Liste einem Interface zu. Die Liste “default” gilt für alle Interfaces auf denen keine andere Liste gebunden ist. Folgender Befehl setzt die Standardauthentifizierung auf RADIUS, Fallback (RADIUS nicht erreichbar) ist local:aaa authentication login default group radius local      Ab diesem Zeitpunkt muss man sich an allen Interfaces mit Benutzername und Passwort vom RADIUS Server anmelden.Wenn die Netzwerkgeräte in sicheren Serverräumen untergebracht sind kann man sich überlegen die Authentifizierung für den Console Port zu deaktivieren, damit man im Desaster Fall noch eine letzte Hoffnung auf Zugriff hat. Dazu legt man eine Liste an und setzt die Authentifizierung auf “none”, danach bindet man die Liste auf “line con 0”:aaa authentication login liste1 none&lt;/p&gt;    line con 0      &#160; login authentication liste1&lt;/code&gt;  Authorization  Am RADIUS Server habe ich in den Settings das Attribut Service-Type auf “Administrative” gesetzt. Dadurch müsste ich eigentlich im “enable” Mode landen. Das funktionier jedoch erst nachdem auch die Authorization auf RADIUS gesetzt wurde. Folder Befehl legt fest dass RADIUS für alle Interfaces verwendet wird, die Console ist dabei ausgeschlossen:  aaa authorization exec default group radius local  Um Authorization auf der Console über RADIUS zu aktivieren wird folgender Befehl verwendet:  aaa authorization console  Wenn ich mich erneut anmelden lande ich direkt im “Enable” Mode des Switches.  Logging  Am NPS wird im Event Log Security ein Event 6272 aufgezeichnet, außerdem wird im Logfile (D:\\\\NPS\\\\LogFiles) ein Eintrag hinzugefügt.  Sniffing  Mit Wireshark o.ä. sieht man ein RADIUS Access-Request Paket vom Switch zum NPS Server und ein RADIUS Access-Accept Paket vom NPS Server zum Switch.  Das Access-Request Paket enthält unter anderem folgende Informationen:  User-Name: Der Benutzer der sich am RADIUS Client anmeldet  Calling-Station-Id: IP Adresse des Clients (der z.B. die Telnet Session öffnet)  NAS-IP-Address: IP Adresse des RADIUS Clients  Das Access-Accept Paket enthält die AV-Pair Informationen:  AVP: Attribute Value Pair das am NPS konfiguriert wurde (Service-Type: Administrative)    &#160;  tom\",\n  \"url\": \"https://onprem.wtf/post/cisco-aaa/\"\n},{\n  \"id\": \"post-cisco-aaa-nps-radius-server\",\n  \"title\": \"Cisco AAA–NPS RADIUS Server\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Network\"],\n  \"content\": \"In größeren Netzwerken kann es aufgrund der Firmenrichtlinie oder der Gesetzgebung notwendig sein sich an den Netzwerkgeräten mit persönlichen User Accounts anmelden zu müssen. Man kann dafür natürlich für jeden Netzwerkadministrator ein persönliches Account auf allen Geräten anlegen, oder man authentifiziert gegen einen RADIUS Server. Dieser RADIUS Server kann z.B. ein Network Policy Server sein, der seit Windows Server 2008 den IAS abgelöst hat. Der Vorteil so einer Implementierung liegt auf der Hand, die Authentifizierung wird über das Zentrale Active Directory gesteuert und Benutzerkonten müssen nur an einem Ort gepflegt werden.NPSDie NPS Serverrolle muss auf einem Server hinzugefügt werden, ob das ein dedizierter Server ist oder ob man die Rolle auf einem andern mitlaufen lässt hängt von der Größe der Umgebung ab. Die Rolle kann wie jede andere über den Servermanager oder das PowerShell cmdlet Add-WindosFeature hinzugefügt werden. Damit das cmdlet verfügbar ist muss das Modul ServerManager geladen werden.Für RADIUS reicht der NPAS-Policy-Server. Wen die Rolle hinzugefügt wurde kann NPS konfiguriert werden, der erste Schritt ist es den NPS Server im Active Directory zu registrieren. Rechtsklick auf NPS (local) und “Register Server in Active Directory” wählen&quot;Der zweite Schritt ist die Konfiguration des Accounting, bzw. Logging, dafür gibt es in der NPS Konsole unter dem Punkt “Accounting” drei Einstellungsmöglichkeiten.Der “Configure Accounting Wizard” erleichtert einem Konfiguration:Ich entscheide mich für das Logging in ein Textdokument, je nach Umgebung kann man auch einen zentralen SQL Server angeben.Den Ordner für die Log Files lege ich auf eine zweite Partition. Der NPS Server ist nun konfiguriert, es fehlen noch die RADIUS Clients sowie das Regelwerk das definiert wer sich anmelden darf.Radius ClientsJedes Netzwerkgerät das über NPS authentifizieren will muss dort als RADIUS Client angelegt werden, in diesem Schritt werden der Name, die IP Adresse und der Pre-Shared Key für jeden Client festgelegt. Der Pre-Shared Key wird verwendet um den RADIUS Client zu authentifizieren, der Benutzer meldet sich mit seinem Benutzernamen und Passwort an.Um einen RADIUS Client anzulegen erweitert man den Ordner “RADIUS Clients and Servers” in der NPS Konsole, Rechtslick auf “RADIUS Clients” und “New” öffnet den Dialog “New RADIUS Client”.Unter dem Reiter “Settings” wird der Friendly name konfiguriert, dieser ist später wichtig für die Konfiguration der Regeln. Außerdem gibt man hier die IP Adresse des Clients an, der Pre-Shared Key kann manuell eingegeben werden, ich empfehle jedoch ihn automatisch zu generieren. (Achtung: einige alte Geräte unterstützen nur Keys bis zu einer bestimmten Länge)Unter Advanced könnte man noch ein bestimmtes RADIUS Feature Set auswählen, normalerweise reicht aber der Standard aus. Connection Request PolicyÜber die Connection Request Policy wird definiert welcher RADIUS Client wie authentifiziert wird. NPS kann auch als RADIUS Proxy arbeiten und könnte daher anfragen eines Clients selbst authentifizieren und die eines andern an einen Remote RADIUS Server weiterleiten, dieser Server muss zuerst unter “RADIUS Clients and Servers” angelegt werden.Die Standardregel ist so konfiguriert dass alle anfragen Lokal, also gegenüber Active Directory, authentifiziert werden.Network PolicyDie Network Policy definiert wer sich unter welchen Umständen authentifizieren darf. Da beide Standardregeln keinen Zugriff zulassen müssen wir eine neue Network Policy anlegen, Rechtsklick auf “Network Policy” und “New” öffnet den Dialog “New Network Policy”.Auf der ersten Seite wird eine Name für die neue Richtlinie konfiguriert, der Rest bleibt Standard.Auf dieser Seite werden die Konditionen definiert unter welchen die Authentifizierung erfolgreich ist. Man kann z.B. den RADIUS Client und eine bestimmt AD Gruppe hinzufügen, die beiden Kriterien sind “AND” verknüpft, müssen also beide zutreffen. Der Benutzer der sich am Client “cisco_1” anmeldet muss also Mitglied der Gruppe NetworkAdmins sein damit er sich authentifizieren darf.Im nächsten Schritt wird festgelegt ob diese Regel den Zugriff erlaubt oder verweigert.PAP muss als Authentifizierungsmethode hinzugefügt werden, man wird darauf hingewiesen dass diese Methode nicht sicher ist da das Passwort in Clear-Text über die Leitung geht, das muss man wohl oder übel in kauf nehmen.Hier könnte man weitere verbindungsspezifische Einstellungen machen, für die Authentifizierung an Netzwerkgeräte wird das allerdings nicht benötigt.&#160;Im letzten Schritt werden die Einstellungen konfiguriert die der RADIUS Server in der Antwort mitschickt, hier kann man sogenannte Attribute-Value (AV)-Pairs konfigurieren. Diese AV-Pairs sind Herstellerabhängig, bei Cisco z.B. kann man mit Attribut 6 den Service-Type definieren, gibt man “Administrative” an landet ein authentifiziert User direkt im “enable” Mode. Framed-Protcol PPP kann gelöscht werden, Service-Type ändere ich auf “Administrative”&#160;Somit ist der NPS Server fertig konfiguriert und bereit Anfragen von einem RADIUS Client mit der IP 10.1.1.254 und dem richtigen Pre-Shared Key zu beantworten. Nur Benutzer die Mitglied der Gruppe NetworkAdmins sind dürfen sich am RADIUS Client anmelden, ist die Authentifizierung erfolgreich sollte der Benutzer gleich im “enable” Mode sein.&#160;Im nächsten Artikel konfiguriere ich einen Cisco Switch für RADIUS Authentifizierung.tom\",\n  \"url\": \"https://onprem.wtf/post/cisco-aaa-nps-radius-server/\"\n},{\n  \"id\": \"post-one-note-kleiner-tipp\",\n  \"title\": \"One Note–Kleiner Tipp\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Client\"],\n  \"content\": \"Ich werde von Tag zu Tag ein gr&ouml;&szlig;erer Fan von Microsoft OneNote. Dokumentationen und Notizen lassen sich perfekt mit diesen starken Tool verwalten und pflegen. (Ich liebe die eingebaute Funktion &ldquo;Bildschirmausschnitt&rdquo;)Vor ein paar Tagen ist mir aufgefallen, dass die Suche in OneNote ein tolles Feature beinhaltet: Es kann Screenshots nach Text durchsuchen!!Testet es einfach aus, erstellt einen Screenshot und sucht im Suchfeld nach Text, welcher sich im Screenshot befindet. Ihr werdet &uuml;berrascht sein &nbsp;&nbsp;Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/one-note-kleiner-tipp/\"\n},{\n  \"id\": \"post-subdomain-certificate-enrollment\",\n  \"title\": \"Subdomain Certificate Enrollment\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Client\",\"Server\"],\n  \"content\": \"Wenn man f&uuml;r einen Server aus einer Subdomain ein Zertifikat aus der Zertifizierungsstelle in der Root-Domain ausstellen m&ouml;chte, wird das aufgrund fehlender Berechtigungen nicht funktionieren. Um das Zertifikat erfolgreich ausstellen zu k&ouml;nnen muss der Computer bzw. die Dom&auml;nencomputer Mitglieder der Gruppe CERTSVC_DCOM_ACCESS der Root-Domain sein:Danach ist es notwendig den Server neu zu starten, welcher das Zertifikat erhalten soll.Nun kann das Zertifikat ausgestellt werden.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/subdomain-certificate-enrollment/\"\n},{\n  \"id\": \"post-installing-vsphere-powercli\",\n  \"title\": \"Installing vSphere PowerCLI\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"VMware\"],\n  \"content\": \"Mit vSphere PowerCLI bietet VMware ein PowerShell Snapin das mit &uuml;ber 250 cmdlets die Verwaltung der vSphere Umgebung vereinfacht bzw. Automatisierung&nbsp; erm&ouml;glicht.Die aktuelle Version kann unter http://vmware.com/go/powercli heruntergeladen werden.&nbsp;Die Installationsroutine installiert au&szlig;er den PowerShell Snapins die VMware VIX API, die das Management von virtuellen Maschinen erm&ouml;glicht. Diese API erlaubt es Programme direkt im Gastsystem der VM ausf&uuml;hren bzw. Dateien zu manipulieren.Nachdem das License Agreement akzeptiert wurde, kann man den Pfad f&uuml;r die Installation festlegen, jetzt noch auf installieren klicken und das wars.Auf dem Desktop wurde eine Verkn&uuml;pfung zu PowerCLI angelegt, sonst findet man sie unter Start, Programme, VMware, VMware vSphere PowerCLI.Wenn man die PowerCLI startet wird das PSSnapin &ldquo;VMware.VimAutomation.Core&rdquo; geladen, dieses kann nat&uuml;rlich auch in einer &ldquo;normalen&rdquo; PowerShell Session mit Add-PSSnapin hinzugef&uuml;gt werden.Wie in der Titelleist zu erkennen ist, ist die PowerCLI standardm&auml;&szlig;ig &ldquo;not connected&rdquo;, um auf die Virtuelle Umgebung zugreifen zu k&ouml;nnen muss man eine Verbindung mit dem vCenter Server herstellen. Dazu verwendet man das Connect-VIServer cmdlet, z.B.:Connect-VIServer vcenter.ntsystems.local &ndash;credential (Get-Credential)Mit diesem Befehl verbindet man die PowerCLI mit dem vCenter Server und kann alternative Anmeldeinformationen mitgeben, wenn der Benutzer mit dem die PowerCLI gestartet wurde ausreichende Rechte im vCenter hat kann man &ndash;credential nat&uuml;rlich weglassen.Wenn die Verbindung hergestellt wurde kann man mit PowerCLI arbeiten und sich z.B. eine Liste der VMs ausgeben lassen die nicht eingeschaltet sind:Get-VM | ?{$_.PowerState -notlike \\\"*On*\\\"}Alternativ kann man PowerCLI auch direkt mit einem ESX/ESXi Host verbinden, das ist z.B n&ouml;tig um mit Get-ESXTop Performance Informationen &uuml;ber einen Host zu sammeln.&nbsp;Die Hilfe zur PowerCLI kann einfach mit dem cmdlet Get-PowerCLIHelp aufgerufen werden, empfehlenswert ist auch Get-PowerCLICommunity.&nbsp;Hier noch ein kleiner Tipp: Wer die PowerShell ISE verwendet kann eigene Add-Ons hinzuf&uuml;gen. Ich habe ein einfaches Add-On gebastelt um das PowerCLI Snapin in die ISE Session zu laden. Dazu einfach folgendes Script in das ISE Profil kopieren. Um die ISE Profil Datei zu &ouml;ffnen &ldquo;notepad $profile.CurrentUserCurrentHost&rdquo; in der ISE ausf&uuml;hren.&nbsp;$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add(     &nbsp; \\\"Connect to vCenter\\\",      &nbsp;&nbsp;&nbsp; {      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add-PSSnapin VMware.VimAutomation.Core      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $VIServer = Read-Host -Prompt \\\"ESX/ESXi Host or vCenter Server FQDN\\\"      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Test-Connection $VIServer -Quiet) {Connect-VIServer $VIServer}      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {Write-Output \\\"Server not reachable\\\"}      &nbsp;&nbsp;&nbsp; },      &nbsp; \\\"Control+Alt+V\\\"      )Die Profildatei sollte signiert sein, wie man das macht habe ich hier beschrieben.&nbsp;so long   tom\",\n  \"url\": \"https://onprem.wtf/post/installing-vsphere-powercli/\"\n},{\n  \"id\": \"post-upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht\",\n  \"title\": \"Upgrade Windows Server 2008R2 Sp1 - BlackBerry Monitoring Service startet nicht\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Nach dem Update auf Windows Server 2008R2 Sp1 starten die Monitoring Services des BlackBerry Enterprise Servers nicht mehr. Betroffen sind folgende Dienste:BBMonitoringService_APP - BlackBerry Monitoring Service - Application Core&lt;/p&gt;    BBMonitoringService_DCS - BlackBerry Monitoring Service - Data Collection Subsystem    BBMonitoringService_ENG - BlackBerry Monitoring Service - Polling Engine&lt;/code&gt;  Im Eventlog (Application) werden folgende Fehler protokolliert:  Source: BBMonitoringService_ENG Event ID: 3&lt;/p&gt;    Source: BBMonitoringService_DCS Event ID: 3    Source: BBMonitoringService_APP Event ID: 3&lt;/code&gt;  Die Lösung: Im %temp% Verzeichnis gibt es einen Ordner “gen_py”, die Inhalte dieses Ordners müssen gelöscht werden, dann starten die Dienste wieder.  Achtung: Der Ordner “gen_py” muss in allen Temp Verzeichnissen gelöscht werden, also C:\\\\Windows\\\\Temp und im User Verzeichnis des BesAdmin Accounts.  Hier ein Link zum Artikel in der RIM KB.  tom\",\n  \"url\": \"https://onprem.wtf/post/upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht/\"\n},{\n  \"id\": \"post-forefront-tmg-console-error\",\n  \"title\": \"Forefront TMG Console – Script Error\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"de\",\"Security\"],\n  \"content\": \"Seit der Installation von Internet Explorer 9 bekomme ich auf meinem Windows 7 Client folgende Fehlermeldungen beim &Ouml;ffnen der Forefront TMG Management Console:Script Error: An Error has occurred in the script on this page.Forefront TMG Error: Refresh failed Error 0x80020003: Member not foundDieses Problem kann man einfach l&ouml;sen, man schnappt sich ein Notepad (Achtung: mit administrativen Rechten) und &ouml;ffnet die Datei &ldquo;TabsHandler.htc&rdquo;. Diese befindet sich standardm&auml;&szlig;ig unter folgendem Pfad: &ldquo;C:\\\\Program Files\\\\Microsoft Forefront Threat Management Gateway\\\\UI_HTMLs\\\\TabsHandler&rdquo;In dieser Datei gibt es drei Zeilen die mit &ldquo;m_aPages [niPage].m_tdMain.style.paddingTop&rdquo; beginnen. Diese drei Zeilen m&uuml;ssen mit &ldquo;//&rdquo; auskommentiert werden und schon l&auml;uft die Konsole wieder normal. Hier noch ein Beispiel:// m_aPages [niPage].m_tdMain.style.paddingTop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((m_nBoostUp &lt; 0) ? -m_nBoostUp : 0) ;&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-tmg-console-error/\"\n},{\n  \"id\": \"post-remotefx\",\n  \"title\": \"RemoteFX\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\"],\n  \"content\": \"Windows Server 2008 R2 bringt mit dem SP1 ein neues Feature für Remote Desktop mit: RemoteFX. RemoteFX verwendet die Hardware des Servers um die Grafikverarbeitung zu beschleunigen.Für RemoteFX gibt es 2 Verwendungsbereiche:&#160;1) RemoteDesktop Virtualization HostAuf dem Host ist dafür folgendes notwendig:   SLAT-enabled CPU     Zertifizierte Grafikkarte      RemoteFX encoder      Hyper-V INFO: Wenn Live-Migration verwendet wird, müssen alle Server dieselbe Grafikkarte haben.RemoteFX benötigt für die Grafikkarte einen WDDM Treiber, ist dieser nicht verfügbar (z.B. ILO), muss entweder die Grafikkarte im BIOS deaktiviert, oder der RemoteFX CAP-Treiber installiert werden. Bevor aber der RemoteFX CAP Treiber installiert wird, sollte der WDDM Treiber installiert und RemoteFX aktiviert sein. Danach kann der CAP Treiber über folgenden Befehl installiert werden:dism /online /enable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageUm den CAP Treiber zu deinstallieren reicht folgender Befehl: dism /online /disable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageVerwendet der Client mehrere Monitore, so muss folgende Tabelle bezüglich der RAM Benutzung auf der Grafikkarte beachtet werden:&#160;            Maximun resolution        1 monitor        2 monitor        3 monitor        4 monitor                  1024 x 768        75 MB        105 MB        135 MB        165 MB                  1280 x 1024        125 MB        175 MB        225 MB        275 MB                  1600 x 1200        184 MB        257 MB        330 MB        N/A                  1920 x 1200        220 MB        308 MB        N/A        N/A                  &nbsp;        &nbsp;        &nbsp;        &nbsp;        &nbsp;        &#160;2) Remote Desktop Session HostDamit RemoteFX für Remote Desktop Session läuft, muss der Prozessor zwingend das Feature SSE2 unterstützen. Zusätzlich kann noch ein sog. „Remote FX Hardware Decoder“ eingebaut werden um die Leistung zu erhöhen.&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/remotefx/\"\n},{\n  \"id\": \"post-softap-windows-7-wireless-access-point\",\n  \"title\": \"SoftAP - Windows 7 Wireless Access Point\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"de\"],\n  \"content\": \"Hinter dem Namen SoftAp oder Virtual WIFI verbirgt sich ein tolles Feature von Windows 7, es erm&ouml;glicht durch das Erstellen eines virtuellen Netzwerkadapters das Betreiben eines Access Point mit Windows 7. Damit man einen virtuellen Wlan Adapter erstellen kann muss nat&uuml;rlich ein Wlan Adapter installiert und aktiviert sein.Man erstellt den Virtual WIFI Adapter mit Hilfe des Command-Line Tools \\\"netsh\\\", dazu ben&ouml;tigt man eine Administrative Eingabeaufforderung in die man dann folgenden Befehl eintippt:netsh wlan set hostednetwork mode=allow ssid=* key=* keyUsage=persistentAn der Stelle der \\\"*\\\" kommt die SSID (ohne Leerzeichen) und der WPA2 Key, wurde dieser Befehl abgesetzt wird der virtuelle Adapter erstellt.&nbsp;Jetzt muss das Hostednetwork gestartet werden, damit sich Clients verbinden k&ouml;nnen:netsh wlan start hostednetworkInternet Connection SharingWenn man auf dem Windows 7 Rechner eine Internetverbindung hat kann man diese dem Hostednetwork zur Verf&uuml;gung stellen. Dazu &ouml;ffnet man die Eigenschaften des Adapters der die Internetverbindung herstellt und w&auml;hlt \\\"Freigabe\\\". Hier muss man die Checkbox bei \\\"Anderen Benutzern im Netzwerk gestatten....\\\" setzen und darunter den Virtual WIFI Adapter ausw&auml;hlen.Bei einem Neustart des Rechners startet das Wlan nicht automatisch mit. Ohne neustart kann das Hostednetwork mit folgendem Befehl gestoppt werden:netsh wlan stop hostednetworkUm den Status des Hostednetwork zu sehen verwendet man folgenden Befehl:netsh wlan show hostednetworkDaniel Melanchthon beschreibt in diesem Artikel weitere Details zu Virtual WIFI.&nbsp;UpdateDas Ganze funktioniert nat&uuml;rlich auch unter Windows 8 :)Gut zu wissen: Das \\\"hostednetwork\\\" unterst&uuml;tzt leider&nbsp;nur das v&ouml;llig &uuml;berf&uuml;llte 2,4 GHz Band: \\\"Radio types supported (Direct Sequence Spread Spectrum [DSSS], 802.11g, 802.11b)\\\"Hier der Link zur entsprechenden TechNet Seite: http://technet.microsoft.com/en-us/library/cc755301(v=WS.10).aspx&nbsp;Tom\",\n  \"url\": \"https://onprem.wtf/post/softap-windows-7-wireless-access-point/\"\n},{\n  \"id\": \"post-appv-streaming-server\",\n  \"title\": \"AppV Streaming Server\",\n  \"author\": \"tto\",\n  \"tags\": [\"AppV\",\"Client\",\"Server\"],\n  \"content\": \"Verwendet man AppV für Applikationsvirtualisierung mit Clients in Standorten mit langsamer Anbindung (WAN) kann ein Updates eines Paketes ziemlich lange dauern, außerdem wird es von jedem Client einzeln heruntergeladen.Der AppV Streaming Server könnte die Lösung für dieses Problem sein. Mit dem Desktop Optimization Pack kommen neben den Installationsdateien für den AppV Management (Full) Server auch die Dateien für den Streaming Server. Die Installation gestaltet sich einfach, man wählt das Streaming Protokoll, sollte natürlich jenes sein das der Management Server verwendet. Außerdem muss man den Pfad für den “Content” Ordner angeben, diesen muss man manuell anlegen und freigeben (\\\\\\\\servername\\\\Content, Leseberechtigungen für Benutzer reichen aus).Die Installation ist abgeschlossen und der Dienst “Application Virtualization Streaming Server” (AppVirtServer) sollte gestartet sein.Im Application Event Log wird bei jedem Start des AppVirtServer Dienstes folgender Fehler Protokolliert:Error:&lt;/p&gt;    Source: Application Virtualization Server    Event ID: 44937    Empty package map for package content root: [D:\\\\Content\\\\].&lt;/code&gt;  Dieser Fehler wird für jedes Packet das auf dem AppV Management Server verfügbar ist einmal Protokolliert, und zwar so lange bis man die Daten aus dem Content Share des AppV Management Servers auf den Streaming Server kopiert. Es reicht aus die .sft Files zu kopieren, wichtig ist dabei dass eventuelle Unterordner auch angelegt werden.  Sind die Daten kopiert (d.h. beide Content Shares gleich) kann ist der Streaming Server bereit.  &#160;  Die Clients im Remote Netzwerk wissen allerdings nichts von diesem Server, d.h. Updates werden immer noch vom Management Server heruntergeladen. Über folgenden Registry Key gibt man den Clients die Information, in diesem Fall verwendet der Streaming Server RTSP:  HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\SoftGrid\\\\4.5\\\\Client\\\\Configuration&lt;/p&gt;    REG_SZ ApplicationSourceRoot    rtsp://servername:554/&lt;/code&gt;  Ab jetzt ist es nur mehr Wichtig bei Paket Updates daran zu denken alle Content Shares zu aktualisieren.   &#160;  tomt\",\n  \"url\": \"https://onprem.wtf/post/appv-streaming-server/\"\n},{\n  \"id\": \"post-create-vmware-esxi-flash-drive\",\n  \"title\": \"Create VMWare ESXi Flash Drive\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"VMware\"],\n  \"content\": \"Der Hypervisor von VMWare kann auf einem USB Stick installiert werden, so kann man die vorhandenen Festplatten des Servers als Datastore f&uuml;r Virtuelle Maschinen verwenden oder Server ohne interne Festplatten als ESXi Hosts verwenden.Dazu braucht man:einen USB Stick (min. 2GB)VMWare Workstation (oder Player)VMWare ESXi Installationsimage (VMWare ESXi)Dann kanns losgehen, mit VMWare Workstation (oder Player) wird eine neue Virtuelle Maschine erstellt.Als Pfad f&uuml;r das Installationsimage wird das Image von ESXi 4.1 angegeben.Als Gastbetriebssystem wird VMware ESX ausgew&auml;hlt.Ein Ordner f&uuml;r die Konfigurationsdateien und die virtuelle Festplatte muss angegeben werden, hier kann einfach ein Ordner auf der Lokalen Festplatte verwende werden.Die Gr&ouml;&szlig;e der virtuellen Festplatte kann man so akzeptieren, diese wird nicht verwendet.Die virtuelle Maschine ist eigentlich erstellt, allerdings muss noch ein USB Controller hinzugef&uuml;gt werden, dazu auf &ldquo;Customize Hardware&rdquo; klickenund den USB Controller hinzuf&uuml;gen.Jetzt kann man die virtuelle Maschine starten, und auch gleich &uuml;ber &ldquo;VM&rdquo; und &ldquo;Removable Devices&rdquo; den USB Stick verbinden (muss nat&uuml;rlich am PC angeschlossen sein&hellip;)Bei der Installation des ESXi Servers wird der USB Stick als Ziel angegeben, ACHTUNG: Alle Daten auf dem USB Stick werden gel&ouml;scht, der Stick wird neu formatiert.Sobald die Installation abgeschlossen ist, kann man die VM herunterfahren, auf dem USB Stick ist jetzt VMWare ESXi installiert. Von diesem Stick kann man jeden (unterst&uuml;tzten) Server booten und als ESXi Host verwenden.&nbsp;Achtung: bei der Installation auf USB wird keine Scratch Partition erstellt, Infos dazu hier: /post/ESXi&ndash;Persistent-Scratch-Location.aspx&nbsp;so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/create-vmware-esxi-flash-drive/\"\n},{\n  \"id\": \"post-sharepoint-dienstkonto-wechseln\",\n  \"title\": \"SharePoint–Dienstkonto wechseln, Probleme mit Kerberos\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wird das Dienstkonto f&uuml;r die SharePoint-Webseite vom Netzwerk-Konto auf ein Dom&auml;nen-Konto ge&auml;ndert, und Kerberos in Kombination mit Windows-Authentifizierung verwendet wird, k&ouml;nnen sich die Clients nicht mehr an der Webseite authentifizieren.Der Dialog zum Eingeben der Credentials wird immer wieder angezeigt, die Authentifizierung kann jedoch nicht richtig verarbeitet werden.Um das Problem zu beheben, muss im IIS die Kernelmodus-Authentifizierung aktiviert werden, die standardm&auml;&szlig;ig nach der Installation von SharePoint deaktiviert ist:Nun k&ouml;nnen sich die Clients wieder ganz normal an der SharePoint-Webseite authentifizieren.&nbsp;Gr&uuml;&szlig;e   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-dienstkonto-wechseln/\"\n},{\n  \"id\": \"post-outlook-gesendete-objekte-shared-mailbox\",\n  \"title\": \"Outlook–gesendete Objekte–Shared Mailbox\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Client\"],\n  \"content\": \"Wie in diesem Post beschrieben kann man mit Exchange 2010 einfach Shared Mailboxen verbinden. Wenn ein User Send-As Berechtigungen auf eine solche Mailbox hat und ein Mail schickt, wird das Mail im Ordner “Sent Items” des jeweiligen Users gespeichert. Damit die gesendete Nachricht in den Sent Items der shared Mailbox gespeichert wird muss man folgenden Eintrag in der Registry erstellen (auf den Clients).Unter dem Schlüssel: “HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Office\\\\14.0\\\\Outlook\\\\Preferences” wird ein REG_DWORD mit dem Namen “DelegateSentItemsStyle” und dem Wert “1” erstellt.In einer Active Directory Umgebung bieten sich natürlich die Group Policy Preferences dafür an.\",\n  \"url\": \"https://onprem.wtf/post/outlook-gesendete-objekte-shared-mailbox/\"\n},{\n  \"id\": \"post-tmge28093fehler-beim-ausfuhren-von-abfragen-im-log\",\n  \"title\": \"TMG–Fehler beim Ausführen von Abfragen im Log\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Security\",\"SQL\"],\n  \"content\": \"Letztens hatte ich ein seltsames Problem auf meinen TMG 2010 Server. Ich logge auf die lokale SQL Express Datenbank und konnte keine Abfragen im Log aus der TMG Konsole mehr machen. Nach dem Start einer Abfrage erscheint der folgende Fehler:&nbsp;Daraufhin habe ich den SQL Server &uuml;berpr&uuml;ft, konnte aber keine Probleme feststellen. Im Management Studio lie&szlig;en sich die Logs durch SELECT Anweisung abfragen.Das Problem liegt an der Formatierung des Datums und taucht durch das Service Pack 1 (KB2288910) auf TMG&rsquo;s in deutscher Sprache auf.Das Problem l&auml;sst sich aber relativ einfach beheben: Man verbindet sich mit dem Management Studio auf die SQL Instanz und &auml;ndert die Standard-Sprache des Benutzerkontos &ldquo;NT Authority\\\\NetworkService&rdquo; auf Schwedisch um. Nachdem man nun die SQL Dienste neu startet kann man problemlos wieder das Abfragen im LOG starten.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/tmge28093fehler-beim-ausfuhren-von-abfragen-im-log/\"\n},{\n  \"id\": \"post-zertifizierungsstelle-verschiebene28093neuer-servername\",\n  \"title\": \"Zertifizierungsstelle verschieben–neuer Servername\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"In diesem Beitrag habe ich beschrieben wie man eine Zertifizierungstele sichert, den alten Server abbaut und die CA auf einem neuen Server mit dem selben Namen wiederherstellt. Will man allerdings die CA umziehen und den aktuellen Server nicht abbauen sind ein paar zusätzliche Schritte nötig. Wichtig ist hier zu sagen dass man zwar den Servernamen ändern kann, allerdings nicht den Namen der Zertifizierungsstelle!Tipp: Auch wenn die Microsoft Dokumentation das nicht wirklich bestätigt funktioniert eine Migration von 32Bit auf 64Bit. Also Backup auf x86 Restore auf x64 ist Möglich.Backup   Auf jeden Fall eine komplette Sicherung des Servers erstellen!     CA Datenbank und Key sichern     CA Konfiguration (Registry) sichern             Mit dem Registrierungseditor zu folgendem Schlüssel navigieren, rechtsklick und “Export”         HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration         reg export HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration RegBackup.reg             CA Templates notieren oder mit certutil.exe –catemplates &gt; templates.txt exportieren     CA Deinstallieren             Im Server Manager mit Remove Role die Active Directory Certificate Services deinstallieren         Achtung: wie bereits im alten Beitrag erwähnt bleiben gewisse Daten auf dem Server          Restore   alle Dateien (und Ordner) die von der Sicherung erstellt wurden auf den neuen Server kopieren             Achtung: caname.p12 enthält den private Key der CA!             Private Key importieren             certutil –importpfx caname.p12             CA Dienste installieren             Server Manager                     Im Servermanager mit Add Roles die Active Directory Certificate Services hinzufügen             Bei der Installation den richtigen CA Typ auswählen und das Richtige Zertifikat mit vorhandenem private Key wählen                         setupca.vbs                     auf einem Core Server wird die CA am besten mit diesem Script installiert             Bei der Installation muss der Wert im “Key Container” des installierten private Key angegeben werden, diesen kann man so herausfinden: certutil.exe -store my | find &quot;Key Container&quot;             setupca.vbs hat verschiedene Parameter um den entsprechenden CA Typ auszuwählen, folgendes Beispiel installiert eine Subordinate Enterprise CA: cscript setupca.vbs /IF /RC /SN WertKeyContainer             hier die Wichtigsten Parameter              /IE – Enterprise Root CA Service               /IS – Standalone Root CA Service               /IF – Enterprise Subordinate CA Service               /IT – Standalone Subordinate CA Service               /RC – Reuse Certificate and Key               /SN – CA Name                             CA Datenbank wiederherstellen             dazu muss der Dienst certsvc gestoppt werden, net stop certsvc         Im Server Manager mit rechtsklick, Restore CA kann die Datenbank wiederhergestellt werden         mit certutil –f –restoreDB PfadZumDataBaseOrdner kann man dasselbe erreichen             Konfiguration wiederherstellen: die Sicherung der Registry muss wieder importiert werden, dabei gilt es allerdings einiges zu beachten:             Backup der Registry auf dem neuen Server vor dem Import!         CAServerName anpassen, muss den neuen Servernamen enthalten         Die Pfade für folgende Werte kontrollieren, wenn sie auf dem alten Server nicht geändert wurden sollten kein Anpassungen nötig sein:                     DBDirectory, DBLogDirectory, DBSystemDirectory, DBTempDirectory                         Den Inhalt für folgende Werte zu kontrollieren um sicherzustellen dass CDP und AIA Informationen richtig veröffentlicht werden                     CACertPublicationURLs. CRLPublicationURLs                         Den Wert von CACertHash kontrollieren, wenn das CA Zertifikat erneuert wurde beinhaltet dieser Wert mehrere Thumbprints der CA Zertifikate. Wenn ein Thumbprint importiert wird und das zugehörige Zertifikat nicht installiert ist startet der Zertifikatsdienst (certsvc) nicht und protokollieret folgenden Fehler im Application Log:                     Active Directory Certificate Services did not start: Could not load or verify the current CA certificate.&#160; CAName The system cannot find the file specified. 0x80070002 (WIN32: 2).                             Berechtigungen auf CDP und AIA Container             Das Computerkonto des neuen Servers muss FullControl für die AIA und CDP Objekte des alten Server haben um CRLs und neue Root Zertifikate veröffentlichen zu können.         Berechtigungen werden mit ADSI Edit gesetzt, die Objekte finden sich unter CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local          CheckUm zu überprüfen ob alles läuft kann man ein Zertifikat anfordern. Funktioniert das ausstellen der Zertifikate sollte man noch überprüfen ob der Zugriff auf die Sperrlisten funktioniert. Dazu Exportiert man das Zertifikat (in eine .cer Datei) und führt “certutil –url datei.cer” aus.&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/zertifizierungsstelle-verschiebene28093neuer-servername/\"\n},{\n  \"id\": \"post-signing-powershell-scripts\",\n  \"title\": \"Signing PowerShell Scripts\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Damit ein PowerShell Script signiert werden kann muss man im besitz eines Zertifikates mit dem “Intended Purpose” Code Signing sein. So ein Zertifikat kann man sich selbst ausstellen, oder von einer Enterprise CA anfordern. Natürlich kann man es auch kaufen…Wie man ein SelfSigned Zertifikat erstellt ist ausführlich in der Hilfe beschrieben, einfach “Get-Help about_signing” ausführen.Um ein Code Signing Zertifikat von Enterprise Zertifizierungsstelle anzufordern muss man “Enroll” Berechtigungen auf die Zertifikatsvorlage haben, oder man kopiert die Vorlage und erstellt eine eigene, z.B. mit längerer Gültigkeit.Hat man also ein Zertifikat erhalten findet man es mit folgendem cmdlet:Get-ChildItem cert:\\\\CurrentUser\\\\My –codesigningMit Set-AuthenticodeSignature wird ein Script signiert, dieses cmdlet benötigt zwei Parameter, das zu Signierende Script und das Zertifikat.Im Folgenden Beispiel signiere ich die Datei C:\\\\scripts\\\\my-test.ps1 mit dem einzigen Zertifikat das in meinem Zertifikatsstore ist.$cert = Get-ChildItem cert:\\\\CurrentUser\\\\My –codesigning&lt;/p&gt;    Set-AuthenticodeSignature C:\\\\scripts\\\\my-test.ps1 $cert&lt;/code&gt;  Erscheint folgender Fehler, hat man das Script mit PowerShell ISE erstellt. Diese verwendet eine Codierung mit der Set-AuthenticodeSignature nicht zurechtkommt. Man erhält den vielsagenden Fehler: UnknonError.    Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab.    Und schon ist das Script signiert.  Wenn man das Script jetzt auf einem Host ausführt auf dem die ExecutionPolicy auf AllSigned gesetzt ist wird man informiert dass der Herausgeber unbekannt ist. Das Zertifikat welches zum Signieren verwendet wurde muss im TrustedPublisher Zertifikatstore sein.    Um das Zertifikat zu exportieren kann man die MMC Certficates verwenden, das Code Signing Zertifikat auswählen und auf Export klicken. Den Privat Key kann man nicht exportieren, dieser wird auch nicht benötigt um die Signatur zu bestätigen.  Die .cer Datei die man nach dem Export erhält kann man mit Gruppenrichtlinien auf alle Clients/Server verteilen oder manuell in den Store für Vertrauenswürdige Herausgeber importieren.  Gruppenrichtlinie:    Nach dem nächsten GP Refresh läuft das Script ohne Fehlermeldung.      Wird ein Script verändert nachdem es signiert wurde, wird die Ausführung verhindert. Folgende Fehlermeldung erscheint.    &#160;  tom\",\n  \"url\": \"https://onprem.wtf/post/signing-powershell-scripts/\"\n},{\n  \"id\": \"post-powershell-scripts\",\n  \"title\": \"PowerShell Scripts\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Achtung: Diese Scripts sind Beispiele, sie sind nicht f&uuml;r die Verwendung in Produktivsystemen gedacht! Die Autoren von ntSystems.it k&ouml;nnen keine Haftung f&uuml;r eventuelle Sch&auml;den durch diese Scripts &uuml;bernehmen.&nbsp;Exchange: Set SimpleDisplayName on all Mailboxes where this Attribute is empty; change characters like &ouml; to oe; send E-Mail if script fails   1: Import-Module 'C:\\\\Users\\\\daniel nitz\\\\AppData\\\\Roaming\\\\Microsoft\\\\Exchange\\\\RemotePowerShell\\\\ex2k10.domain.local\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.SimpleDisplayName -eq \\\"\\\"}   4: if($Mailboxes -ne $null)   5: {   6:     try {   7:         ForEach ($Mailbox in $Mailboxes)   8:         {   9:             $NameString = $Mailbox.Name  10:             if($NameString -match \\\"&uuml;\\\")  11:                 {  12:                 $NameString = ($NameString -replace \\\"&uuml;\\\",\\\"ue\\\")  13:                 }  14:             if($NameString -match \\\"&auml;\\\")  15:                 {  16:                 $NameString = ($NameString -replace \\\"&auml;\\\",\\\"ae\\\")  17:                 }  18:             if($NameString -match \\\"&ouml;\\\")  19:                 {  20:                 $NameString = ($NameString -replace \\\"&ouml;\\\",\\\"oe\\\")  21:                 }  22:             Set-Mailbox -Identity $Mailbox.Name -SimpleDisplayName ($NameString + \\\" - COMPANY\\\")  23:         }  24:     } Catch {  25:         Send-MailMessage -to daniel.nitz@domain.local -Subject \\\"Exchange Shell Script Error\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  26:     }                 27: }  28:     &nbsp;Exchange: Set Out of Office Assistent on Mailboxes where the &ldquo;Office&rdquo; property isn&acute;t empty   1: Import-Module 'C:\\\\Users\\\\daniel nitz\\\\AppData\\\\Roaming\\\\Microsoft\\\\Exchange\\\\RemotePowerShell\\\\ex2k10.domain.local\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.Office -ne \\\"\\\"}   4: try {   5:     $OOFTextExternal = ${E:\\\\OOF-Text\\\\External-Text.txt}   6:     $OOFTextInternal = ${E:\\\\OOF-Text\\\\Internal-Text.txt}   7:        8:     ForEach ($Mailbox in $Mailboxes)   9:     {  10:         Set-MailboxAutoReplyConfiguration -Identity $Mailbox.Name -AutoReplyState scheduled -StartTime \\\"2011.01.21T07:00\\\" -EndTime \\\"2011.01.21T19:00\\\" -ExternalAudience All -ExternalMessage $OOFTextExternal -InternalMessage $OOFTextInternal     11:     }  12: } Catch { Send-MailMessage -to daniel.nitz@domain.local -Subject \\\"Exchange Shell Script Error\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  13: }\",\n  \"url\": \"https://onprem.wtf/post/powershell-scripts/\"\n},{\n  \"id\": \"post-tmg-2010-unable-to-authenticate-users\",\n  \"title\": \"TMG 2010 unable to authenticate users after reboot\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"Nach dem Upgrade von ISA Server 2006 auf TMG 2010 musste ich eine Reihe von Probleme bez&uuml;glich der Authentifizierung feststellen. Nach jedem Neustart des Servers dauerte es zwischen einer halben und 2 Stunden bis der TMG Clients gegen AD erfolgreich authentifizierte. In der Zwischenzeit wurden die Verbindung aufgrund fehlender Authentifizierung abgelehnt.Auch das EventLog protokollierte folgende Fehler:Im ADAM Log wurde folgender Fehler protokolliert:&nbsp;Mein Problem habe ich dadurch gel&ouml;st, indem ich ein Computer-Zertifikat f&uuml;r den FQDN des TMG von meiner Zertifizierungsstelle angefragt und installiert habe. Anschlie&szlig;end habe ich den Netzwerkdienst Lesen-Berechtigungen f&uuml;r das Verzeichnis C:\\\\ProgramData\\\\Microsoft\\\\Crypto\\\\RSA\\\\MachineKeys gegeben (hier werden die Computerzertifikate gespeichert).INFO: Wenn der Request f&uuml;r das Zertifikat fehschl&auml;gt, muss in den Systemregeln der strikte RPC Filter deaktiviert werden:&nbsp;Nachdem diese Schritte abgeschlossen wurden, konnte ich im EventLog sehen wie die SSL-Verbindungen erfolgreich hergestellt wurden:&nbsp;Nach einem Neustart werden Verbindungen nun sofort authentifiziert.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/tmg-2010-unable-to-authenticate-users/\"\n},{\n  \"id\": \"post-exchange-2010-change-display-name-for-outgoing-mails\",\n  \"title\": \"Exchange 2010, change Display Name for outgoing Mails\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Mit Exchange Server 2010 ist es sehr einfach den Display Name für ausgehende Mails zu ändern.Zunächst muss das Feature für die Remote-Domänen aktiviert werden. Mit den folgenden Befehl wird das Feature für alle Remote-Domänen aktiviert:Get-RemoteDomain | Set-RemoteDomain –UseSimpleDisplayName $trueIn den Einstellungen der Mailbox&#160; befindet sich die Eigenschaft Simple display name. Hier lässt sich der angepasste Display Name einfügen. ACHTUNG: Befindet sich kein Wert im Feld Simple Display Name nachdem das Feature aktiviert wurde, sendet Exchange die Mail-Adresse.&#160;Alle Mails, die nun die Organisation verlassen, werden mit den angepassten Display Name versendet:&#160;Anbei noch ein Shell-Beispiel um schnell für eine Liste (CSV-Import Datei) von Benutzern den Simple Display Name mit&#160; Name + Firma GmbH zu setzen.Import-CVS &quot;C:\\\\Import-File.csv&quot; | Foreach {Set-Mailbox -Identity $_.Name -SimpleDisplayName ($_.Name + &quot; - Firma GmbH/Srl&quot;)}           Beispiel für CSV-Import DateiName     Daniel Nitz      Max MustermannGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-change-display-name-for-outgoing-mails/\"\n},{\n  \"id\": \"post-zertifizierung\",\n  \"title\": \"Zertifizierung\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Heute ist ein guter Tag f&uuml;r beide Autoren von ntSystems.it.Nachdem wir &uuml;ber eine halbe Stunde vor dem Prometric Test Centre warten mussten weil es dort Probleme mit den PCs gab konnten wir unsere Examen in Angriff nehmen.Daniel hat erfolgreich das &ldquo;70-432 TS: Microsoft SQL Server 2008, Implementation and Maintenance&rdquo; Examen absolviert und erweitert so seinen MCITP: Enterprise Administrator mit dem&nbsp; MCTS: SQL Server 2008, Implementation and Maintenance.Ich habe mit dem &ldquo;70-663 Pro: Designing and Deploying Messaging Solutions with Microsoft Exchange Server 2010&rdquo; nun den Status MCITP: Enterprise Messaging Administrator 2010 erreicht.In diesem Sinne,    tom\",\n  \"url\": \"https://onprem.wtf/post/zertifizierung/\"\n},{\n  \"id\": \"post-mail-sensitivity-header-exchange-2010-sp1\",\n  \"title\": \"Mail Sensitivity Header Exchange 2010 SP1\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Wer Shared Mailboxes mit Exchange 2010 verwendet kann folgendes Verhalten beobachten:· wird eine Mailbox über das AD Attribut msExchDelegateListLink verbunden sehen Benutzer keine als „Privat“ markierten Mails· verbindet ein User die Mailbox über Datei -&gt; Konto hinzufügen sind alle Objekte sichtbar, auch die als „Privat“ markiertenDie Vertraulichkeit einer Nachricht wird mit dem Sensitivity Header geregelt, dieser wird in dem Fall auf “private” gesetzt. Mit Transportregeln in Exchange kann man Message Header löschen oder bearbeiten. In diesem Fall reicht das Löschen des Headers nicht aus, man muss ihn auf “Normal” ändern. Man erstellt also eine neue Transportregel für alle eingehenden Nachrichten welche an die Shared Mailbox gesendet werden. Diese Regel soll der Wert des Headers “Sensitivity” von “private” auf “normal” ändern.Transportregeln kann man an drei verschiedenen Orten pflegen, EMS, EMC und ECP. Natürlich muss man die entsprechenden Berechtigungen besitzen. Exchange Control PanelDas Exchange Control Panel ist über https://meinexchange/ecp erreichbar, dort muss unter Options “My Organization” ausgewählt werden. Dann kann man unter “Mail Control” Regeln mit Hilfe eines Wizards erstellen.Exchange Management ConsoleIn der Management Console sind die Regeln unter “Organization Configuration” – “Hub Transport” und “Transport Rules” zu finden, auch hier kann man Regeln einfach über einen Wizard erstellen.Exchange Management ShellNatürlich kann man Transportregeln auch mit der Managment Shell erstellen. Dazu am Besten im TechNet vorbeischauen.Hier ein Beispiel:New-TransportRule -Name 'Remove Header' -Comments '' -Priority '0' -Enabled $true -SentTo 'shared.mailbox@domain.com' -HeaderMatchesMessageHeader 'Sensitivity' -HeaderMatchesPatterns 'private' -SetHeaderName 'Sensitivity' -SetHeaderValue 'normal'&#160;so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/mail-sensitivity-header-exchange-2010-sp1/\"\n},{\n  \"id\": \"post-sharepoint-2010-external-list-bcs-sql\",\n  \"title\": \"Sharepoint 2010, external List, BCS, SQL\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\",\"SQL\"],\n  \"content\": \"In diesem Post werde ich die einzelnen Schritte erklären um in Sharepoint eine SQL Tabelle einzubinden. Dazu erforderlich ist:   Sharepoint 2010 Foundation / Server     SQL Server     Sharepoint Designer 2010  Externen Inhaltstyp definierenIn diesem Schritt definieren wir den Inhaltstyp und somit die Verbindung zu SQL Server. Dies kann alles mit dem Sharepoint Designer erledigt werden. Unter Externe Inhaltstypen definieren wir die Verbindung.Nun kann ein Name und die Verbindung zu SQL Server angegeben werden, indem wir auf “Klicken Sie hier, um externe Datenquellen zu ermitteln und Vorgänge zu definieren” klickenWir erstellen eine neue Verbindung vom Typ SQL Server und geben die Datenbankinformationen anNun können wir die Tabellen auswählen, die für diesen Inhaltstyp zur Verfügung stehen. Dabei klicken wir auf die Tabelle und können verschiedene Vorgänge definieren:   Element lesen     Liste lesen     Erstellen     Aktualisieren     Löschen  Nun ist der Inhaltstyp definiert und steht in Sharepoint zur Verfügung.&#160;BCS Berechtigungen definierenStandardmäßig haben wir keine Berechtigung um auf den Inhaltstyp zuzugreifen. Dies müssen wir erst in den BCS Einstellungen definieren. Am schnellsten kann dies über die Zentraladministration erledigt werden.Zentraladministration / Anwendungsverwaltung / Dienstanwendungen verwaltenNun wählen wir den Business Data Connectivity-Dienst und definieren die Berechtigungen für den Inhaltstyp.Info: Mindestens 1 Account muss das Buntzerrecht “Berechtigungen festlegen” haben.Jetzt können wir die externe Liste erstellen und hätten theoretisch Zugriff darauf, wäre da nicht das Double-Hop Problem. Beim Zugriff erhalten wir folgende Fehlermeldung:&#160;Double-Hop Problem behebenUm das Double-Hop Problem zu lösen gehen wir folgendermaßen vor:1. Zunächst erstellen wir einen neuen SPN (Service Principal Name) für unseren SQL Server:setspn –A MSSQLsvc/NETBIOSNAME.DOMAIN:1433 DOMAIN\\\\SQL-Service-AccountDer SQL Service Account kann am schnellsten unter den Diensten ermittelt werden.2. Danach müssen wir in ActiveDirectory die Delegierungen für folgende Objekte aktivieren   Sharepoint Computer-Objekt     SQL-Service Account  Ich empfehle den Sharepoint sowie den SQL Server neu zu starten um sicherzugehen, dass die Konfiguration aktiv ist.Jetzt haben wir Zugriff auf die SQL Tabelle über Sharepoint.&#160;Nähere Informationen zur Double-Hop Problematik unter folgenden Link&#160;Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2010-external-list-bcs-sql/\"\n},{\n  \"id\": \"post-sharepoint-foundation-2010-insufficient-sql-permissions\",\n  \"title\": \"Sharepoint Foundation 2010, insufficient SQL permissions\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\",\"SQL\"],\n  \"content\": \"Wenn man Sharepoint Foundation 2010 mit den integrierten SQL Server 2008 Express installiert, hat man recht wenig Möglichkeiten Eigenschaften für den SQL Server zu definieren (Benutzerkonten, Logs, Backup).Wenn man nun über das Management Studio eine Verbindung mit SQL Server herstellen möchte, kann es vorkommen, dass man selbst mit dem Farm-Administratorkonto keine Änderungen an den entsprechenden Datenbanken vornehmen kann. Ein Blick auf die verbunden Gruppen des Farm-Administratorkontos verrät, dass sich das Benutzerkonto nur in der Gruppe public befindet und somit keine Einstellungen ändern darf.Zudem ist kein Benutzerkonto ersichtlich mit dem man sich anmelden könnte um das Farm-Administratorkonto den entsprechen Gruppen zuzuweisen. Mit dem Benutzer SA kann man sich ebenfalls nicht anmelden, da der “SQL Server- und Windows-Authentifizerungsmodus” nicht aktiviert ist.Der Grund dafür liegt hier: Wenn man Sharepoint Foundation 2010 über den Rechtsklick auf das Setup-File und “Als Administrator ausführen” installiert, wird das Produkt über das lokale Administratorkonto mit logischerweise den entsprechenden Administratorrechten installiert. Das wäre eigentlich auch kein Problem, wäre nicht die folgende Änderung ab SQL Server 2008 fest implementiert:In den Versionen vor SQL 2008 wurde der Gruppe lokale Administratoren (die enthält wiederum den Domain-Admin und geg. andere Benutzer) das SQL Benutzerrecht sysadmin zugewiesen. Folglich konnte jeder Admin,die Datenbanken verwalten. Ab SQL Server 2008 erhält diese Gruppe nicht mehr das sysadmin-Recht. Bei der manuellen Installation von SQL wird man danach gefragt welche Benutzer das sysadmin-Recht erhalten sollen. Als die Installation mit der Option “Als Administrator ausführen” durchgeführt wurde, hat der lokale Administrator die sysadmin-Rechte erhalten.Lösung: Wir erhalten mit dem Farm-Administrator Konto keine Ändern-Rechte in SQL, bis wir uns mit dem lokalen Administrator anmelden, Management Studio öffnen und den Benutzerkonten die entsprechenden Rechte zuweisen.PS: Wenn die Datenbank in den Sinlge User Mode geschalten wird, erhält die Gruppe lokale Administratoren (folglich auch Domain-Admins) die sysadmin-Rechte.Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-2010-insufficient-sql-permissions/\"\n},{\n  \"id\": \"post-migration-isa-server-2k4-2k6-zu-tmg-wpad\",\n  \"title\": \"Migration ISA Server 2k4, 2k6 zu TMG, WPAD\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"de\",\"Server\",\"Security\"],\n  \"content\": \"Wenn der ISA Server zu TMG oder einem anderen physischen Server migriert wird und sich dadurch der Servername &auml;ndert, funktioniert unter Umst&auml;nden die automatische Browserkonfiguration &uuml;ber WPAD bei DHCP Clients nicht mehr.WPADDas Web Proxy Autodiscovery Protocol (WPAD) ist ein Protokoll, mit dem Web-Clients automatisiert zu verwendende Web-Proxies innerhalb eines Computernetzwerkes finden k&ouml;nnen, indem eine Proxy autoconfiguration (PAC)-Datei unter einer erratbaren URL gespeichert wird, beispielsweise http://wpad.example.com/wpad.datWPAD wird in den DHCP Einstellungen sowie in DNS konfiguriert um DHCP Clients und jene Ger&auml;te mit den automatischen Einstellungen zu versorgen, die eine statische IP Adresse besitzen.Das Problem nach Migrationen / Serverumzug des ISA / TMG Servers bei DHCP Clients erkl&auml;rt sich so:Am DHCP Server wird eine neue Option (252) konfiguriert, die den Pfad zur WPAD.dat Datei bereitstellt. Sobald ein neuer DHCP Client sich vom DHCP Server eine IP Adresse holt, bekommt er auch eine Lease-Zeit zugewiesen, wie lange er die Adresse verwenden darf. Die Lease wird standardm&auml;&szlig;ig nach der H&auml;lfte der Lease-Zeit verl&auml;ngert. Solange sich der Client in dieser Lease befindet und die IP Adresse dem DHCP Server anbietet, wird die WPAD Datei nicht aktualisiert.&Auml;ndert sich jetzt der Servername des ISA / TMG Servers und ist in der Option 252 vom DHCP Server der jeweilige Servername eingetragen, so erhalten die DHCP Clients nicht die neue Konfiguration. Man m&uuml;sste bei jedem Client, der sich in einer Lease befindet die Befehle ipconfig /release und ipconfig /renew ausf&uuml;hren um einen manuellen Refresh durchzuf&uuml;hren.Es gibt mehrere Methoden das Problem zu umgehen:Methode 1 &ndash; Option 252 von Anfang an mit dem CNAME WPAD konfigurierenWenn man in den DHCP Einstellungen nicht den FQDN des Servers verwendet, sondern den CNAME WPAD (so wie man es f&uuml;r DNS konfigurieren muss), so wird der CNAME WPAD immer auf den jeweiligen aktuellen Server zeigen. ACHTUNG: Dies muss nat&uuml;rlich von Anfang an so erfolgen!!Methode 2 &ndash; Clients daran hindern die WPAD Option von DHCP zu zeihen.Durch hinzuf&uuml;gen des Registry Keys: AutoProxyDetectType mit dem Wert 2 unter HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settingswerden die Clients angewiesen das WPAD File &uuml;ber DNS anzufragen.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/migration-isa-server-2k4-2k6-zu-tmg-wpad/\"\n},{\n  \"id\": \"post-exchange-2010-pfad-einer-mailboxdatenbank-andern\",\n  \"title\": \"Exchange 2010 Pfad einer Mailboxdatenbank ändern\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Der Pfad zu einer Exchange 2010 Mailboxdatenbank kann geändert werden, die Datenbank muss dazu allerding “dismounted” also offline sein. Das heißt die Benutzer deren Mailbox sich in der betreffenden Datenbank befinden habe für die Zeit der Änderung keinen Zugriff auf ihre Mailbox.Ich werde im Beispiel zwischen einer einzelnen Datenbank und einer Datenbank in einer DAG mit mehreren Kopien unterscheiden. Einzelne DatenbankDer Datenbankpfad kann mit der EMC sowie mit der EMS verschoben werden.Exchange Management Console   Rechtsklick auf Datenbank, Dismount     Wenn die Datenbank offline ist, wieder Rechtsklick und Move Databse Path auswählen.     Exchange Management Shell   Datenbank offline nehmen mit      Dismount-Database DB01     Pfad ändern      Move-DatabaseFilePath DB01 –EdbFilePath M:\\\\db01\\\\db01.edb –LogFolderPath L:\\\\     Datenbank wieder online nehmen      Mount-Database DB01  Datenbank in DAGAchtung:       Wenn Circular Logging für die Datenbank aktiviert ist muss das vor der Änderung deaktiviert werden!      Einstellungen wie ReplayLagTime und TruncationLagTime notieren, durch das entfernen und wieder erstellen der Datenbankkopien gehen diese Einstellungen verloren!   Alle Datenbankkopien entfernen, d.h. Datenbank wird nur auf einem Server belassen, auf diesem wird der Pfad geändert      Remove-MailboxDatabaseCopy     Datenbank offline nehmen (einzige verbleibende Kopie)      Dismount-Database     Datenbankpfad verschieben      Move-DatabasePath –EdbFilePath –LogFolderPath     Auf allen Servern die eine Kopie der Datenbank enthalten sollen muss der neue Pfad existieren, durch kopieren der alten Files an den neuen Pfad kann man zeit und Replikationstraffic sparen, die Datenbank muss so nicht neu geseedet werden     Datenbank wieder online nehmen      Mount-Database     Datenbankkopien wieder erstellen      Add-MailboxDatabaseCopy     Index und Search Dienste neu starten      net stop msftesql-Exchange        net start MSExchangeSearch     Replikation überprüfen      Test-ReplicationHealth        Get-MailboxDatabaseCopyStatus  &#160;Fehler beim entfernen/hinzufügen von KopienBeim entfernen einer Mailboxdatenbankkopie kann es zu einem Fehler mit folgender Meldung kommen: Error:      Registry key has subkeys and recursive removes are not supported by this method.&lt;/p&gt;    Warning:      An unexpected error has occurred and a Watson dump is being generated: Registry key has subkeys and recursive removes are not supported by this method.&lt;/code&gt;  Obwohl der Fehler auftritt wird die Datenbankkopie gelöscht. Allerdings bekommt man beim wiedererstellen der Datenbankkopie den selben Fehler und die Kopie wird nicht erstellt. Es hilft folgender Workaround.     GUID der betreffenden Datenbank herausfinden     Get-MailboxDatabase db01 | fl name,guid     Auf dem Server, auf dem die Datenbankkopie erstellt werden soll muss folgender Registry Key gelöscht werden     HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\ExchangeServer\\\\v14\\\\Replay\\\\State\\\\{GUID}\\\\DumpsterInfo    Jetzt wird das Add-MailboxDatabaseCopy cmdlet erneut ausgeführt und die Kopie wird erstellt.  &#160;  tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-pfad-einer-mailboxdatenbank-andern/\"\n},{\n  \"id\": \"post-exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben\",\n  \"title\": \"Exchange 2010 SP1 Online Archive in eigene Datenbank verschieben\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Mit Exchange 2010 wurden Online Archive eingeführt, mit SP1 hat man die Möglichkeit Archive in einer eigenen Datenbank zu verwalten. Die Vorteile liegen auf der Hand, man kann Archivdaten so auf billigeren, langsamen Storge legen, kann verschiedene Backup/Restore SLAs für Produktiv- und Archivdaten anbieten usw…Wer Online Archive bereits mit Exchange 2010 RTM verwendet hat und diese jetzt auf eine andere Datenbank schieben muss kann wie folgt vorgehen.EMCIn der EMC wurden mit SP1 die Wizards für einen neuen Move Request angepasst, dort kann man das Archiv auswählen und nur dieses verschieben.EMSIn der EMS gibt es neue Parameter für das cmdlet New-MoveRequest, hier ein Beispiel in dem das Archiv des Benutzers test.user in die Datenbank adb01 verschoben wird.new-MoveRequest test.user –ArchiveOnly –ArchiveTargetDatabase adb01tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben/\"\n},{\n  \"id\": \"post-exchange-2010-zertifikat-anfordern\",\n  \"title\": \"Exchange 2010 Zertifikat anfordern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Um OWA, Active Sync usw. betreiben zu können benötigt Exchange ein entsprechendes Zertifikat. Seit Exchange 2010 hat Microsoft hierfür einen komfortablen Wizard zur Verfügung gestellt.Der Wizard befindet sich unter der Serverkonfiguration und wird über den Menüpunkt “New Exchange Certificate” aufgerufen.Sobald der Wizard startet, muss zunächst ein Namen vergeben werden. Auf der nächsten Seite kann das Zertifikat noch für alle Subdomains freigegeben werden.Nun können die Einstellungen gesetzt werden, wie der Certificate-Request erstellt werden soll. Als Beispiel habe ich hier einige Parameter aufgelistet:OWAActiveSyncOutlook Anywhere und AutodiscoverAls Ergebnis werden dann die Domains angezeigt, die im Zertifikat registriert werdenNachdem die Informationen zu Organisation und Standort ausgefüllt wurde, kann der Certficate-Request abgespeichert und bei der CA eingereicht werden. Bevor die CA das Zertifikat ausstellen kann, muss die CA noch für die Registrierung mehrere Subject Names aktiviert werden.Nachdem die CA das Zertifikat ausgestellt hat, muss der Request noch abgeschlossen werden. Hier klickt man rechts auf das Zertifikat in der EMC und wählt die Option “Complete Pending Request”.Sobald das Zertifikat installiert ist, muss es noch mit den jeweiligen Diensten verbunden werden. Hier ist uns wieder ein Wizard behilflich. Rechtslick auf das Zertifikat und “Assign Services to Certificate”Nun kann man sämtliche Services auswählen, für die das Zertifikat zuständig ist.Mit Assign wird das Zertifikat dann hinzugefügt.Grüße   dnlive vom ntSystems techDAY :)\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-zertifikat-anfordern/\"\n},{\n  \"id\": \"post-exchange-2010-san-zertifikate28093server-2008-pki\",\n  \"title\": \"Exchange 2010 SAN Zertifikat–Server 2008 PKI\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Zertifikate f&uuml;r den Exchange 2010 Client Zugriff beinhalteten mehrere Subject Names. Standardm&auml;&szlig;ig werden sogenannte SAN Zertifikate von Server 2008 Certificate Authorities nicht unterst&uuml;tzt.Damit die CA ein SAN Zertifikat ausstellen kann muss folgender Befehl von einer Eingabeaufforderung mit administrativen Rechten ausgef&uuml;hrt werden:certutil &ndash;setreg policy\\\\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2Anschlie&szlig;end m&uuml;ssen die CA Dienste neu gestartet werden. Am besten mit \\\"net stop certsvc &amp;&amp; net start certsvc&rdquo;.Will man jetzt einen Certificate Request &uuml;ber die MMC einreichen erscheint folgender Fehler:&ldquo;The request contains no Certificate template information. 0x80094801 (-2146875391) Denied by Policy Module 0x80094801, the request does not contain a Certificate template extension or the Certificate Template request attribute.&rdquo;Man muss den Request &uuml;ber die Certificate Web Services einreichen, standardm&auml;&szlig;ig l&auml;uft die auf der CA unter /certsrv, in unserem Fall also: http://dc01.ntsystems.local/certsrv. Dort w&auml;hlt man Request a Certificate, advanced certificate request und submit a certificate using a (&hellip;) file. In das Textfeld wird der gesamte Inhalt der .req Datei kopiert, bei Certificate Template wird Web Server ausgew&auml;hlt. Wenn der Request erfolgreich war, kann man die .cer Datei herunterladen und in Exchange den Request fertigstellen (Complete Pending Request).Alternativ kann der Request mit &ldquo;certutil&rdquo; eingereicht werden, wobei mit dem Parameter &ldquo;/attrib&rdquo; das Template gew&auml;hlt wird.Beispiel: certreq.exe -submit -attrib \\\"CertificateTemplate:WebServer\\\" c:\\\\certreq.req&nbsp;tomlive vom ntSystems techDAY :)\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-san-zertifikate28093server-2008-pki/\"\n},{\n  \"id\": \"post-webdav-iis7-publishing-ober-isa-server-part-2\",\n  \"title\": \"WebDav, IIS7 publishing over ISA Server Part 2\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Wie versprochen hier der 2. Teil meiner WebDav Reihe. In diesem Post geht es darum das WebDav Verzeichnis mit dem ISA Server zu veröffentlichen.Als erstes erstellen wir eine neue Webveröffentlichungsregel:Wir geben an, dass wir eine einzelne Webseite veröffentlichen und wählen bei Sicherheit SSL ausNun müssen wir den Sitenamen inkl. IP Adresse (sofern dieser nicht aufgelöst werden kann) vergebenDanach geben wir den Pfad an, für welchen die Veröffentlichungsregel wirken soll, bzw. auf welchen Ordner der externe Zugriff beschränkt werden soll.Nun tragen wir noch den externen Namen einINFO: Sollte euer Pfad Leerzeichen haben, ist das für den ISA Server kein Problem. Man muss die Leerzeichen nicht durch %20 ersetzen, sondern kann die URL ganz normal eingeben.Als nächstes erstellen wir einen neuen Listener und weisen ihn an, dass eine SSL Verbindung erforderlich istJetzt wählen wir IP Adresse und das entsprechende Zertifikat aus. Sofern dies noch nicht auf dem ISA Server installiert wurde, muss es jetzt nachinstalliert werden.Als Authentifizierung wählen wir die HTTP Authentifizierung – StandardAls Authentifizierungsdelegierung nehmen wir NTLMZum Schluss kann man noch eine Gruppe angeben, auf welche die Veröffentlichungsregel beschränkt ist.&#160;Das Standardverhalten des Client ist es, den veröffentlichen Ordner selbst durch die HTTP Methode OPTIONS abzufragen. Damit die Verbindung nicht fehlschlägt, müssen wir dies zulassen und dürfen es nicht wie durch die bereits erstellte Regel mit den zugelassenen Pfaden blockieren. Wir kopieren die neu erstelle Regel und platzieren sie unter der ersten Regel. Danach werden die die HTTP Methode auf OPTIONS beschränken.Nun geben wir der kopierten Regel einen neuen Namen (Bsp: WebDav – OPTIONS) um sie von der ersten Regel zu unterscheiden. Wir löschen zudem unter dem Reiter Pfade die Ordnerbeschränkung.Als nächstes wird die HTTP Methode auf OPTIONS beschränkt. Wir öffnen die HTTP Richtlinie und tragen die Methode ein:&#160;ACHTUNG: Ordner mit UmlauteWenn ihr Ordner mit Umlaute verwendet, wird die Verbindung beim versuch die Ordner zu öffnen, immer zusammenbrechen. Der Grund hierfür liegt darin, dass das High Bit-Zeichen standardmäßig deaktiviert ist. Dieses High Bit-Zeichen lässt Umlaute in der URL zu. Ich empfehle auf beiden Veröffentlichungen WebDav und WebDav Options das High Bit-Zeichen zu erlauben.     Dies kann ebenfalls in der jeweiligen HTTP Richtlinie vorgenommen werden:Nun kann der Client den Ordner via HTTPS von Extern mappen.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/webdav-iis7-publishing-ober-isa-server-part-2/\"\n},{\n  \"id\": \"post-webdav-iis7-publishing-over-isa-server-part-1\",\n  \"title\": \"WebDav, IIS7 publishing over ISA Server Part 1\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Dies ist der erste aus 2 Teilen zum Thema WebDav. WebDav (Web-based Distributed Authoring and Versioning) ist ein offizieller Standard, Dateien im Internet bereitzustellen.&lt;/p&gt;Der Vorteil von WebDav ist, dass es nicht wie FTP oder SSH spezielle Ports verwendet, sondern &uuml;ber HTTP und HTTPS &uuml;bertragen wird und somit durch jede Firewall kommt, welche Port 80 und 443 ge&ouml;ffnet hat.Im ersten Teil werde ich zeigen wie ein Verzeichnis unter IIS7 erstellt und &uuml;ber WebDav freigegeben wird. Im 2. Teil werde ich beschreiben wie man das Ganze &uuml;ber den ISA Server ver&ouml;ffentlicht.&nbsp;ServerSofern IIS nicht installiert ist, besteht der erste Schritt darin den Webserver zu installierenZus&auml;tzlich zum Webserver muss das Feature WebDav hinzugef&uuml;gt werden.Der n&auml;chste Schritt besteht darin, eine neue Webseite in IIS zu erstellen. Als physikalischen Pfad geben wir das Verzeichnis ein, welches &uuml;ber WebDav freigegeben werden soll.Zus&auml;tzlich binden wir die Webseite auf Port 443 HTTPS und w&auml;hlen das jeweilige Zertifikat aus.Als n&auml;chstes m&uuml;ssen unter Authentifizierung die Anonyme Authentifizierung deaktivieren und Windows- und Standardauthentifizierung aktivieren.Bei den Webseiteneinstellung befindet sich das Feature WebDav-Erstellungsregeln.In den Einstellungen muss zun&auml;chst WebDav aktiviert werden und danach eine neue Erstellungsregel erstellt werden. Die Erstellungsregel definiert die jeweiligen Zugriffsrechte.Die Konfiguration ist nun abgeschlossen. Ich empfehle jedoch um Probleme mit&nbsp;Zielpfade auf &nbsp;entfernten Servern zu vermeiden, zus&auml;tzlich unter den Verbindungseinstellungen der Webseite, einen Benutzer anzugeben, der Zugriffsrechte auf die Webseite hat.&nbsp;ClientUm das WebDav-Verzeichnis zu mappen, muss der Client ein neues Netzlaufwerk verbinden und die Option &ldquo;Verbindung mit einer Webseite herstellen, auf der Sie Dokumente und Bilder speichern k&ouml;nnen&rdquo; ausw&auml;hlen.Als Adresse geben wir https://Servername einJetzt k&ouml;nnen wir auf das Verzeichnis &uuml;ber HTTPS zugreifen.Gr&uuml;&szlig;e dn&lt;/code&gt;\",\n  \"url\": \"https://onprem.wtf/post/webdav-iis7-publishing-over-isa-server-part-1/\"\n},{\n  \"id\": \"post-rbac\",\n  \"title\": \"Exchange 2010–Role Based Access Control\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"In Exchange 2010 wurde ein neues Berechtigungsmodell eingef&uuml;hrt, Role Based Access Control. Es basiert auf sogenannten Rollen anstelle von ACLs, diese Rollen (eigentlich die Role Entries) steuern den Zugriff auf cmdlets. Um dieses neue Modell zu verstehen muss man die Grundbausteine verstehen aus denen es besteht. Vereinfacht gesagt wird festgelegt wer was wo machen darf.&nbsp;Scope (wo)Definiert die Objekte im Active Direcotry auf welchen die Rolle Berechtigungen hat. New-ManagementScope Role/Role Entry (was)Eine Rolle ist eine Sammlung von Role Entries, sie definiert welche cmdlets und welche Parameter ausgef&uuml;hrt werden d&uuml;rfen. New-ManagementRole Add-ManagementRoleEntry, Remove-ManagementRoleEntry RoleGroup (wer)Universelle Sicherheitsgruppe deren Mitglieder die Rechte bekommen die in der Role definiert sind. Verkn&uuml;pft Rolle und Scope. New-RoleGroup &ndash;Roles &ldquo;&rdquo; &ndash;CustomRecipientWriteScope &ldquo;&rdquo; Role AssignmentVerbindet die oben genannten Elemente, legt fest wer was wo machen darf. Das cmlet New-RoleGroup erzeugt den ManagementRoleAssignmenteintrag Get-ManagementRoleAssignment Es gibt in Exchange 2010 65 vordefinierte Rollen die man sich mit Get-ManagementRole anzeigen lassen kann.Will man die Role Entries zu einer Rolle sehen f&uuml;hrt man folgendes cmdlet aus: Get-ManagementRoleEntry Rolle\\\\*Beispiel: Get-ManagementRoleEntry \\\"Move Mailboxes\\\\*\\\"&nbsp;Benutzerdefinierte Rolle erstellenSoll eine Benutzerdefinierte Rolle bzw. ein Scope erstellt werde, dann in dieser Reihenfolge:New-ManagementScope \\\"Gruppe1Scope\\\" -RecipientRestrictionFilter {memberofgroup -eq \\\"CN=Gruppe1,OU=users,DC=domain,DC=local} Diese Rolle darf nur Mitglieder der Gruppe1 bearbeiten. New-ManagementRole \\\"Create Move Request Gruppe1\\\" &ndash;Parent &ldquo;Move Mailboxes&rdquo; Eine neue Rolle wird erstellt New-RoleGroup \\\"Gruppe1 Movers\\\" -roles \\\"Create Move Request Gruppe1\\\" -CustomRecipientWriteScope \\\"Gruppe1Scope\\\" Eine neue Gruppe wird erstellt (Universelle Sicherheitsgruppe im AD), die Rolle sowie der Scope werden dieser Gruppe zugewiesen Add-RoleGroupMember \\\"Gruppe1 Movers\\\" -members \\\"username\\\" Benutzer werden der Gruppe hinzugef&uuml;gt, kann auch im AD gemacht werden So sieht die soeben erstellte Rolle aus:Get-ManagementRoleEntry \\\"Create Move Request Gruppe1\\\\*\\\"&nbsp;Benutzerdefinierte Rolle anpassenMeine soeben erstellte Rolle soll nur Berechtigungen haben einen Move Request zu erstellen. Mitglieder sollen den Move Request nicht l&ouml;schen, anhalten oder weiterf&uuml;hren k&ouml;nnen. Also passe ich die RoleEntries entsprechend an.Nicht gew&uuml;nschte cmdlets entfernen mit remove-ManagementRoleEntry remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Remove-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Suspend-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Resume-MoveRequest&rdquo; Mit add-ManagmentRoleEntry &ldquo;Create Move Request Gruppe1\\\\RoleEntry&rdquo; kann man weitere Eintr&auml;ge erstellen und die Rolle weiter personalisieren. Nachdem die nicht erw&uuml;nschten cmdlets entfernt wurden sieht das Ganze so aus:Get-ManagementRoleEntry \\\"Create Move Request Gruppe1\\\\*\\\"&nbsp;Wichtig: RBAC Rollen sind nicht gleichzusetzen mit ACLs (Sicherheitsberechtigungen), das hei&szlig;t es wird nicht die restriktivste Rolle angewandt. Benutzer erhalten durch alle Rollen die ihnen zugewiesen sind Zugriff auf ein bestimmtes &ldquo;Set&rdquo; an Funktionen. Mehr Rollen = Mehr Funktionen.Wenn man das Prinzip einmal verstanden hat, wird einem schnell bewusst wie m&auml;chtig dieses neue Berechtigungsmodell ist. Da die Exchange Management Konsole auch nichts anderes macht also PowerShell Befehle abzusetzen kann man so wirklich alles genau an seine Bed&uuml;rfnisse anpassen.tom\",\n  \"url\": \"https://onprem.wtf/post/rbac/\"\n},{\n  \"id\": \"post-shared-mailboxes-und-auto-mapping-e14-sp1\",\n  \"title\": \"Shared Mailboxes und Auto Mapping E14 Sp1\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Shared und Ressourcen Postf&auml;cher gibt es schon l&auml;nger. Mit Exchange 2010 SP1 kommt aber ein neues Feature das den Admins das leben um einiges erleichtert. Wie das Kind hei&szlig;t ist noch nicht zu erfahren, es wird in div. Blogs und Foren &ldquo;Auto Mapping&rdquo; genannt.Um dieses neue Feature zu verwenden muss man nur auf einem Exchange 2010 SP1 Server Berechtigungen auf eine Shared Mailbox setzen, existieren die Berechtigungen bereits m&uuml;ssen sie entfern und nochmal gesetzt werden.&nbsp; Beim setzen der Berechtigungen werden n&auml;mlich die Benutzer, die von der Berechtigung profitieren, in das ActiveDirectory Attribut msExchDelegatedListLink aufgenommen.Outlook sucht beim starten nach Mailboxen mit dem DN des Benutzers und verbindet diese automatisch. Ein weiterer Vorteil ist dass die Mailbox vom Benutzer nicht geschlossen oder entfernt werden kann, so werden die Helpdesk Calls weiter reduziert ;)Das Ganze funktioniert &uuml;brigens auch f&uuml;r Ressourcen (Room/Equipment) Mailboxen.tomspecial thanks to: Steve Goodman\",\n  \"url\": \"https://onprem.wtf/post/shared-mailboxes-und-auto-mapping-e14-sp1/\"\n},{\n  \"id\": \"post-e14-sp1-importexport-update\",\n  \"title\": \"E14 SP1 Import/Export Update\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Vor kurzem habe ich in diesem Post &uuml;ber die Import/Export-Mailbox cmdlets geschrieben.Mit Exchange 2010 SP1 wurde die Import/Export Funktionalit&auml;t ge&auml;ndert und die cmdlets werden durch MailboxImportRequest und MailboxExportRequest ersetzt. Die Vorteile die daraus Resultieren sind folgende:Import/Export von Online ArchivenVerwendet Exchange MAPI Provider, Outlook muss nicht mehr auf dem Server installiert werdencmdlets verwenden UNC Pfade (PST Files m&uuml;ssen nicht mehr auf den Server kopiert werden)Beispiel:New-MailboxImportRequest-Mailbox&nbsp;test -IsArchive&nbsp;-FilePath \\\\\\\\server\\\\test.pstDieser Befehl Importiert den Inhalt der Datei test.pst in das Online Archiv der Mailbox \\\"test\\\".\",\n  \"url\": \"https://onprem.wtf/post/e14-sp1-importexport-update/\"\n},{\n  \"id\": \"post-sharepoint-2010-fehler-in-der-sql-datenbank-beheben\",\n  \"title\": \"Sharepoint 2010, Fehler in der SQL Datenbank beheben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Letztens wollte ich einen Test-Restore meiner Sharepoint Datenbank durchführen. Normalerweise hat das immer problemlos funktioniert, jedoch beim letzten Backup gab es große Probleme mit dem Sharepoint-Inhalt. Der Restore-Vorgang wurde erfolgreich beendet, jedoch war lediglich die halbe Sharepoint Struktur und keine Daten enthalten.Nachdem ich das Eventlog des Quellservers durchforstet habe, bin ich auf folgende Fehler im Anwendungs-Log gestoßen:Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 18053    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Fehler: 7884, Schweregrad: 20, Status: 1. (Parameter: ). Der Fehler wird aufgrund eines Formatierungsfehlers im nicht ausführlichen Modus gedruckt. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden ausgelassen.    Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 7105    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Die Datenbank-ID '6', Seite '(0:0)', Slot '0' für den LOB-Datentypknoten ist nicht vorhanden. Dies ist gewöhnlich auf Transaktionen zurückzuführen, die Daten, für die kein Commit ausgeführt wurde, auf einer Datenseite lesen können. Führen Sie DBCC CHECKTABLE aus.    Um den Fehler zu analysieren muss man zunächst das SQL Server 2008 Management Studio Express installieren. Über das Management Studio erhält man Zugriff auf dem SQL Server und kann mit dem Troubleshooting beginnen.    Zunächst meldet man sich am SQL Server an. Als Servername verwenden wir SERVER\\\\SharepointNun ist die Verbindung zum Server hergestellt. Jetzt muss die Datenbank mit der ID ‘6’ (wie in der Fehlermeldung 2) gefunden werden. Als erstes öffnen wir ein Abfragefenster und gehen jede Datenbank mit use NAME-DER-DATENBANK     select db_id()durch, bis uns die entsprechende ID im Fenster “Meldungen” ausgegeben wird. In meinen Fall war das die Datenbank WSS_CONTENT.Nun führen wir den Befehl DBCC CHECKDB (WSS_CONTENT) WITH NO_INFOMSGS, ALL_ERRORMSGS aus und bekommen eine Liste mit den entsprechenden FehlernIn meinem Fall:Meldung 8965, Ebene 16, Status 1, Zeile 1     Tabellenfehler: Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594043760640 (LOB data-Typ). Auf den Datenknoten außerhalb von Zeilen auf Seite (0:0), Slot 0, Text-ID 1759772672 wird von Seite (1:4986), Slot 6 verwiesen, er wurde jedoch im Scan nicht betrachtet.     Meldung 8929, Ebene 16, Status 1, Zeile 1     Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594123255808 (In-row data-Typ): Es wurden Fehler in Daten außerhalb von Zeilen gefunden mit der ID 1759772672, im Besitz von data, Datensatz identifiziert durch RID = (1:4986:6).     Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'AllDocs'-Tabelle (Objekt-ID 69575286) gefunden.    Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'WSS_Content'-Datenbank gefunden.    repair_allow_data_loss ist die minimale Reparaturstufe für die Fehler, die mit DBCC CHECKDB (WSS_Content) gefunden wurden.&#160;Die Meldungen weisen darauf hin, dass eine Inkonsistenz in der Datenbank vorliegt. Höchstwahrscheinlich handelt es sich dabei um eine Datei, die auf dem Sharepoint Server upgeloaded wurde. Um die Inkonsistenz zu beheben muss DBCC CHECKDB mit dem Parameter repair_allow_data_loss ausgeführt werden. Dafür müssen zunächst alle Sharepoint Dienste und der IIS Dienst beendet werden.   Danach müssen die folgenden Kommandos ausgeführt werden:Mit dem Befehl ALTER DATABASE WSS_Content SET SINGLE_USER, wird die Datenbank in den Sinlge_Mode gesetzt, der Befehl DBCC CHECKDB (WSS_Content, REPAIR_ALLOW_DATA_LOSS) startet die Reparatur.Nachdem die Reparatur abgeschlossen wurde und DBCC CHECKDB keine Fehler mehr protokolliert, kann der Modus wieder zu MULTI_USER geändert werden.Jetzt können alle Dienste wieder gestartet werden. Die Datenbank sollte jetzt konsistent sein und die Sicherung vollständig durchlaufen.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2010-fehler-in-der-sql-datenbank-beheben/\"\n},{\n  \"id\": \"post-appv-46e28093sccm-2007r2-streaming-applications\",\n  \"title\": \"AppV 4.6–SCCM 2007R2 Streaming Applications\",\n  \"author\": \"tto\",\n  \"tags\": [\"AppV\",\"Server\"],\n  \"content\": \"Seit System Center Configuration Manager 2007 R2 kann man Virtuelle Applikationen verteilen. Daf&uuml;r m&uuml;ssen ein paar Einstellungen im SCCM gemacht werden, der SCCM Advanced Client sowie der AppV Client m&uuml;ssen auf den Clients installiert werden.Einstellungen SCCM 2007R2Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Client Agents, Advertised Programs Client Agent&rdquo; &ouml;ffnen unter General muss &ldquo;Allow virtual application package advertisemet&rdquo; muss werden  Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Site Systems, Servername, ConfigMgr distribution point&rdquo; &ouml;ffnen unter General muss &ldquo;Allow Clients to transfer content from this distribution Point using BITS, HTTP, and HTTPS&rdquo; aktiviert werden unter Virtual Application muss &ldquo;Enable virtual application streaming&rdquo; aktiviert werden &nbsp; AppV Client deploymentUnter &ldquo;%ProgramFiles%\\\\Microsoft Configuration Manager\\\\Tools\\\\VirtualApp&rdquo; die Datei &ldquo;AppVirtMgmtClient.sms&rdquo; anpassen. Version=4.6 (wenn AppV Client 4.6 verwendet wird) Commandline=setup.exe /s /v\\\"/quiet /norestart /qn\\\"0\\\\\\\"\\\\\\\" (Application Virtualization Client Installer Command-Line Parameters) Ein neues Paket aus einer Definition erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Package From Definition&rdquo; w&auml;hlen. Mit &ldquo;Browse&rdquo; die Datei AppVirtMgmtClient.sms ausw&auml;hlen  Im n&auml;chten Fenster &ldquo;Always obtain files from a source directory&rdquo; w&auml;hlen  Als Pfad wird ein Netzwerkfreigabe gew&auml;hlt auf welcher der AppV Client entpackt wurde, folgende Dateien und Ordner sollten vorhanden sein: setup.exe setup.msi Support\\\\Watson\\\\dw20shared.msi Auf Finish klicken und das Paket wurde erstellt Jetzt muss noch ein Advertisement f&uuml;r das Paket erstellt werden.Rechtsklick auf &ldquo;Site Database, Computer Management, Software Distribution, Advertisements&rdquo; und New Advertisement w&auml;hlen. Einen Namen eingeben, das Paket ausw&auml;hlen welches im vorigen Schritt erstellt wurde und eine Collection ausw&auml;hlen welche den Client erhalten soll.  Mandatory Assignment hinzuf&uuml;gen  Art der Verteilung w&auml;hlen, in dem Fall &ldquo;Download from distribution point and run locally&rdquo;  An dieser Stelle kann auf Finish geklickt werden, f&uuml;r die &uuml;brigen Einstellungen akzeptiere ich die Standards. Jetzt wurde das Paket und die Zuweisung erstellt, die Clients die in der Collection sind erhalten die Software.Virtuelle Applikation importierenNachdem die Virtuelle Applikation im Sequencer erstellt wurde (wie z.B. hier erkl&auml;rt) muss sie im System Center Configuration Manager importiert werden.Ein neues virtuelles Paket erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Virtual Application Package&rdquo; w&auml;hlen. Im ersten Fenster muss die XML Datei des Pakets angegeben werden.  Das Fenster &ldquo;General&rdquo; ist eigentlich selbsterkl&auml;rend, Name, Hersteller usw. k&ouml;nnen eingegeben werden. Im Fenster &ldquo;Data Source&rdquo; wird eine Netzwerkfreigabe angegeben auf der das Paket erstellt wird, von dieser Freigabe wird das Paket dann auf die Distribution Points verteilt (Achtung: der Angegebene Order muss existieren und vorhandene Daten werden &uuml;berschrieben!)  Jetzt kann wieder auf Finish geklickt werden, die Standards der restlichen Einstellungen sind ok. Das Virtuelle Paket wurde nun also auch erstellt. Jetzt fehlt noch ein Advertisement f&uuml;r dieses.Das Advertisement wird genau gleich erstellt wie jenes f&uuml;r den AppV Client, der einzige unterschied liegt in der Auswahl der Verteilungsmethode hier w&auml;hlt man &ldquo;Stream virtual applications from distribution point&rdquo; &nbsp; Nach kurzer Zeit werden die Clients auch dieses Advertisement erhalten. Sind Desktopverkn&uuml;pfungen oder Dateizuordnungen konfiguriert werden diese auf dem Client bereits angewandt. Das hei&szlig;t ein .pdf File bekommt in diesem Beispiel bereits den virtuellen Adobe Reader zugewiesen. Beim ersten Starten des Programmes wird der Inhalt des Paketes heruntergeladen, d.h. der erste Start dauert ein bisschen, alle weiteren Starts verlaufen wesentlich schneller, dabei wird nur auf Updates &uuml;berpr&uuml;ft, alle anderen Files sind bereits lokal vorhanden.tom\",\n  \"url\": \"https://onprem.wtf/post/appv-46e28093sccm-2007r2-streaming-applications/\"\n},{\n  \"id\": \"post-sharepoint-web-apps-lassen-sich-nicht-installieren\",\n  \"title\": \"Sharepoint Web Apps lassen sich nicht installieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wenn man die Sharepoint Webseite nicht über den default Port 80 betreibt, bricht die Installation der Sharepoint Webservices bei der Erstellung der Beispieldaten ab. &#160;Um das Problem zu umgehen empfiehlt es sich die Sharepoint Webseite während der Installation auf Port 80 zu binden. Dazu sind folgende 2 Schritte notwendig:   In der Sharepoint Zentraladministration muss der alternative Zugriff auf Port 80 gebunden werden    Im IIS Manger muss ebenfalls die Bindung neu festgelegt werden Danach läuft die Installation vollständig durch und die Webseite kann wieder auf den ursprünglichen Port gebunden werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-web-apps-lassen-sich-nicht-installieren/\"\n},{\n  \"id\": \"post-appv-46e28093sccm-2007r2e28093streaming-issue\",\n  \"title\": \"AppV 4.6–SCCM 2007R2–Streaming Issue\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\",\"AppV\"],\n  \"content\": \"Hi, tom here again. Talking about AppV and System Center Configuration Manager 2007R2 today.I was stumbling upon this error while I was trying to stream virtual Applications with SCCM. If I set the advertisement to &ldquo;Stream virtual applications from distribution point&rdquo; the following error occurred, though if I set the advertisement to &ldquo;Download content from distribution point and run locally&rdquo; everything worked without any problem.The problem was caused by the malware inspection feature of my ForeFront TMG Web Proxy Server.If you see &ldquo;an unexpected error&rdquo; with the Error Code like: 0A-400000C8 try to disable the Proxy on the Clients for further research.If you are using Forefront TMG be sure to add the SCCM (streaming enabled) Distribution Point to the Malware Destination Exceptions.You wont see this error with Application Virtualization Management Server when using RTSP or RTSPS as streaming protocol. You wont see it even with SCCM&nbsp;if &ldquo;Download content from distribution point and run locally&rdquo; is selected because this uses BITS to transfer the whole package to the client and run it locally. Since SCCM uses HTTP/HTTPS for streaming the connection will go to the proxy server and will be killed by Malware Inspection.tomps. special thanks go to J.C. Hornbeck (http://blogs.technet.com/b/appvcallback/)\",\n  \"url\": \"https://onprem.wtf/post/appv-46e28093sccm-2007r2e28093streaming-issue/\"\n},{\n  \"id\": \"post-sharepoint-foundation-serach-14\",\n  \"title\": \"Sharepoint Foundation Serach, 14\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wenn ihr auf folgende Fehlermeldung auf eurem Sharepoint 2010 Server stoßt:&#160;Protokollname: Application     Quelle: Microsoft-SharePoint Products-SharePoint Foundation Search      Datum: 09.08.2010 16:51:10      Ereignis-ID: 14      Aufgabenkategorie:Gatherer      Ebene: Warnung      Schlüsselwörter:      Benutzer: LOKALER DIENST      Computer: Miami.domain.local      Beschreibung:      Die Startadresse 'sts4://jobportal:8015/contentdbid={4cee0e9c-fee5-498f-86b7-9855d89539ff}' kann nicht durchforstet werden.Kontext: Anwendung 'Suchabfragen_über_Hilfethemen_bedienen', Katalog 'Search'Details:Zugriff verweigert. Vergewissern Sie sich, dass das Standardkonto für den Inhaltszugriff Zugriff auf dieses Repository hat, oder fügen Sie eine Durchforstungsregel zum Durchforsten dieses Repositorys hinzu. Wenn es sich bei dem zu durchforstenden Repository um ein SharePoint-Repository handelt, vergewissern Sie sich, dass das verwendete Konto über die Berechtigung &quot;Alles lesen&quot; für die durchforstete SharePoint-Webanwendung verfügt. (0x80041205)   bedeutet das, dass ihr eine Webanwendung unter einer URL betreibt, die nicht dem Computername des Server entspricht. Dafür verantwortlich ist das sog. Loopback check security feature, welches ab Windows Server 2003 SP1 implementiert ist. Es lehnt die Authentifizierung ab, wenn die URL nicht mit dem Computernamen übereinstimmt und verhindert somit, dass die Sharepoint Suche die Webseite indiziert.Hier ein Workaround um das Problem zu beheben:In der Registry des Sharepoint Servers muss unter HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Lsader Schlüssel (DWORD) “DisableLoopbackCheck” mit Wert 1 erstellt werden. Nach einem Neustart ist das Security Feature deaktiviert und es werden keine Warnungen mehr ins EventLog geschrieben.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-serach-14/\"\n},{\n  \"id\": \"post-exchange-2010e28093database-restore\",\n  \"title\": \"Exchange 2010–Database Restore\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber mehr in einem anderen Beitrag.Die Datenbank wird also von der Sicherung zurückgeholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Widerherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die *.edb Datei der Datenbank und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Wurden die Files zurückgeholt, kann man die Recovery Database erstellen. Dazu brauchen wir mal wieder die dunkle Seite der Macht, also öffne ich die Exchange Management Shell. Dort wird mit dem cmdlet new-MailboxDatabase eine Recovery Database aus der widerhergestellten *.edb Datei erstellt.Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server mbx01, X:\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner Widerhergestellt wurden.   New-MailboxDatabase –Recovery Rdb01 –Server mbx01 –EdbFilePath x:\\\\restore\\\\db.edb –LogFolderPath x:\\\\restore  Die Datenbank wurde erstellt, jedoch wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.Um die Recovery Datenbank in einen “Clean Shutdown State” zu bringen wird das Tool eseutil.exe verwendet. Dafür öffnet man eine Eingabeaufforderung (oder EMS) und lässt eseutil –p auf die edb Datei los. Der Parameter –p steht hier für Repair. In meinem Beispiel lautet der Befehl:    eseutil.exe –p x:\\\\restore\\\\db.edb  Nachdem Eseutil durchgelaufen ist, die Datenbank sich also im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick oder in der Shell mit Mount-Database RDB01.Die Datenbank wurde erfolgreich gemounted und ich habe jetzt Zugriff auf die Daten.Mit dem cmdlet Export-Mailbox können jetzt einzelne Mails oder ganze Mailboxen widerhergestellt werden, mehr zum cmdlet Export-Mailbox gibt es hier.&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010e28093database-restore/\"\n},{\n  \"id\": \"post-importexport-mailbox\",\n  \"title\": \"Import/Export Mailbox\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Mit den cmdlets import-Mailbox und export-Mailbox kann Inhalt von einer Mailbox exportiert oder in eine Mailbox importiert werden. Soviel sagt eigentlich der Name auch ;)Diese cmdlets sind standardm&auml;&szlig;ig aber nicht verf&uuml;gbar, bzw. hat ein &bdquo;normaler&ldquo; Exchange Organization Administrator keine Berechtigungen sie zu verwenden. Bevor diese Berechtigungen gesetzt werden sollte man RBAC (Role Based Access Control) verstehen.Man erstellt eine neue Universelle Gruppe im Active Directory, ich gebe ihr einen beschreibenden Namen &bdquo;Enterprise Import Export Users&ldquo;. Jetzt wei&szlig;e ich dieser Gruppe die Management Rolle &bdquo;Mailbox Import Export&ldquo; zu, dazu verwende ich folgendes cmdlet in der Exchange Management Shell:New-ManagementRoleAssignment -Name \\\"Import Export Role\\\" -SecurityGroup \\\"Enterprise Import Export Users\\\" -Role \\\"Mailbox Import Export\\\"Mitglieder dieser Gruppe haben jetzt die notwendigen Berechtigungen um die Import/Export cmdlets zu verwenden, die Exchange Management Shell bzw. Management Konsole m&uuml;ssen neu gestartet werden.Import-MailboxWird verwendet um PST Daten in Mailboxen zu importieren. Wenn die PST Dateien im Format &lt;Exchange Alias&gt;.pst vorhanden sind kann man auch mehrere Imports gleichzeitig machen.Mit diesem Befehlt werden alle Elemente aus c:\\\\pst\\\\test.pst in die Mailbox &ldquo;test&rdquo; importiert.Import-Mailbox &ndash;identity test &ndash;PstFolderPath c:\\\\pst\\\\test.pstMit diesem Befehl werden alle Dateien im Ordner c:\\\\pst in die entsprechenden Mailboxen importiert, wichtig ist dabei der Name der PST Files.Dir c:\\\\pst |Import-MailboxExport-MailboxWird verwendet um Objekte von Mailboxen zu exportieren, als Ziel kann eine andere Mailbox oder eine PST Datei anagegeben werden. H&auml;ufig wird dieses cmdlet verwendet um Objekte aus einer Recovery Datenbank wieder in der urspr&uuml;nglichen Mailbox herzustellen.Mit diesem Befehl werden alle Elemente aus der Mailbox &ldquo;test&rdquo; in den Ordner &ldquo;testdata&rdquo; der Mailbox &ldquo;export&rdquo; kopiert.Export-Mailbox -Identity test -TargetMailbox export -TargetFolder testdataMit diesem Befehl werden alle Element aus der Mailbox \\\"test\\\" in die PST Datei auf C:\\\\pst exportiert. Achtung: F&uuml;r diesen Befehl wird Outlook (x64)&nbsp;auf dem Exchange Server ben&ouml;tigt der den Export durchf&uuml;hren soll. Nach Best Practice sollte das ein separater Server sein der sonst keine Mailboxen h&auml;lt.Export-Mailbox -Identity test -PstFolderPath c:\\\\pst\\\\test.pstGenauere Informationen gibts im Technet: Export-Mailbox, Import-Mailboxtom\",\n  \"url\": \"https://onprem.wtf/post/importexport-mailbox/\"\n},{\n  \"id\": \"post-appve28093adobe-reader-sequencing-receipe\",\n  \"title\": \"AppV–Adobe Reader Sequencing Receipe\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Anhand des Adobe Readers möchte ich hier zeigen wie man eine virtuelle Applikation erstellt.Wie der&#160; Sequencer vorbereitet wird habe ich hier beschrieben.&#160;Der Sequencer wird gestartet und die AppV Sequencer Console wird geöffnet. Man wählt “Paket erstellen” um ein neues Paket zu erstellen.Im nächsten Dialog wird der Name und eventuell eine Beschreibung vergeben.Nachdem man auf “Weiter” geklickt hat kann man mit dem Sequencing beginnen. Durch klicken auf “Überwachung starten” wird man aufgefordert einen Ordner auszuwählen den der Sequencer überwachen soll.Es wird ein Ordner auf dem Q-Drive erstellt, dieser sollte einen Namen im 8.3 Format haben, also maximal acht Zeichen vor dem Punkt und maximal drei danach.Jetzt wird das Setup von Adobe Reader gestartet (nicht der Web Installer, sondern das offline Installationspaket). Wichtig ist dabei das man den eben erstellten Ordner auf dem Q-Drive als Zielordner angibt.Wenn die Installation erfolgreich abgeschlossen ist kann man die Überwachung beenden.Im nächsten Schritt werden Dateizuordnungen und Verknüpfungen konfiguriert, man kann z.B. wählen ob eine Verknüpfung auf dem Desktop der Clients erstellt werden soll oder nicht.Jetzt kann die Applikation personalisiert werden, durch klicken auf “Starten” wird Adobe Reader gestartet und man kann die EULA akzeptieren, dann muss das nicht der Benutzer machen. Außerdem empfiehlt es sich die Automatischen Updates des Readers zu deaktivieren. Wenn man alle Einstellungen gemacht hat wird die Applikation wieder beendet.Noch einmal auf “Weiter” klicken und das Paket ist vorerst fertig.In den folgenden Fenstern können noch diverse Einstellungen getroffen werden, wichtig ist im Reiter “Bereitstellung” das richtige Protokoll zu wählen, für Testumgebungen wird das RTSP sein. Außerdem kann man hier die unterstützten Betriebssysteme und die “Ausgabeoptionen” wählen. Wird das Paket per Streaming verteilt sollte man die Komprimierung aktivieren. Wenn man die Applikation an “Standalone” Clients verteilt dann muss man auch ein MSI File generieren.Eine weitere wichtigie Einstellung ist der Hostname des Servers, standardmäßig wird die Variable %SFT_SOFTGRIDSERVER% verwendet, diese muss auf den Clients als Umgebungsvariable mit dem Hostnamen des Servers konfiguriert werden.Man kann noch mehr personalisieren und sogar die virtuelle Registry bearbeiten, allerdings ist das für Adobe Reader nicht notwendig. Also kann das Paket gespeichert werden.Wurde das Paket gespeichert erhält man folgende Dateien. Diese können mit einem Application Virtualization Management Server, mit System Center Configuration Manager oder direkt per MSI an die Clients verteilt werden.Um die Applikation mit dem AppV Management Server zu verteilen wird in der Management Console mit rechts auf Applications gecklickt, dort kann man die *.sprj Datei auswählen und so die virtuelle Applikation erstellen. Die Dateien die mit dem Sequencer erstellt wurden müssen dazu in den “Content” Ordner des AppV Management Servers kopiert werden. &#160;tom\",\n  \"url\": \"https://onprem.wtf/post/appve28093adobe-reader-sequencing-receipe/\"\n},{\n  \"id\": \"post-appve28093sequencer\",\n  \"title\": \"AppV–Sequencer\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Der Microsoft Application Virtualization Sequencer ist ein Client oder Server der verwendet wird um virtuelle Applikationen zu erstellen.Der Sequencer ist im Idealfall eine virtuelle Maschine, vor jedem „Sequencing“ sollte der Ausgangszustand des Sequencers der Selbe sein.Man erstellt also eine neue virtuelle Maschine und installiert ein Betriebssystem seiner Wahl. Es müssen zwei Partitionen vorhanden sein, eine für das System und eine für das sogenannte Q-Drive.Zu diesem Zeitpunkt sollte man so wenig Software wie möglich installieren, alles was auf dem Sequencer installiert wird muss auch auf den Clients installiert werden damit die virtuellen Applikationen laufen.Es wird also der AppV Sequencer installiert und die zweite Partition mit NTFS Formatiert, dieser Partition weist man den Laufwerksbuchstaben Q: zu. Der Client soll in der Domain hängen und folgende Dienste sollten gestoppt und deaktiviert werden:· Windows Update· Windows SearchJetzt wird die virtuelle Maschine heruntergefahren und das Feature UnDo Disk (VMWare: Nonpersistent Disk) wird aktiviert. Ab jetzt ist die Maschine bei jedem Start auf dem gleichen Stand und bereit ein Paket zu erstellen.Wie ein Paket erstellt wird erkläre ich in diesem Post.tom\",\n  \"url\": \"https://onprem.wtf/post/appve28093sequencer/\"\n},{\n  \"id\": \"post-keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)\",\n  \"title\": \"Keine Mailzustellung auf Öffentliche Ordner nach Exchange 2010 Upgrade (von Exchange 2k3)\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Nachdem der letzte Exchange 2003 Server aus der Struktur entfernt wird, bleiben dennoch die Administrative Gruppe und verschiedene Ordner-Strukturen in der AD Konfiguration zurück.Dies kann unter Umständen den Mailfluss zu den Öffentlichen Ordnern stören. Man erhält dann folgende&#160; Unzustellbarkeitsberichte vom Exchange Server: Um das Problem zu beheben muss zunächst der ADSI Editor geöffnet werden. In der Unterstruktur&#160;Configuration / CN=Configuration,DC=YOURDOMAIN / CN= Services / CN= YOUR ORGANISATION / CN= Administrative Groups / CN= First administrative Group /&#160;der Ordner CN=Servers gelöscht werden (sofern dieser auch leer ist)&#160;Nun werden Mails den Öffentlichen Ordnern wieder zugestelltGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)/\"\n},{\n  \"id\": \"post-appv-46e28093fehler-beim-starten\",\n  \"title\": \"AppV 4.6–Fehler beim Starten\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Heute mal ein neues Thema auf ntSystems, Applikations Virtualisierung. Viele Hersteller setzen auf diese Technologie, unter anderem Microsoft mit SoftGrid bzw. AppV.Erscheint beim Starten der Applikation der Fehler: &ldquo;Auf die Angegebene Instanz von Application Virtualization Server konnte nicht zugegriffen werden&rdquo; mit einem Fehlercode wie &ldquo;xxxxxxx-xxxxxx0A-10000002&rdquo; dann wurde die Umgebungsvariable SFT_SOFTGRIDSERVER am AppV Client nicht gesetzt.Beim Erstellen der virtuellen Applikation (sequencing) wird standardm&auml;&szlig;ig diese Variable verwendet, der Client kann damit allerdings nicht viel anfangen. Also einfach auf den AppV Clients die Variable setzen und als Wert den FQDN des AppV Management Servers eintragen.Tipp: Daf&uuml;r bieten sich nat&uuml;rlich Group Policy Preferences an.Erscheint der Fehler: &ldquo;Die angegeben Anwendung ist nicht vorhanden&rdquo; mit einem Fehlercode wie dem &ldquo;xxxxxxx-xxxxxxxx-00000A09&rdquo; deutet das auf einen falschen Namen hin. Der Fehler kann auch auftreten w&auml;hrend ein Programm l&auml;uft, z.B. wenn es sich bei der Anwendung um einen Proxy des Office Deplyment Kit for AppV handelt. Beim Ausf&uuml;hren von \\\"msiexec /i offvirt.msi\\\" muss auf die richtigen Namen geachtet werden. Mehr dazu in einem separaten Post.&nbsp;Ein weiterer Fehler ist folgender:Am AppV Sequenzer wird standardm&auml;&szlig;ig das RTSPS (322) Protokoll verwendet, das muss allerdings erstmal konfiguriert werden (Zertifikat usw.). Zum Testen eignet sich auch RTSP das Port 554 verwendet. Das kann direkt beim Erstellen des Paketes ausgew&auml;hlt werden, alternativ kann man auch die .osd Datei bearbeiten und den Link anpassen.Anstelle von \\\"RTSPS://%SFT_SOFTGRIDSERVER%:322/DefaultApp.sft\\\" wird also \\\"RTSP://%SFT_SOFTGRIDSERVER%:554/DefaultApp.sft\\\" gesetzt.&nbsp;Soviel zum Thema Applikations Virtualisierung. Ich arbeite an weiteren Posts die den Vorgang des Sequencen und Verteilen von Applikationen beschreiben.stay tuned, tom\",\n  \"url\": \"https://onprem.wtf/post/appv-46e28093fehler-beim-starten/\"\n},{\n  \"id\": \"post-exchange-2010-w3wpexe-belegt-sehr-viel-ram\",\n  \"title\": \"Exchange 2010, w3wp.exe belegt sehr viel RAM\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Heute musste ich auf meinen Exchange Server 2010 feststellen, dass eine Instanz vom w3wp.exe Dienst läuft, die über 1 GB an RAM beansprucht.Um die RAM-Auslastung zu verringern müssen die Recycling Einstellungen für den entsprechenden Applikation Pool im IIS konfiguriert werden.Als erstes öffnet man den IIS Manager und wechselt zu den “Application Pools”&#160;    Um den verantwortlichen Application Pool zu finden kann jeder einzelne Pool durch Rechtsklick / Recycling zum Aufräumen gezwungen werden. Ist der verantwortliche Pool gefunden kann man die Recycling Vorgänge in den Eigenschaften automatisieren. Bsp: Alle 12 Stunden den Recycling-Vorgang starten.&#160; &#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-w3wpexe-belegt-sehr-viel-ram/\"\n},{\n  \"id\": \"post-exchange-2010e28093gal-fotos\",\n  \"title\": \"Exchange 2010–GAL Fotos\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Exchange\",\"Server\"],\n  \"content\": \"Schon in fr&uuml;heren Exchange Versionen wurden Drittherstellertools eingesetzt um ein Foto in der Globalen Adressliste zu ver&ouml;ffentlichen und in diversen Clients anzuzeigen.Exchange 2010 und Outlook 2010 k&ouml;nnen das mit Bordmitteln, das Bild wird dabei in der Active Directory gespeichert.&nbsp;&nbsp; Foto in Active Directory ladenDas Foto wird &uuml;ber die Exchange Management Shell importiert und zwar mit folgendem cmdlet.Import-RecipientDataProperty -Identity user.name -Picture -FileData ([Byte[]]$(Get-Content -Path \\\"C:\\\\path\\\\to\\\\picture.jpg\\\" -Encoding Byte -ReadCount 0))Dieses cmdlet enkodiert das Bild und speichert die Daten im Active Directory Attribute &ldquo;thumbnailPhoto&rdquo;. Wenn man sich dieses Attribut jetzt ansieht (AC Users and Computers, ADSI Edit) dann sieht man die &ldquo;Rohdaten&rdquo;.Achtung: Das Attribut &ldquo;thumbnailPhoto&rdquo; kann eine maximale Gr&ouml;&szlig;e von 10k haben, das Bild sollte 96x96 Pixel messen um in Outlook optimal dargestellt zu werden.Durch die Gr&ouml;&szlig;enbeschr&auml;nkung von 10k wird ein &ldquo;&uuml;berf&uuml;llen&rdquo; der Active Direcotry verhindert, man sollte allerdings die Zunahme des Replikationstraffic bedenken wenn man GAL Fotos einf&uuml;hrt, diese Zunahme ist tempor&auml;r schlie&szlig;lich &auml;ndert man das Foto nicht t&auml;glich.Damit ist das Foto zwar im Active Directory hinterlegt, allerdings ist in Outlook noch nichts davon zu sehen.Schema &Auml;nderungDaf&uuml;r muss man eine kleine Schema&auml;nderung durchf&uuml;hren, und zwar muss das Attribut &ldquo;thumbnailPhoto&rdquo; an den Globalen Catalog Server repliziert werden.Daf&uuml;r &ouml;ffnet man das Active Directory Schema Snap-In in einer MMC und navigiert zum Attribut, in den Eigenschaften wird die Checkbox bei &ldquo;Replicate this Attribute to the Global Catalog&rdquo; gesetzt.Die schmmgmt.dll muss Registriert werden damit das Schema Snap-In zur Verf&uuml;gung steht In einer Administrativen CMD: &ldquo;regsvr32 schmmgmt.dll&rdquo; MMC &ouml;ffnen (Start, Ausf&uuml;hren, mmc) File, Add/Remove Snap-in&hellip;, Active Directory Schema Unter &ldquo;Attributes&rdquo; rechtsklick auf &ldquo;thumbnailPhoto&rdquo; und die oben genannte Checkbox setzenOffline Address Book aktualisierenJetzt muss nur noch das Offline Adressbuch aktualisiert werden um das Ergebnis gleich zu sehen, alternativ kann man auch warten bis das automatisch geschieht (default: 5 Uhr). Das OAB kann einfach &uuml;ber folgendes cmdlet aktualisiert werden:&nbsp;Get-OfflineAddressBook | Update-OfflineAddressBookOutlook l&auml;dt aktualisiert das Offlineadressbuch nur einmal in 24h also muss auch dort noch ein Download durchgef&uuml;hrt werden, dann ist das Foto schlie&szlig;lich sichtbar.Hinweis: Das Offline Adressbuch wird durch die Fotos nicht gr&ouml;&szlig;er, es wird nur ein Pointer auf das Foto im OAB gespeichert, nicht das Foto selbst. Das hei&szlig;t allerdings auch dass ein Offline Client das Foto nicht sieht.tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010e28093gal-fotos/\"\n},{\n  \"id\": \"post-sharepoint-foundation-2010\",\n  \"title\": \"Sharepoint Foundation 2010, Fehler Web.config, requestFiltering\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wer im Eventlog des Sharepoint-Foundation-Servers auf folgende Fehlermeldung st&ouml;&szlig;t:TEXT:Protokollname: Application Quelle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft-SharePoint Products-SharePoint Foundation Datum:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20.07.2010 00:00:01 Ereignis-ID:&nbsp;&nbsp; 2137 Aufgabenkategorie:Integrit&auml;t Ebene:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fehler Schl&uuml;sselw&ouml;rter: Benutzer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NETZWERKDIENST Computer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miami.**** Beschreibung: SharePoint-Integrit&auml;tsanalyse: Fehler. Die Datei 'Web.config' weist falsche Einstellungen f&uuml;r das Element 'requestFiltering' auf. F&uuml;r das requestFiltering-Element in der Datei 'web.config' muss das Attribut 'allowDoubleEncoding ' auf 'true' festgelegt sein, damit Dateinamen, die das Zeichen + enthalten, unterst&uuml;tzt werden. Au&szlig;erdem muss es &uuml;ber ein untergeordnetes Element 'requestLimits' verf&uuml;gen, dessen Attribute 'maxAllowedContentLength' auf '2147483647' festgelegt ist, um Konflikte mit Dateiuploads zu vermeiden. Stellen Sie sicher, dass das Element 'requestFiltering' in der Datei 'web.config' vorhanden ist, dass das Attribut 'allowDoubleEncoding' auf 'true' festgelegt ist, dass ein untergeordnetes Element 'requestLimits' vorhanden ist und dass der Wert 'maxAllowedContentLength' auf '2147483647' festgelegt ist. Weitere Informationen zu dieser Regel finden Sie unter http://go.microsoft.com/fwlink/?LinkID=163442.dem wird dieser Fix helfen:IIS Manager &ouml;ffnen Zur Sharepoint webseite wechseln Den Konfigurationseditor &ouml;ffnen Abschnitt &ldquo;requestFiltering&rdquo; w&auml;hlen Zu &ldquo;requestLimits&rdquo; wechseln und den Wert maxAllowedContentLenght in 2147483647 &auml;ndern, danach Konfiguration &uuml;bernehmen Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-2010/\"\n},{\n  \"id\": \"post-upgrade-exchange-2k3-2010\",\n  \"title\": \"Upgrade Exchange 2k3 - 2010\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"&#160;In diesem Post werde ich das Upgrade von Exchange 2k3 zu 2010 beschreiben und einige bekannte Fehler und deren Lösung aufzeigen.&#160;Upgrade&#160;Um einen groben Überblick zu bekommen ob die Infrastruktur Exchange 2010 tauglich ist, empfehle ich den “Microsoft Exchange Pre-Deployment Ananlyzer” auszuführen. Dieses Tool führt einige Checks an der Struktur aus.&#160;   Exchange Organisation in native mode setzen &#160;Sofern das nicht schon passiert ist, muss die Organisation im nativen Modus geschalten werden.&#160; &#160;   Active Directory Schema upgrade &#160;Jetzt muss das Schema geupdatet werden. Dazu startet man vom Schema Master folgende Setup Kommandos von der Exchange CD aus:&#160;Setup /PrepareLegacyExchangePermissionsSetup /PrepareSchemaSetup /PrepareAD [/OrganizationName:YOUR_DOMAIN]Setup /PrepareDomain&#160;   Link state suppression deaktivieren &#160;In Exchange Server 2003 wurde für einen Server, der keine Connectoren besitzt ein anderer Pfad für den Versand gesucht. Diese Option wird ab Exchange 2007 nicht mehr unterstützt. Um die Koexistenz zu gewährleisten muss dieses Feature auf allen Exchange 2003 Server deaktiviert werden&#160;   Open Registry Editor.    Locate HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Services\\\\RESvc\\\\Parameters.    Right-click Parameters and select New | DWORD value. Name the new DWORD value SuppressStateChanges.    Double-click SuppressStateChanges.    In the Value data field, enter 1.    Close Registry Editor, and then restart the SMTP service, the Microsoft Exchange Routing Engine service, and the Microsoft Exchange MTA Stacks services for the change to take effect. &#160;   Exchange 2010 System Requirements &#160;Mit folgendem Kommando werden die nötigen Requirements auf dem Exchange Server installiert&#160;Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy –Restart&#160;Zudem beim Dienst NetTCPPortSharing den Starttyp auf Automatisch setzen:&#160;Set-Service NetTcpPortSharing -StartupType Automatic&#160;&#160;Installation Client Access Rolle&#160;Als erstes wird die Rolle “Client Access” installiert&#160; &#160; &#160;Wenn der Server z.B. über OWA erreicht werden soll muss noch die externe Adresse angegeben werden (Bsp: mail.contoso.com)&#160; &#160;Zertifikate installieren&#160;Der nächste Schritt besteht darin die Zertifikate einzufügen und zu registrieren. Über den Exchange Zertifikatwizzard kann ein neues Exchange Zertifikat erstellt werden:&#160; &#160;Jetzt müssen noch alle erforderlichen Optionen angegeben werden bevor die Anforderung erstellt werden kann:&#160; &#160;Die Anforderung kann jetzt gespeichert werden. Diese muss dann über die Zertifizierungsstelle eingereicht werden und man erhält sein Zertifikat. Nachdem das Zertifikat ausgestellt wurde kann es über die Console der Anfrage hinzugefügt werden. Jetzt muss man dem Zertifikat noch die entsprechenden Dienste zuweisen:&#160; &#160;Installation Hub Transport Rolle&#160;Jetzt wird die Rolle “Hub Transport” installiert.&#160; &#160;Das Setup Programm weist darauf hin, dass es einen Connector benötigt um Mails von / zu den Exchange 2003 Servers zu senden. Es muss der Server ausgewählt werden, der zur gleichen Routinggruppe wie der Exchange Server 2010 zählt sofern mehrere 2003 Server in unterschiedlichen Standorten vorhanden sind.&#160;Wenn das Microsoft Filter Pack nicht installiert wurde wird man darauf hingewiesen es nach zu installieren:&#160; &#160;Damit Active Sync in einer Exchange 2003 / 2010 Umgebung weiterhin funktioniert, muss die Authentifizierung für die Virtual Directory auf integrierte Windows Authentifizierung geändert werden.Zuerst muss der Hotfix KB937031 auf den Exchange 2003 Servern installiert werden um die entsprechende Einstellung setzen zu können.Nachdem der Hotfix auf dem Exchange Server 2003 installiert wurde, lassen sich die Einstellungen für das ActiveSync virtuelle Verzeichnis ändern. Die Authentifizierung kann jetzt auf &quot;Integrierte Windows-Authentifizierung&quot; geändert werden&#160; &#160;Installation Mailbox Rolle&#160;Jetzt wird die Mailbox Rolle installiert.&#160; &#160;Jetzt verfügt man über ein vollwertige Exchange 2010 Installation. Für den Betrieb des Servers müssen noch einige Einstellungen vorgenommen werden.&#160;Offline Adressbuch&#160;Das offline Adressbuch muss auf den Exchange 2010 verschoben werden. Dies kann über die Console unter den Organisationseinstellungen gemacht werden. Zudem muss die Einstellung für den Webverteilung aktiviert werden. (Ab Outlook 2007 wird das Adressbuch über die Webservices geladen)&#160; &#160;Send Connector erstellen&#160;Es wird ein neuer Send Connector erstellt, der für Exchange 2010 fungiert. Danach wird der alte Exchange 2003 Connector gelöscht.&#160; &#160;Receive Connector konfigurieren&#160;Damit der Exchange Server Mails annimmt, muss ein neuer Connector erstellt werden, der für den anonymen Zugriff freigeschalten wird.&#160; &#160;Kompatibilität Outlook 2003&#160;Outlook 2010, 2007 verwenden Standardmäßig die PRC Verschlüsselung, 2003 nicht. Bei Exchange Server 2010 werden per default nur verschlüsselte RPC Verbindungen angenommen. Dies kann jedoch mit folgendem Befehl über die Shell abgeschaltet werden:&#160;Set-RPCClientAccess – Server –YOURSERVER –EncryptionRequired $false&#160;&#160; Öffentliche Ordner, Free / Busy Informationen synchronisieren&#160;Um die Öffentlichen Ordner auf Exchange 2010 zu verschieben müssen diese repliziert werden. Diese Einstellungen werden auf dem Exchange 2003 vorgenommen. Hierzu wird der Exchange Server 2010 als Replikationspartner den Ordnern “Offline Address Book” und “Schedule + Free Busy” hinzugefügt.&#160; &#160;Nachdem die Informationen repliziert wurden kann das Replikat von den Exchange 2003 Servern entfernt werden.&#160;Adresslisten konvertieren&#160;Um die Exchange 2003 Adresslisten in Exchange 2010 bearbeiten zu können müssen diese erst konvertiert werden (Exchange 2003 benutzte LDAP Filter). Dies wird über die Shell gemacht. &#160;Die Adresslisten können mit den folgenden Kommandos geupdatet werden:&#160;Bsp: Adressliste Verwaltung die auf die Abteilung gefiltert wird&#160;Set-AddressList &quot;Verwaltung&quot; -IncludedRecpients MailboxUsersSet-AddressList &quot;Verwaltung&quot; -ConditionalDepartment Verwaltung&#160;Addresspolicy updaten&#160;Auch die Addresspolicy muss geupdatet werden, sonst erhält man folgende Meldung:&#160; &#160;Das Update kann über folgenden Befehl gemacht werden:&#160;Set-EmailAddressPolicy “Default Policy” –IncludedRecipients AllRecipients&#160;&#160;Die Exchange Installation ist nun komplett und man kann beginnen die Mailboxen zu verschieben.     Wichtig: Nach der Installation sollte der Exchange BPA ausgeführt werden um sämtliche Einstellungen und Funktionen zu verifizieren.&#160;Fehler&#160;Während dem Upgrade bin ich auf mehrere Fehler gestoßen die ich hier kurz samt Lösung erläutere:&#160;Fehler 1&#160;Log Name: ApplicationSource: MSExchange MailTipsDate: 12.07.2010 15:40:53Event ID: 14003Task Category: MailTipsLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Unable to create Group Metrics distribution share.Share: GroupMetricsDirectory: C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\GroupMetricsMessage: 00000842&#160;Um diese Fehlermeldung zu beheben habe ich den Starttyp des Dienstes “Microsoft Echange Service Host” auf Automatic (Delayed Start) gesetzt&#160;Fehler 2&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:07:45Event ID: 9323Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Entry 'Benutzer1' has invalid or expired e-mail certificates. These certificates will not be included in the offline address list for '\\\\oGAL'. - \\\\Offline-EX2k10 &#160;Das bedeutet, dass Benutzer1 Fehlerhafte Zertifikate in AD besitzt. Diese müssen gelöscht werden (vorher in AD die erweiterten Eigenschaften einblenden).&#160; &#160;Fehler 3&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:14:01Event ID: 9359Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:OALGen truncated or dropped properties for entry 'Discovery Search Mailbox' in address list '\\\\oGAL’ because they exceeded the configured size limits for the version 4 offline address list. The affected MAPI ids are: 8cd8. - \\\\Offline-EX2k10 &#160;Dieser Fehler kann ignoriert werden, er ist ab Design so.&#160;Fehler 4&#160;Log Name: ApplicationSource: MSExchange ActiveSyncDate: 15.07.2010 09:50:07Event ID: 1053Task Category: ConfigurationLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Exchange ActiveSync doesn't have sufficient permissions to create the &quot;CN=Daniel Nitz,OU=***,OU=****,DC=***,DC=local&quot; container under Active Directory user &quot;Active Directory operation failed on **********. This error is not retriable. Additional information: Access is denied.Active directory response: 00000005: SecErr: DSID-03151E04, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0&quot;.Make sure the user has inherited permission granted to domain\\\\Exchange Servers to allow List, Create child, Delete child of object type &quot;msExchangeActiveSyncDevices&quot; and doesn't have any deny permissions that block such operations.&#160;&#160;Hier gibt es ein Rechte-Problem. Bei den User wurde wahrscheinlich in AD die Vererbung deaktiviert.&#160;Fehler 5&#160;Fehler beim Download des Offline Adressbuches:&#160; &#160;Dieser Fehler kann behoben werden, indem im IIS des Exchange Servers im virtual Directory “OAB” die Einstellung gesetzt wird, dass nicht mehr SSL erzwunden werden muss.&#160; &#160;Viel Spaß bei der Migration zu Exchange Server 2010!&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/upgrade-exchange-2k3-2010/\"\n},{\n  \"id\": \"post-forefront-tmg-2010e28093rsa-authentication-manager-71\",\n  \"title\": \"Forefront TMG 2010–RSA Authentication Manager 7.1\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"&nbsp;Wer das Vergn&uuml;gen hat die beiden genannten Systeme zum kommunizieren zu bewegen wird sich &uuml;ber die &uuml;ppige Dokumentation freuen die es zu den Vorg&auml;ngerprodukten gibt&hellip; die&nbsp;hilft so gut wie gar nicht weiter.&nbsp;Ich gehe davon aus das RSA Authentication Manager 7.1 Sp3 bereits installiert wurde, ein Realm bzw. Security Domain eingerichtet wurde. Man meldet sich also an der RSA Security Console an und erstellt einen neuen &ldquo;Authentication Agent&rdquo;. Dazu klickt man auf Access, Authentication Agents, Add New.&nbsp;&nbsp;Jetzt m&uuml;ssen die Felder ausgef&uuml;llt werden, also der Hostname des TMG Servers (Array), die IP Adressen die dazu geh&ouml;ren (nat&uuml;rlich nur die vom betreffenden Netzwerk). Bei Agent Type habe ich Standard Agent verwendet und das funktioniert, habe leider keine Dokumentation gefunden aus der hervorgeht welchen Typ man verwenden sollte. Bei &ldquo;Agent may be Accessed by&rdquo; kann konfiguriert werden ob sich alle (aktiven) Benutzer &uuml;ber den Authentication Agent anmeldn k&ouml;nnen oder nur Mitglieder bestimmter Gruppen.Anschli&szlig;end muss man nur noch auf Save klicken und der Authentication Agent ist erstellt.&nbsp;Jetzt braucht man eine Konfigurationsdatei f&uuml;r TMG Server. Also wieder auf Access, Authentication Agents klicken und dieses mal &ldquo;Genereate Configuration File&rdquo; w&auml;hlen.&nbsp;&nbsp;Wenn man dann auf &ldquo;Generate Config File&rdquo; klickt, erh&auml;lt man eine Zip Datei die eine Datei sdconf.rec beinhaltet. Diese Datei muss auf allen TMG Array Mitgliedern in folgende Pfade kopiert werden.%windir%\\\\system32%programfiles%\\\\Microsoft Forefront Threat Management Gateway\\\\sdconfig&nbsp;Achtung: Die Datei muss unbedingt an beiden Orten vorhanden sein, sonst kommt es zu Fehlern wie: &ldquo;106: The Web Server is busy. Try again later.&rdquo;&nbsp;Die RSA betreffende Konfiguration ist damit eigentlich schon abgeschlossen. Also sehen wir uns die Ver&ouml;ffentlichung am TMG an.&nbsp;Es wird einfach eine normale Web Ver&ouml;ffentlichung konfiguriert, beim erstellen des Web Listeners ist auf folgendes Acht zu geben:&nbsp;&nbsp;Die Authentifizierung erfolgt &uuml;ber ein HTML Formular, wenn hier noch &ldquo;Collect addinoal delegation in the form&rdquo; ausgew&auml;hlt wird kann der Benutzer zus&auml;tzlich zum Username und RSA Passcode noch sein Active Directory Kennwort eingeben und TMG leitet es an den Web Server weiter. Daf&uuml;r muss dann bei der Ver&ouml;ffentlichungsregel die Authentication Delegation auf Basic gesetzt werden und der Web Server dahinter muss nat&uuml;rlich Basic Authentication akzeptieren.&nbsp;&nbsp;Das Integrierte HTML Formular von TMG sieht dann je nach Einstellung so aus. Will man OWA ver&ouml;ffentlichen kann man verwendet man nat&uuml;rlich besser den Assistant &ldquo;Publish Exchange Web Client Access&rdquo;. Achtung: Auf den Client Access Servern muss Basic Authentication aktiviert werden (Server Configuration, Client Access, owa).&nbsp;&nbsp;Achtung: Mutlihomed TMGForefront TMG wird in den allermeisten Konfigurationen mit mehreren Netzwerkkarten installiert, ist ja schlie&szlig;lich eine Firewall. Dadurch wei&szlig; TMG (genauer gesagt ACEClient) nicht &uuml;ber welche Netzwerkkarte er den RSA Server erreichen kann, man sieht im Event Log die Warnung: &ldquo;Multihomed host detected; Primary IP assumed is : x.x.x.x&rdquo;. Die Event ID ist 1012 die Source ACECLIENT.Das kann man beheben indem man zu Schl&uuml;ssel HKLM\\\\Software\\\\SDTI einen Schl&uuml;ssel ACIClient hinzuf&uuml;gt. Dieser bekommt dann einen String Value mit dem Namen &ldquo;PrimaryInterfaceIP&rdquo;. Der Wert entspricht der IP Adresse, des TMG, &uuml;ber die der RSA Server erreicht werden kann.&nbsp;&nbsp;Viele Gr&uuml;&szlig;etom\",\n  \"url\": \"https://onprem.wtf/post/forefront-tmg-2010e28093rsa-authentication-manager-71/\"\n},{\n  \"id\": \"post-apple-ipad\",\n  \"title\": \"Apple IPad\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Gerade eben hatte ich zum ersten Mal das Vergn&uuml;gen ein IPad zu testen. Es waren zwar nur wenige Minuten aber einen ersten Eindruck habe ich von dem Ding:Die Verarbeitung scheint sehr gut, das Ger&auml;t f&uuml;hlt sich hochwertig an. Mit 730 Gramm ist das 3G Modell allerdings ziemlich schwer.Das Display ist sehr scharf, wie es in der Sonne ist kann ich nicht sagen, im Raum ist es jedoch ausreichend hell und klar. Wird das IPad auf die Seite gedreht, dreht sich das Bild mit, sowas kennt man ja schon.Die Bedienung finde ich innovativ, ist ja auch von Apple ;) Der EBook Reader ist einfach zu bedienen, sonstige Features wie IPod und Web Browser sind nat&uuml;rlich super und bereiten dem Benutzer viel spa&szlig;. Sogar Filme kann man mit dem Ding anschauen.F&uuml;r mich w&auml;re das Ger&auml;t dennoch nichts, ich habe keinen wirklichen Verwendungszweck und nur zum Rumspielen ist Preis (in dem Fall 702&euro;) einfach zu hoch.Das Beste zum Schluss: als ich den Browser &ouml;ffnete kam als Startseite&hellip; na was schon&hellip; Bing zum Vorschein! Da konnte ich mir ein Grinsen nicht verkneifen.so long, tom\",\n  \"url\": \"https://onprem.wtf/post/apple-ipad/\"\n},{\n  \"id\": \"post-exchange-2010-entourage-web-services-edition-ews-attachement-size\",\n  \"title\": \"Exchange 2010 Entourage Web Services Edition- EWS Attachement Size\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"&nbsp;Auch MAC Clients k&ouml;nnen mit Exchange 2010 arbeiten. Daf&uuml;r gibt es entweder den Microsoft Entourage Client oder den integrierten MAC Mail Client. Entourage muss in der Web Services Edition verwendet werden, da Exchange 2010 kein WebDAV mehr unterst&uuml;tzt, die aktuelle Version von MAC Mail (Snow Leopard) macht das von Haus aus.&nbsp;Will man allerdings einen Anhang gr&ouml;&szlig;er als ca. 12MB verschicken meckert sowohl Entourage als auch MAC Mail. Entourage bringt folgende Fehlermeldung: &ldquo;HTTP-Fehler: Die Anforderung kann vom Server nicht verarbeitet werden&rdquo;.&nbsp;&nbsp;Man kontrolliert also erstmal die Gr&ouml;&szlig;enbeschr&auml;nkungen der betreffenden Mailbox, die der Send und Receive Connectoren und in der Transport Konfiguration, am schnellsten geht das wohl in der Management Shell mit folgenden cmdlets:get-TransportConfig | fl maxSendSize get-SendConnector | fl name, maxMessageSize get-ReceiveConnector | fl name, maxMessageSize get-Mailbox name | fl maxSendSize&nbsp;Sind die Werte an diesen Stellen ok, dann kann der User mit dem Microsoft Office Outlook Client den Anhang ohne Probleme senden, nur mit Entourage bzw. Mac Mail tritt das Problem auf.&nbsp;Das Problem liegt am Exchange Web Service, das ist eine ASP.NET Applikation und verwendet daher Konfigurationsdateien aus der IIS Konfiguration. Diese k&ouml;nnen in weder in der EMS noch in EMC gesehen bzw. ge&auml;ndert werden.&nbsp;Nun gibt es leider keine ausreichende Dokumentation von Microsoft, also versuche ich hier alles, was in den tiefen des Internet herumschwirrt, zusammenzufassen.&nbsp;BackupAchtung: Vor der Bearbeitung von Konfigurationsdateien unbedingt ein Backup der Datei erstellen!!&nbsp;EWS Treten die Probleme nur im Zusammenhang mit EWS auf reicht folgende &Auml;nderung der Konfiguration am Client Access Server (bzw. an alles CAS wenn mehrere im Einsatz sind):&nbsp;In der Datei %windir%\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\ClientAccess\\\\exchweb\\\\ews\\\\web.config muss der Wert von &ldquo;maxReceivedMessageSize&rdquo; unter &lt;EWSMessageEncoderSoap11Element /&gt; ge&auml;ndert werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;EWSMessageEncoderSoap11Element /&gt; &lt;httpsTransport maxReceivedMessageSize=\\\"52428800\\\" &hellip;.&gt; &nbsp;Mit appcmd.exe muss noch der Wert von maxAllowedContentLength angepasst werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt appcmd set config \\\"Default Web Site/ews\\\" -section:requestFiltering /requestLimits.maxAllowedContentLength:52428800 &nbsp;In manchen Foren bzw. anderen Blogs findet man immer wieder den Parameter &ldquo;maxRequestLength&rdquo; der auch in der web.config Datei vom EWS angepasst werden soll. Allerdings hat dieser Parameter per Default schon den gr&ouml;&szlig;tm&ouml;glichen Wert eingestellt, ich rate also davon ab diesen Parameter zu ver&auml;ndern.&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;OWADieses Problem gibt es auch in Outlook Web App, man kann standardm&auml;&szlig;ig keine Anh&auml;nge &uuml;ber 30MB hochladen. Auch hier ist wieder eine Einstellung in der web.config schuld. OWA ist eine ASP.NET Anwendung und die maximale Gr&ouml;&szlig;e der zu &uuml;bertragenden Daten wird mit dem Parameter maxRequestLength konfiguriert.Hier wird also diese Einstellung interessant, in der web.config von OWA ist diese n&auml;mlich per Default auf 30000 gesetzt.&nbsp;In der Datei %windir%\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\ClientAccess\\\\Owa\\\\web.config muss der Wert von maxRequestLength ge&auml;ndert werden, ACHTUNG: Angabe in KiloByte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;httpRuntime maxRequestLength=\\\"51200\\\" /&gt;&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;F&uuml;r dieses Problem gibt es sogar einen Artikel im TechNet: Configure Maximum Message Size in Outlook Web App&nbsp;&nbsp;Tipp: Man kann mit der PowerShell ganz einfach Werte in Byte und wieder Retour konvertieren. Einfach mal 50mb eintippen und versuchen.&nbsp;&nbsp;Naja, ich hoffe ich kann damit einigen weiterhelfen.&nbsp;Gr&uuml;&szlig;etom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-entourage-web-services-edition-ews-attachement-size/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-backup\",\n  \"title\": \"Exchange 2010 – Backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Dies ist der erste Teil einer Exchange Backup und Restore Serie.    Der zweite Teil folgt in kürze.Datensicherung ist in Exchange 2010 ein umfangreiches Thema. Für die Widerherstellung von einzelnen Elementen (Mails, Kontakte…) bietet sich z.B. der Dumpster an, dazu aber ein anderes Mal mehr. In diesem Beitrag möchte ich Datensicherung im klassischen Sinn behandeln, also Backup von Servern und Datenbanken.Backup SoftwareExchange 2010 verwendet den Windows eigenen VSS Dienst, kann also nur mit einer Backup Applikation gesichert werden die diesen Service unterstützt. Für Tests eignet sich natürlich Windows Backup von Server 2008R2, will man das Ganze in einer größeren Umgebung betreiben empfiehlt sich der Data Protection Manager.System State BackupJeder Server sollte regelmäßig gesichert werden, dazu gehört ein Backup des System Volumes und des System State. System State Backups enthalten die Registry sowie die Boot Dateien und COM+ Class Registration Datenbank. Je nach installierter Serverrolle (ADDS, IIS…) werden weitere Informationen gesichert.Mit einem System State Backup kann der Zustand des Servers (und der installierten Rollen/Applikationen) zum Zeitpunkt des Backups widerhergestellt werden.Single Server BackupWenn alle Rollen auf einem Server installiert sind müssen der System State sowie die Volumes mit den Datenbanken und Logdateien gesichert werden.Backup von Client Access ServernAuf CA Servern befinden sich keine Daten die speziell gesichert werden müssen, diese Serverrolle sollte ohnehin ausfallsicher designed werden, da der Clientzugriff im Fehlerfall sonst nicht mehr möglich ist. Die Konfiguration kann aus dem System State Backup widerhergestellt werden.Allerdings sollte man nicht vergessen das IIS Log Verzeichnis (C:\\\\inetpub\\\\logs\\\\LogFiles\\\\W3SVC1) zu überwachen bzw. alte Logs kontinuierlich zu löschen.Backup von Hub Transport ServernEs sind keine Daten auf Hub Transport Servern vorhanden ohne die eine Exchange Umgebung nicht widerhergestellt werden könnte, allerdings ist es für spätere Analyse Sinnvoll die Message Tracking Logs sowie die Protocol Logs zu sichern. Diese befinden sich im Exchange Installationsordner unter \\\\Transportroles\\\\Logs und können einfach auf File-Ebene gesichert werden.Die Konfiguration des Transport Servers wird im Active Directory gespeichert, auch diese Serverrolle sollte ausfallsicher designed werden.Backup von Edge Transport ServernEdge Transport Server speicher die Konfiguration im Active Directory, im Fehlerfall kann man einfach den Server neu aufsetzen und die EdgeSync neu einrichten. Alternativ kann man mit Cloned Configuration arbeiten, also die Konfiguration exportieren und auf dem neuen Server wieder importieren, dazu mehr in einem anderen Beitrag. Die Logs die auf Hub Transport Servern gesichert werden sollten befinden sich bei Edge Transport Servern an der selben Stelle und sollten aus dem selben Grund gesichert werden.Backup von Unified Messaging ServernDie für die Konfiguration relevanten Informationen werden in der Active Directory gespeichert, einzig die Audio Prompts können auf File- Ebene gesichert werden, diese befinden sich im Exchange Installationsordner unter \\\\UnifiedMessaging\\\\Prompts.Backup von Mailbox ServernAuf den Servern auf denen die Mailbox Rolle installiert ist befinden sich die Datenbank und Transaction Log Files, diese müssen auf jeden Fall gesichert werden. Wird eine Sicherung mit Windows Backup durchgeführt muss jeweils das gesamte Volume auf dem die Datenbank bzw. Log Files liegen ausgewählt werden. Von diesen Volumes muss ein “Full VSS&quot; Backup gemacht werden, nur so merkt Exchange dass die Daten gesichert wurden und löscht die entsprechenden Log Files.Backup der Active DirectoryExchange Server speichert viele Daten und Einstellungen in der Active Directory und ist extrem Abhängig von einer funktionstüchtigen Umgebung. Daher sollten natürlich auch Domain Controller regelmäßig gesichert werden. Hierfür reicht ein System State Backup aus, dieses enthält alle Daten/Einstellungen der AD.Backups und DAGSind die Exchange Server die gesichert werden sollen Mitglieder einer Database Availability Group (DAG) ändern sich die Gründe für eine Datensicherung. Da es bis zu 16 Kopien einer Mailbox innerhalb der DAG geben kann, ist das Backup nicht mehr der einzige Ausweg wenn die aktive Kopie der Datenbank offline geht. Fällt ein Mitglied einer DAG aus, werden die Datenbanken die auf diesem Server aktiv waren vom Server mit der nächst-höheren Priorität übernommen (natürlich muss es eine Kopie der Datenbank dort geben). So ist man bei einem Ausfall eines Mailboxservers gut gerüstet, allerdings kann es auch zu einem Datenbankfehler kommen, dafür gibt es aber folgende alternative zum Backup.Datenbank Kopien werden standardmäßig aktuell gehalten, d.h. eine Änderung wird sofort an alle Mitglieder der DAG repliziert. Man kann allerdings eine Verzögerung (ReplayLagTime) konfigurieren und so z.B. auf einem Server ältere Versionen der Datenbanken halten. Tritt nun ein Datenbankfehler auf, kann die ältere Datenbank verwendet werden ohne umständliches Restore von Tape oder woher auch immer.Ein weiterer Effekt des Backups ist das löschen der Log Files, sollte man also auf regelmäßige Backups verzichten muss man wohl oder übel Circular Logging für die Datenbanken aktivieren um ein überlaufen der Festplatten zu verhindern.Diese neue Möglichkeit der Hochverfügbarkeit bringt sicher viele Vorteile, jedoch sollte man meiner Meinung nach nicht auf ein Backup verzichten. Ich empfehle regelmäßige System State Backups von allen Servern. Die Datenbanken würde ich auf jeden Fall auch sichern und das Backup und Restore Szenario ausreichend testen und dokumentieren!Soweit mal zum Thema Backup, viele Grüße   tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-backup/\"\n},{\n  \"id\": \"post-migration-sharepoint-services-v3-zu-sharepoint-foundation-2010\",\n  \"title\": \"Migration Sharepoint Services v3 zu Sharepoint Foundation 2010\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Heute habe ich die Migration von den Sharepoint Services 3 auf die Version 2010 Foundation abgeschlossen. Während der Umstellung bin ich auf mehrere Probleme gestoßen, die ich mit diesem Post im einzelnen aufzeigen werden. Vielleicht erspart das dem ein oder anderen von euch Zeit nach einer Lösung zu suchen.Problem 1 – Fehler 7043 (Sharepoint Foundation) im EventLog Anwendung Lösung: Im Ordner C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Web Server Extensions\\\\14\\\\TEMPLATE\\\\CONTROLTEMPLATES befindet sich die Datei SearchArea.ascx. Diese Datei wird in der Version 2010 nicht benötigt und kann umbenannt werden (Bsp: SearchArea.ascx.old)Problem 2 – Fehler 7009 und 7000 (Service Control Manager) im EventLog System  Lösung: Es kann passieren, dass der Dienst “Claim to Windows Token Service” beim Systemstart nicht starten kann. Sobald der Start-Typ von “Automatisch” auf “Automatisch (Verzögerter Start)” gesetzt wird, startet der Dienst normal, jedoch ein wenig später als die anderen Dienste.&#160;Problem 3 – Fehler 6398 und 5586 (Sharepoint Foundation) im EventLog Anwendung  Lösung: Sharepoint Zentraladministration öffnen und zum Punkt Sicherheit wechseln. Im Menüpunkt Dienstkonten konfigurieren den richtigen Webanwendungspool auswählen und das entsprechende Konto angeben. Mit OK bestätigen sodass das Konto nochmal registriert wird.&#160;Problem 4: Backup der Sharepoint FarmWenn ihr Versucht ein Backup der Sharepoint Farm zu erstellen, bekommt ihr den Hinweis, dass der Verwaltungsdienst angehalten wurde. ACHTUNG: Es geht auch noch schlimmer: Wenn ihr wie ich eure Sharepoint Farm über das Befehlszeilentool stsadm.exe sichert, sind die Menüelemente auf der Sharepoint Webseite während und nach der Sicherung gesperrt. Wenn ihr die Berechtigungen prüft werdet ihr sehen, dass ihr nicht mehr über ausreichend Berechtigungen verfügt um irgendwas an der Webseite zu ändern bzw. hochzuladen zu löschen usw. Auch könnt ihr die Eigenschaften der Webseite nicht mehr öffnen oder bearbeiten.Lösung: Das Problem lässt sich durch einen ganz einfachen Handgriff beheben. Nach der Installation ist der Dienst “Sharepoint 2010 Administration” auf Start-Typ Manuell gesetzt und somit nicht aktiv. Ändert das Startverhalten des Dienstes auf Automatisch und ihr könnt wieder normal Backups ziehen und die Steuerelemente aktivieren sich nach der Sicherung wieder.Viel Spaß beim Upgrade auf Foundation 2010, Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/migration-sharepoint-services-v3-zu-sharepoint-foundation-2010/\"\n},{\n  \"id\": \"post-sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen\",\n  \"title\": \"Sharepoint Foundation 2010 Dateien lassen sich nicht öffnen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Nach einer Standardinstallation von Sharepoint Foundation 2010 lassen sich gewisse Dateien (z.B. PDF) nur downloaden, nicht aber direkt aus der Bibliothek abrufen.&#160;Das ist ein neues Sicherheitsfeature, welches den Browser zwingt die Datei nur zum Download anzubieten. Das Sicherheitsfeature kann in der Sharepoint Zentraladministration deaktiviert werden.Anwendungsverwaltung / Webanwendungen verwalten die entsprechende Webanwendungs auswählen, unter Allgemeine Einstellungen kann nun die Option “Dateiverarbeitung durch den Browser” auf Berechtigt gesetzt werden.  Nun können die Dateien wieder direkt aus der Bibliothek geöffnet werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen/\"\n},{\n  \"id\": \"post-distributedcom-fehler-10016-fehlende-berechtigungen\",\n  \"title\": \"DistributedCOM Fehler 10016, fehlende Berechtigungen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2008-R2\"],\n  \"content\": \"Wenn auf euren Server DistributedCOM Fehler mit der ID 10016 vorkommen, so bedeutet das meist, dass erforderliche Berechtigungen fehlen.Beispiel: Der Benutzer NETZWERKDIENST hat keine Berechtigung die Komponente mit der ID 000C101C-0000-0000-C000-000000000046 zu aktivieren In diesem Fall muss dem Benutzer NETZWERKDIENST lediglich das Benutzerrecht gegeben werden um die jeweilige Komponente zu starten. Als erstes wird die Komponente über das Tool Komponentendienste gesucht. Wenn ihr die Einstellungen der Komponente nicht ändern könnt, habt ihr selbst nicht die notwendigen Berechtigungen.  Die könnt ihr euch aber selber zuweisen indem ihr in der Registry unter HKEY_CLASSES_ROOT\\\\AppID den Schlüssel mit der ID sucht und in den Berechtigungen der Gruppe Administratoren oder euch selbst den Besitz übertragt und das Recht Vollzugriff gebt. Danach lassen sich die Einstellungen der Komponente ändern und ihr könnt den jeweiligen Benutzer die erforderlichen Rechte geben.&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/distributedcom-fehler-10016-fehlende-berechtigungen/\"\n},{\n  \"id\": \"post-windows-virtual-pc-interner-dhcp-server\",\n  \"title\": \"Windows Virtual PC / interner DHCP Server\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Wenn man mit Windows Virtual PC eine DHCP Infrastruktur virtualisiert, wird der Client keine IP-Adresse bekommen, sofern die Netzwerke auf “Internes Netzwerk” geschalten wurden.    Das Verhalten ist weniger ein Problem, sondern ein Feature, das sich leicht deaktivieren lässt.     Sobald man die Netzwerkeinstellungen des Clients auf “Internes Netzwerk” ändert, erhalt er eine Adresse aus dem Pool 196.254.0.16 – 196.254.10.254 (APIPA ist von 169.254.0.0-196.254.255.255)        Um diesen internen DHCP Server zu deaktivieren müssen zuerst alle VM’s heruntergefahren bzw. gespeichert werden. Dann muss folgende Datei geöffnet werden:%localappdata%\\\\microsoft\\\\Windows Virtual PC\\\\options.xml        In dieser Datei tauschen wir im Abschnitt dhcp enabled den Wert TRUE durch FALSE.         Nach dieser Änderung kann der Client IP Adressen vom aufgesetzten DHCP Server empfangen.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/windows-virtual-pc-interner-dhcp-server/\"\n},{\n  \"id\": \"post-ntsystems-update\",\n  \"title\": \"ntSystems - Update\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Heute habe ich die Blog Platform von ntSystems aktualisiert. Wir verwenden nun die aktuellste Version von BlogEngine.NET.Das neue Theme ist in Bearbeitung, wird in den n&auml;chsten Tagen Online sein.Bis dahin, stay tuned!twitter.com/torgglertwitter.com/nitz_d\",\n  \"url\": \"https://onprem.wtf/post/ntsystems-update/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-safelist-aggregation\",\n  \"title\": \"Exchange 2010 – SafeList Aggregation\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"In Exchange 2010 gibt es viele M&ouml;glichkeiten sich vor Spam zu sch&uuml;tzen, unter anderem kann jeder User seine pers&ouml;nliche Black- und White List in den Outlook Junk-E-Mail Optionen pflegen.Ist ein Edge Transport Server in der Exchange Organisation vorhanden, kann man diese pers&ouml;nlichen Listen direkt an der Edge, also an der ersten M&ouml;glichkeit anwenden und so die Effizienz steigern und false positives verringern. Ist die SafeList Aggregation aktiviert werden sichere Mails dem Empf&auml;nger direkt zugestellt, ohne von weitern Filter Agents gepr&uuml;ft zu werden. Au&szlig;erdem werden die blockierten Absender bei der ersten M&ouml;glichkeit blockiert.Sichere Absender sind alle (E-Mail Adressen oder Domains) die in der entsprechenden Liste eingetragen sind. Outlook Kontakte und E-Mail Adressen an die der Benutzer eine Nachricht sendet k&ouml;nnen optional ausgew&auml;hlt werden. Die Informationen die der Benutzer in Outlook konfiguriert werden als sogenannte SafeList Collection auf dem Mailbox Server des Benutzers gespeichert. Eine SafeList Collection kann bis zu 1024 Eintr&auml;ge beinhalten.Das Update-SafeList cmdlet aktualisiert diese Collection im ActiveDriectory, dort werden die Informationen (Hashes) in den Attributen msExchSafeSenderHash, msExchSafeRecipientHash, und msExchBlockedSendersHash gespeichert.&Uuml;ber den EdgeSync Service werden die Attribute dann mit der ADLDS Instanz am Edge Transport Server synchronisiert (one-way).Will man also die SafeList Collection eines einzelnen Users aktualisieren verwendet man &ldquo;update-safelist mail.box&rdquo;.Sollen die Collections aller Mailboxen aktualisiert werden dann kann man das z.B. so machen: Get-Mailbox | Update-SafeList. Um die Edge Synchronisierung anzusto&szlig;en (Testumgebung) kann man noch Start-EdgeSychronization verwenden.Wenn es sich um eine gr&ouml;&szlig;ere Organisation handelt werden mit Get-Mailbox wom&ouml;glich nicht alle Mailboxen zur&uuml;ckgegeben, daf&uuml;r eignet sich folgende Kommandos.Set-AdServerSettings -ViewEntireForest $true Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Update-SafelistWenn man diese beiden Kommandos in einer Datei speichert kann man einfach einen geplanten Task erstellen der die SafeList automatisch aktualisiert.Achtung: Damit die SafeList Aggregation funktioniert muss der Content Filtering Agent am Edge Transport Server laufen. Das kann mit &ldquo;Get-ContentFilterConfig&rdquo; einfach &uuml;berpr&uuml;ft werden.tomt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-safelist-aggregation/\"\n},{\n  \"id\": \"post-tpm-bitlocker-schlussel-in-ad-ds-speichern\",\n  \"title\": \"TPM / BitLocker Schlüssel in AD DS speichern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"de\",\"Server\",\"Server-2008\",\"Server-2008-R2\"],\n  \"content\": \"Wenn BitLocker im Unternehmen aktiviert wird, empfiehlt es sich die Wiederherstellungsinformationen in Active Directory zu sichern. Diese Anleitung richtet sich an Windows Server 2008 / 2008 R2 und Windows 7 als Client-Betriebssystem. Die Anleitung beschreibt, welche Schritte erforderlich sind um TPM- und BitLocker Schl&uuml;ssel in AD DS zu speichern, als Beispiel wird jenes Volume verschl&uuml;sselt, welches das Betriebssystem enth&auml;lt.  Wir unterscheiden hier zwischen 2 diverse Schl&uuml;ssel:TPM: Hierbei wird der Besitzerschl&uuml;ssel des TPM Bausteins in AD DS gespeichert BitLocker: Hierbei handelt es sich um den Wiederherstellungsschl&uuml;ssel f&uuml;r die betreffende PartitionSchritt 1: AD DS zum speichern von TPM Besitzerschl&uuml;ssel vorbereitenAls erstes muss AD DS f&uuml;r das speichern des TPM Besitzerschl&uuml;ssels konfiguriert werden. Sofern Server 2003 als DC verwendet wird, muss vorher noch ein Schema-Update durchgef&uuml;hrt werden. F&uuml;r die Betriebssysteme Server 2008 und Server 2008 R2 ist dies nicht notwendig, da diese die Erweiterung bereits mitbringen.Damit der Client den TPM Besitzerschl&uuml;ssel in AD DS speichern kann, muss das Script Add-TPMSelfWriteACE.vbs auf dem DC ausgef&uuml;hrt werden. Dieses Script setzt die Berechtigungen des Attributs msTPM-OwnerInformation so, dass der Client seinen TPM Schl&uuml;ssel einf&uuml;gen kann.ACHTUNG: Sollte man nicht das Server-Betriebssystem in englischer Sprachversion verwenden, so muss das Script noch angepasst werden: Anstatt die Berechtigung &ldquo;SELF&rdquo; zu setzen, muss diese z.B. f&uuml;r Deutsch in &ldquo;SELBST&rdquo; ersetzt werden. Sonst l&auml;uft das Script nicht erfolgreich durch.Schritt 2: Setzen der GPO&rsquo;sDa nun Active Directory zum speichern von TPM Schl&uuml;sseln vorbereitet ist, setzten wir die Gruppenrichtlinien und weisen den Client an, die Wiederherstellungsschl&uuml;ssel in Active Directory zu speichern.BitLockerComputerkonfiguration / Administrative Vorlagen / Windows-Komponenten / BitLocker Laufwerksverschl&uuml;sselung / Betriebssystemlaufwerke&rdquo;Festlegen, wie BitLocker-gesch&uuml;tzte Betriebssystemlaufwerke wiederhergestellt werden k&ouml;nnen&rdquo;Anhand dieser Richtlinie wei&szlig;en wir den Client an die Wiederherstellungsinformationen in der Active Directory zu speichern. BitLocker kann erst aktiviert werden, sobald die Widerherstellungsinformationen in Active Directory hinterlegt sind.TPMComputerkonfiguration / Administrative Vorlagen / System / Trusted Platform Module-Dienste&ldquo;TPM-Sicherung in Active-Directory-Dom&auml;nendienste aktivieren&rdquo;Anhand dieser Richtlinie wird der Client angewiesen den TPM Besitzerschl&uuml;ssel in der Active Directory zu speichern.Schritt 3: TPM am Client initialisierenWenn der TPM am Client initialisiert wird, wird ein Besitzerschl&uuml;ssel generiert.In Active Directory werden die Informationen im Attribut msTPM-OwnerInformation mitgeschrieben.Schritt 4: Verwaltungsprogramm f&uuml;r BitLocker-Schl&uuml;ssel installierenServer 2008 liefert eine zus&auml;tzliche Registerkarte f&uuml;r Active Directory um BitLocker-Schl&uuml;ssel anzuzeigen. Vorher muss jedoch das Feature Verwaltungsdienstprogramm f&uuml;r BitLocker aktiviert werden.Nach der Aktivierung findet man eine neue Registerkarte in den Computerkonten.&nbsp;Schritt 5: BitLocker aktivieren und Wiederherstellungsschl&uuml;ssel einsehenNun k&ouml;nnen wir am Client BitLocker f&uuml;r das Volume aktivieren, welches das Betriebssystem enth&auml;lt.Nach der Aktivierung kann der Wiederherstellungsschl&uuml;ssel im jeweiligen Computerkonto in der Registerkarte &ldquo;BitLocker-Wiederherstellung&rdquo; eingesehen werden.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/tpm-bitlocker-schlussel-in-ad-ds-speichern/\"\n},{\n  \"id\": \"post-wsus-auf-neuen-server-verschieben\",\n  \"title\": \"WSUS auf neuen Server verschieben\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Daniel hat in diesem Artikel bereits dar&uuml;ber geschrieben.Im Gro&szlig;en und Ganzen habe ich die Migration genau gleich gemacht. Also WSUS auf dem neuen Server installiert, WSUS Content kopiert und mit \\\"wsutil export datei.cab datei.log\\\" und \\\"wsutil import datei.cab datei.log\\\" die Updates importiert. Allerdings wollte ich die Einstellungen nicht manuell &uuml;bernehmen, daf&uuml;r gibt es WSUSMigrate.Man findet das Tool im WSUS TechCenter unter API Samples and Tools. Installiert man diese, erh&auml;lt man diverse zus&auml;tzliche Tools f&uuml;r WSUS, unter anderm WSUSMigrationImport und WSUSMigrationExport mitsamt kurzem HowTo.Also habe ich diese Tools auf dem alten sowie auf dem neuen Server installiert und mit \\\"WSUSMigrationExport datei.xml\\\" die Gruppen und Approvals exportiert. Auf dem neuen Server kann man dann mit Parametern entscheiden welche Einstellungen man importieren m&ouml;chte. Die verf&uuml;gbaren Parameter f&uuml;r WSUSMigrationImport sind:TargetGroups -&gt; Importiert nur GruppenApprovals -&gt; Importiert nur Update ApprovalsAll -&gt; Importiert Gruppen und ApprovalsMan kann auch entscheiden was mit den Gruppen passieren soll die es auf dem Zielserver eventuell schon gibt, daf&uuml;r gibt es diese Parameter:None -&gt; Beh&auml;lt die bestehenden GruppenDeleteUnmatchedGroups -&gt; L&ouml;scht Gruppen vom Zielserver die nicht in der XML Datei vorhanden sindNoch ein Beispiel f&uuml;r den Import Befehl:\\\"WSUSMigrationImport datei.xml All None\\\" -&gt; Importiert alle Gruppen und Approvals und ver&auml;ndert bestehende Gruppen auf dem Zielserver nicht.so long!tomt\",\n  \"url\": \"https://onprem.wtf/post/wsus-auf-neuen-server-verschieben/\"\n},{\n  \"id\": \"post-buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3\",\n  \"title\": \"Buchen einer Ressource in Outlook 2010 mit Exchange 2k3\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Wenn man mit Outlook 2010 &uuml;ber einen Exchange Server in der Version 2003 eine Ressource buchen m&ouml;chte (z.B. Konferenzraum f&uuml;r eine Besprechung) wird das unter Umst&auml;nden nicht funktionieren. Die Besprechungsanfrage wird zwar allen Teilnehmern gesendet und auch im eigenen Kalender eingetragen, die Ressource jedoch nicht gebucht, sprich im Ressourcenkalender nicht eingetragen.  Dieses Problem tretet nur in der Konstellation von Outlook 2010 auf einem Exchange Server 2003 SP* auf.L&ouml;sung: Damit die Ressource wieder gebucht werden kann, muss in der Registry des PC&rsquo;s wo Outlook 2010 installiert ist, folgender Schl&uuml;ssel angelegt werden:HKCU\\\\Software\\\\Microsoft\\\\Office\\\\14.0\\\\Outlook\\\\Options\\\\CalendarREG_DWORD EnableDirectBooking 1 (HEX)Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3/\"\n},{\n  \"id\": \"post-nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules\",\n  \"title\": \"NLB – Unicast vs. Multicast, Konfiguration, Port Rules\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"UnicastIm Unicast Mode tauscht jeder NLB Knoten seine MAC Adresse mit der Cluster MAC Adresse aus, d.h. alle Knoten haben die gleiche “virtuelle” MAC Adresse.Dieses Konfiguration zwingt den Switch zu “suboptimalem” Verhalten, da die selbe MAC Adresse über mehrere Switchports erreichbar ist, kann der Switch die Adresse nicht “lernen” also sie nicht in seine MAC Address Table aufnehmen und an ein Switchport binden. Alle Pakete an diese MAC Adresse werden vom Switch über alle Ports geflutet. Das führt zu überflüssiger Last am Switch und im gesamten Netzwerk.Ein weiteres Problem ist dass die einzelnen NLB Knoten so nicht mehr miteinander kommunizieren können, dafür wird eine zusätzliche Netzwerkkarte benötigt. Aus diesem Grund wird Unicast Mode mit nur einer Netzwerkkarte nicht empfohlen.Das Fluten von Paketen kann durch erstellen eines eigenen VLAN für die NLB Knoten vermindert werden. So werden Pakete nur innerhalb dieses VLANs geflutet und nicht über den ganzen Switch. MulticastBeim Multicast Mode wird jedem Konten eine Multicast MAC Adresse hinzugefügt, so dass alle Knoten mit zwei Layer2 Adressen ausgestattet sind. Das ermöglicht dem Switch das “lernen” der echten MAC Adressen und den einzelnen Knoten eine Kommunikation untereinander.Damit ein Multicast Cluster auch erreichbar wird müssen statische ARP Einträge am Switch konfiguriert werden, denn Standardmäßig wird die Auflösung von Unicast IPs in Multicast MAC Adressen blockiert. So werden Pakete an die Multicast Adressen nur an die festgelegten Ports weitergeleitet.Cluster im Multicast Mode können auch mit nur einer Netzwerkkarte betrieben werden, aus Performancegründen und verbessertem Management empfehle ich aber die Verwendung zweier Netzwerkkarten.NLB KonfigurationWie bereits oben beschrieben muss im Unicast Mode jeder Knoten zwei Netzwerkkarten besitzen. Im Multicast Mode reicht eine Karte, allerdings ist es eine “Best Practice” zwei zu verwenden.Als erstes muss das Feature installiert werden, ich habe hier deutsch Server, also heißt das Ding: Netzwerklastenausgleich. Das geht entweder über die GUI, oder mit “servermanagercmd –i nlb”. Auch mit PowerShell kann man Features installieren, und zwar mit dem Add-WindowsFeature cmdlet. Dann werden die beiden Netzwerkkarten konfiguriert. Eine wird die Netzwerkkarte für das LAN, sie wird mit IP, Gateway und DNS Server konfiguriert. Ich habe sie in LAN umbenannt. Die zweite Netzwerkkarte wird der dedizierte Adapter für NLB. Diese wird nur mit einer IP Adresse konfiguriert.Ich verwende im LAB 192.168.1.10 als Cluster Adresse. 192.168.1.11 und 192.168.1.12 als Adressen für die Netzwerkkarten “LAN”. Für die NLB Adapter verwende ich 192.168.1.21 und 192.168.1.22.Wichtig ist dass man auf die Bindings achtet, d.h. der Adapter LAN muss der erste in der Auswahl sein. Die Bindings werden in den Erweiterten Netzwerkeinstellungen konfiguriert. Jetzt wird mit dem NLB-Manager der Cluster erstellt. Dazu wird auf Cluster und Neu geklickt, dann wird der erste Knoten hinzugefügt: Wichtig: Der dedizierte NLB Adapter wird verwendet!Als dedizierte Adresse wird als 192.168.1.21 angezeigt, auf dieser NIC wird NLB aktiviert und die Cluster Adresse gebunden. Im nächsten Fenster wird die Cluster Adresse festgelegt, ich verwende wie oben beschrieben 192.168.1.10/24.Der Modus, also Unicast oder Multicast wird im nächsten Fenster konfiguriert. Außerdem wird der FQDN für den Cluster hier gesetzt. Mein Testcluster heißt nlb.ntsystems.it und läuft im Multicast Mode.&#160;  Jetzt werden noch die Port Rules konfiguriert, ich akzeptiere vorläufig mal die Standardeinstellungen, dazu aber später mehr.So, jetzt habe ich NLB mal soweit eingerichtet. Natürlich muss noch der zweite Knoten hinzugefügt werden. Dazu einfach auf den Clusternamen klicken und Host hinzufügen wählen. Wichtig auch hier wieder dass die Netzwerkkarte NLB verwendet wird, also die dedizierte Adresse 192.168.1.22.Ist der zweite Knoten hinzugefügt und der Status im NLB Manager auf “Converged” oder “Zusammengeführt” ist der Cluster erstellt.Allerdings ist die Konfiguration damit noch nicht fertig. Die Cluster IP ist noch nicht erreichbar. Das hat zwei Gründe, erstens muss am Switch noch der statische ARP Eintrag erstellt werden (Cisco: arp 192.168.1.10 03bf.c08a.010a). Außerdem muss IP Forwarding noch konfiguriert werden, dazu brauchen wir folgenden netsh Befehl: “netsh int ipv4 set int “NLB” forwarding=enabled”NLB Port RulesAls letzter Schritt bei der Konfiguration des Clusters werden die Port Rules konfiguriert. Standardmäßig werden einfach alle Ports (0-65535) egal ob TCP oder UDP an alle Clusterknoten weitergeleitet. Nun um die Angriffsfläche oder( “Attack Surface”) zu verringern und die Konfiguration zu optimieren sollten nur diese Ports weitergeleitet werden die auch wirklich benötigt werden. Ein weiterer Vorteil von einer eigenen Regel für jedes Protokoll ist dass man die Affinität so für jedes Port einstellen kann.Mein NLB Cluster soll ein Webserver werden, also werde ich nur die Ports 80 und 443 weiterleiten, ich möchte die Affinität für beide Ports “Einfach” haben, es wird also die IP Adresse jedes Clients verwendet um die Affinität zu steuern. Ich lösche also die Default Port Rule und erstelle zwei neue. Die Port Rules werden entweder in den Clustereigenschaften konfiguriert, oder direkt beim erstellen des Clusters.Jetzt erkennen wir einen weiteren Vorteil der Konfiguration mit zwei Netzwerkkarten: Der NLB Manager kann weiterhin mit beiden Knoten kommunizieren, obwohl ich für die Protokolle die verwendet keine Port Rules erstellt habe. Der NLB Manager verwendet für die Konfiguration die dedizierten Adressen.ChecklistHier die einzelnen Schritte nochmal im Überblick.        Feature installieren       zusätzliche Netzwerkkarte installieren    Netzwerkkarten konfigurieren (IP, Bindings!)    Cluster erstellen (Unicast/Multicast)    Hosts hinzufügen    evtl. Statische ARP Einträge    IP Forwarding aktivieren (netsh int ipv4 set int “NLB” forwarding=enabled)    Port Rules erstellen &#160;so long!   tomt\",\n  \"url\": \"https://onprem.wtf/post/nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules/\"\n},{\n  \"id\": \"post-installation-der-sharepoint-services-30-auf-server-2008\",\n  \"title\": \"Installation der Sharepoint Services 3.0 auf Server 2008\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2008-R2\",\"Sharepoint\"],\n  \"content\": \"Die Installation der Sharepoint Services kann sich unter Server 2008 / 2008 R2 als schwierig erweisen, wenn der Windows Installer während der Installationsphase einen falsch angegeben Parameter meldet: Das Problem hängt hierbei mit der “Windows Internal Database” zusammen.Lösung: Vor der Installation folgendes Kommando eingeben:    ocsetup.exe &quot;WSSEE&quot; /quiet /norestart /x:&quot; /lv* C:\\\\bak.logGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/installation-der-sharepoint-services-30-auf-server-2008/\"\n},{\n  \"id\": \"post-office-2010-fertig!!\",\n  \"title\": \"Office 2010 fertig!!\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Kurze Info: Office 2010 ist fertig!! Ab sofort ist es für TechNet und MSDN Abonnenten zum Download verfügbar!Lasst die Leitungen glühen!! :)\",\n  \"url\": \"https://onprem.wtf/post/office-2010-fertig!!/\"\n},{\n  \"id\": \"post-programme-vom-server-core-hyper-v-server-deinstallieren\",\n  \"title\": \"Programme vom Server Core / Hyper-V Server deinstallieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\",\"Server\"],\n  \"content\": \"Der Server 2008 Core und der Hyper-V Server haben keine Oberfläche um Programme zu deinstallieren (Add/Remove programs).Um Programme deinstallieren zu können, öffnen wir die Registrierung. (Üblicherweise Remoteregistrierung von einem Client aus). Unter    HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall    werden die installierten Programme gelistet. Wenn man den Wert im Schlüssel “UninstallString” in der Kommandozeile des Servers eingibt, wird der Windows Installer gestartet und deinstalliert das Programm.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/programme-vom-server-core-hyper-v-server-deinstallieren/\"\n},{\n  \"id\": \"post-exchange-2010-active-sync-funktioniert-nicht\",\n  \"title\": \"Exchange 2010 - Active Sync funktioniert nicht\",\n  \"author\": \"tto\",\n  \"tags\": [\"Events\",\"Exchange\"],\n  \"content\": \"Ja es ist ruhig zur Zeit auf ntSystems&hellip; das liegt daran dass die beiden Autoren zur Zeit ihre MCSA/MCSE Zertifizierungen auf MCITP-EA aktualisieren. Wir sind auch ganz gut im Rennen, aber einige Pr&uuml;fungen fehlen noch. Naja, bald gibt&rsquo;s hoffentlich wieder mehr zum Lesen.Inzwischen die L&ouml;sung f&uuml;r folgendes Problem:ActiveSync funktioniert mit Exchange 2010 nicht, Event ID: 1053 Source: MSExchange ActiveSync wird Protokolliert. Aus der Beschreibung des Fehlers erkennt man auch schon das Problem, fehlende Berechtigungen.Exchange ActiveSync doesn't have sufficient permissions to create the container &ldquo;CN&rdquo; under Active Directory &hellip; &lt;/p&gt;Active directory response: 00000005: SecErr: DSID-03152492, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0 Make sure the user has inherited permission granted to domain\\\\Exchange Servers to allow List, Create child, Delete child of object type \\\"msExchangeActiveSyncDevices\\\" and doesn't have any deny permissions that block such operations.&lt;/code&gt;Also einfach die in der Fehlermeldung beschriebenen Berechtigungen setzen, oder die Vererbung auf dem Active Directory User Objekt wieder aktivieren.Um Berechtigungen im Active Directory zu setzen muss unter &ldquo;View&rdquo; die Option &ldquo;Advanced Features&rdquo; aktiviert werden. Dann&nbsp;wird unter den Eigenschaften des Benutzers der Reiter &ldquo;Security&rdquo; angezeigt.tt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-active-sync-funktioniert-nicht/\"\n},{\n  \"id\": \"post-wds-remoteinstallationsordner-verschieben\",\n  \"title\": \"WDS Remoteinstallationsordner verschieben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Um in den Deployment Services den Installationsorder zu verschieben müssen folgende Befehle ausgeführt werden:wdsutil /uninitialize-serverDann den Ordner an seinen neuen Platz verschiebenwdsutil /initialize-server /reminst:Laufwerksbuchstabe\\\\OrdnerGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/wds-remoteinstallationsordner-verschieben/\"\n},{\n  \"id\": \"post-wsus-content-auf-anderes-volume-verschieben\",\n  \"title\": \"WSUS content / database auf anderes Volume verschieben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"ContentUm den WSUS content auf einem anderen Volume zu verschieben, reicht es ein einfaches Command auszuführen:wsusutil.exe movecontent “neuer Pfad” “Pfad für das entstehende LogFile”Das Tool wsusutil befindet sich unter Program Files\\\\ Update Services \\\\ ToolsDatabaseUm die Datenbank zu verschieben gibt es 2 Möglichkeiten, einmal über das Management Studio oder über SQLCMD. In diesem Post gehe ich lediglich auf die Methode anhand des Management Studio ein1) Datenbank über folgenden Pfad öffnen\\\\\\\\.\\\\pipe\\\\MSSQL$MICROSOFT##SSEE\\\\sql\\\\query 2) Datenbank trennenBevor die Datenbank getrennt wird, sollte der Dienst “update services” beendet werden. Die Datenbank SUSDB trennen und bei den Optionen muss noch angegeben werden, dass die Verbindungen mit getrennt werden sollen. 3) Datenbank auf neuem Volume kopieren4) Datenbank wieder anfügen&#160; Danach kann der Dienst “update services” wieder gestartet werden.Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/wsus-content-auf-anderes-volume-verschieben/\"\n},{\n  \"id\": \"post-forefront-2010-e28093-dienste-starten-nicht-automatisch\",\n  \"title\": \"Forefront 2010 – Dienste starten nicht automatisch\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"Wer Forefront 2010 installiert und das Logging nicht separat konfiguriert wird sich wom&ouml;glich wundern warum bei einem Neustart folgende Dienste nicht starten:Microsoft Forefront TMG ControlMicrosoft Fronfront TMG FirewallMicrosoft Forefront TMG Job SchedulerMicrosoft Forefront TMG Managed ControlForefront beantwortet somit keine Anfragen und jeglicher Zugriff von allen au&szlig;er den Management Computern wird blockiert.Das liegt daran dass Standardm&auml;&szlig;ig eine Lokale SQL Instanz also Logging Ziel konfiguriert ist, der SQL Dienst aber erst nach den Forefront Diensten startet&hellip; Und wenn Forefront nicht Protokollieren kann dann wird der Dienst beendet. Im Eventlog steht:The Microsoft Forefront TMG Control service terminated with service-specific error %%278540.L&ouml;sen l&auml;sst sich das Problem ganz einfach, entweder man stellt auf Logging to File&nbsp;oder man Konfiguriert die vier oben genannten Dienste f&uuml;r verz&ouml;gerten Start.&nbsp;&Uuml;ber die Sinnhaftigkeit dieser Standardkonfiguration muss man wohl nichts mehr sagen&hellip;tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-2010-e28093-dienste-starten-nicht-automatisch/\"\n},{\n  \"id\": \"post-wds-tftp-timeout\",\n  \"title\": \"WDS TFTP TimeOut\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008-R2\",\"Server-2008\",\"Server-2003\"],\n  \"content\": \"Wenn die Windows Deployment Services auf derselben Maschine wie der DNS Server laufen, wird WDS nach der Installation des DNS-Patches KB953230 (wird auch über Windows Updare verteilt) möglicherweise nicht mehr funktionieren. Wenn der Client versucht über PXE zu booten erscheint folgende Meldung: PXE-E32: TFTP open timeoutUm dieses Problem zu beheben muss folgendes an den WDS Diensten verändert werden:Server 2003 – 2008In den Eigenschaften des WDS Servers muss der UDP Portbereich zu den Werten 50000 bis 65000 verändert werden.      Server 2008 R2Wenn als OS Server 2008 R2 verwendet wird, kann auch die Option aktiviert werden, dass WDS automatisch nach verfügbaren WinSock Ports abfragt und nicht den vorkonfigurierten UDP Portbereich verwendet. Dazu muss der Schlüssel UDPPortPolicy unter HKLM\\\\System\\\\CurrentControlSet\\\\Services\\\\WDSServer\\\\Parameters von 1 auf 0 gesetzt werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/wds-tftp-timeout/\"\n},{\n  \"id\": \"post-terminal-lizenzserver-4105\",\n  \"title\": \"Terminal-Lizenzserver, 4105\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2003\"],\n  \"content\": \"Nach der Domänenmigration von 2003 zu 2008 kann es geg. zu Problemen am Terminal-Lizenzserver kommen, dass Lizenzattribute für Benutzer nicht aktualisiert werden können. Das Problem ist, dass nach der Migration der Domäne die Benutzer-Berechtigungen für die Gruppe “Terminalserver-Lizenzserver” nicht aktualisiert werden.Um die Benutzerberechtigungen für die bestehenden Benutzer manuell zu setzen müssen der Gruppe Terminalserver-Lizenzserver folgende Berechtigungen zugewiesen werden: “Terminalserver-Lizenzserver lesen” und ”Terminalserver-Lizenzserver schreiben”  Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/terminal-lizenzserver-4105/\"\n},{\n  \"id\": \"post-bootmgr-is-missing\",\n  \"title\": \"BOOTMGR is missing\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Gestern habe ich meinen Windows Server 2008 R2 für den Cluster vorbereitet. Aus versehen habe ich eine Daten-Partition als aktiv markiert. Das habe ich natürlich sofort rückgängig gemacht.Heute habe ich meinen Server neu gestartet und musste feststellen, dass er nicht mehr bootet. Als Fehlermeldung wurde angezeigt, dass der Bootloader fehlt (BOOTMGR is missing). Nach ein wenig Recherche über Bing (ehemals Google :) ) bin ich auf 2 Methoden gestoßen um das Problem zu beheben:Methode 1: Den BCD Speicher neu erstellen   Server CD in einlegen und Server damit starten     Die Option “Computerreparatur” auswählen     CMD starten und den Befehl Bootrec /RebuildBcd eingeben. Nun sollte das Betriebssystem aufgelistet werden. Nun bestätigt man mit YES, dass der BCD Speicher neu geschrieben wird. Sollte das Betriebssystem nicht aufgelistet werden, so muss folgende durchgeführt werden: Export der Konfiguration: Bcedit /export C:\\\\BCD_Export Alte Konfiguration umbenennen: ren c:\\\\boot\\\\bcd bcd.old Und die Konfiguration nochmal erstellen lassen: Bootrec /RebuidlBcd     Server neu starten  Methode 2: Den BCD Speicher manuell neu erstellenDiese Methode habe ich noch nicht versucht, aber hier der KB-Artikel zum nachlesen.Nachdem Methode 1 bei mir nicht funktionierte und nach mehreren Anläufen über /fixboot usw. sich nichts getan hat, erinnerte ich mich, dass auf der Windows 7 DVD eine Reparaturoption für den Startvorgang enthalten ist. Nachdem ich den Server mit der Windows 7 DVD gestartet hatte, wählte ich die Option “Startup Repair” aus und lies die Diagnose durchlaufen. Nach 1 Minute und einem Neustart später startete der Server wieder ordnungsgemäß.ACHTUNG: Das funktioniert nicht für den Microsoft Hyper-V Server. Dieser hat eine andere Bootkonfiguration, die vor dem Start des Betriebssystems den Hypervisor startet.Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/bootmgr-is-missing/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-this-attachment-was-removed\",\n  \"title\": \"Exchange 2010 – This Attachment was removed\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Ich betreibe seit einiger Zeit eine Exchange 2010 Umgebung bestehend aus einem Edge Transport Server und einem Multi-Role Exchange Server im Lan.Standardm&auml;&szlig;ig ist am Edge Transport Server der &ldquo;Attachment Filter Agent&rdquo; aktiv, dieser ist daf&uuml;r verantwortlich, potentiell gef&auml;hrliche Anh&auml;nge zu filtern. Will man also z.B. eine .exe Datei verschicken muss man diesen Agent deaktivieren. Das wird auf dem Edge Transport Server gemacht und zwar per PowerShell.Disable-TransportAgent -Identity \\\"Attachment Filter agent\\\"Ich schlage allerdings vor dieses Sicherheitsfeature nicht auszuschalten. Man kann diverse Einstellungen vornehmen, so kann z.B. festgelegt werden dass ein unsicherer Anhang nicht entfernt wird sondern das Mail direkt &ldquo;rejected&rdquo; wird.Man kann die Attachment Filter Eintr&auml;ge &uuml;ber folgendes cmdlets selbst bearbeiten.Add-AttachmentFilterEntry -Name &lt;FileName&gt; -Type FileNameAdd-AttachmentFilterEntry -Name &lt;MIMEContentType&gt; -Type ContentTypeAu&szlig;erdem kann man das Verhalten des Attachment Filter Agent festlegen und zwar &uuml;ber das set-AttachmentFilterListConfig cmdletSet-AttachmentFilterListConfig -Action -Reject -RejectResponse \\\"Versenden von Mails mit unsicheren Anh&auml;ngen nicht erlaubt!\\\"Genauere Syntax und Infos zu den Parametern findet man im TechNet:Set-AttachmentFilterListConfig Add-AttachmentFilterEntry&nbsp;na dann, sch&ouml;nes Wochenende! tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-this-attachment-was-removed/\"\n},{\n  \"id\": \"post-nvspbind-fur-hyper-v\",\n  \"title\": \"NVSPBIND für Hyper-V\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\"],\n  \"content\": \"In einem meiner letzten Posts (Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben) habe ich erklärt, wie man über die Registry die Bindungen an den Netzwerkschnittstellen verändern kann.     Die Microsoft Entwickler haben dazu jetzt ein Tool veröffentlich, mit dem das Ganze etwas komfortabler gemanagt werden kann: NVSPBIND.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/nvspbind-fur-hyper-v/\"\n},{\n  \"id\": \"post-wsus-verschieben\",\n  \"title\": \"WSUS auf anderen Server verschieben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Um den WSUS Server auf einer anderen physischen Maschine zu verschieben müssen folgende Schritte unternommen werden:1) WSUS auf dem Zielserver installieren2) Einstellungen manuell vom Quellserver zum Zielserver übernehmen3) Mit NTBackup das Verzeichnis WSUSContent vom Quellserver sichern (Kopieren ist auch möglich) 4) Daten mit NTBackup auf dem Zielserver in den entsprechenden Ordner wiederherstellen5) Metadaten vom Quellserver exportieren   CMD öffnen und zum Ordner Tools unter C:\\\\Programme\\\\Update Services\\\\ wechseln    Folgenden Befehl eintippen um die Metadaten zu exportieren: wsusutil.exe export export.cab export.log    2 Files wurden erstellt (Export.cab und Export.log)  6) Metadaten zum Zielserver importieren   Mit dem Befhl wsusutil.exe import export.cab import.log werden die zuvor exportierten Metadaten am Zielserver importiert             Info: Es kann einige Zeit vergehen, bis der Import Vorgang vollständig abgeschlossen wurde. 7) GPO abändern und auf den neuen WSUS Server verweisen    Grüße     dn \",\n  \"url\": \"https://onprem.wtf/post/wsus-verschieben/\"\n},{\n  \"id\": \"post-wpad-und-server-2008\",\n  \"title\": \"WPAD und Server 2008\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008\",\"Server-2008-R2\",\"Server\",\"Client\"],\n  \"content\": \"Heute habe ich meinen Windows Server 2008 R2 Server zum Domänencontroller promoted. D.h. Domänendienste, GC und DNS wurden installiert. Zudem habe ich als primären DNS Server die lokale Maschine angegeben.Nach einiger Zeit wunderte ich mich, dass das Internet nicht mehr funktioniert. Als Gateway betreibe ich eine ISA Server 2006, der Proxy wird über WPAD automatisch konfiguriert.Windows Server 2008 besitzt für DNS ein neues Sicherheitsfeature, welches WPAD nicht zulässt (DNS Global Query Blocklist).dnscmd /info /enableglobalqueryblocklist –&gt; zeigt ob das Sicherheitsfeature aktiv ist. 1 = True, 0 Falsednscmd /config /enableglobalqueryblocklist 0 –&gt; schaltet das Sicherheitsfeature ausWenn das Sicherheitsfeature abgeschaltet wird, muss der DNS Server noch neu gestartet werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/wpad-und-server-2008/\"\n},{\n  \"id\": \"post-hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben\",\n  \"title\": \"Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\",\"Server\"],\n  \"content\": \"Wenn man den Hyper-V Server bzw. den Server Core verwendet und an den Netzwerkschnittstellen die Bindungen verändern möchte, kommt man um das Editieren der Registry nicht herum.   In meinen Fall möchte ich die “Datei und Druckerfreigabe” von den iSCSI Adaptern loslösen.Als erstes muss die ID der Netzwerkadapter ermittelt werdenwmic nicconfig get Description,SettingIDDanach erhält man eine Liste mit den Adaptern und deren ID Nun beginnt die Arbeit in der Registry: Zunächst muss der Schlüssel Bind unter HKEY_LOCAL_MACHINE\\\\system\\\\currentcontrolset\\\\services\\\\lanmanserver\\\\     linkagegeöffnet werden. Hier erhält man eine Liste mit den Netzwerkadaptern und ihren Bindungen zum Protokoll der “Datei und Druckerfreigabe”. Der nächste Schritt besteht darin, die Bindungen aufzuheben, indem man alle Zeilen wo die entsprechende Adapter-ID vorkommt löscht.   Änderungen werden nach einem Reboot aktiv.Anbei noch eine Liste mit den Protokollen und ihren Schlüsseln:File and Printer Sharing: LanmanServer     Client for MS Networks: LanmanWorkstation      Link-Layer Discovery Mapper I/O Driver: lltdio      Link-Layer Topology Discovery Responder: rspndr      TCP/IP v4: tcpip      TCP/IP v6: tcpip6Grüße   dn    \",\n  \"url\": \"https://onprem.wtf/post/hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben/\"\n},{\n  \"id\": \"post-bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung\",\n  \"title\": \"BlueScreen “Stop 0x0000007E” beim aktivieren der Virtualisierungs-Technologie\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\",\"Server-2008-R2\"],\n  \"content\": \"Nachdem im BIOS die Virtualisierungs-Technologie aktiviert wird, kann es zu einem BlueScreen bei starten des Servers kommen. Im BlueScreen wird folgender Fehlercode mitgeteilt: 0x0000007E.Betroffen sind folgende Produkte: Windows Server 2008 R2 Standard  Windows Server 2008 R2 Enterprise  Windows Server 2008 R2 Datacenter Hyper-V Server 2008 R2&#160;Microsoft hat dazu den KB-Artikel 974598 und einen Hotfix veröffentlicht. Um den Server wieder flott zu bekommen, muss die Virtualisierungs-Technologie deaktiviert werden. Danach muss der Server gestartet und der Hitfix installiert werden.   Nachdem der Hotfix installiert wurde, kann die Virtualisierungs-Technologie wieder aktiviert und das System gestartet startet.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung/\"\n},{\n  \"id\": \"post-server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen\",\n  \"title\": \"Server 2008 Core / Hyper-V Netzwerkschnittstelle umbenennen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Hyper-V\"],\n  \"content\": \"Um auf einem Server Core oder auch Hyper-V Server die Netzwerkschnittstelle umzubenennen, wird das Tool netsh verwendet.Um z.B. “LAN-Verbindung 5” in “iSCSI 10” umzubenennen, muss folgender Befehl ausgeführt werden:netsh interface set interface name=”LAN-Verbindung 5” newname=”iSCSI 10”Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen/\"\n},{\n  \"id\": \"post-disclaimer\",\n  \"title\": \"disclaimer\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  &lt;p&gt;1. Inhalt des Onlineangebotes &lt;/p&gt;  &lt;p&gt;Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. &lt;/p&gt;  &lt;p&gt;Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen. &lt;/p&gt;  &lt;p&gt;2. Verweise und Links &lt;/p&gt;  &lt;p&gt;Bei direkten oder indirekten Verweisen auf fremde Webseiten (&quot;Hyperlinks&quot;), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. &lt;/p&gt;  &lt;p&gt;Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist. &lt;/p&gt;  &lt;p&gt;3. Urheber- und Kennzeichenrecht &lt;/p&gt;  &lt;p&gt;Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen. &lt;/p&gt;  &lt;p&gt;Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! &lt;/p&gt;  &lt;p&gt;Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet. &lt;/p&gt;  &lt;p&gt;4. Datenschutz &lt;/p&gt;  &lt;p&gt;Sofern innerhalb des Internetangebotes die Möglichkeit zur Eingabe persönlicher oder geschäftlicher Daten (Emailadressen, Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme und Bezahlung aller angebotenen Dienste ist - soweit technisch möglich und zumutbar - auch ohne Angabe solcher Daten bzw. unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet. Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie Emailadressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstössen gegen dieses Verbot sind ausdrücklich vorbehalten. &lt;/p&gt;  &lt;p&gt;5. Rechtswirksamkeit dieses Haftungsausschlusses &lt;/p&gt;  &lt;p&gt;Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt. &lt;/p&gt;  &lt;p&gt;1. Content&lt;/p&gt;  &lt;p&gt;The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect,will therefore be rejected. &lt;/p&gt;  &lt;p&gt;All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the author without separate announcement. &lt;/p&gt;  &lt;p&gt;2. Referrals and links&lt;/p&gt;  &lt;p&gt;The author is not responsible for any contents linked or referred to from his pages - unless he has full knowledge of illegal contents and would be able to prevent the visitors of his site fromviewing those pages. If any damage occurs by the use of information presented there, only the author of the respective pages might be liable, not the one who has linked to these pages. Furthermore the author is not liable for any postings or messages published by users of discussion boards, guestbooks or mailinglists provided on his page. &lt;/p&gt;  &lt;p&gt;3. Copyright&lt;/p&gt;  &lt;p&gt;The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. &lt;/p&gt;  &lt;p&gt;The copyright for any material created by the author is reserved. Any duplication or use of objects such as images, diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's agreement. &lt;/p&gt;  &lt;p&gt;4. Privacy policy&lt;/p&gt;  &lt;p&gt;If the opportunity for the input of personal or business data (email addresses, name, addresses) is given, the input of these data takes place voluntarily. The use and payment of all offered services are permitted - if and so far technically possible and reasonable - without specification of any personal data or under specification of anonymized data or an alias. The use of published postal addresses, telephone or fax numbers and email addresses for marketing purposes is prohibited, offenders sending unwanted spam messages will be punished. &lt;/p&gt;  &lt;p&gt;5. Legal validity of this disclaimer&lt;/p&gt;  &lt;p&gt;This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual terms of this statement are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. &lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/disclaimer/\"\n},{\n  \"id\": \"post-zertifizierungsstelle-verschieben-(backuprestore)\",\n  \"title\": \"Zertifizierungsstelle verschieben (Backup/Restore)\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Eine Zertifizierungsstelle geh&ouml;rt zu den Serverrollen die &uuml;ber viele Jahre gleich bleiben und einige Hardware- bzw. Betriebsystem- Lifecycles &uuml;berdauern. Aus diesem Grund kann es vorkommen dass man eine CA von einem Server auf einen anderen migrieren muss.Wichtig dabei ist dass der Name des Servers sich nicht &auml;ndern sollte, kann man eine &Auml;nderung nicht verhindern gibt es hier einen KB Artikel der die Vorgehensweise beschreibt. Aber wie gesagt, besser/einfacher ist es den Namen nicht zu &auml;ndern.Nun denn, zuerst gilt es eine Strategie zu w&auml;hlen, ich habe es so gemacht dass ich die CA gesichert habe, CA deinstalliert, DC heruntergestuft, Server aus der Domain genommen. Neuen Server mit gleichem Namen installiert, zum DC hochgestuft, CA installiert, CA widerhergestellt und l&auml;uft.Also zum ersten Schritt, Sichern einer Zertifizierungsstelle:Im CA SnapIn auf den CA Namen klicken und All Tasks &ndash;&gt; Backup CA w&auml;hlenBeide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenEinen Ordner angeben wohin das Ganze gesichert wird (sollte leer sein)Ein Kennwort f&uuml;r den Private Key angeben (sollte man sich nat&uuml;rlich merken)regedit &ouml;ffnen und zum Schl&uuml;ssel HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration wechseln, Rechtsklick auf den Schl&uuml;ssel und Export w&auml;hlen. Wieder einen Ordner w&auml;hlen um den Registry Key abzulegen.Deinstallieren einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Remove Roles w&auml;hlenActive Directory Certificate Services entfernenNeu Starten und fertigfolgende Daten bleiben auf dem Server (Achtung bei Entsorgung!!)CA database, CA public and private keys, CA's certificates in the Personal storeCA chain's root certificate in the Trusted Root Certification Authorities storeCA chain's intermediate certificates in the Intermediate Certification Authorities storeThe CA's CRLWiederherstellen einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Add Roles w&auml;hlenActive Directory Certificate Services hinzuf&uuml;genBei &ldquo;Specify Type&rdquo; den entsprechenden Typ ausw&auml;hlen, Standalone oder EnterpriseBei &ldquo;Set up Private Key&rdquo; muss man &ldquo;Use existing private Key&rdquo; w&auml;hlen, darunter &ldquo;Select a certificate and use its associated private key&rdquo;Jetzt wird das vorher gesicherte Zertifikat (*.p12 Datei) ausgew&auml;hlt und das entsprechende Passwort eingegebenBei &ldquo;Configure Database&rdquo; ist noch darauf zu achten dass der CertLog Ordner im gleichen Pfad liegt wie auf dem alten Server (Standard %systemroot%\\\\system32\\\\CertLog)Jetzt wird die CA installiert Ist die Installation abgeschlossen, die Dienstkonsole &ouml;ffnen (services.msc) und den Dienst &ldquo;Active Directory Certificate Services&rdquo; beendenJetzt das vorher exportierte Registry File doppelklicken und die Einstellungen importierenCA SnapIn &ouml;ffnen und auf den CA Namen klicken, All Tasks &ndash;&gt; Restore CA w&auml;hlenWieder beide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenJetzt kann der Dienst &ldquo;Active Directory Certificate Services&rdquo; wieder gestartet werden und die CA l&auml;uft wiederWeihnachtliche Gr&uuml;&szlig;e tom&nbsp;\",\n  \"url\": \"https://onprem.wtf/post/zertifizierungsstelle-verschieben-(backuprestore)/\"\n},{\n  \"id\": \"post-domain-controller-umbenennen\",\n  \"title\": \"Domain Controller umbenennen\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2008-R2\",\"Server-2008\",\"Server\"],\n  \"content\": \"Es kann vorkommen dass man bei der Wahl der Servernamen mal danebengreift oder einfach im Nachhinein einen anderen Namen braucht. Wenn z.B. eine Zertifizierungsstelle wiederhergestellt werden soll dann ist der Computername wichtig.Um also einen Domain Controller (2008, 2008R2) umzubenennen geht man am besten so vor (Achtung: Ein Neustart ist nötig).Zuerst wird ein zusätzlicher DNS-Hostname hinzugefügt.netdom computername altername.domain.local /add:neuername.domain.localWichtig ist nun die Replikation mit allen anderen DCs abzuwarten oder manuell anzustoßen (repadmin, AD Sites and Services). Alle DCs müssen die Änderung im Computerkonto mitbekommen, in allen DNS Servern muss der zusätzliche Namen als Ressource Record aufscheinen. Erst nachdem die Replikation abgeschlossen ist darf man zum nächsten Schritt gehen. Man kann das Ergebnis der Replikation sehen indem man mit ADSI Edit die Eigenschaften des entsprechenden Computerkontos anzeigt, dort muss das Attribut &quot;msDS-AdditionalDnsHostName” den Wert neuername.domain.local haben. Alternativ zu ADSI Edit kann man auch das SnapIn Active Directory Users and Computers verwenden, allerdings muss man dazu unter “View” die “Advanced Features” aktivieren damit man die Attribute sieht.Ist die Replikatoin erfolgt wird der neue Computername als Primärer gesetzt.netdom computername altername.domain.local /makeprimary:neuername.domain.localNach diesem Schritt ist wiederum die Replikation abzuwarten/anzustoßen. Es ändert sich der Name des Computerobjektes und das Attribut “msDS-AdditionalDnsHostName” bekommt den Wert “altername.domain.local”.Jetzt muss der Server neu gestartet werden.Zum Schluss wird der alte Namen noch entfernt.netdom computername neuername.domain.local /remove:altername.domain.localMan kommt nicht um den Neustart herum, so funktioniert aber alles reibungslos.Grüße.   tt\",\n  \"url\": \"https://onprem.wtf/post/domain-controller-umbenennen/\"\n},{\n  \"id\": \"post-forefront-thread-management-gateway-2010\",\n  \"title\": \"Forefront Threat Management Gateway 2010\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Security\"],\n  \"content\": \"Der Nachfolger des beliebten MS Internet Security and Acceleration Servers (ISA) ist seit Mitte November verf&uuml;gbar. Nat&uuml;rlich wurde der Name ge&auml;ndert&nbsp;sowas ist&nbsp;nach einigen Versionen&nbsp;immer n&ouml;tig ;) Das Ding wurde in die Forefront Produktlinie aufgenommen und hei&szlig;t jetzt Forefront Threat Management Gateway 2010. TMG gibt es wie ISA als Standard und Enterprise Edition, die Unterschiede findet man hier.Wichtig zu erw&auml;hnen ist dass Forefront TMG nur mehr als 64 Bit Version verf&uuml;gbar ist, es gibt eine Testversion f&uuml;r 32 Bit Systeme, ist Produktiv allerdings nicht unterst&uuml;tzt. Die Genauen Systemvoraussetzungen gibt es hier.Die wichtigsten neuen Features kurz im &Uuml;berblick:Web Protection Subscription ServiceBietet HTTP/HTTPS Traffic InspectionURL Filterung in Zusammenarbeit mit MRS (Microsoft&nbsp;Reputation Services) mehr dazu z.B. bei Technet EdgeE-Mail Supportarbeitet mit Exchange Edge Transport zusammenNIS Network Inspection SystemIntrusion PreventionEnhanced NATendlich eine 1-to-1 NAT Funktion, d.h. man kann selbst entscheiden welche interne Adresse auf welche externe &uuml;bersetzt wirdVoIP Support64 Bit SupportStartet man das Setup bekommt man mal etwas wirklich cooles, das Preparation Tool.&nbsp;Dieses Tool installiert alle&nbsp;ben&ouml;tigten Serverrollen und Features. Diese sind je nach Installation unterschiedlich:Forefront TMG servicesWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellWindows Web Services API (WWSAPI)Network Policy Server (NPAS-Policy-Server)NPAS Routing and Remote Access Services (NPAS-RRAS-Services)Active Directory Lightweight Directory Services (ADLDS)Network Load Balancing (NLB)Forefront TMG management onlyWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellForefront TMG EMS (nur Enterprise Version)Windows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellActive Directory Lightweight Directory Services (ADLDS)Ist der Preparation Wizard abgeschlossen, kann mit der Installation des TMG begonnen werden.Die Installation dauert einige Zeit, wenn sie abgeschlossen ist kann man die Management Konsole &ouml;ffnen und mit der Konfiguration beginnen. Zuerst sind noch mit einfachen Wizards die Netzwerkeinstellungen, Updates und URL Filtering bzw. Web Protection Subscription zu konfigurieren.Wenn jetzt noch der Web Access Wizard ausgef&uuml;hrt wird kann man gleich noch eine erste Regel erstellen. Man kann ausw&auml;hlen welche URL Kategorien man sperren m&ouml;chte, ob man Web und HTTPS inspection aktivieren m&ouml;chte und wenn ja mit welchem Zertifikat. Au&szlig;erdem kann hier gleich das Caching aktiviert werden.Alles in allem scheint TMG wirklich ein sehr interessantes Produkt zu werden, das deutlich mehr kann als nur den ISA Server zu ersetzen. In n&auml;chster Zeit werde ich sicher noch einiges dar&uuml;ber berichten.viele Gr&uuml;&szlig;e.tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-thread-management-gateway-2010/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-anonymous-relay\",\n  \"title\": \"Exchange 2010 – Anonymous Relay\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Immer wieder gibt es Gründe (z.B. SharePoint) um bestimmten Hosts anonymes Relaying über Exchange zu erlauben. Man muss sich so eine Konfiguration natürlich gut überlegen und die entsprechenden Hosts müssen vertrauenswürdig bzw. sicher sein.Man erstellt also einen neuen “Custom” Receive Conenctor, dem man erst mal einen Namen geben muss (Server Configuration, Hub Transport). Unter “Local Network Settings” kann man die IP Adresse angeben über welche der Exchange Server am besten mit dem Host reden kann. Wenn man nur eine Netzwerkkarte im Hub Transport Server hat kann man sich diese Einstellung schenken und einfach alle verfügbaren IPv4 Adressen verwenden. Außerdem kann man noch den FQDN eingeben mit dem sich der Exchange Server melden soll. Unter “Remote Network Settings” wird jetzt der Host (bzw. die Hosts) hinzugefügt der anonym über den Exchange Relayen darf. Wichtig: der Host muss wirklich vertrauenswürdig sein und AntiVirus bzw. Firewall sollen laufen, damit man nicht selbst zur Spamschleuder wird. Man kann einzelne Hosts, IP Bereiche oder ganze Subnets angeben. Durch klicken auf weiter und wird der Connector erstellt. Jetzt muss man noch die benötigten Berechtigungen setzen. Dazu Rechtsklick auf den Connector und die Eigenschaften öffnen. Unter “Authentication” werden alle Felder deaktiviert, unter “Permission Groups” wird die Gruppe Anonymous Users hinzugefügt.   Das Ganze kann man natürlich auch wieder mit der PowerShell machen, dazu einfach das New-ReceiveConnector cmdlet verwenden. Hier ein Beispiel:New-ReceiveConnector -Name &quot;SharePoint Relay&quot; -Usage Custom -PermissionGroups AnonymousUsers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.1.10,192.168.1.15-192.168.1.18Jetzt gibt es also den Connector und die angegeben Hosts verwenden diesen, das Relaying funktioniert allerdings noch nicht.    Dazu muss man dem User “NT AUTHORITY\\\\ANONYMOUS LOGON” die Berechtigung “Ms-Exch-SMTP-Accept-Any-Recipient” geben. Diese Aktion kann man nur in der EMS (Exchange Management Shell) durchführen.Get-ReceiveConnector &quot;SharePoint Relay&quot; | Add-ADPermission -User &quot;NT AUTHORITY\\\\ANONYMOUS LOGON&quot; -ExtendedRights &quot;Ms-Exch-SMTP-Accept-Any-Recipient&quot;Hat man auch das gemacht funktioniert das Realying.tt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-anonymous-relay/\"\n},{\n  \"id\": \"post-ersten-ws08r2-dc-im-vorhandenen-forest-installieren\",\n  \"title\": \"Ersten WS08R2 DC im vorhandenen Forest installieren\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2008-R2\"],\n  \"content\": \"Neue Features wie das AD Administrative Center (hat Daniel hier&nbsp;schon&nbsp;vorgestellt)&nbsp;oder der AD Recycle Bin erfordern Windows Server 2008 R2 Domain Controller. Das Administrative Center braucht nur einen neuen DC, f&uuml;r den Recycle Bin muss das Forest Functional Level auf WS08R2 gestuft werden, mehr dazu in einem n&auml;chsten Beitrag.Um die Domain auf den ersten 2008 R2 DC vorzubereiten muss wie auch schon bei fr&uuml;heren Updates zuerst das AD Schema aktualisiert werden (auf Version 47). Dazu wird auf einem bestehenden DC die Windows Server 2008 R2 CD eingelegt, man muss nat&uuml;rlich mit einem Benutzer mit Schema Admin Rechten anmelden. Im Ordner Support\\\\adprep befinden sich die Dateien adprep.exe und adprep32.exe. Wie der Dateiname schon sagt wird mit adprep.exe die Schemaerweiterung bei x64 Systemen durchgef&uuml;hrt, mit adprep32.exe wird das Schema auf x86 DCs erweitert.Folgende Parameter werden ben&ouml;tigt:adprep[32].exe /forestprep Bereitet den gesamten Forest auf WS08R2 voradprep[32].exe /domainprep /gpprep Muss auf dem Infrastruktur Master ausgef&uuml;hrt werdenBereitet die Domain vor und setzt Berechtigungen auf Sysvol Share f&uuml;r RSoP Planning Modeadprep[32].exe /rodcprep Muss nur ausgef&uuml;hrt werden wenn ein RODC vorhanden ist, bzw. installiert werden sollJetzt sind Domain und Forest bereit f&uuml;r den neuen DC und der Windows Server 2008R2 kann mit dcpromo hochgestuft werden.viele Gr&uuml;&szlig;e tt\",\n  \"url\": \"https://onprem.wtf/post/ersten-ws08r2-dc-im-vorhandenen-forest-installieren/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-edge-subscription\",\n  \"title\": \"Exchange 2010 – Edge Subscription\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Exchange\"],\n  \"content\": \"Exchange 2010 bringt wie sein Vorg&auml;nger die Edge Transport Rolle mit. In Exchange 2007 wurde bei jeder Synchronisation die gesamte Konfiguration repliziert, dieser Prozess wurde mit Exchange 2010 verbessert, jetzt ist die erste Replikation vollst&auml;ndig, bei allen weiteren werden nur noch die &Auml;nderungen repliziert (incremental updates).Diese Serverrolle kann als einzige nicht mit anderen Rollen auf einem Server installiert werden, der Grund daf&uuml;r ist auch einfach erkl&auml;rt: der Edge Transport Server wird als Mail Relay in der DMZ eingesetzt und ist kein Dom&auml;nenmitglied bzw. hat nur sehr eingeschr&auml;nkten Zugriff auf das LAN.Vor der Installation des Edge Transport Servers muss die interne Hub Transport Rolle konfiguriert werden. Das hei&szlig;t Accepted Domains und die Connectoren m&uuml;ssen konfiguriert werden. Hier ein Link zur entsprechenden Technet Seite.Die Installation des Edge Transport Servers gestaltet sich sehr einfach. Man braucht einen x64 Server 2008 (am besten R2) in der Standard Edition. Dort wird das .net Framework installiert. Au&szlig;erdem wird ein Verzeichnisdienst ben&ouml;tigt, der Edge Transport Server muss ja wissen welche Empf&auml;nger es im Active Directory gibt. Active Direcotry Lightweight Directory Services (ADLDS), der Nachfolger des ADAM, und die entsprechende Verwaltungskonsole werden also auch installiert.Am schnellsten geht das wohl &uuml;ber die PowerShell:Import-Module ServerManagerAdd-WindowsFeature NET-Framework,RSAT-ADDS,ADLDS &ndash;RestartNach dem Neustart muss noch der Starttyp eines Dienstes ge&auml;ndert werden, auch wieder in der PowerShell:Set-Service NetTcpPortSharing -StartupType AutomaticDer Server ist jetzt soweit vorbereitet, man muss (wenn nicht schon passiert) noch den DNS Suffix der internen Domain (z.B: domain.local) eintragen.Da der Server in der DMZ stehen soll, muss auf der Firewall folgendes konfiguriert werden:DNS: Port 53 (tcp/udp) Richtung interne DNS ServerSMTP:&nbsp;Port 25 (tcp)&nbsp;Richtung interner Hub Transport ServerEdgeSync:&nbsp;Port 50636 (tcp)&nbsp;Richtung interner Hub Transport Server (Replikationspartner)Jetzt kann das Exchange 2010 Setup ausgef&uuml;hrt werden, bei dem die &ldquo;Custom Installation&rdquo; gew&auml;hlt wird und dort nur die Edge Transport Rolle und die Management Tools installiert werden. Die Installation ist schnell abgeschlossen, was jetzt noch ben&ouml;tigt wird ist die Synchronisation zwischen Edge Transport und internem Exchange (HUB) Server. Wichtig: Auf dem Edge Transport Server ist keine Konfiguration (Accepted Domains usw.) n&ouml;tig, diese Einstellungen werden mit der Edge Synchronisierung &uuml;bernommen.Auf dem Edge Transport Server ein neues Subscription File erstellt. Es wird einfach New-EdgeSubscription -FileName \\\"C:\\\\filename.xml\\\" in der EMS eingegeben. Die eben erstellte Datei wird auf den Hub Transport Server &uuml;bertragen, dort wird&nbsp;mit dem selben cmdlet die EdgeSync erstellt. New-EdgeSubscription -FileName \\\"C:\\\\EdgeSubscriptionInfo.xml\\\" -Site \\\"Name-der-AD-Site\\\". Nat&uuml;rlich kann man die EdgeSync auch in der EMC erstellen, dazu in der Organization Configuration die Hub Transport Rolle ausw&auml;hlen, dort auf den Edge Subscription Tab wechseln und New Edge Subscription w&auml;hlen. Jetzt muss noch der Active Directory Standort gew&auml;hlt werden und das xml File angegben werden. Auch hier k&ouml;nnen die Connectoren auf Wunsch automatisch erstellt werden.Wichtig: Der interne Hub Transport Server muss den Edge Transport Server per DNS Name aufl&ouml;sen k&ouml;nnen!Durch die EdgeSync werden die ben&ouml;tigten Connectoren erstellt und die relevanten Einstellungen &uuml;bernommen. So wird z.B. die Konfiguration des Default Recipient Connector sowie die Accepted Domains vom internen Server &uuml;bernommen.Weiterf&uuml;hrend kann ich das Exchange 2010 TechCenter empfehlen.Sehr lesenswert ist auch der Exchange Team Blog, zu finden in der Blogroll.viele Gr&uuml;&szlig;ett\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-edge-subscription/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-get-owavirtualdirectory-access-denied\",\n  \"title\": \"Exchange 2010 – Get-OwaVirtualDirectory Access Denied\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Exchange\"],\n  \"content\": \"Wird Exchange 2010 Server in einer Exchange 2007 Umgebung installiert erscheint folgender Fehler wenn man in der Exchange Management Console unter “Server Configuration” die Client Access Rolle verwalten möchte. “An IIS directory entry couldn't be created. The error message is Access is denied. HResult = -2147024891. It was running the command 'Get-OwaVirtualdirectory'”Den selben Fehler erhält man wenn man in der Exchange Management Shell den Befehl “Get-OwaVirtualDirectory” ausführt, macht die EMC eigentlich auch, nur mit Bild drum herum :).Der Grund dafür ist wohl dass Exchange 2010 keine Berechtigungen auf der entsprechenden Website im IIS auf dem 2007 Client Access Server erhält.Die Lösung: Alle Exchange 2010 Server sollen Mitglied der lokalen Administratoren auf allen Exchange 2007 Servern sein. Also am besten die Gruppe “Exchange Trusted Subsystems” zu den Lokalen Admins auf den Exchange 2007 Server hinzufügen.Alternativ kann man der Gruppe “Exchange Trusted Subsystems” auch Berechtigungen (Full Control) auf der entsprechenden Website (Default Website) im direkt im IIS geben.viele Grüße   tt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-get-owavirtualdirectory-access-denied/\"\n},{\n  \"id\": \"post-dhcp-fehler-1003\",\n  \"title\": \"DHCP Fehler 1003\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Letztens konnte ich auf mehreren meiner Client-PC’s Fehlermeldungen im Eventlog bezüglich fehlerhafter Anmeldungen feststellen:Ereignistyp:&#160;&#160;&#160; Warnung   Ereignisquelle:&#160;&#160;&#160; Dhcp    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 1003    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:25    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****    Beschreibung:    Der Computer konnte die Netzwerkadresse, die durch den DHCP-Server für die Netzwerkkarte mit der Netzwerkadresse ******A98F0 zugeteilt wurde, nicht erneuern. Der folgende Fehler ist aufgetreten:     Das Zeitlimit für die Semaphore wurde erreicht. . Es wird weiterhin im Hintergrund versucht, eine Adresse vom Netzwerkadressserver (DHCP) zu erhalten. Ereignistyp:&#160;&#160;&#160; Fehler   Ereignisquelle:&#160;&#160;&#160; NETLOGON    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 5719    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:33    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****Beschreibung:   Es steht kein Domänencontroller für die Domäne ***** aus folgendem Grund zur Verfügung:     Es sind momentan keine Anmeldeserver zum Verarbeiten der Anmeldeanforderung verfügbar.    Stellen Sie sicher, dass der Computer mit dem Netzwerk verbunden ist, und versuchen Sie es erneut. Wenden Sie sich an den Domänenadministrator, wenn das Problem weiterhin besteht. Als erstes habe ich die DNS Struktur gecheckt. Danach mit den beiden Tools dcdiag und netdiag mehrfach Diagnosen gestartet und ausgewertet. Laut den Diagnosetools war alles OK.    Nach ein wenig Recherche habe ich das Problem entdeckt: Es war der Switch.     Auf den Switch ist das STP Protokoll aktiv. Dieses braucht üblicherweise 30-60 Sekunden um den Switchport von Listening und Learning Status auf Forwarding zu bringen. Da die PC’s schneller starten als der Switchport aktiv ist, kann der PC seine IP nicht erneuern bzw. anfordern.Das Problem kann man umgehen indem man die Client-Switchports auf “PortFast” stellt und somit der Switchport sofort in den Forwarding-Status geht.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/dhcp-fehler-1003/\"\n},{\n  \"id\": \"post-windows-7-usbdvd-download-tool\",\n  \"title\": \"Windows 7 USB/DVD Download Tool\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Microsoft hat nun ein kostenloses Tool zur Verfügung gestellt um einen USB Stick Bootfähig zu machen, die Windows 7 Installationsdateien darauf zu kopieren und damit die Windows 7 Installation durchzuführen.Windows 7 USB/DVD Download ToolDer USB Stick muss mindestens 4 GB groß sein. Wie ein USB Stick manuell für die Installation präpariert werden kann, hat Thomas in einen vorhergehenden Post erklärt.Viel Spaß beim installieren!!    Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-usbdvd-download-tool/\"\n},{\n  \"id\": \"post-microsoft-techday-dezember-2009\",\n  \"title\": \"Microsoft TechDay Dezember 2009\",\n  \"author\": \"dni\",\n  \"tags\": [\"Events\"],\n  \"content\": \"Die jährlichen Microsoft Techdays stehen wieder vor der Tür. Vorgestellt werden folgende Produkte: Office, Sharepoint und Exchange in der Version 2010.   Steffen Krause und Daniel Melanchton präsentieren alle wesentlichen Neuerungen anhand von vielen Demos.Termine:     08.12.2009: Stuttgart    09.12.2009: München    15.12.2009: Düsseldorf    16.12.2009: BerlinZur Anmeldung und Agenda über den LinkGrüße, dn\",\n  \"url\": \"https://onprem.wtf/post/microsoft-techday-dezember-2009/\"\n},{\n  \"id\": \"post-microsoft-hyper-v-server-2008-v1-vs-v2\",\n  \"title\": \"Microsoft Hyper-V Server 2008 V1 vs. V2\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Hyper-V\"],\n  \"content\": \"Der neue Microsoft Hyper-V Server 2008 R2 steht ja nun seit einigen Wochen auf TechNet zum downloaden bereit. Hier erkläre ich nochmal kurz alle Neuerungen.In der folgenden Tabelle werden die Features von Hyper-V V1 und V2 gegenübergestellt. Neu in V2 ist außerdem:   Hochverfügbarkeit und Live-Migration (nettes Feature)    Bis zu 384 virtuelle Maschinen und 512 virtuelle Prozessoren werden unterstützt    Virtuelle Festplatten können ab jetzt im laufenden Betrieb hinzugefügt bzw. entfernt werden. Ein Neustart ist nicht mehr nötig    Für die Netzwerkunterstützung: VMQ, TOE, Jumbo Frames    Möglichkeit von einem Flash-Speicher zu booten Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/microsoft-hyper-v-server-2008-v1-vs-v2/\"\n},{\n  \"id\": \"post-netlogon-fehler-5719-auf-server-(nicht-dc)\",\n  \"title\": \"Netlogon Fehler 5719 auf Server (nicht DC)\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Wenn der Fehler NETLOGON 5719 direkt nach dem starten des Servers (nicht DC) protokolliert wird, bedeutet das folgendes: Die Netlogon-Prozess hat stattgefunden bevor das Netzwerk bereit war und somit standen beim Anmeldeprozess keine Domänencontroller für die Authentifizierung zur Verfügung.Es gibt 2 Möglichkeiten das Problem zu beheben:1) Update des NetzwerkkartentreibersAls allererstes sollte der Netzwerkkartentreiber geupdated werden. In den meisten Fällen erledigt sich das Problem damit. Ich empfehle den Treiber immer von der Support-Webseite des Servers herunterzuladen, nicht vom NIC-Hersteller direkt (Bsp: Server von HP und Netzwerkkarte von Intel). Diese Treiber auf der Support-Webseite des Servers sind getestet und für das System freigegeben.2) Den Netlogon Service zwingen auf das Netzwerk zu wartenWenn der aktuelle Netzwerkkartentreiber nichts bringt, kann man den Netlogon-Prozess so zum warten zwingen:In der Registry muss der Eintrag “TermService” dem Schlüssel “DependOnService” hinzugefügt werden.    HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\NetlogonNachdem der Server neu gestartet wurde, sollte das Problem behoben sein.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/netlogon-fehler-5719-auf-server-(nicht-dc)/\"\n},{\n  \"id\": \"post-windows-7-e28093-update-von-rc-auf-rtm\",\n  \"title\": \"Windows 7 – Update von RC (7100) auf RTM (7600)\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Es ist zwar nicht wirklich empfohlen, gewünscht oder supported aber es geht. Windows 7 RTM Installationsdateien auf einen (vorbereiteten) USB Stick kopieren. In der Datei \\\\Sources\\\\cversion.ini muss der Wert MinClient auf 7100.0 (die entsprechende Build Nr. von der man updaten will) gesetzt werden. Man sollte für so ein Update einige Zeit einplanen, bei mir dauerte es ca. zwei Stunden. Das gilt übrigens auch für unterstützte Updates. Eine normale Windows 7 Installation ist bekanntlich in 20 Minuten abgeschlossen.Ein Update von x86 auf x64 oder umgekehrt lässt sich so natürlich auch nicht machen, dafür ist immer eine neuinstallation nötig. In diesem Post erklärt Daniel nochmal genau welche Updates unterstützt werden.Nochmal: ich empfehle dieses Workaround nicht für produktive Systeme, ich habe mein Notebook so aktualisiert und alles läuft wunderbar, aber es ist wie gesagt kein produktiv genutzter PC.Gruß    tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-update-von-rc-auf-rtm/\"\n},{\n  \"id\": \"post-windows-7-bootloader-os-hinzufugen\",\n  \"title\": \"Windows 7 Bootloader, OS hinzufügen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Der Windows Vista / 7 Bootloader hat sich ja im vergleich zu Windows XP geändert. In den früheren Windows Version konnte man die Datei Boot.ini bearbeiten um den Bootloader zu sagen was er tun soll. Ab der Version Vista nutzt man das Commandline-Tool bcdedit.exe.     Auf meinen Computer habe ich 2 Windows 7 Installationen. Auf C:\\\\befindet sich die erste, die zweite auf der Partition D:\\\\     Da ich das zweite Windows 7 durch den Restore eines Images aufgespielt habe, erscheint dies natürlich nicht automatisch in der Betriebssystemauswahl. Um das zweite Betriebssystem dem Bootloader hinzuzufügen, müssen folgende Schritte durchgeführt werden:1) Commandline mit Administratorrechte öffnen2) Einen neuen Eintrag dem Bootloader hinzufügenbcdedit /create /d “Windows 7 zweite Installation” /application osloader            Nachdem dieser Befehl ausgeführt wurde, bekommen wir eine ID       Bsp: {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395}3) Nun müssen wir den Bootloader noch sagen wo sich das zweite Betriebssystem befindet (D:)bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} device partition=C:      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} osdevice partition=D:4) Nun fügen wir den Pfad für den Bootloader und dem System Root Verzeichnis hinzubcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} path \\\\Windows\\\\system32\\\\winload.exe      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} systemroot \\\\Windows5) Als letztes stellen wir noch die Reihenfolge der Auflistung der Betriebssysteme festbcdedit /displayorder {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} /addlastNoch zur Info: Den Namen, der bei der Betriebssystemauswahl angezeigt wird, könnt ihr mit diesen Command ändern:bcdedit /set {current} description &quot;Windows 7 erste Installation&quot;Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-bootloader-os-hinzufugen/\"\n},{\n  \"id\": \"post-servergespeicherte-ts-profile-fehler-1543\",\n  \"title\": \"Servergespeicherte TS-Profile, Fehler 1543\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Client\",\"Server-2008\",\"Server-2003\"],\n  \"content\": \"Auf meinem Terminalserver-Cluster 2008 habe ich mehrere EventLog Warnungen mit der ID 1543 (User Profile Service) bemerkt. Die Einträge deuten darauf hin, dass das UserProfil nicht synchronisiert werden konnte. Die Einträge konnte man auf allen Servern im TS Cluster finden. Etwas zur Struktur: Als Server setze ich Windows Server 2008 ein, die Server sind auf Hyper-V Servern virtualisiert. Als Speicherort für die Profile benutze ich das DSF Feature von Server 2003 R2.Zuerst dache ich mir, dass es da Probleme mit dem Netzwerk gibt. Eines wollte ich aber noch versuchen bevor ich mit der Analyse des Netzwerkes starte: Windows-Defender.Nachdem ich den Windows-Defender auf allen Terminalservern deaktiviert hatte, konnte das Problem nicht mehr reproduziert werden. Anscheinend blockiert der Windows-Defender bei der Anmeldungen bestimmte Vorgänge, die der Server braucht um das User-Profil herunterzuladen. Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/servergespeicherte-ts-profile-fehler-1543/\"\n},{\n  \"id\": \"post-netzwerkprobleme-lassen-dynamics-absturzen\",\n  \"title\": \"Netzwerkprobleme lassen Dynamics abstürzen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Wie ich in einem meiner letzten Posts versprochen hatte, hier der Post über die Dynamics Netzwerkprobleme.Mein Microsoft Dynamics Server arbeitete immer sehr zuverlässig, das EventLog war frei von den unbeliebten “roten Kreuzen”. Bis an den Tag x, an dem der Dynamics Service seinen Dienst verweigerte und im laufenden Betrieb stoppte. Im EventLog wurden folgende Fehlermeldungen protokolliert: Der Fehler “Error 1450 in module 1..\\\\server.cpp(498) weißt auf zu wenig Server-Ressourcen hin. Dieser Fehler konnte durch die Korrektur nicht optimaler Einstellungen an der Auslagerungsdatei behoben werden.Der Fehler “Error 3 in module 244..\\\\server.cpp(351) weißt auf einen TCP-Fehler hin. Durch die Installation der neuesten Soft- und Firmware der Netzwerkkarte konnte ich das Problem beheben.Nun ist das EventLog wieder sauber und der Server hat bisher seinen Betrieb nicht wieder unterbrochen.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/netzwerkprobleme-lassen-dynamics-absturzen/\"\n},{\n  \"id\": \"post-upgrade-auf-windows-7\",\n  \"title\": \"Upgrade auf Windows 7\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Die beiden Betriebssysteme Windows XP und Vista können durch eine Upgrade-Lizenz auf Windows 7 geupdated werden. Für alle anderen Betriebssysteme braucht es eine Vollversion.Beim Upgrade unterscheiden wir 2 Szenarien:    Custom Install: Das Betriebssystem muss komplett neu installiert werden.    In-Place Upgrade: Das bestehende Betriebssystem kann auf Windows 7 geupdatet werden und übernimmt somit alle vorhandenden Einstellungen bzw. Programme.Anhand dieser Matrix kann man feststellen in welchen Fällen ein In-Place Upgrade möglich ist.&#160; Quelle der Grafik: http://blogs.technet.com/dmelanchthon/Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/upgrade-auf-windows-7/\"\n},{\n  \"id\": \"post-sharepoint-logfiles-verkleinern\",\n  \"title\": \"Sharepoint LogFiles verkleinern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"In letzter Zeit ist mir aufgefallen, dass der freie Speicherplatz auf meinem Sharepoint-Server immer kleiner wird. Nachdem ich mich ein bisschen auf der Partition umgesehen hatte fielen mir die großen LOG Files der Sharepoint Datenbank auf.    Wenn ihr wie ich Sharepoint in den Standardeinstellungen inkl. der Windows Internal Database installiert habt, so legt Sharepoint die Files unter C:\\\\WINDOWS\\\\SYSMSI\\\\SSEE\\\\MSSQL.2005\\\\MSSQL\\\\Data ab.         In meinem Fall hat das Content-Log 8 GB und das Config-Log 5 GB verbraten.         Um die LogFiles nun zu verkleinern muss zunächst SQL Server Management Express installiert werden.Danach muss die Datenbank mit den folgenden Parameter geöffnet werden: \\\\\\\\.\\\\pipe\\\\MSSQL$MICROSOFT##SSEE\\\\sql\\\\query Nachdem die Datenbank geöffnet wurde wählt man die Datenbank aus, deren LogFiles verkleinert werden sollen. Nach einem Rechtsklick auf die Datenbank wählt man Tasks / Verkleinern / DateienNun erscheint das Optionsfenster. Hier muss als Dateityp Protokoll ausgewählt werden. Als Information erhält man hier wie groß das aktuelle LogFile und zu wie viel es belegt ist. Im unteren Bereich kann der Speicherplatz neu organisiert werden. (In meinem Fall 2 GB) Nachdem die Eingaben bestätigt werden, schrumpft das LogFile auf die angegebene Größe zusammen.    Dieser Schritt kann für alle Datenbanken vorgenommen werden, dessen LogFile zu groß ist.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-logfiles-verkleinern/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-dynamic-signature\",\n  \"title\": \"Exchange 2010 – Dynamic Signature\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Ein leidiges Thema mit den bisherigen Exchange und Outlook Versionen war die zentrale Verwaltung von Signaturen. Die meisten Administratoren verwendeten Skripts oder dritthersteller Tools um das Problem einigerma&szlig;en in den Griff zu bekommen.Mit Exchange 2010 stellt Microsoft (endlich) eine M&ouml;glichkeit vor um die Signaturen zentral zu verwalten und dynamisch zu erstellen. Verwendet wird dazu der seit Exchange 2007 bekannte Disclaimer, dieser wurde erweitert und kennt jetzt HTML Tags und Attribute aus dem Active Directory.Konfiguriert wird der Disclaimer in der Hub Transport Rolle auf Organisationsebene. Man erstellt eine neue Transport Rule indem man einfach mit rechts auf den Knoten Hub Transport klickt und &ldquo;New Transport Rule&rdquo; ausw&auml;hlt.Nachdem man Namen und Beschreibung vergeben hat, kann per Filter festgelegt werden f&uuml;r welche Mails diese Regel gelten soll. Mehr Details zu den Filterm&ouml;glichkeiten: Exchange 2010 Transport Rule Predicates.&nbsp;Als Action w&auml;hlt man &ldquo;Append disclaimer text and fallback to action if unable to apply&rdquo;. Dort kann ein beliebiger Text eingegeben werden den man mit HTML Tags formatieren und mit Platzhaltern wie %%DisplayName%% personalisieren kann. Neben dem Text kann man auch die Fallback Action festlegen, d.h. was Exchange mit der Nachricht machen soll wenn der Disclaimer nicht angewendet werden kann. Es gibt drei M&ouml;glichkeiten:wrap: die originale Nachricht wird in einen Anhang gepackt, und der Disclaimer wird in die neue Nachricht eingef&uuml;gt.reject: die Nachricht wird nicht &uuml;bermittelt, der Sender erh&auml;lt ein NDR in dem steht warum die Nachricht nicht &uuml;bermittelt werden konnte.ignore: die Nachricht wird unver&auml;ndert &uuml;bermittelt, es wird kein Disclaimer angeh&auml;ngt.Einige Details noch im Technet: Understanding DisclaimersZum Schluss kann man noch Au&szlig;nahmen definieren, f&uuml;r welche die Regel nicht zutreffen soll:Jetzt fehlt noch der klick auf New und die Regel wird erstellt. Es wird ab jetzt also jedem Mail das den Konditionen entspricht der Disclaimer Text angef&uuml;gt, egal ob es von OWA oder Outlook kommt.Eine endg&uuml;ltige L&ouml;sung stellt diese Funktion nicht dar, denn ein Nachteil des Disclaimers ist dass er am Ende der Nachricht eingef&uuml;gt wird. Antwortet man also auf ein Email so steht die Signatur (Disclaimer) ganz unten, unter dem zitiertem Mail. Alles in allem ist das meiner Meinung nach ein Schritt in die richtige Richtung, allerdings fehlt noch einiges bis zum Ziel.\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-dynamic-signature/\"\n},{\n  \"id\": \"post-fehler-bei-hp-netzwerkkarten-update\",\n  \"title\": \"Fehler bei HP Netzwerkkarten Update\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Zu Abwechslung mal ein Problem aus der HP Welt:Für heute habe ich das Firmware / Treiber Update meiner HP ML 350 G5 Server geplant. Zuerst habe ich mir die neueste Firmware-CD von HP gezogen und diese dann installieren lassen. Alles verlief ohne Probleme.    Danach wollte ich die Treiber updaten und habe bemerkt, dass jede Komponente geupdated wurde, nur der Treiber der Netzwerkkarte (v. 5.0.16.0) nicht.     Das war sehr ärgerlich, denn dieser Treiber war der Wichtigste, denn es gab Netzwerkprobleme mit Microsoft Dynamics. Folgender Fehler wurde ausgegeben: “HP Virtual Bus Device installation requires a newer version. Version 4.6.16.0 is required.”Um den Treiber dennoch installieren zu können, muss zuerst auf die Version 4.6.16.0 geupdated werden, dann kann man erst die neueste Version installieren: Link zum Treiber v4.6.16.0 Grüße, dnPS: Wenn die Netzwerkprobleme mit Dynamics behoben sind, werde ich dazu noch einen Post veröffentlichen. (kleiner Ausflug in die ERP-Software :) )\",\n  \"url\": \"https://onprem.wtf/post/fehler-bei-hp-netzwerkkarten-update/\"\n},{\n  \"id\": \"post-e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung\",\n  \"title\": \"“DATA ENCRYPTION” Fehler bei RDP Verbindung\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2003\",\"Server\"],\n  \"content\": \"Kürzlich hatte ich ein seltsames Problem mit der RDP Verbindung auf einem meiner Server die im Ausland stehen und nur über RDP erreichbar sind.   Jedes Mal wenn ich eine RDP Verbindung starten wollte, erschien die Fehlermeldung, dass ein Netzwerkfehler vorliegt.Im Eventlog wurde ein Fehler protokolliert, dass die RDP-Protokollkomponente “DATA ENCRYPTION” ein Problem verursachte. Glücklicherweise funktionierte der Zugriff durch AdminMagic noch, sodass ich mit der Fehlerbehebung beginnen konnte.Um die RDP Verbindung wieder flott zu bekommen muss folgender Registry-Eintrag gelöscht werden:HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Services\\\\TermService\\\\     Parameters\\\\ CertificateNach einem Neustart des Servers konnte ich mich wieder via RDP auf dem Server verbinden.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung/\"\n},{\n  \"id\": \"post-windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden\",\n  \"title\": \"Windows Server / Hyper-V Server 2008; storflt kann nicht geladen werden\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Nachdem ich alle meine Hyper-V Server 2008&#160; auf SP2 aktualisiert habe, erhalte ich beim Start der Maschinen einen Fehler im Ereignisprotokoll, dass storflt nicht geladen werden konnte. Dieser Fehler ergibt sich aus upgedateten Treibern für den Hypervisor durch SP2 und wird nur auf physischen Maschinen protokolliert. Der Eventlog-Eintrag kann einfach ignoriert werden.Mit dem Befehl sc delete storflt wird der Dienst storflt gelöscht und der Fehler nicht mehr protokolliert. Dies darf jedoch nur für den Windows Server 2008 gemacht werden, nicht für den Hyper-V Server, da dieser den Service für die virtuellen Maschinen braucht.Sollte der Service auf einem Hyper-V Server gelöscht werden, bleibt dieser beim Starten mit einem Bluescreen stehen. Durch die “Letzte bekannte Konfiguration” kann der Server aber wieder gestartet werden.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden/\"\n},{\n  \"id\": \"post-active-directory-verwaltungscenter\",\n  \"title\": \"Active-Directory-Verwaltungscenter\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Mit dem Windows Server 2008 R2 ist ein neues Verwaltungs-Feature hinzugekommen: “Active-Directory-Verwaltungscenter”. Das neue Verwaltungscenter basiert auf der PowerShell v2 was bedeutet, dass jede Aktion im Hintergrund einen PowerShell Befehl startet.     Durch dieses neue Feature soll dem Administrator die tägliche AD-Objektverwaltung vereinfacht werden. Für folgende Aufgaben kann die neue Konsole verwendet werden (Auszug aus technet.microsoft.com)   Erstellen neuer Benutzerkonten oder Verwalten vorhandener Benutzerkonten     Erstellen neuer Gruppen oder Verwalten vorhandener Gruppen     Erstellen neuer Computerkonten oder Verwalten vorhandener Computerkonten     Erstellen neuer Organisationseinheiten und Container oder Verwalten vorhandener Organisationseinheiten     Herstellen von Verbindungen mit einer oder mit mehreren Domänen bzw. Domänencontrollern in derselben Active Directory-Verwaltungscenterinstanz und Anzeigen oder Verwalten der Verzeichnisinformationen für diese Domänen oder Domänencontroller     Filtern von Active Directory-Daten mithilfe der abfragegenerierenden Suche  Die Oberfläche Die Oberfläche wirkt strukturiert und Übersichtlich. Die Suche Häufig verwendete Kriterien lassen sich schnell der Suche hinzufügen. Neuen Benutzer anlegen Einfache Navigation durch die Container&#160;Auf mich wirkt die Oberfläche sehr übersichtlich und durchdacht. Alle Aufgaben lassen sich jedoch nicht abbilden, sodass man auf die Konsole “Active-Directory-Benutzer und Computer” nicht völlig verzichten kann.    Im täglichen AD-gebrauch spricht einer Verwendung der neuen Konsole jedoch nichts dagegen.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/active-directory-verwaltungscenter/\"\n},{\n  \"id\": \"post-language-pack-fur-windows-7\",\n  \"title\": \"Language Pack für Windows 7\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Für Windows 7 in der Enterprise und Ultimate Edition sind die Language Packs nun verfügbar.Im Windows Update Fenster lassen sich die Pakete herunterladen und installieren. Nachdem das Paket heruntergeladen und installiert wurde, kann es in der Systemsteuerung unter “Region und Sprache” bei “Anzeigesprache” aktiviert werden.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/language-pack-fur-windows-7/\"\n},{\n  \"id\": \"post-hyper-v-server-2008-r2-cluster\",\n  \"title\": \"Hyper-V Server 2008 R2 Cluster\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Hyper-V\",\"Server\",\"Server-2008-R2\"],\n  \"content\": \"Da der Hyper-V Server 2008 R2 und der Windows Server 2008 R2 nun RTM sind, habe ich mir den Hyper-V Cluster näher angeschaut.        Für die Simulation habe ich 3 physische Computer verwendet:2 Hyper-V Server 2008 R2   1 Windows Server 2008 R2 (inkl. iSCSI Target)Das zentrale Storage wird über iSCSI angebunden. Dafür verwenden wir den Windows Server 2008 R2.Topologie&#160; Um den Cluster zu erstellen müssen 8 Schritte durchgeführt werden:Schritt 1 Hyper-V Server und Server 2008 R2 auf den 3 Computern installierenDie beiden Hyper-V Server werden mit der Standard-Installation installiert. Der Windows Server 2008 R2 wird zusätzlich zum DC heraufgestuft um die Domäne hyper.local bereit zu stellen.Schritt 2 Firewall deaktivierenFür den Test habe ich auf den 3 Servern die Firewall deaktiviert, um nicht die entsprechenden Ports öffnen zu müssen.Schritt 3 Hyper-V Server in Domäne aufnehmenAls nächstes werden die Hyper-V Server in die Domäne aufgenommen.Schritt 4 Verwaltungstools auf dem Windows Server installierenUm den Cluster später steuern zu können müssen wir 2 Konsolen installieren: Clusterverwaltung und die Hyper-V Tools. Die Konsolen können unter den Features aktiviert werden. Schritt 5 iSCSI Target installieren und konfigurierenAls iSCSI Target Software habe ich das Tool von StarWind verwendet. Nachdem das Programm installiert wurde, kann man sich unter den Benutzernamen “test”, Password “test” anmelden und das Target entsprechen konfigurieren.Am iSCSI Target erstellen wir zunächst 2 virtuelle Volumes. 1 Volume wird als Quorumdatenträger für den Cluster verwendet, das andere als Storage für die VHD’s. Wichtig ist dabei, dass die Option “Allow multiple concurrent iSCSI connections (clustering)” verwendet wird, somit können beide Hyper-V Knoten gleichzeitig auf die Volumes zugreifen.Schritt 6 Hyper-V Server mit den iSCSI Volumes verbindenJetzt muss noch die Verbindung zwischen den Hyper-V Server und dem iSCSI Target hergestellt werden. In der Version R2 des Hyper-V Servers wurde eine grafische Oberfläche für den iSCSI-Initiator hinzugefügt. Der Initiator wird mit den Command iscsicpl gestartet. Nachdem wir zugestimmt haben den iSCSI Dienst zu starten, erhalten wir die Oberfläche wo wir die IP Adresse des iSCSI Targets eintragen und uns zunächst nur mit dem Quorum Volume verbinden.Jetzt muss das Volume noch entsprechend Formatiert werden.Schritt 7 Cluster einrichtenNun können wir den Cluster erstellen. Wir verbinden uns auf die Hyper-V Server und aktivieren mit Option 11 die Failoverclusterfeatures.Nachdem die Features auf beiden Servern aktiviert sind, öffnen wir den Failovercluster-Manager auf dem Windows Server und starten die Clusterkonfiguration.Nachdem wir beide Hyper-V Server für den Cluster angegeben haben, startet die Konfigurationsüberprüfung. Sofern bis hierhin alle richtig Konfiguriert wurde, sollte der Check keine Fehler aufzeigen.&#160; Nachdem der Cluster vollständig erstellt wurde, werden beide Hyper-V Server im Manager angezeigt.Da wir den Quorumdatenträger bereits mit beiden Cluster-Knoten verbunden haben, wurde dieser erkannt und schon als Quorumdatenträger konfiguriert.Jetzt verbinden wir das Storage-Volume mit den beiden Cluster Knoten um auf die VHD’s zuzugreifen. Bevor das Volume benutzt werden kann, muss es noch formatiert werden.    Jetzt aktivieren wir im Failovercluster-Manager die “Cluster Shared Volumes” und erlauben somit gleichzeitigen Zugriff auf die VHD’s. Um nun das Storage-Volume einzubinden, müssen wir es zunächst dem “Speicher” und dann den “Freigegeben Clustervolumes” (Cluster Shared&#160; Volumes) hinzufügen.Sobald Cluster Shared Volumes verwendet werden, kann man auf diese unter C:\\\\ClusterStorage\\\\ zugreifen. Für jedes Volume wird ein eigener “Ordner” erstellt.Schritt 7 Virtuelle Maschine erstellenAls nächstes erstellen wir eine virtuelle Maschine (z.B. Windows XP) und ein virtuelles Netzwerk über die zuvor installierte Hyper-V Konsole auf einem der Hyper-V Server. Die VHD und entsprechende Konfigurationsdatei wird dabei auf dem Storage-Volume erstellt. Wichtig: Die virtuelle Maschine muss mit dem Netzwerkadapter verbunden werden bevor sie hochverfügbar gemacht wird, sonst kann die Maschine nicht auf den anderen Knoten verschoben werden.Schritt 8 Virtuelle Maschine hochverfügbar machenUm die virtuelle Maschine hochverfügbar zu machen, fügen wir einen neuen Dienst hinzu. Dabei muss geachtet werden, dass sich die Maschine im Status beendet oder gespeichert befindet. Ich empfehle die Maschine komplett herunterzufahren um Probleme zu vermeiden. Wir erhalten danach eine Liste mit den virtuellen Maschinen. Nachdem wir die Testmaschine ausgewählt haben, startet die Konfiguration um den Host hochverfügbar zu machen.Die Konfiguration ist soweit abgeschlossen.Test 1 Quick- und Live-MigrationQuick- und Live-Migration sind beides Verfahren um virtuelle Maschine auf einen anderen Knoten zu verschieben.&#160; Mehr Infos (Whitepapers) zu Live- und Quick-MigrationLive Migration    In meinen Test habe ich für die Live-Migration lediglich 1 Ping verloren.&#160;Quick-Migration     Für den Umzug auf den 2. Knoten durch Quick-Migration gingen 9 Pings an die virtuelle Maschine verloren.&#160; Test 2 Ausfall von einem Hyper-V Server simulierenAls 2. Test habe ich den Stromstecker des Hyper-V Servers gezogen, der aktuell die virtuelle Maschine hostet. Der Failovercluster hat nach wenigen Sekunden die virtuelle Maschine auf dem 2. Konten neu gestartet.   Grüße,dn\",\n  \"url\": \"https://onprem.wtf/post/hyper-v-server-2008-r2-cluster/\"\n},{\n  \"id\": \"post-applocker\",\n  \"title\": \"AppLocker\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"In einem meiner letzten Beiträge habe ich kurz über ein paar Neuerungen von Windows 7 berichtet. Mittlerweile habe ich mir das Feature “AppLocker” näher angeschaut:Mit AppLocker kann man den Clientcomputer noch besser schützen, indem man nun sehr viel genauer vorgeben kann welche Anwendungen ein Benutzer ausführen bzw. installieren darf. AppLocker kann über ein Domänen- oder über die lokale-GPO konfiguriert werden.Wie man AppLocker verwendet zeige ich Anhand von folgendem Beispiel: Benutzern ist es nur erlaubt Applikationen auszuführen, die sich unter %Programfiles% und %Windir% befinden. Benutzer die der Gruppe “Not Restr Access” angehören ist es außerdem erlaubt das Testprogramm “Excel Viewer 2003” aus dem Verzeichnis “C:\\\\Program Files 2” zu starten. Als erstes öffnet man das GPO und wechselt zur Option “AppLocker”&#160;Für die Option Executable Rules lassen wir die Standardregeln generieren (“Create default Rules”). Nachdem diese konfiguriert sind, findet man 3 Regeln vor:        1. Admins dürfen alle Programme aufrufen    2. User dürfen Programme aus %Windir% starten    3. User dürfen Programme aus “%Programfiles% starten Jetzt müssen wir eine neue Regel erstellen, die der Benutzergruppe “Not Restr Access” erlaubt unsere Testapplikation zu starten. Über “Create New Rule” wird der entsprechende Wizard gestartet. Wir wählen die Option “Allow” und beziehen die Regel auf die Gruppe “Not Restr Access”. Jetzt haben wir 3 Möglichkeiten. Über die Option Publisher kann ein einzelnes signiertes Programm freigegeben oder gesperrt werden, über die Option Path ein ganzer Pfad und über die Option File Hash eine nicht-signierte Applikation. Im unseren Beispiel wählen wir die Option Publisher, da der Excel Viewer von Microsoft zertifiziert ist. Nachdem die Applikation ausgewählt wurde, kann über einen Schieberegler die Genauigkeit der Prüfung von AppLocker eingestellt werden. (Bsp. AppLocker soll nur den Dateinamen, nicht die Dateiversion prüfen) Wenn nötig können im nächsten Schritt noch Ausnahmen definiert werden. Somit haben wir unsere Regel definiert.Wichtig: AppLocker ist auf einen Dienst angewiesen der aus Sicherheitsgründen nicht automatisch startet. Damit die Einstellungen greifen, muss der Dienst “Application Identity” gestartet werden. Ich empfehle den Dienst solange im Startmodus “Manuell” zu belassen, bis alle Einstellungen passen. Wenn wir jetzt den Test machen, können Benutzer aus der Gruppe “Not Restr Access” problemlos den Excel Viewer starten. Benutzer, die nicht dieser Gruppe angehören, erhalten eine Fehlermeldung. Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/applocker/\"\n},{\n  \"id\": \"post-windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn\",\n  \"title\": \"Windows 7, Server 2008 R2 und Hyper-V Server 2008 R2 in Deutsch auf TechNet/MSDN\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\",\"Server-2008-R2\",\"Hyper-V\"],\n  \"content\": \"Für TechNet bzw. MSDN Abonnenten stehen nun auch die deutschen ISO’s zu Windows 7 bereit. Zeitgleich wurde der Server 2008 R2 und der Hyper-V Server 2008 R2 zum downloaden bereit gestellt.TechNet    MSDNGrüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn/\"\n},{\n  \"id\": \"post-windows-virtual-pc-e28093-undo-und-differencing-disks\",\n  \"title\": \"Windows Virtual PC – UnDo und Differencing Disks\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"In meinem letzen Beitrag über den Windows Virtual PC habe ich die Undo und differenzierenden Festplatten erwähnt, hier die versprochenen Details.UnDo Disks – Snapshots für Virtual PC!?Bei den UnDo Disks handelt es sich um ein Feature das ich in bisherigen Virtual PC Versionen immer vermisste: Man kann den Status einer VM vor einer Änderung sichern und kann auf den Punkt der Sicherung zurückspringen wenn die Änderung nicht so funktioniert wie man sich das vorgestellt hat.UnDo Disks werden in den Einstellungen der VM aktiviert. Die Virtuelle Maschine muss ausgeschaltet (heruntergefahren) sein damit die Option zur Verfügung steht. Beim nächsten Start der VM wird eine .vud Datei erstellt, in dieser werden (wie bei einem Snapshot in der Enterprise Umgebung) ab jetzt&#160; alle Änderungen gespeichert. Die VHD bleibt unverändert. In der Zwischenzeit habe ich um eine Änderung zu simulieren einfach mal ein Programm installiert. Man sieht auch gleich dass die .vud Datei größer wird. Um die Änderungen in die VHD zu übernehmen bzw. diese zu verwerfen muss man die VM wieder schließen (herunterfahren/Ruhezustand) und in den Einstellungen den entsprechenden Punkt auswählen. Ich habe mich entschieden die Änderungen zu verwerfen also wird meine .vud Datei gelöscht. Nach dieser Aktion wird wieder von der VHD gestartet und alles ist so wie es vorher war.     Wenn man Änderungen übernimmt werden diese in die VHD geschrieben.Lässt man die Undo Disk aktiv und startet die Virtuelle Maschine wieder, wird erneut eine .vud Datei erstellt in der alle Änderungen bis zum Übernehmen oder Verwerfen separat gespeichert werden. Um die Undo Disk zu deaktivieren muss die virtuelle Maschine heruntergefahren werden, im Ruhezustand geht das nicht.Insgesamt also ein super Feature, spart einem sicher ‘ne Menge Arbeit.Differencing DisksIm zweiten Beispiel installiere ich mehrere neue VMs in differenzierenden Disks auf Basis einer bereits bestehenden Maschine.Wichtig: Differenzierende Virtuelle Maschinen basieren auf einer bereits installierten VM, wenn ich also für eine Testumgebung mehrere VMs brauche kann ich eine bestehende beliebig oft duplizieren und so Zeit sparen. Ich habe die Quell-VM mit sysprep vorbereitet um Probleme mit gleichen SID und Computernamen zu verhindern. Wichtig ist außerdem dass man die Quell-VHD herunterfährt und auf Schreibgeschützt setzt, denn wenn diese geändert wird sind alle erstellten Differenzierenden Disks ungültig.Update: Wenn man die VMs so dupliziert erhalten alle “Child” VMs die gleiche MAC Adresse. Die einzige Lösung die ich im Moment gefunden habe ist in der .vmc Datei die MAC Adresse zu löschen, dann wird einen neue generiert. Also kann man sagen um die Quell VM richtig vorzubereiten muss man 3 Punkte beachten:   Betriebssystem vorbereiten (sysprep)     Quell VM herunterfahren und VHD als Read-Only markieren     MAC Adresse aus der Konfigurationsdatei der Quell VM löschen     Man erstellt also eine neue VM über den Button “Create virtual machine” und gibt ihr einen Namen. Bei Add Disk wählt man “Create a Virtual Hard Disk using advanced options” und dann “Differencing Hard Disk”. Der neuen HD kann man einen Namen geben und dann muss man die Quell-VHD (parent) angeben. Wenige Sekunden später hat man eine neue VM bei der man nur noch die Windows Einstellungen anpassen muss. Der Vorteil ist dass nicht die ganze Quell-VM kopiert wird, sondern nur der Teil ab dem man die Differenzierende HD erstellt. So spart man neben viel Zeit auch noch einiges an Speicherplatz.viele Grüße!    tt\",\n  \"url\": \"https://onprem.wtf/post/windows-virtual-pc-e28093-undo-und-differencing-disks/\"\n},{\n  \"id\": \"post-windows-virtual-pc\",\n  \"title\": \"Windows Virtual PC\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Mit Windows 7 wurde auch der Windows XP Mode vorgestellt. Dieser basiert auf der neuen Virtualisierungstechnologie Windows Virtual PC.Voraussetzung für die Verwendung des Windows VPC ist dass die CPU Virtualisierungstechnologien unterstützt. Mit diesen Tools kann man überprüfen ob Virtualisierung unterstützt wird: Intel, AMDDie Virtualisierungstechnologien müssen im BIOS noch aktiviert werden, also am besten im Handbuch des Mainboard Herstellers nachschlagen.    Tipp: Bei HP Computern ist die Einstellung unter “Sicherheit” versteckt, nicht unbedingt logisch aber bitte.Auf die Installation des XP-Mode möchte ich nicht weiter eingehen, den kann man sich selbst herunterladen und mit wenigen Klicks installieren.Ich habe die Virtuellen Maschinen selbst installiert und die Integration Features und Auto Publish aktiviert, so kann ich in Windows 7 Programme aus meinen virtuellen Vista und XP Maschinen verwenden. So präsentiert sich der neue Virtual PC, integriert in ein normales Explorer Fenster hat man die Möglichkeit Virtuelle Maschinen und Festplatten zu erstellen, zu bearbeiten oder zu löschen. Durch einen rechtsklick auf die VM kommt man zu den bekannten Einstellungen. Eine neue virtuelle Maschine wird einfach durch klicken auf “Create virtual machine” erstellt, in den folgenden Dialogen wird der Speicherort für VHD und Konfigurationsdateien festgelegt. Im nächsten Dialog kann der Arbeitsspeicher festgelegt werden und Networking für die VM aktiviert oder deaktiviert werden. Abschließend entscheidet man sich für einen VHD Typ (Fix, Dynamisch, Differenzierend) seiner Wahl und klickt auf Create. Ein genauerer Blick lohnt sich auf die Undo Disk Option, bei dieser werden die Änderungen die man in der VM macht in einem separatem File gespeichert. So kann man fehlgeschlagenen Änderungen immer wieder verwerfen. Dazu (und zum Thema Differenzierende Festplatte) gibts einen eigenen Artikel.&#160;Und schon haben wir eine VM erstellt. In den Einstellungen (rechtsklick auf die VM) kann man noch genauere Einstellungen definieren, für mich reicht es aber vorerst das CD Image für die Installation auszuwählen. Wenn man die VM startet wird von “CD” gestartet und die Windowsinstallation beginnt. Hat man das Betriebssystem installiert, sollte man die Integration Features aktivieren (Klick auf Tools, Enable Integration Features). Mit diesen Features kann man Sound, Zwischenablage, Drucker, Smart Cards und die Laufwerke des Lokalen Computers in der VM verwenden.Möchte man außerdem die Programme der VM auf dem physikalischen Computer verwenden muss man noch ein Update Installieren und “Auto publish” in den Einstellungen der VM aktivieren.Update for Windows XP SP3 to enable RemoteApp     Update for Windows Vista SP1 or above to enable RemoteApp Im Startmenü von Windows 7 werden nun die Programme angezeigt die in den Virtuellen Maschinen installiert sind.&#160; Wichtig: Es muss eine Verknüpfung mit dem Programm und All Users/Startmenü erstellt werden, nur dann werden die Programme korrekt angezeigt. Um ein Virtuelles Programm zu starten muss die Virtuelle Maschine geschlossen sein. Wenn sie sich im Ruhezustand befinden wird sie im Hintergrund automatisch gestartet.viele Grüße!   tt\",\n  \"url\": \"https://onprem.wtf/post/windows-virtual-pc/\"\n},{\n  \"id\": \"post-bitlocker-to-go\",\n  \"title\": \"BitLocker To Go\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Mit BitLocker To Go lassen sich lokale / externe Datenträge sowie USB Sticks einfach verschlüsseln. Eine neue Funktion ist zudem, dass die Partition bzw. das Laufwerk nicht nur verschlüsselt, sondern auch mit Passwort geschützt wird. Die Verschlüsselungsstärke kann über eine GPO von 128 auf 256 Bit erhöht werden.Um den mit BitLocker verschlüsselten Datenträger auf Windows Vista bzw. XP verwenden zu können muss der Datenträger zwingend mit FAT formatiert sein. In diesem Legacy-Modus kann mit Vista und XP auf dem Datenträger nur gelesen, nicht geschrieben werden.Anleitung um BitLocker To Go zu aktivieren1) Datenträger mit FAT formatieren   2) BitLocker für den Datenträger aktivieren 3) Art des Schutzes wählen (Passwort oder Smart Card) 4) Nun muss gewählt werden, in welcher Form der Wiederherstellungsschlüssel&#160; gespeichert wird. Der Wiederherstellungsschlüssel dient dazu den Datenträger zu entschlüsseln, sollte man das Passwort vergessen haben. Man hat hier 2 Möglichkeiten: Den Key speichern oder drucken.5) Nun kann das Laufwerk verschlüsselt werden Windows 7    Steckt man den Datenträger nun in den Windows 7 Computer, so erscheint folgende Passwortabfrage bevor auf dem Datenträger lesen und schreiben werden kann. Windows Vista bzw. XP     Steckt man den Datenträger in einem Vista oder XP Rechner startet das “BitLocker To Go-LeseTool”. Nach Eingabe des Passwortes kann auf dem Datenträger gelesen werden.&#160;Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/bitlocker-to-go/\"\n},{\n  \"id\": \"post-windows-7-sicherheitsproblem-in-uac\",\n  \"title\": \"Windows 7 - Sicherheitsproblem in UAC\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Auf diversen Blogs ist zu lesen dass es ein Problem mit der Benutzerkontensteuerung (UAC, User Account Control) in Windows 7 gibt. Das habe ich mir gestern kurz angesehen und hier ist das Ergebnis. (getestet mit Windows 7 RC, 7100)Es war möglich mit dem Tool von Leo Davidson ein beliebiges Programm mit administrativen Rechten zu starten ohne eine UAC abfrage hervorzurufen. Aber ich musste Mitglied einer Gruppe mit administrativen Rechten sein (z.B. Administratoren), als normaler User funktionierte es nicht. Wenn man also mit in der UAC nur noch “Ja ich will&quot; klicken müsste, dann kann man sie mit dem Code Injection Issue umgehen, wird ein Passwort abgefragt funktioniert das Ganze anscheinend nicht.Meiner Meinung nach handelt es sich hier also um ein Problem, jedoch ist es in meinen Augen nicht so dramatisch. Im Enterprise Umfeld sollte eh kein User Mitglied in administrativen Gruppen sein und zu Hause wird man wohl kaum (gewollt) seinen eigenen PC abschießen. Trotzdem sollte sich Microsoft das Problem zu Herzen nehmen, denn der Entwickler hat es genau Dokumentiert und laut eigenen Angaben MS schon seit längerem informiert.Links zu Artikeln Rund um dieses Thema:Long Zheng 1, 2, Video    Leo Davidsonviele Grüße   tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-sicherheitsproblem-in-uac/\"\n},{\n  \"id\": \"post-windows-7-neuerungen-auf-den-ersten-blick\",\n  \"title\": \"Windows 7 Neuerungen auf den ersten Blick\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Benutzeroberfl&auml;che Was einem sofort ins Auge sticht ist die v&ouml;llig &uuml;berarbeitete Oberfl&auml;che. Ge&ouml;ffnete Programme scheinen als Icons in der Taskleiste auf und genehmigen Einblicke auf die ge&ouml;ffneten Fenster.WLAN Auf der rechten Seite der Taskleiste findet sich eine &Uuml;bersicht der verf&uuml;gbaren Drahtlosnetzwerke. Die Verbindungen lassen sich mit einen klick auf Connect z&uuml;gig herstellen.BitLocker to Go Mit dieser Erweiterung von BitLocker lassen sich Wechseldatentr&auml;ger verschl&uuml;sseln. Somit sind auch Daten die unterwegs mitgenommen werden gesch&uuml;tzt. Einfach den USB Stick anschlie&szlig;en und im BitLocker Men&uuml; die Verschl&uuml;sselung aktivieren.&nbsp;Oberfl&auml;che Die Verwaltung zu Oberfl&auml;chenanpassung wurde sehr viel &Uuml;bersichtlicher gestaltet. Neue Styles lassen sich einfach ausw&auml;hlen und aktivieren.Media Center + Media Player 12 Das Media Center wurde &uuml;berarbeitet. Die Men&uuml;s sind klarer strukturiert und die Konfiguration l&auml;sst sich in wenigen Schritten beenden.Der Media Player hat auch ein neues Gesicht bekommen. Die Multimedia-Unterst&uuml;tzung wurde durch zus&auml;tzliche Codes f&uuml;r langsame Systeme optimiert.Die Installation vom USB Stick hat keine halbe Stunde gedauert und schon war Windows 7 betriebsbereit. Auf den ersten Blick macht Windows 7 RTM einen sehr guten Eindruck. Was das Betriebssystem in Sachen Performance und Alltagstauglichkeit leisten kann wird sich in den n&auml;chsten Wochen zeigen. Es wird sicher noch der ein oder andere Post von Thomas und mir diesbez&uuml;glich erscheinen.Gr&uuml;&szlig;e, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-neuerungen-auf-den-ersten-blick/\"\n},{\n  \"id\": \"post-remoteapp-mit-zertifikat\",\n  \"title\": \"RemoteApp mit Zertifikat\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\",\"Server-2008\"],\n  \"content\": \"Die Sicherheit von RemoteApp Programmen kann erh&ouml;ht werden indem die Echtheit des Servers mit einem Zertifikat best&auml;tigt wird. Daf&uuml;r habe ich ein Computerzertifikat f&uuml;r den Terminal Server ausgestellt der die RemoteApp Programme hosted. Das ausgestellte Zertifikat muss nat&uuml;rlich g&uuml;ltig sein, d.h. Datum und Namen m&uuml;ssen stimmen und die ausstellende CA (Enterprise CA in meinem Fall) muss vertrauensw&uuml;rdig sein.&nbsp;Um RemoteApp Programme mit Zertifikaten zu signieren muss man nicht wie bei den Makros (wie Daniel schreibt) eine Richtlinie f&uuml;r Softwareeinschr&auml;nkung erstellen, sondern man erstellt ein GPO in dem man den Fingerabdruck des Zertifikates zu den Vertrauensw&uuml;rdigen RDP-Herausgebern hinzuf&uuml;gt. Die entsprechende Einstellung findet sich als Computer oder Benutzerkonfiguration unter:Administrative Vorlagen/Windows-Komponenten/Remote Desktop Services/Remotedesktopverbindungs-Client/SHA1-Fingerabdr&uuml;cke von Zertifikaten angeben, die vertrauensw&uuml;rdige RDP-Herausgeber darstellenSo wird die Identit&auml;t des Remotecomputers verifiziert und beim verbinden erh&auml;lt der Benutzer keine Abfrage ob er dem Herausgeber auch wirklich vertraut.\",\n  \"url\": \"https://onprem.wtf/post/remoteapp-mit-zertifikat/\"\n},{\n  \"id\": \"post-doch-kein-windows-7-e\",\n  \"title\": \"Doch kein Windows 7 E\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Nachdem man schon ein paar Tage etwas dar&uuml;ber lesen konnte scheint es nun fix zu sein: Windows 7 kommt mit Internet Explorer f&uuml;r alle, also kein \\\"E\\\" Version f&uuml;r den europ&auml;ischen Markt.Alle die&nbsp;Windows 7 E Vorbestellt haben werden eine Vollversion des jeweiligen Produktes erhalten.Als alternative wird vermutlich eine Browserauswahl beim Start von Windows 7 zur Verf&uuml;gung stehen, so kann der Benutzer sich f&uuml;r seinen bevorzugten Browser entscheiden.Der gr&ouml;&szlig;te Vorteil dieser Aktion ist wohl die Upgrade Funktion die nun auch f&uuml;r uns Europ&auml;er verf&uuml;gbar ist. So kann man von Windows Vista bequem updaten ohne seine Einstellungen zu verlieren. F&uuml;r Windows XP wird es keine Upgrade Funktion geben, man kann jedoch eine g&uuml;nstigere Upgrade Version kaufen und diese installieren.Hier&nbsp;gehts zum Artikel von Daniel Melanchthon wo man genaueres nachlesen kann.\",\n  \"url\": \"https://onprem.wtf/post/doch-kein-windows-7-e/\"\n},{\n  \"id\": \"post-windows-7-joint-launch-roadshow\",\n  \"title\": \"Microsoft Roadshow zu neue Produkte\",\n  \"author\": \"dni\",\n  \"tags\": [\"Events\"],\n  \"content\": \"Microsoft startet Roadshow zu Windows 7, Windows Server 2008 R2, Exchange Server 2010 in f&uuml;nf deutsche St&auml;dte.Steve Ballmer selbst wird in M&uuml;nchen die neuen Produkte vorstellen.Eventtermine07. Oktober 2009 ICM M&uuml;nchen 18. November 2009 Maritim Airport Hotel Hannover20. November 2009 Swiss&ocirc;tel D&uuml;sseldorf23. November 2009 Congress Center Frankfurt am Main25. November 2009 Stadthalle KarlsruheMehr zum Event Agenda Anmeldung Gr&uuml;&szlig;e, dnDanke an Daniel f&uuml;r die Info. \",\n  \"url\": \"https://onprem.wtf/post/windows-7-joint-launch-roadshow/\"\n},{\n  \"id\": \"post-windows-home-server-pp3-(beta)-e28093-windows-7\",\n  \"title\": \"Windows Home Server PP3 (Beta) – Windows 7\",\n  \"author\": \"tto\",\n  \"tags\": [\"Home-Server\",\"Client\"],\n  \"content\": \"Mit dem Power Pack 3 wird Windows 7 besser in den Home Server integriert und man hat folgende Vorteile:   Backup &amp; Restore von Clients mit Windows 7     bessere Integration in das Windows 7 Media Center     Integration in die Bibliotheken (Libraries) von Windows 7     Verbesserungen der Suche     Besserer Support von Netbooks  Um die Beta Version des neuen Power Packs herunterzuladen muss man sich auf der Microsoft Connect Seite Registrieren.Nach dem Download erhält man ein Verzeichnis dass drei Updates, die Release Dokumentation und jeweils eine Batch Datei für Installation und Deinstallation beinhaltet. Die Batch Datei macht nichts anderes als der Reihe nach folgende Updates zu installieren: (es empfiehlt sich die Verwendung der Batch Datei, so erspart man sich einige Reboots :)).   WindowsSearch-KB940157-Srv2K3-x86-enu.exe (Installiert Windows Search 4.0)     WindowsServer2003.WindowsXP-KB969949-x86-ENU.exe (Hotfix für Windows Search 4.0 und WHS)     WHS-KB968349-v1-x86-ENU.exe (WHS Power Pack 3)  Nach der Installation wird der WHS Connector auf den Clients automatisch aktualisiert. Die neuen Features sind nach dem Update verwendbar. Für die Integration in das Media Center muss man den Media Center Connector (Start Menü) ausführen. Nach einem Neustart sind die Bibliotheken des WHS im Media Center verfügbar. Wann die endgültige Version des Power Pack 3 verfügbar sein wird ist noch nicht bekannt, man spekuliert auf eine Veröffentlichung zeitgleich mit Windows 7, also vermutlich im Oktober.Viele Grüße!\",\n  \"url\": \"https://onprem.wtf/post/windows-home-server-pp3-(beta)-e28093-windows-7/\"\n},{\n  \"id\": \"post-server-logs-in-sql-datenbank-importieren\",\n  \"title\": \"Server Logs in SQL Datenbank importieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Security\",\"SQL\"],\n  \"content\": \"Als ich letztens die &Uuml;berwachungsrichtlinien der Dom&auml;ne &uuml;berarbeitet habe, sind mir mehrfach fehlgeschlagene &ldquo;Objektzugriffe&rdquo; von Clients aufgefallen, die versuchten in Bereiche einzudringen, f&uuml;r die sie keine Berechtigung haben. Da das EventLog am Server jedoch kein dauerhafter Speicher f&uuml;r Log Files und f&uuml;r Auswertungen relativ umst&auml;ndlich ist, schreibe ich die Logs in eine SQL Datenbank. Anschlie&szlig;end werden die Daten so bereinigt, dass nur noch Ereignisse des Typs &ldquo;Objektzugriff&rdquo; enthalten sind.Wie ich dabei vorgegangen bin erkl&auml;rt dieser BeitragSchritt 1 &ndash; SQL Server installieren Als erstes habe ich mir einen neuen Server auf meiner Hyper-V Umgebung bereitgestellt und auf diesen dann Microsoft SQL Server 2008 installiert.Schritt 2 &ndash; Tabellen erstellenUm meine EventLogs zu speichern habe ich 2 gleiche Tabelle erstellt. Eine f&uuml;r das tempor&auml;re Speichern der EventLogs (&ldquo;tblTMPLog&rdquo;) und eine f&uuml;r das dauerhafte Speichern (&ldquo;tblSecurityObject&rdquo;). Die tempor&auml;re Tabelle wird deshalb verwendet, da die Daten vor dem eigentlichen Speichern noch bereinigt werden.Schritt 3 &ndash; EventLogs exportierenUm die Event Logs vom Server zu exportieren hilft uns das Tool &ldquo;DUMPEVT&rdquo;. Es exportiert Logs vom Server und schreibt sie in ein File. Die Logs werden dabei vom Server nicht gel&ouml;scht. Auch merkt sich das Tool welche Logs vom Server schon exportiert wurden, sodass ein Mehrfach-Export nicht passieren kann.DUMPEVT habe ich heruntergeladen, und unter C:\\\\DUMPEVT entpackt.Nun kann man sich schon von der Befehlszeile Logs vom Server holen&ldquo;C:\\\\DUMPEVT\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\DUMPEVT\\\\evtlog.csv /computer=localhostDie Logs werden wie angegeben in die Datei evtlog.csv geschriebenEs ist auch m&ouml;glich DUMPEVT vom SQL Server aus zu steuern. Daf&uuml;r muss als erstes das Feature &ldquo;xp_cmdshell&rdquo; aktiviert werden (sofern nicht nicht geschehen).Mit den folgenden Code kann man sich dann die Logs holenmaster..xp_cmdshell 'C:\\\\DUMPEVT\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\DUMPEVT\\\\evtlog.csv /computer=localhost'Schritt 4 &ndash; Logs in die SQL Datenbank importierenUm die Logs in SQL zu importieren wird zun&auml;chst die tempor&auml;re Tabelle gel&ouml;scht und dann &uuml;ber den BULK INSERT Befehl eingelesen.DELETE FROM tblTMPLog BULK INSERT tblTMPLog FROM 'c:\\\\dumpevt\\\\evtlog.csv' WITH (FIELDTERMINATOR = ',')Schritt 5 &ndash; Tabelle bereinigenWenn ich jetzt ein SELECT * FROM tblTMPLog ausf&uuml;hre, erhalte ich folgende Ausgabe:Um die Daten zu bereinigen, entferne ich alle Ereignisse, die nicht die Kategorie &ldquo;Objektzugriff&rdquo;, ID &ldquo;560&rdquo; aufweisen. Im Field Data werden Sonderzeichen entfernt, die vom Export des Logs entstanden sind.DELETE FROM tblTMPLog WHERE NOT Category = 'Objektzugriff' DELETE FROM tblTMPLog WHERE NOT EventID = '560' Update tblTMPLog Set Data = Replace(Data, ' ', '') Update tblTMPLog Set Data = Replace(Data, '^', '') Update tblTMPLog Set Data = Replace(Data, '`', '')Schritt 6 &ndash; Tempor&auml;re Tabelle &uuml;bertragenNachdem die Daten bereinigt wurden, kann die tempor&auml;re Tabelle in die fixe Tabelle &uuml;bertragen werden. Wenn n&ouml;tig, kann man sich an dieser Stelle die Daten noch ein wenig zurechtr&uuml;cken.Bsp: Nur die Information &ldquo;Objektname&rdquo; wird f&uuml;r das Field Data &uuml;bertragen.&nbsp; &nbsp;&nbsp; UPDATE tblSecurityObject SET Data = SUBSTRING(Data,CHARINDEX('Objektname:', Data)+12,CHARINDEX('Handlekennung:', Data) - CHARINDEX('Objektname:', Data)-12) WHERE CHARINDEX('Objektname:', Data) &gt; 0Schritt 7 &ndash; AuswertungNachdem die Daten sich auf dem SQL Server befinden, kann man diese entsprechend sauber auswerten und speichern.Bsp: Programm in C# um die SQL Daten anzuzeigen&nbsp;Viel Spa&szlig; beim importieren und auswerten, dn- Vielen Dank an Robert van den Berg, der in seinem Blog das Thema bereits &auml;hnlich behandelt hat -\",\n  \"url\": \"https://onprem.wtf/post/server-logs-in-sql-datenbank-importieren/\"\n},{\n  \"id\": \"post-mehrere-externe-ipe28099s-am-isa-server\",\n  \"title\": \"Mehrere externe IP’s am ISA Server\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Security\"],\n  \"content\": \"Stellt euch folgende Situation vor:Ihr habt einen ISA Server als Firewall und mehrere öffentliche IP Adressen zur Verfügung. Die Adressen werden dem externen Interface des ISA Servers zugewiesen.    Beispiel:200.200.200.1 –&gt; VPN   200.200.200.2 –&gt; OWA    200.200.200.3 –&gt; Veröffentlichte Webseite    200.200.200.4 –&gt; SonstigesDer MX-Reccord der Domäne leitet Mails der IP Adresse 200.200.200.2 weiter. Von der 200.200.200.2 werden die Mails dem internen Mailserver zugestellt. Der Zielverkehr für das externe Netzwerk wird über die erste IP Adresse am externen Interface geleitet. Folglich wird Internetverkehr, sowie Mails über die öffentliche IP 200.200.200.1 geleitet (nach Standardkonfiguration).Wenn eurer Mailserver selbst die DNS-Auflösung vornimmt und Mails dem Ziel zustellt, tut er das mit der 200.200.200.1Mailserver führen vermehrt ein Reverse-DNS-Lookup durch, um den Versender zu verifizieren. In dieser Konfiguration stellt das aber ein Problem dar, da die Mails über die 200.200.200.1 versendet werden, der MX aber auf die 200.200.200.2 zeigt. Folglich kann es passieren, dass Mails nicht angenommen werden oder man landet gleich direkt auf der Blacklist.Um dieses Problem zu beheben hat man 2 Möglichkeiten:   Mails über einen Smarthost senden    Die öffentliche IP Adresse des Mail Servers am externen Interface des ISA Servers als erste Adresse eintragen &#160;ISA Server unterstützt bis jetzt (aktuelle Version 2006) nicht die Anbindung mehrerer öffentlicher IP Adressen.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/mehrere-externe-ipe28099s-am-isa-server/\"\n},{\n  \"id\": \"post-ein-paar-infos-zu-e2809cdirectaccesse2809d\",\n  \"title\": \"Ein paar Infos zu “DirectAccess”\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008-R2\",\"Client\",\"Server\"],\n  \"content\": \"Mit Windows 7 und Windows Server 2008 R2 kommt ein neues Remote-Verbindungs-Feature: DirectAccess. DirectAccess ist der traditionellen VPN Verbindung sehr ähnlich, bietet jedoch entscheidende Vorteile: Clientcomputer initiieren automatisch eine gesicherte Verbindung zum Ziel. Somit bedarf es keinen Eingriff des Users, denn er ist sofort mit dem Zielnetzwerk verbunden. DirectAcces baut eine IPv6 Verbindung zum DirectAccess Server auf. Sollte die Firewall den IPv6 Verkehr blocken, so wird IP over HTTPS verwendet. Somit kann also jede Firewall mit geöffneten Web-Ports passiert werden.Man kann DirectAccess in 3 verschiedene Modi betreiben:   Full Intranet Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt     Selected Server Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt. Die Verbindung vom Clientcomputer zum internen Netzwerk ist authentifiziert     End-to-End Access: Die Verbindung vom Clientcomputer über das Internet zum internen Netzwerk ist verschlüsselt und authentifiziert   Ein weiterer Vorteil bezieht sich auf das Patch- und Richtlinienmanagement. Befindet sich der Client mehrere Wochen nicht im internen Netzwerk, könnte es unter Umständen sein, dass er in dieser Zeit keine Updates vom Server bezieht. Mit DirectAccess ist der Client ständig in Verbindung mit den internen Servern und kann Updates sowie die aktuellen GPO’s beziehen.Um DirectAccess benutzen zu können ist zwingend Windows 7, Windows Server 2008 R2 und eine PKI nötig. Der Client muss außerdem der Domäne angehören.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/ein-paar-infos-zu-e2809cdirectaccesse2809d/\"\n},{\n  \"id\": \"post-windows-7-e28093-nativer-vhd-support\",\n  \"title\": \"Windows 7 – Nativer VHD Support\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Das neue Windows kann von Haus aus VHDs als Festplatten einbinden. So kann man sich z.B. ein Testsystem installieren ohne die Festplatt partitionieren zu m&uuml;ssen.Virtuelle Festplatten k&ouml;nnen direkt in der Datentr&auml;gerverwaltung erstellt werden (rechtsklick auf Datentr&auml;gerverwaltung, neue virtuelle Festplatte).Will man Windows 7 auf der zu erstellenden VHD installieren muss man die Festplatte mit fester Gr&ouml;&szlig;e erstellen.&nbsp;Windows 7 von einem beliebigem Installationsmedium (USB Stick, DVD) starten und mit Shift-F10 eine Eingabeaufforderung starten. Jetzt muss man die vorhin erstellte VHD mit diskpart einbinden. Dazu wird die VHD mit selet vdisk file=c:\\\\pfad\\\\zur\\\\datei.vhd ausgew&auml;lt und mit attach vdisk angebunden.Die Installation von Windows 7 kann jetzt normal fortgesetzt werden, die Warnung dass Windows auf einer virtuellen Festplatte nicht installiert werden kann, ignoriert man einfach.mfg tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-nativer-vhd-support/\"\n},{\n  \"id\": \"post-windows-7-e28093-installation-mit-usb-stick\",\n  \"title\": \"Windows 7 – Installation mit USB Stick\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Windows 7 kann von einem USB Wechseldatentr&auml;ger aus installiert werden. So kann es problemlos auf Netbooks und anderen Ger&auml;ten ohne ein optisches Laufwerk installiert werden. Ich verwende eigentlich immer diese Variante da USB Sticks in der Regel schneller sind als DVD Laufwerke.Um den USB Stick vorzubereiten verwendet man das Programm diskpart (standartm&auml;&szlig;ig installiert). Diskpart wird in einer Eingabeaufforderung mit administrativen Rechten gestartet.Wenn Diskpart gestartet wurde \\\"list disks\\\" ausf&uuml;hren, um die installierten Laufwerke anzuzeigen.Mit \\\"select disk\\\" wird der USB Stick ausgew&auml;hlt, dann wird er mit \\\"clean\\\" gel&ouml;scht (ACHTUNG: Alle Daten auf dem Stick gehen verloren)Jetzt wird mit \\\"create partition primary\\\" eine Prim&auml;re Partition erstellt die mit \\\"active\\\" als Aktiv gesetzt wird (damit das BIOS davon booten kann). Jetzt fehlt noch das Dateisystem das mit \\\"format fs=fat32 quick\\\" festgelegt wird. Mit \\\"assign\\\" wei&szlig;t man noch einen Laufwerksbuchstaben zu.Dieser Prozess kann auch &uuml;ber GUI ausgef&uuml;hrt werden, wichtig ist nur dass am Ende eine prim&auml;re, aktive Fat32 Partition auf dem USB Stick vorhanden ist.Zu Schluss kopiert man noch alle Daten von der Windows 7 DVD auf den USB Stick. So erstellt man einen Bootf&auml;higen Stick, man muss nur noch dem BIOS beibringen davon zu starten und schon kann Windows installiert werden.Genauere Details zu Diskpart gibts im entsprechenden KB Artikel.\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-installation-mit-usb-stick/\"\n},{\n  \"id\": \"post-msat-deckt-schwachstellen-in-der-it-umgebung-auf\",\n  \"title\": \"MSAT deckt Schwachstellen in der IT Umgebung auf\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Microsoft bietet das kostenlose Tool MSAT (Microsoft Security Assessment Tool) Unternehmen an, ihre IT-Sicherheitsumgebung zu bewerten. Als erstes wird der aktuelle Stand der IT-Sicherheit ermittelt, das Tool gibt eine nach Priorität geordnete Liste mit Problemen und Verbesserungsmöglichkeiten aus.Folgende Features sind im Tool enthalten:   Einfach zu verwendende, umfassende und kontinuierliche Sicherheitsinformationen     Ein Defense-in-Depth-Framework mit branchenbezogener vergleichender Analyse     Detailliertes, kontinuierliches Reporting mit Vergleich von Ausgangsbasis und Fortschritt     Empfehlungen und nach Priorität geordnete Maßnahmen zur Verbesserung der Sicherheit     Strukturierte Anleitungen von Microsoft und anderen Branchenvertretern   Downloaden kann man das Tool hierGrüße, dn\",\n  \"url\": \"https://onprem.wtf/post/msat-deckt-schwachstellen-in-der-it-umgebung-auf/\"\n},{\n  \"id\": \"post-windows-7-e28093-rtm-verfugbarkeit\",\n  \"title\": \"Windows 7 – RTM Verfügbarkeit\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Wie im Windows 7 Team Blog zu lesen ist steht nun das RTM Datum fest.Die wichtigsten Daten im Überblick:   MSDN &amp; Technet ab 6. August&#160;    Volume License mit SA ab 7. August    Volume License ohne SA ab 1. September    Microsoft Partner Network Portal ab 16. August    Microsoft Action Pack ab 23. August Bei diesen Daten handelt es sich um die englischen Versionen, andere Sprachen folgen am 1. Oktober und in den Regalen steht Windows 7 ab 22. Oktober.viele Grüße    tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-rtm-verfugbarkeit/\"\n},{\n  \"id\": \"post-zertifikat-fur-makros-der-domane-bereitstellen\",\n  \"title\": \"Zertifikat für Makros der Domäne bereitstellen\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Letzens habe ich mir vorgenommen alle von mir geschriebenen Makros digital zu signieren, sodass die User beim Öffnen der Dateien keine Abfragen bekommen ob sie den Code aktivieren möchten oder nicht. Um einen Makro digital zu signieren und das Zertifikat der Domäne zur Verfügung zu stellen bedarf es mehrerer Schritte:    Zertifikatdienste auf einem Server installieren     Zertifikat zur Codesignatur ausstellen     Makros digital signieren und die Office-Files ablegen  Nun muss nur mehr das Zertifikat den Usern bereit gestellt werden. Wenn man das mit einem GPO macht, muss darauf geachtet werden, dass man die Einstellungen für Computer vornimmt. Das Zertifikat muss als erstes unter die Vertrauenswürdigen Stammzertifizierungsstellen Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Vertrauenswürdige Stammzertifizierungsstellen  Bis hierher wird das Zertifikat in den lokalen Zertifikat-Speicher “Vertrauenswürdigen Stammzertifizierungsstellen” geschoben. Das Zertifikat muss aber noch in den Speicher für “Vertrauenswürdige Herausgeber”, sonst erscheinen weiterhin Abfragen. Um das Zertifikat da rein zubekommen muss im vorher konfigurierten GPO eine neue “Richtlinie zur Softwareeinschränkung” erstellt werden. Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Richtlinien für Softwareeinschränkung Danach muss unter “Zusätzliche Regeln” eine neue Zertifikatsregel mit den entsprechenden Zertifikat erstellt werden. Wichtig dabei ist, dass die Sicherheitsstufe “Nicht eingeschränkt” lautet. Nun wird das Zertifikat an alle Computer unter dem GPO verteilt. Alle digital signierten Makros werden ohne Abfrage ausgeführt.\",\n  \"url\": \"https://onprem.wtf/post/zertifikat-fur-makros-der-domane-bereitstellen/\"\n},{\n  \"id\": \"post-delta-crl-e2809cunable-to-downloade2809d-iis-7\",\n  \"title\": \"Delta CRL “Unable to Download” IIS 7\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Erstmal herzlich willkommen in unserem Blog ;)und zweitens ein Problemchen &uuml;ber das ich in dieser Woche gestolpert bin: IIS 7 blockiert aus Sicherheitsgr&uuml;nden sogenannte Double-Escape Sequenzen (\\\"+\\\" \\\"-\\\"). Da die Delta CRL jedoch standardm&auml;&szlig;ig ein \\\"+\\\" im Namen hat schl&auml;gt der Download fehl. M&ouml;chte man die CRL's bzw. Delta CRL's in seiner PKI &uuml;ber http ver&ouml;ffentlichen kann man sich durch abschalten dieser Sicherheitsfunktion f&uuml;r die betreffenden Virtual Directories helfen:%windir%\\\\system32\\\\inetsrv\\\\appcmd.exe set config \\\"Default Web Site/virtual Directory\\\" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true \\\"virtual Directory\\\" entspricht dem Virtuellen Verzeichnis in dem die Delta CRL ver&ouml;ffentlicht wird.hier der entsprechende KB Artikel: http://support.microsoft.com/kb/942076mfg tt\",\n  \"url\": \"https://onprem.wtf/post/delta-crl-e2809cunable-to-downloade2809d-iis-7/\"\n},{\n  \"id\": \"post-drucken-mit-internet-explorer-8-nicht-mehr-moglich\",\n  \"title\": \"Drucken mit Internet Explorer 8 nicht mehr möglich\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Letztens hatte ich das Problem, dass mein Internet Explorer plötzlich das Drucken verweigerte. Auch ist mir aufgefallen, dass das „Info-Fenster“ nur mehr ein weißes Fenster zeigte. Es scheint Probleme zu geben, wenn zum Internet Explorer 8 der „Microsoft Software Inventory Analyzer“ installiert wird. Deinstallation des Analyzers hat das Problem behoben. \",\n  \"url\": \"https://onprem.wtf/post/drucken-mit-internet-explorer-8-nicht-mehr-moglich/\"\n},{\n  \"id\": \"post-willkommen\",\n  \"title\": \"Willkommen\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Willkommen im Blog von ntSystems – info.tech\",\n  \"url\": \"https://onprem.wtf/post/willkommen/\"\n},{\n  \"id\": \".well-known-lnurlp-tto\",\n  \"title\": \"Tomt\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{    \\\"status\\\":\\\"OK\\\",    \\\"tag\\\":\\\"payRequest\\\",    \\\"commentAllowed\\\":255,    \\\"callback\\\":\\\"https://getalby.com/lnurlp/tomt/callback\\\",    \\\"metadata\\\":\\\"[[\\\\\\\"text/identifier\\\\\\\", \\\\\\\"tomt@getalby.com\\\\\\\"], [\\\\\\\"text/plain\\\\\\\", \\\\\\\"Sats for tto\\\\\\\"]]\\\",    \\\"minSendable\\\":1,    \\\"maxSendable\\\":1000000000,    \\\"payerData\\\":    {        \\\"name\\\":{\\\"mandatory\\\":false},        \\\"email\\\":{\\\"mandatory\\\":false}    }}\",\n  \"url\": \"https://onprem.wtf/.well-known/lnurlp/tto\"\n},{\n  \"id\": \"404\",\n  \"title\": \"404\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"404Page not found :(The requested page could not be found.You can search or go back home.\",\n  \"url\": \"https://onprem.wtf/404\"\n},{\n  \"id\": \"500\",\n  \"title\": \"500\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"500Internal Server Error :(The requested page could not be delivered.\",\n  \"url\": \"https://onprem.wtf/500\"\n},{\n  \"id\": \"api-v1-docs\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"[{% for p in site.resources %}{  \\\"id\\\": \\\"{{ p.relative_url | slugify }}\\\",  \\\"title\\\": {{p.data.title | jsonify}},  \\\"author\\\": {{ p.data.author | jsonify }},  \\\"tags\\\": {{ p.tags | jsonify }},  \\\"content\\\": {{ p.content | strip_html | strip_newlines | jsonify }},  \\\"url\\\": {{ p.relative_url | prepend: site.url | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]\",\n  \"url\": \"https://onprem.wtf/api/v1/docs/\"\n},{\n  \"id\": \"api-v1\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{\\\"posts\\\":[{% for post in collections.posts.resources %}{  \\\"title\\\": {{post.data.title | jsonify}},  \\\"url\\\": {{ post.relative_url | jsonify }},  \\\"date\\\": {{ post.data.date | date: '%B %-d, %Y' | jsonify }},  \\\"category\\\": {{ post.category | jsonify }},  \\\"tags\\\": {{ post.tags | jsonify }},  \\\"author\\\": {{ post.data.author | jsonify }},  \\\"content\\\": {{ post.content | strip_html | strip_newlines | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}],\\\"docs\\\":[{% for p in site.resources %}{  \\\"id\\\": \\\"{{ p.relative_url | slugify }}\\\",  \\\"title\\\": {{p.data.title | jsonify}},  \\\"author\\\": {{ p.data.author | jsonify }},  \\\"tags\\\": {{ p.tags | jsonify }},  \\\"content\\\": {{ p.content | strip_html | strip_newlines | jsonify }},  \\\"url\\\": {{ p.relative_url | prepend: site.url | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]}\",\n  \"url\": \"https://onprem.wtf/api/v1/\"\n},{\n  \"id\": \"api-v1-posts\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{\\\"items\\\":[{% for post in site.posts %}{  \\\"title\\\": {{post.title | jsonify}},  \\\"url\\\": {{ post.url | prepend: site.baseurl | prepend: site.url | jsonify }},  \\\"date\\\": {{ post.date | date: '%B %-d, %Y' | jsonify }},  \\\"category\\\": {{ post.category | jsonify }},  \\\"tags\\\": {{ post.tags | jsonify }},  \\\"author\\\": {{ post.author | jsonify }},  \\\"language\\\": {{ post.language | jsonify }},  \\\"content\\\": {{ post.content | strip_html | strip_newlines | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]}\",\n  \"url\": \"https://onprem.wtf/api/v1/posts/\"\n},{\n  \"id\": \"\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"## Welcome{: .bold-title}**{{ site.metadata.title }}** is the evolution of ntsystems.it. It contains a complete [archive](/post/) of the old site as well as new content. Just like the old site, this site is **free**. There are no trackers, no ads, no cookies. ~~We use a service worker to store pages you visited in your browser's cache storage. That makes the site [installable](https://web.dev/discover-installable/), [fast]({% link _posts/2021-01-16-why-is-this-website-fast.md %}), and it will continue to work even if you're offline.~~## Popular Tags{: .bold-title}Since 2009 we have written {{ collections.posts.resources.size }} posts. You can browse our more popular topics below or find [all tags](/tags) in the menu above.{% assign tags_max = 0 %}{% for tag in site.tags %}    {% if tag[1].size > tags_max %}    {% assign tags_max = tag[1].size %}    {% endif %}{% endfor %}{%- for i in (1..tags_max) reversed -%}{%- for tag in site.tags -%}{% if tag[1].size == i and tag[1].size > 4 %}{{ tag[0] }}{{ i }}{% endif %}{%- endfor -%}{%- endfor -%}## Recent Posts{: .bold-title}    {% for post in collections.posts.resources limit:3 %}            {{ post.data.title }}        {% if post.excerpt %}{{ post.excerpt }}{% else %}{{ post.summary }}{% endif %}        {%- endfor -%}## Archive{: .bold-title}You can find an archive of all posts here: [Archive](/post/)\",\n  \"url\": \"https://onprem.wtf/\"\n},{\n  \"id\": \"manifest.json\",\n  \"title\": \"Manifest\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{  \\\"short_name\\\": \\\"onprem\\\",  \\\"name\\\": \\\"onprem.wtf\\\",  \\\"description\\\": \\\"My playground\\\",  \\\"icons\\\": [    {      \\\"src\\\": \\\"/assets/icons/android-chrome-192x192.png\\\",      \\\"type\\\": \\\"image/png\\\",      \\\"sizes\\\": \\\"192x192\\\"    },    {      \\\"src\\\": \\\"/assets/icons/android-chrome-512x512.png\\\",      \\\"type\\\": \\\"image/png\\\",      \\\"sizes\\\": \\\"512x512\\\"    }  ],  \\\"start_url\\\": \\\"/index.html\\\",  \\\"background_color\\\": \\\"#0f0f0f\\\",  \\\"display\\\": \\\"standalone\\\",  \\\"scope\\\": \\\"/\\\",  \\\"theme_color\\\": \\\"#171717\\\",  \\\"shortcuts\\\": [    {      \\\"name\\\": \\\"PowerShell\\\",      \\\"short_name\\\": \\\"PS\\\",      \\\"description\\\": \\\"View PowerShell help content\\\",      \\\"url\\\": \\\"/PowerShell\\\",      \\\"icons\\\": [        {          \\\"src\\\": \\\"/assets/icons/android-chrome-192x192.png\\\",          \\\"type\\\": \\\"image/png\\\",          \\\"sizes\\\": \\\"192x192\\\"        }      ]    }  ]}\",\n  \"url\": \"https://onprem.wtf/manifest.json\"\n},{\n  \"id\": \"offline\",\n  \"title\": \"Offline\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"Oh snap, looks like you're not connected.\",\n  \"url\": \"https://onprem.wtf/offline/\"\n},{\n  \"id\": \"powershell\",\n  \"title\": \"PowerShell\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"# Modules{: .bold-title}    {%- for post in collections.Modules.resources -%}            {{ post.data.title }}        {{ post.summary }}        {%- endfor -%}# Scripts{: .bold-title}    {%- for post in collections.Scripts.resources -%}            {{ post.data.title }}        {{ post.summary | strip_html }}        {%- endfor -%}\",\n  \"url\": \"https://onprem.wtf/powershell/\"\n},{\n  \"id\": \"search\",\n  \"title\": \"Find\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"      Find anything    Search posts, tags, and PowerShell documentation    {% render \\\"bridgetown_quick_search/search\\\", placeholder: \\\"Start typing to search…\\\", input_class: \\\"search-input search-focus-input\\\", snippet_length: 400 %}  \",\n  \"url\": \"https://onprem.wtf/search/\"\n},{\n  \"id\": \"sitemap.xml\",\n  \"title\": \"Sitemap\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"    {% for post in site.resources %}    {% if post.layout != nil %}    {% if post.layout != 'feed' %}    {% if post.title != 'Find' %}            {{ post.relative_url | remove: 'index.html' | prepend: site.url }}        {{ post.date | site.time | date: \\\"%F\\\" }}        {% endif %}    {% endif %}    {% endif %}    {% endfor %}\",\n  \"url\": \"https://onprem.wtf/sitemap.xml\"\n},{\n  \"id\": \"tags\",\n  \"title\": \"Tags\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{% assign tags_max = 0 %}{% for tag in site.tags %}    {% if tag[1].size > tags_max %}    {% assign tags_max = tag[1].size %}    {% endif %}{% endfor %}{%- for i in (1..tags_max) reversed -%}{%- for tag in site.tags -%}{% if tag[1].size == i %}{{ tag[0] }}{{ i }}{% endif %}{%- endfor -%}{%- endfor -%}\",\n  \"url\": \"https://onprem.wtf/tags/\"\n},{\n  \"id\": \"tools\",\n  \"title\": \"Tools\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"# Tools{: .bold-title}    {% for tool in site.data.tools %}            {{ tool.name }}        {{ tool.description }}        source        {% endfor %}\",\n  \"url\": \"https://onprem.wtf/tools/\"\n},{\n  \"id\": \"bridgetown_quick_search-index.json\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"[  {%- assign looped = false %}  {%- assign documents = site.resources %}  {%- for document in documents %}    {%- if document.title %}      {%- unless document.exclude_from_search or document.id == \\\"\\\" %}        {%- assign url = document.relative_url %}        {%- assign content = document.content %}        {%- if document.quick_search_content %}{% assign content = document.quick_search_content %}{% endif %}        {%- if looped %},{% endif %}        {          \\\"id\\\": \\\"{{ url | slugify }}\\\",          \\\"title\\\": {{ document.title | jsonify }},          {%- if document.collection %}          \\\"collection\\\": {            \\\"label\\\": {{ document.collection.label | jsonify }},            \\\"name\\\": {{ document.collection.name | default: \\\"Posts\\\" | jsonify }}          },          {%- endif %}          \\\"categories\\\": {{ document.categories | join: \\\", \\\" | jsonify }},          \\\"tags\\\": {{ document.tags | join: \\\", \\\" | jsonify }},          \\\"url\\\": {{ url | jsonify }},          \\\"content\\\": {{ content | strip_html | replace_regex: \\\"[\\\\s/\\\\n]+\\\",\\\" \\\" | strip | jsonify }}        }        {%- assign looped = true %}      {%- endunless %}    {%- endif %}  {%- endfor %}  {%- for document in site.generated_pages %}    {%- if document.name contains \\\".md\\\" or document.name contains \\\".html\\\" %}      {%- if document.title %}        {%- unless document.exclude_from_search %}          {%- if looped %},{% endif %}          {%- assign content = document.content %}          {%- if document.quick_search_content %}{% assign content = document.quick_search_content %}{% endif %}          {            \\\"id\\\": \\\"{{ document.url | slugify }}\\\",            \\\"title\\\": {{ document.title | jsonify }},            \\\"categories\\\": {{ document.categories | join: \\\", \\\" | jsonify }},            \\\"tags\\\": {{ document.tags | join: \\\", \\\" | jsonify }},            \\\"url\\\": {{ document.url | jsonify }},            \\\"content\\\": {{ content | strip_html | replace_regex: \\\"[\\\\s/\\\\n]+\\\",\\\" \\\" | strip | jsonify }}          }        {%- endunless %}      {%- endif %}    {%- endif %}  {%- endfor %}]\",\n  \"url\": \"https://onprem.wtf/bridgetown_quick_search/index.json\"\n},{\n  \"id\": \"\",\n  \"title\": null,\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n},{\n  \"id\": \"\",\n  \"title\": null,\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n},{\n  \"id\": \"\",\n  \"title\": \"onprem.wtf\",\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n},{\n  \"id\": \"\",\n  \"title\": null,\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n}]"
        },
        {
          "id": "api-v1",
          "title": "Index",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/api/v1/",
          "content": "{\"posts\":[{\n  \"title\": \"lost & found: AI highlights of the week\",\n  \"url\": \"/post/lost-found-ai-highlights/\",\n  \"date\": \"December 5, 2025\",\n  \"category\": null,\n  \"tags\": [\"AI\"],\n  \"author\": \"tto\",\n  \"content\": \"I learned a lot attending AI Lowlands this week and wanted to share some links and highlights.gpt-realtime and vibevoiceOpenAI’s gpt-realtime is available on Microsoft Foundry very fast but quite expensive.Microsoft just launched VibeVoice-Realtime.llms.txt and NLwebllms.txt as a way to provide LLM-friendly content has been around for a little while.Microsoft proposes NLweb as a proof-of-concept for conversational interfaces and a semantic layer for the web.planetary defensehera.space is on a mission to study asteroid deflection. the website is also a super-cool multi-modal AI showcase.\"\n},{\n  \"title\": \"The Ecological Nature of Technological Change\",\n  \"url\": \"/post/technology-transforms-everything/\",\n  \"date\": \"January 23, 2025\",\n  \"category\": null,\n  \"tags\": [\"technology\"],\n  \"author\": \"tto\",\n  \"content\": \"  Technological change is not additive; it is ecological. A new medium does not add something; it changes everything.I’ve been thinking about this quote from media theorist Neil Postman lately. Written in the 1990s about television’s impact on society, it feels more relevant than ever as we watch AI reshape our industry.From Smartphones to AI: Patterns of ChangeConsider the smartphone: it didn’t just add a portable phone to our lives - it transformed how we navigate spaces (goodbye paper maps), coordinate socially (from fixed meeting times to fluid arrangements), and process information. This wasn’t simply adding features; it was a fundamental reshaping of our behaviors and capabilities.The AI Transformation in ITToday, we’re witnessing a similar ecological transformation with AI in the IT industry. Like previous technological waves, the initial phase brings a surge of integration work - much as we saw with cloud adoption. But AI isn’t just another tool being added to our stack; it’s reshaping the entire landscape of how we work.The traditional cycle of coding, debugging, and deployment is evolving. But perhaps most intriguingly, while previous technological advances often reduced human interaction, AI might do the opposite. By handling routine tasks, it could create more space for meaningful human collaboration.Looking AheadHowever, this remains largely theoretical. While we’re seeing increased integration work now, the deeper transformation of workplace dynamics will take time. Technology capabilities may advance rapidly, but organizational and human adaptation follows its own pace.The challenge ahead isn’t just technical implementation - it’s about thoughtfully shaping AI’s role to enhance rather than diminish human connection in our work. As with any ecological change, the outcomes will depend not just on the technology itself, but on how we choose to integrate it into our (professional) lives.— TomThis post was generated from a conversation I had with Claude.\"\n},{\n  \"title\": \"Zed and PowerShell on macOS\",\n  \"url\": \"/post/zed-pwsh/\",\n  \"date\": \"August 20, 2024\",\n  \"category\": null,\n  \"tags\": [\"Zed\",\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"VSCode has been my daily driver pretty much since it launched. It’s got a great community and amazing extensions, but sometimes it’s slow, and it started draining my battery a lot. I began looking for alternatives, and it wasn’t long before I came across Zed. Zed is a relatively new, high-performance code editor. It’s so fast that typing literally feels easier :)Most of my (coding) work revolves around PowerShell, so the lack of support was a problem for me. I followed Zed Industries’ GitHub and noticed that some good soul closed this issue a few days ago. Did they just add support for PowerShell? The answer is yes, as it turns out!The ExtensionFirst of all, we need to install the PowerShell extension. Like in VSCode, press ⌘ ⇧ X (Command + Shift + X) to open the extensions tab. Type “PowerShell” and press install.PowerShell Editor ServicesThen we need a language server to provide common editor features for the PowerShell language. Think tab completion, IntelliSense, best practices, and so on. There’s a PowerShell module that provides just that:             PowerShell/PowerShellEditorServices    Download the latest release and unzip it to a folder on your local device; in my case, it is: /Users/tom/code/PowerShellEditorServices.Zed ConfigurationLastly, we need to tell Zed where to find the language server (LSP). Again, like in VSCode, press ⌘ , (Command + ,) to open settings and configure the LSP. You can also set pwsh as the default shell and much more.\\\"terminal\\\": {  \\\"shell\\\": {    \\\"program\\\": \\\"pwsh\\\"  }},\\\"lsp\\\": {  \\\"powershell-es\\\": {    \\\"command\\\": \\\"pwsh\\\",    \\\"args\\\": [      \\\"-NoProfile\\\",      \\\"-Command\\\",      \\\"/Users/tom/code/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1\\\"    ]  }}Have fun!\"\n},{\n  \"title\": \"Configure Sign in with Apple for Azure Static Web App\",\n  \"url\": \"/post/setup-sign-in-with-apple-with-azure-swa/\",\n  \"date\": \"July 22, 2023\",\n  \"category\": null,\n  \"tags\": [\"Azure\"],\n  \"author\": \"tto\",\n  \"content\": \"I’m working on a side project and decided to use Sign in with Apple as an additional authentication provider, next to AAD that I would normally use.As per Microsoft’s documentation, adding apple as custom authentication provider is simple enough, just add the following lines to your staticwebapp.config.json file:\\\"identityProviders\\\": {    \\\"apple\\\": {    \\\"registration\\\": {        \\\"clientIdSettingName\\\": \\\"APPLE_CLIENT_ID\\\",        \\\"clientSecretSettingName\\\": \\\"APPLE_CLIENT_SECRET\\\"    }  }}Then we add the two setting names to the Web App’s configuration and we’re done, right? Almost.First we have to take a deep-dive into JWT as the APPLE_CLIENT_SECRET must be a signed JWT. There is no documentation specifically for Static Web Apps but this one for App Service is close enough.I converted the sample C# code to powershell for easier use. The required package have a dependency loop and so, instead of easily installing them with Install-Package I had to use nuget. Follow the documentation above to obtain client id, team id, key id, and the key in pkcs8 format, then use the following snippet to generate the client secret:function Get-AppleClientSecret {    param (        [string]$TeamId,        [string]$ClientId,        [string]$KeyId,        [System.IO.FileInfo]$P8KeyFile    )    $p8Content = Get-Content -Path $p8keyfile    $p8key = $p8Content.where{$_ -notmatch \\\"^---\\\"} -join(\\\"\\\")    [string]$audience = \\\"https://appleid.apple.com\\\"    [string]$issuer = $teamId    [string]$subject = $clientId    [string]$kid = $keyId    $Claims = New-Object -TypeName System.Collections.Generic.List[System.Security.Claims.Claim]    $Claims.Add(        (New-Object -TypeName System.Security.Claims.Claim(\\\"sub\\\", $subject))    )        $cngKey = [System.Security.Cryptography.CngKey]::Import(        [Convert]::FromBase64String($p8key),         [System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob    )    $signingCred = New-Object Microsoft.IdentityModel.Tokens.SigningCredentials(        (New-Object Microsoft.IdentityModel.Tokens.ECDsaSecurityKey(            (New-Object System.Security.Cryptography.ECDsaCng($cngKey)        ))),        \\\"ES256\\\" # EcdsaSha256    )    $NotBefore = Get-Date    $Expires = (Get-Date).AddDays(180)    $token = New-Object -TypeName System.IdentityModel.Tokens.Jwt.JwtSecurityToken(        $Issuer,         $Audience,         $Claims,         $NotBefore,         $Expires,         $signingCred    )    $null = $token.Header.Add(\\\"kid\\\", $kid)    $null = $token.Header.Remove(\\\"typ\\\")    $tokenHandler = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler        return $tokenHandler.WriteToken($token)}# install &amp; import requirementsInvoke-WebRequest -Uri 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' -OutFile \\\"$env:USERPROFILE\\\\Downloads\\\\nuget.exe\\\"&amp; \\\"$env:USERPROFILE\\\\Downloads\\\\nuget.exe\\\" Install System.IdentityModel.Tokens.Jwt -Version 6.32.0 -OutputDirectory \\\"$env:USERPROFILE\\\\Downloads\\\\.nuget\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.Tokens\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Tokens.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\System.IdentityModel.Tokens.Jwt\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\System.IdentityModel.Tokens.Jwt.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.Logging\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Logging.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.JsonWebTokens\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.JsonWebTokens.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\microsoft.identitymodel.abstractions\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Abstractions.dll\\\"# set parameters and get secret$p = @{    TeamId = \\\"Q847A7FG64\\\"    ClientId = \\\"wtf.onprem.appleid\\\"    KeyId = \\\"8QKD4J6XDZ\\\"    P8KeyFile = \\\".\\\\AuthKey_8QKD4J6XDZ.p8\\\"}Get-AppleClientSecret @pOnce we have obtained the APPLE_CLIENT_SECRET, the sign in process with Apple should be successful. However, after signing in, we are redirected to the Static Web App and greeted with a 403: Forbidden:  We need an email address or a handle from your login service. To use this login, please update your account with the missing info.It turns out the identityProviders example given in Microsoft’s documentation is not quite complete. Sign in with Apple only inserts the user’s email address as claim in the authentication token if we specifically ask for it during the sing in process. To do that, we have to add the scopes property to the staticwebapp.config.json file:\\\"identityProviders\\\": {    \\\"apple\\\": {    \\\"registration\\\": {        \\\"clientIdSettingName\\\": \\\"APPLE_CLIENT_ID\\\",        \\\"clientSecretSettingName\\\": \\\"APPLE_CLIENT_SECRET\\\"    },    \\\"login\\\": {        \\\"scopes\\\": [\\\"email\\\"]    }  }}Adding the scope will allow new users to sign in successfully. Users that had already signed in must first remove the app from Sign in with Apple in their Apple account.So, after adding the scope and removing the app from Sign in with Apple, we can finally attempt to sign in again and we should see that the user has to consent sharing their email address in the sign in process:                \"\n},{\n  \"title\": \"Mastodon and WebFinger\",\n  \"url\": \"/post/mastodon-and-webfinger/\",\n  \"date\": \"December 20, 2022\",\n  \"category\": null,\n  \"tags\": [\"ntSystems\",\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"With the uncertainty surrounding Twitter I have decided to set up an account on Mastodon. If you haven’t heard about it Mastodon is an de-centralized, open-source alternative to centralized social media. It is powered by open protocols such as ActivityPub and WebFinger which allow federation of individual servers (called instances).If a user on one server searches for a user on another server, they will enter the full name, i.e. @user@example.com, into the search field. The server will then look for information about the user at the path https://example.com/.well-known/webfinger. If found, the reply contains information about where the profile of the user can be found.We can use this protocol to be discoverable by servers on our own domain. We are using Bridgetown to build this site so placing a JSON file at this path src/.well-known/webfinger did the trick. So even though my profile is currently hosted at masto.ai you can still find me with @tom@onprem.wtf. And if you do find me, give me a follow :)I used this PowerShell function to test the WebFinger endpoint on our and other sites.function Invoke-WebFinger {    [CmdletBinding()]    param(        [Parameter(ValueFromPipeline)]        [ValidatePattern('^@?[\\\\d\\\\w]+@[\\\\d\\\\w]+\\\\.[\\\\d\\\\w]+')]        [string]$Uri,        [string]$Server,        [string]$Username    )    process {        if($Uri){            $Username, $server = $uri -replace '^@' -split '@'        }        $webFingerUri = \\\"https://$server/.well-known/webfinger?resource=acct:$Username@$Server\\\"        Write-Verbose \\\"GET $webFingerUri\\\"        $r = Invoke-RestMethod -Uri $webFingerUri        [PSCustomObject]@{            Uri = $Username,$Server -join '@'            Subject = $r.subject            Aliases = $r.Aliases            ProfilePage = $r.links.where{$_.rel -eq 'http://webfinger.net/rel/profile-page'}.href        }    }}# Examples'tto@masto.ai','@tom@onprem.wtf' | Invoke-WebFingerInvoke-WebFinger -Uri tom@onprem.wtfInvoke-WebFinger -Server onprem.wtf -Username tomOther people wrote about this:  Use your own user @ domain for Mastodon discoverability with the WebFinger Protocol without hosting a server  Mastodon on your own domain without hosting a server  Using Cloudflare to Customize Your Mastodon Username Domain\"\n},{\n  \"title\": \"How to connect to Exchange Online powershell with a managed identity\",\n  \"url\": \"/post/how-to-connect-exchange-online-managed-identity/\",\n  \"date\": \"August 31, 2022\",\n  \"category\": null,\n  \"tags\": [\"PowerShell\",\"Azure\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"The latest preview version of the ExchangeOnlineManagement powershell module includes the following new parameters: -ManagedIdentity and -ManagedIdentityAccountId.As their names imply, they can be used to connect to Exchange Online with a managed identity. According to the documentation this is currently only supported with Azure Virtual Machines and Virtual Machine Scale Sets, however I have used this successfully within Azure Automation runbooks.Create the automation accountIf you have an existing account skip this step. I will be reusing the variables from this first example, so fill in the name of your automation account and the resource group.$accountName = 'azautomation1'$rgName = 'onprem-core'$location = 'West Europe'Connect-AzAccountNew-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -Location $locationGet the moduleThe first step is to add the module to the Automation Account. Installing it through the Azure Portal did not work, as that way only seems to support the latest non-preview version. I used the following commands from the Az powershell module to install the preview version of the module in my automation account:$moduleName = 'ExchangeOnlineManagement'$moduleVersion = '2.0.6-Preview7'New-AzAutomationModule -AutomationAccountName $accountName -ResourceGroupName $rgName -Name $moduleName -ContentLinkUri \\\"https://www.powershellgallery.com/api/v2/package/$moduleName/$moduleVersion\\\"Managed IdentityNow it’s time to enable the system assigned managed identity for the automation account. We can do this through the Azure portal by navigating to the automation account and setting the Status to On under Identity. Alternatively, we can use the Az powershell module like this:Set-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -AssignSystemIdentityNext we will need the id of the managed identity. It will show up in the Azure portal once it has been enabled or it can be retrieved with Az powershell:Get-AzADServicePrincipal -DisplayName $accountNameIn my case the object id is b395da15-4904-490c-9109-2bc91a12a08d. With this id in hand, we use the Microsoft Graph powershell SDK to grant the necessary permissions to the managed identity.Connect-MgGraph$params = @{    ServicePrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    PrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    ResourceId = (Get-MgServicePrincipal -Filter \\\"AppId eq '00000002-0000-0ff1-ce00-000000000000'\\\").id # Exchange online    AppRoleId = \\\"dc50a0fb-09a3-484d-be87-e023b12c6440\\\" # Exchange.ManageAsApp}New-MgServicePrincipalAppRoleAssignedTo @paramsLastly we want to assign the role Exchange Administrator to the managed identity. Again, we can do this through the Azure portal or with the following command:$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter \\\"DisplayName eq 'Exchange Administrator'\\\").idNew-MgRoleManagementDirectoryRoleAssignment -PrincipalId b395da15-4904-490c-9109-2bc91a12a08d -RoleDefinitionId 29232cdf-9323-42fd-ade2-1d097af3e4de -DirectoryScopeId \\\"/\\\"Please assign the role with the least amount of privileges to complete the task you need.Connect to Exchange Online in the runbookAfter completing the steps above we are ready to connect to Exchange Online using the managed identity in the runbook. If you create a new runbook, please make sure to use runtime version 5.1 as the that’s where we have imported the module earlier.Connect-ExchangeOnline -ManagedIdentity -Organization 'onpremwtf.onmicrosoft.com'Get-AcceptedDomainTom\"\n},{\n  \"title\": \"Goodbye Jekyll, hello Bridgetown!\",\n  \"url\": \"/post/goodbye-jekyll/\",\n  \"date\": \"August 13, 2022\",\n  \"category\": null,\n  \"tags\": [\"Jekyll\"],\n  \"author\": \"tto\",\n  \"content\": \"We have been using Jekyll for our little site since 2016. It was fast, simple, it did it’s job nicely. Bridgetown does all the same things, and much more. It’s Jekyll’s modern cousin.We have used GitHub pages to host our site as it integrates nicely with Jekyll. I have long wanted to play with Cloudflare pages, so I decided to upgrade the site and move it over to Cloudflare in the progress.How to run Bridgetown on Cloudflare pages?Well, it’s easy enough, we just have to things to consider:  Include a .node-version file because Cloudflare pages defaults to 12.18.0 and bridgetown requires a version newer than 14  Set the BRIDGETOWN_ENV environment variable to productionTo tell Cloudflare pages to use a newer version of node, I created the file .node-version with the content 16.16.0 in the root directory of my repository. Just like with Jekyll, the base is a GitHub repository. All that’s left to do is sign in to Cloudflare and create a new pages project. I sign in to my GitHub account from Cloudflare, select the repository and enter the following information:Build command: bin/bridgetown deployBuild output directory: outputEnvironment variable: BRIDGETOWN_ENV  productionDone.Cloudflare redirectsWe have used Jekyll’s jekyll-redirect-from plugin to create redirects for some URLs. It seems bridgetown does not yet have a plugin for that, so I used Cloudflare page’s _redirect file instead. I created a file with the name _redirect in the src folder of my bridgetown project. The content of the file is like this:/a/very/long/url/path /shorturl 301You can read more in the docsI used the following few lines of powershell code to find Jekyll’s redirect_from statements in my source folder, convert them into slugs, and add them to the _redirect file.Get-ChildItem ./src/ -Recurse -Filter *.md | Select-String -pattern \\\"redirect_from\\\" | ForEach-Object {    $p = $_.path    $n = $_.filename    $l = $_.line    # remove date and extension from filename as slug contains neither    if($n -match \\\"^\\\\d{4}-\\\"){        $n = $n -replace \\\"\\\\d{4}-\\\\d{2}-\\\\d{2}-\\\",\\\"\\\"     }    $n = $n -replace \\\".md\\\",\\\"\\\"    $name = $n.ToLower()    # find parent path and create slug    $p = Split-Path -Path $p -Parent | Split-Path -Leaf    switch($p){        \\\"_OnlineHelp\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"Archive\\\" { $slug = \\\"/post/$name\\\" }        \\\"_Modules\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"_Scripts\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"_posts\\\" { $slug = \\\"/post/$name\\\" }    }    # write _redirects file    $l -replace \\\"redirect_from: \\\",\\\"\\\" | ConvertFrom-Json | ForEach-Object {        \\\"$_ $slug 301\\\"    } } | Set-Content ./src/_redirects\"\n},{\n  \"title\": \"How to configure sender authentication for Exchange Online in 2021\",\n  \"url\": \"/post/sender-authentication-exo-2021/\",\n  \"date\": \"January 30, 2021\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Office365\",\"Exchange\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"The current state of emailThe year is 2021 and, despite many efforts to kill it off, email is still going strong. According to Microsoft’s latest digital defense report Exchange Online Protection processed 6 trillion messages last year, 13 billion of which malicious. 6 trillion, that’s a number with 12 zeros. And that’s just Exchange Online. Worldwide we are sending and receiving over 300 billion emails every day, according to this site. 300 billion. Every day.With these numbers there’s no wonder email is one of the main threat vectors.As many organizations are moving their mailboxes to Exchange Online, I thought I would share my basic setup for new tenants. This will help you getting started with a secure configuration in no time. I have two goals with this basic setup:  Protect your brand (domain) from being spoofed/abused  Protect your users from receiving malicious emailsSender AuthenticationSo you have just signed up for a new tenant with Microsoft 365 and you are adding your custom domains. The wizard will ask you, whether or not you are planning to use Exchange Online and, if you select yes, it will help you setup SPF.Sender policy frameworkEven though it has only been published as proposed standard by the IETF in 2014, SPF has been around since the early 2000’s. Despite it’s age it is still something we regularly find missing or misconfigured in customer environments. SPF gives an administrator of an email domain a way to specify which systems (IP addresses) are allowed to send emails using the domain. The admin publishes a TXT record in the DNS, listing all IP addresses that are allowed to send emails. This would typically be your onprem Exchange servers or email gateways.Receiving systems check the TXT record and see if the system that’s trying to deliver a message is allowed to do so.If you want to start sending emails from Exchange Online, you should add the following line to your existing SPF record.include: include:spf.protection.outlook.comIf you don’t have an SPF record in place, create a new TXT record at the root of your domain with this content:v=spf include:spf.protection.outlook.com -all  If you are not using a domain for outbound email, please publish the following SPF record to make it harder for criminals to abuse your domain:  TXT: v=spf -allThis is how far the wizard goes but we should really always configure the following records as well.DomainKeys Identified MailDKIM has been standardized in 2011 and, in parts thanks to Exchange Online, is being used widely. However, we find SPF is better known and understood by our customers. DKIM leverages digital signatures that let a receiving system cryptographically verify whether an email was sent by an authorized system or not. The signature includes a domain name (d=) that should match the domain in the mail from address. Like SPF, DKIM uses DNS records in the sender’s email domain. The administrator of the domain publishes a TXT record that contains a public key and then configures the email server to sign all outgoing messages with the corresponding private key.Receiving systems see the signature and a so called selector in the header of the email. The selector tells the receiving system where to find the public key to verify the signature. As always with certificates, keys have to be rotated periodically which means DKIM DNS records must be updated accordingly. Sounds like a lot of complicated work, right?With Exchange Online, Microsoft does that work for you. All outgoing emails from Exchange Online are signed with a key that Microsoft manages. The only thing we have to do, is point our DNS to that key and enable the configuration. There is a lengthy docs article about DKIM and how to build the DNS records you have to publish. I am using a few lines of PowerShell to make that process easier.Use the following PowerShell snippet to:  Create a new DKIM signing configuration for your custom domain  Publish DNS records pointing to Microsoft domains  Enable the DKIM signing configuration# Create DKIM signing config for all domains that do not have one$d = Get-DkimSigningConfig$domains = $d.domainGet-AcceptedDomain | % {​​​​​​     if ($_.DomainName -in $domains) {​​​​​​}​​​​​​     else {​​​​​​ New-DkimSigningConfig -KeySize 2048 -DomainName $_.DomainName -Enabled $false}​​​​​​ }​​​​​# Create DNS RecordsGet-DkimSigningConfig | Where-Object Name -NotMatch onmicrosoft | Select-Object Name,*cname*,@{    n=\\\"Selector1\\\";    e={($_.Selector1CNAME -split \\\"-\\\" | Select-Object -First 1),$_.name -join \\\"._domainkey.\\\"}},@{      n=\\\"Selector2\\\";    e={($_.Selector2CNAME -split \\\"-\\\" | Select-Object -First 1),$_.name -join \\\"._domainkey.\\\"}} Once the DNS records are in place, we can go ahead and enable the DKIM configuration:Get-DkimSigningConfig | Set-DkimSigningConfig -Enabled $true  If you are not using a domain for outbound email, you don’t have to worry about DKIM.Domain-based Message Authentication, Reporting and ConformanceDMARC is the new kid on the bloc. Well kind of, the RFC is from 2015. It is yet another DNS record that an administrator can use to tell receiving systems what exactly they should do with emails that fail SPF or DKIM. Essentially DMARC builds on SPF and DKIM and uses both to calculate an authentication result that supports scenarios where SPF alone would fail (forwarding). The DMARC policy is also used to define what should happen with unaligned or failing DKIM signatures as DKIM itself doesn’t really specify that.So, another DNS record you said? Here we go:Name: _dmarc.example.comType: TXTValue: v=DMARC1; p=none; pct=100;  While the SPF record must be published at the root of your domain, the DMARC record must be at _dmarc.With DMARC it is recommended to implement monitoring, so we will have to look at an additional tool. I have found the DMARC Monitor from ValiMail is a good option to get started, it is also free for Microsoft 365 customers. There are many alternatives, please check with your security team if you already have a tool. Whichever tool you end up using, it will ask you to update your DMARC record to include an URI of a mailbox to send reports to. The rua and ruf tags in the TXT record are used for that, in the case of ValiMail the complete record looks like this:v=DMARC1; p=none; pct=100; rua=mailto:dmarc_agg@vali.email;This record tells a receiving system to deliver emails independent of the authentication result (p is set to none) and send aggregated reports (rua) to ValiMail.With this record in place, you are now ready to send emails from Exchange Online. But we’re not completely done with DMARC just yet.The ultimate goal is to set the DMARC policy to p=reject thereby telling any receiving system to reject emails that fail authentication. Before we can do that, we must make sure all legitimate emails pass authentication. The monitoring helps us verify exactly that, the example in the following screenshot shows outbound emails from our systems for the last month. As you can see, all of them authenticated successfully:                  Exchange Online does currently not send DMARC reports, so if you are sending only to Exchange Online recipients, don’t expect much information in your monitoring.Remember that I said from our systems above, now let’s change that filter in ValiMail and look at all emails from our domain. As you can see in the screenshot below, over the same period of time, 90 emails failed DMARC authentication:                In our case, we already have a reject policy in place, so receiving systems should not accept these emails which are spam or worse. So, after setting up DMARC monitoring with a policy of none, observe the situation for some time and, if you are confident your systems are configured correctly, go ahead and update the record:v=DMARC1; p=reject; pct=100; rua=mailto:dmarc_agg@vali.email;  If you are not using a domain for outbound email, please publish the following DMARC record to make it harder for criminals to abuse your domain:  TXT: v=DMARC1; p=reject; pct=100;In the next post we will have a look at preset security policies in Exchange Online Protection.— Tom.\"\n},{\n  \"title\": \"Why is this website so fast?\",\n  \"url\": \"/post/why-is-this-website-fast/\",\n  \"date\": \"January 16, 2021\",\n  \"category\": null,\n  \"tags\": [\"Jekyll\",\"ntSystems\",\"GitHub\"],\n  \"author\": \"tto\",\n  \"content\": \"I have recently updated our website and have learned a few things while doing so. As mentioned on the home page, this website is still built with Jekyll. The so-called grandfather of static website generators is maybe not perfect, but the following reasons make it a good option for me.  It just works: I don’t have much time to tinker with this side-project, there are no complicated, always changing dependencies like with newer, javascript-based tools (oh and no gigantic node_modules either)  It’s simple: True how variables are handled is not always intuitive but I have learned enough to use it effectively  GitHub pages: The build process is automated, I just push my changes and the rest is taken care ofYou promised fast, what’s all this?I’m getting there. Fast websites are generally associated with more modern site generators like Gatsby. These typically use a lot of javascript that makes them fast but also more complicated. I wanted to see, if I could get good results with good old Jekyll.This site is fast because it’s small and very simple. I’m not saying bigger sites don’t need all that node_modules goodness, I’m saying small sites - like this one - don’t need it.This site is also fast, because I’ve added a few extra lines to the head section of the html. At the end of every post you can find a next navigation button that brings you to the next post. With a little help from Jekyll, I was able to include the relative URL of the next post as link to the head section with the keyword rel=next. This little keyword tells the browser to download the post whenever it has a free moment:{% if page.next %}&lt;link rel=\\\"next\\\" href=\\\"{{ page.next.url }}\\\"&gt;{% endif %}The result is a super fast navigation experience because the target has already been downloaded. I’m also preloading fonts with rel=\\\"preload\\\" and the little CSS we use is inlined.Service workersAnother thing I learned while looking at modern websites is the concept of service workers. This is a little bit of javascript that can be very powerful indeed. Essentially, a service worker is a script that is installed in the browser when a user opens the website. Once installed it can intercept and handle network requests from the browser to the site. It’s a kind of proxy in your browser just for our site.I’m using a service worker to create a local cache for use with this site. On the first visit, the service downloads a few static files that visitors will definitely need (fonts, main pages). It uses a cache-first strategy, so whenever the browser requests something, the service worker looks in the cache first and returns any results from there. After that it goes out to the site and retrieves the latest version of what the browser was looking for. If there’s no cache-hit, the resource is fetched from the network.The service worker needs a manifest and we have to tell the browser where to find it. We add the manifest to the head section and use a few lines of javascript to trigger the installation of the service worker. This is the pointer to the manifest file:&lt;link rel=\\\"manifest\\\" href=\\\"/manifest.json\\\"&gt;And this is the code that registers the service worker in your browser after the page is loaded. I have added a condition to skip the registration if the site is accessed through localhost, which is the case when developing locally:if ('serviceWorker' in navigator &amp;&amp; !(/localhost/.test(window.location.href))) {  window.addEventListener('load', function() {    navigator.serviceWorker.register('//serviceworker.js')    console.log('Servie worker registered.');  });}Faster build times with Jekyll on WSLI have used Jekyll on Windows 10 leveraging the Windows Subsystem for Linux since 2017. Today I realized that actually storing the files within WSL makes the build time much (much) faster. Until today I stored the repository in my Windows user profile, something like C:\\\\users\\\\tto\\\\.... In the WSL I happily changed into this directory following /mnt/C/Users... before running jekyll serve. Build time was around 5 minutes. Not great.Today it ocurred to me to clone the repository again, this time into the WSL. So I can access it using a WSL path, something like /home/tto/.... Build time is now less than one minute. Not bad.WebpageTest resultsYou don’t have to take my word for it, webpagetest also thinks this website is pretty fast:                — Tom\"\n},{\n  \"title\": \"So long, 2020\",\n  \"url\": \"/post/so-long-2020/\",\n  \"date\": \"December 29, 2020\",\n  \"category\": null,\n  \"tags\": [\"Jekyll\",\"ntSystems\",\"GitHub\"],\n  \"author\": \"tto\",\n  \"content\": \"Goodbye 2020! What a year it has been.True, I had to cancel some trips and I stayed home a lot more than usual, but apart from that, it was a pretty spectacular year for me. I moved to Amsterdam from a smaller city in the outskirts. I was able to go to Zürich, Sardinia, Marbella, Napoli and a few other places. In a prolonged episode of lockdown blues I managed to get about 1000 km on my road bike done. However, that was sometime before the summer, since then I have been (a lot) less active. I worked a lot. I learned a lot.Since a certain global event made more travelling impossible, or at least not very recommendable, I’m staying in Amsterdam for the holiday season and started building this new site.After more than 10 years, it’s now time to say: Goodbye ntSystems.itWelcome onprem.wtfWelcome to our new home. This site is still build with Jekyll and hosted on GitHub pages. I replaced the default minima theme with a custom one, mostly because I wanted to learn and experiment with some CSS features. I also had a good look at some of the more modern static site generators and other alternatives but decided to stick with Jekyll because it is simple and I really don’t need all of that node_modules stuff for just a simple blog.The new site has a simpler layout with less clutter, should be easier to read on any screen, and it also has a dark theme. Actually, unless you select a theme, it will use the same settings that your operating system (or browser) uses. Pretty slick, right?What about the domain name you ask? Well, this one was available and it kind of fits with what we are doing at the moment. If you find a better one, I’m open to suggestions 😉What’s next?Well that’s a good question. For now, like many others, I’ll be watching how the vaccine rollout is going and what’s happening in the US of A. I would like to become a better writer so I will try to publish my thoughts more regularly. We’ll see how that goes.With that I wish you all the best for the new year.— Tom.\"\n},{\n  \"title\": \"Convert PowerShell Help to a Website\",\n  \"url\": \"/post/converting-powershell-help-to-a-website/\",\n  \"date\": \"December 21, 2020\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\",\"Help\",\"MarkDown\"],\n  \"author\": \"tto\",\n  \"content\": \"How to use the platyPS PowerShell module to convert comment-based help to markdown and easily host it on GitHub pages.Now you might have read that our blog is powered by Jekyll, which is a static-site generator that turns markdown files into html. So, obviously, if I would be able to convert PowerShell help content to markdown files, I could simply put them into a folder an serve them via the blog.Create markdown filesThe first step is to install platyPS (available on the PS Gallery) and create the markdown files for every function.Install-Module platyPSImport-Module platyPS, TAK, PSSpeechforeach ($cmdlet in (Get-Command -Module PSSpeech)) {     $h = Get-Help $($cmdlet.Name)    $meta = @{        'layout' = 'pshelp';        'author' = 'tto';        'title' = $($cmdlet.Name);        'category' = $($cmdlet.ModuleName.ToLower());        'excerpt' = \\\"`\\\"$($h.Synopsis)`\\\"\\\";        'date' = $(Get-Date -Format yyyy-MM-dd);        'redirect_from' = \\\"[`\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name)/`\\\", `\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name.ToLower())/`\\\", `\\\"/PowerShell/$($cmdlet.Name.ToLower())/`\\\"]\\\"    }    if($h.Synopsis -notmatch \\\"\\\\[|\\\\]\\\") {        New-MarkdownHelp -Command $cmdlet -OutputFolder .\\\\_OnlineHelp\\\\a -Metadata $meta -Force     }}The above example creates a .md help file for every function in the TAK module. The files are almost ready to be used by our Jekyll-powered blog, I’m using the -Metadata parameter to add some additional information to the ‘front matter’ of each file.  I could be using New-MarkdownHelp -Module TAK but that way, I was not able to include the metadata automatically.Rename files for JekyllThe only thing that I have to do now, in order to have Jekyll pick up the files and create websites, is to rename them accordingly.foreach ($file in (Get-ChildItem '.\\\\tak-md-help\\\\*.md')) {    $timestamp = (Get-Date -Format 'yyyy-MM-dd')    $NewName = $timestamp, $file.name -join '-'    Rename-Item -Path $file.FullName -NewName $NewName}The above example renames all *.md files in the tak-md-help folder to include a timestamp. This step is not necessary if you are using a collection in Jekyll.Include HelpUriThe Get-Help command has an -Online parameter, that can be used to easily open a related link when looking for help. To include this functionality in my scripts, I just have to put the URL of the online article in the [CmdletBinding()] statement, like so:[CmdletBinding(HelpUri = 'https://ntsystems.it/PowerShell/TAK/test-tlsconnection/')]Links  https://github.com/PowerShell/platyPSThat’s it :)Tom\"\n},{\n  \"title\": \"Using PowerShell and Azure Cognitive Services to convert text to speech\",\n  \"url\": \"/post/using-powershell-and-azure-cognitive-services-to-convert-text-to-speech/\",\n  \"date\": \"January 11, 2020\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"author\": \"tto\",\n  \"content\": \"In one of our recent Microsoft Teams projects I needed some voice prompts for a customer service call queue. I figured it would be nice to have Azure’s artificial-intelligence-powered speech service convert my text input to an audio file. Turns out it’s easier than I thought it would be.Azure Cognitive Speech ServiceFirst of all we need an Azure Subscription where we can deploy our Speech Services instance. If you don’t have an Azure subscription, you can sign up for a trial account using the links below. If you already have a subscription, you can easily create a free Speech Services account using the following commands from Azure Cloud Shell:az group create -n ntsystems-speech -l WestEuropeaz cognitiveservices account create -n ntsystems-speech -g ntsystems-speech --kind SpeechServices --sku F0 -l WestEurope --yesNow the account was created and we can start using it right away. To authenticate our calls from PowerShell, we need an API key, again we can use Azure Cloud Shell to retrieve the key:az cognitiveservices account keys list -n ntsystems-speech -g ntsystems-speechPowerShellThe speech service provides a well documented API that can easily be called using PowerShell’s native Invoke-RestMethod command. The required information is available on Microsoft Docs (link below), all I had to do is wrap a little PowerShell around it and I had created a quick module. You can install the module using the following command:Install-Module PSSpeechBefore we can call any of the speech service’s API endpoints, we have to use the API key to get a token and store it in a variable for later use:Get-SpeechToken -Key yourapikey | Save-SpeechTokenNow we should be able to get a list of available voices using Get-SpeechVoicesList | Format-Table.And finally we can convert some input text to speech using one of the voices from the list:Convert-TextToSpeech -Voice en-US-JessaNeural -Text \\\"Hi Tom, I'm Jessa from Azure!\\\" -Path jessa.mp3Convert-TextToSpeech -Voice en-GB-HarryNeural -Text \\\"Hi Tom, I'm Harry from Azure!\\\" -Path harry.mp3You can find a lot of information about the speech service in the links below, be sure to check out the SSML structure to see how you can customize the voices, introduce pauses to the audio file, and many other things.You can find the code for the module in my GitHub, please let me know if you find it useful and feel free to submit a pull request with your optimizations :)This is the first post in this new year, best wishes and thanks for reading!TomLinks  Speech Services  Speech Synthesis Markup Language (SSML)  Text to Speech REST API  PSSpeech Module\"\n},{\n  \"title\": \"Configuring policy-based QoS for Teams with Intune\",\n  \"url\": \"/post/configuring-policy-based-qos-for-teams-with-intune/\",\n  \"date\": \"November 29, 2019\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Workplace\",\"Intune\",\"Teams\"],\n  \"author\": \"tto\",\n  \"content\": \"Traditional Active Directory with group policy has no place in the big-picture of the modern workplace, so we need a novel solution to apply policy-based QoS to our Teams clients. One could argue that QoS has no place in the modern workplace either, but that’s a discussion for another day.Configuration Service ProviderSo a CSP or configuration service provider is pretty much exactly what everyone with some traditional enterprise IT background would expect from a group policy object, but delivered from the cloud and, at least in theory, applicable to various types of devices. According to Microsoft Docs it is “an interface to read, set, modify, or delete configuration settings on the device. These settings map to registry keys or files.”You can find a link to the CSP reference below.NetworkQoSPolicy CSPNow it turns out there is a CSP for policy-based QoS but it just applies to Surface Hub devices. If you’re lucky enough to configure QoS on such a device, here is a screenshot of the settings you will most likely use.  The port numbers may be different in your environment.                MSFT_NetQosPolicySettingDataSo here we are trying to configure QoS settings on our Windows 10 clients but CSPs are of no great help. Luckily we can use PowerShell to configure policy-based QoS and Intune provides an easy way to deploy PowerShell scripts to our clients.To configure Windows 10 to tag packets sent by the Teams.exe and on the configured source ports for each modality, we could use three simple commands like in the example below:New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50020 -IPSrcPortEndMatchCondition 50039 -DSCPValue 46 -Name \\\"Teams Audio\\\"New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50400 -IPSrcPortEndMatchCondition 50059 -DSCPValue 34 -Name \\\"Teams Video\\\" New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50069 -IPSrcPortEndMatchCondition 50070 -DSCPValue 28 -Name \\\"Teams AppSharing\\\"You can find a link to the cmdlet reference for New-NetQosPolicy below.Save the above commands to a file with ps1 extension and head over to endpoint.microsoft.com. Create a new script for Windows 10, upload the the ps1 file and set it to run in system context and using the 64 bit PowerShell host. Now assign the script to a group that contains your devices.                Once the script was applied you can use Get-NetQosPolicy to verify the policies were applied correctly.Teams Meeting SettingsFor the above configuration to make any sense, we first have to specify a port range for each modality in the Microsoft Teams admin center.You can find a link to the Teams admin center below.The following screenshot shows an example configuration where a distinct port range is used for each type of traffic, this allows us to distinguish the traffic types and apply different DSCP tags using policy-based QoS.                Special thanks to Mr. Workplace Expert Dave Wenger! Check out his blog in the links below.Links  Configuration service provider reference  New-NetQosPolicy  Microsoft Teams admin center  https://blog.contoso-bern.ch/\"\n},{\n  \"title\": \"Send Check Point Logs to Azure Sentinel (beta)\",\n  \"url\": \"/post/send-check-point-logs-to-azure-sentinel-beta/\",\n  \"date\": \"July 15, 2019\",\n  \"category\": \"Security\",\n  \"tags\": [\"Azure\",\"Cloud\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"Azure Sentinel is Microsoft’s new, cloud-native security information and event management (SIEM) tool. In my simplistic point-of-view it is a security-focused, machine-learning-driven add-on for Log Analytics (OMS). Today we will be looking into ingesting Check Point Firewall logs into Log Analytics.Log Analytics Agent (linux)Log Analytics currently lists only linux-based agents for syslog forwarding. In this case I installed Ubuntu Server 18.10, for production it maybe better to stick with 18.04. The following command installs required components:sudo apt install python auditdFrom the Azure Portal, copy the snippet to install the Log Analytics agent (non-Azure Linux VM). It should look something like this and already have the correct values for workspace id and key.sudo wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh &amp;&amp; sh onboard_agent.sh -w &lt;workspace-id&gt; -s &lt;workspace-key&gt; -d opinsights.azure.comFinally, download the security configuration file for OMS agent. This contains the required regular expressions for the oms.security event type:sudo wget -O /etc/opt/microsoft/omsagent/&lt;workspace-id&gt;/conf/omsagent.d/security_events.conf \\\"https://aka.ms/syslog-config-file-linux\\\"Syslog (rsyslog.d)Now with the Log Analytics agent ready, we need to configure rsyslog to accept logs from the firewall and forward them to the agent.Uncomment the following lines in the file /etc/rsyslog.conf to enable the rsyslog listener on udp port 514:module(load=\\\"imudp\\\")input(type=\\\"imudp\\\" port=\\\"514\\\")Now lets create a new configuration file to tell rsyslog to forward all events that contain the string “Check Point” to the Log Analytics agent. Azure Sentinel documentation creates the file at /etc/rsyslog.d/security-config-omsagent.conf::msg, contains, \\\"Check Point\\\" @127.0.0.1:25226At last it may be a good idea to change the default configuration in such a way that not all logs are written to a file. The default configuration for rsyslog is located at /etc/rsyslog.d/50-default.conf. Just modify the line with *.* accordingly:#*.*;auth,authpriv.none         -/var/log/sysloglocal.*;auth,authpriv.none      -/var/log/syslogWhen we’re done with the configuration we use the following commands to restart the Log Analytics agent and the rsyslog service:sudo /opt/microsoft/omsagent/bin/service_control restart &lt;workspace-id&gt;Sudo service rsyslog restartCheck PointCheck Point publish information about how to configure log export in the article sk122323, see links below. On version R80.20 the required packages are already installed and we just add a log export target like this. Note that this is using export mode shell:cp_log_export add name azsentinel target-server 10.1.1.1 target-port 514 protocol udp format cef read-mode semi-unifiedMake sure to select cef log format and set the read-mode to semi-unified. The existing configuration can be verified with:cp_log_export showname: azsentinel     enabled: true     target-server: 10.1.1.1     target-port: 514     protocol: udp     format: cef     read-mode: semi-unifiedTroubleshootAccording to the Sentinel documentation it can take a while before the first logs show up in Log Analytics, in my case it didn’t take more than five minutes. But if they don’t show up at all, the following steps can be helpful for troubleshooting:Check if syslog services are listening:tom@azsentinel:~$ netstat -anuActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 127.0.0.53:53           0.0.0.0:*udp        0      0 0.0.0.0:514             0.0.0.0:*udp        0      0 127.0.0.1:25224         0.0.0.0:*udp        0      0 127.0.0.1:25226         0.0.0.0:*udp        0      0 0.0.0.0:33569           0.0.0.0:*udp6       0      0 :::514                  :::*Note: rsyslog listens on 514 and the omsagent listens on 25224 and 25226, the latter is of interest in this case.Check if logs are coming in from Check Point:sudo tcpdump -A -ni any port 514 -vvCheck if logs are forwarded to omsagent:sudo tcpdump -A -ni any port 25226 -vvLog Analytics agent log file:sudo tail /var/opt/microsoft/omsagent/log/omsagent.logLinks  Check Point Log Export (sk122323)  Azure Sentinel Documentation\"\n},{\n  \"title\": \"Create a SAS token for AzCopy\",\n  \"url\": \"/post/create-a-sas-token-for-azcopy/\",\n  \"date\": \"June 17, 2019\",\n  \"category\": \"DevOps\",\n  \"tags\": [\"PowerShell\",\"Cloud\",\"Azure\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve spent way too much time trying to figure this out, so here goes a quick note that hopefully saves someone a minute.AzCopyIs a command-line tool that can be used to copy data to all kinds of Azure storage. In this post I am focusing on the Azure Files service because I want to use AzCopy to copy data from an existing file server to a new file share in Azure.According to the documentation, AzCopy supports authentication via Azure AD (using azcopy login) and SAS-token. For the files part, however, only SAS-token authentication is supported.Shared Access Signatures?A shared access signature, SAS, is a string that can be used to delegate access to resources in Azure. It looks something like that:?sv=2018-11-09&amp;sig=&lt;..key..&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=bfqt&amp;sp=racupwdlThere is some documentation out there on how to create the SAS token with the SDK but I couldn’t find much that I could easily use. So after some searching around I found the New-AzStorageAccountSASToken cmdlet in the Az PowerShell module.PowerShell Az ModuleThe Az module is the latest version (I believe) of the PowerShell module to manage Azure. We are going to use it to create the SAS token, so if you don’t have it already, install via the PowerShell Gallery (requires PowerShell 5.1):Install-Module Az -AllowClobberOnce installed I can login to my Azure subscription and create the token:Connect-AzAccount$StorageContext = New-AzStorageContext -StorageAccountName mystorageaccount -StorageAccountKey \\\"storageaccountkey==\\\"New-AzStorageAccountSASToken -Service File -ResourceType Service,Container,Object -Permission racwdlup -Context $StorageContext -ExpiryTime (Get-Date).AddDays(+3)The -ExpiryTime parameter can be used to set an expiration time for the generated token. I believe the default is one hour, so if you expect the copy job to take longer adjust accordingly.Please note: I could also create the storage context without specifying the -StorageAccountKey parameter, but that would lead to the following error message when creating the token:New-AzStorageAccountSASToken : Cannot create Shared Access Signature unless Account Key credentials are used.Copying the dataActually copying files or directories to Azure Files is pretty straight-forward once we have the SAS-token, we just pass it along with the url.To copy a single file:.\\\\azcopy.exe cp D:\\\\Data\\\\file.txt \\\"https://mystorageaccount.file.core.windows.net/myshare/file.txt?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\"To copy a directory:.\\\\azcopy.exe cp D:\\\\Data \\\"https://mystorageaccount.file.core.windows.net/myshare?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\" --recursiveLinks  https://github.com/Azure/azure-storage-azcopy  https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstorageaccountsastoken  https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-files  https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1\"\n},{\n  \"title\": \"ntSystemsPSDrive: a SHiPS drive for the blog\",\n  \"url\": \"/post/ntsystemspsdrive-a-ships-drive-for-the-blog/\",\n  \"date\": \"April 19, 2019\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\",\"Jekyll\",\"ntSystems\"],\n  \"author\": \"tto\",\n  \"content\": \"Some time ago I wrote a post about Consuming ntSystems with PowerShell. It boils down to this: we have a json-based API that is available via https://ntsystems.it/api/v1/ and returns json elements for posts and pages on the blog. For more information check out the linked post. Then I wanted play around with the SHiPS module for some time and finally got around to doing it this past weekend. Now I’m happy to be sharing another method do consume ntSystems with PowerShell: It can be mounted as PSDrive.PSProviderPowerShell has always had the concept of providers which serve as a way of accessing and interacting with data that would otherwise not be easily available at the command-line. According to about_Providers they are Microsoft .NET Framework-based programs that make the data in a specialized data store available in PowerShell so that you can view and manage it.There are some built-in providers such as Alias, Certificate, and Registry that you will be familiar with. Essentially they provide a file-system-like view into the data stores, so we can easily see all defined aliases with the following command:Get-ChildItem -Path Alias:We can see installed certificates in the Cert: drive and access the registry via hkcu: and hklm:. Not only can we list the content of the data stores with cmdlets such as Get-ChildItem, we can also modify values with Set-Item or Set-ItemProperty like this:# Create a new REG_SZ New-ItemProperty -Path HKCU:\\\\Environment\\\\ -PropertyType string -Name TestPS -Value \\\"test pwsh\\\"# Create an aliasNew-Item Alias:\\\\test -Value \\\"Get-Process\\\"# Remove expired CertificatesGet-ChildItem Cert:\\\\CurrentUser\\\\my | Where-Object NotAfter -lt (Get-Date) | Remove-ItemWell, you get it by now: providers make it relatively easy to work data stored in certain locations.Some vendors, such as VMware, add providers to their PowerShell tools. So after installing PowerCLI and connecting to a server, we can browse the inventory using:Get-ChildItem vi:Get-ChildItem vmstore:We can see all available drives using Get-PSDrive.There are not too many 3rd-party providers out there, probably because it was quite hard to write them. Enter SHiPS.Simple Hierarchy in PowerShell (SHiPS)According to the SHiPS GitHub repository, “developing PowerShell provider got so much easier”. The module leverages PowerShell classes to create the hierarchy and items that are then exposed as a PS Drive.How easy you ask? Well I gave it a shot the other day and here is the result.ntSystemsPSDriveAs stated above, the module requires the SHiPS module and builds on top of it. So in the code we first declare the following:using namespace Microsoft.PowerShell.SHiPSThen we go ahead and create classes for our navigation nodes, folders (items containing child items) inherit from SHiPSDirectory and leafs (like files) inherit from SHiPSLeaf.In the classes we define constructors and methods as needed, if a folder shall be used as root node, i.e. the entry point used by New-PSDrive, it must have a constructor with the node name as parameter.Home([string]$name): base($name) { }All folder nodes must define a GetChildItem() method that is called when browsing the directory.[object[]] GetChildItem() { }So for example the Home node in the module ntSystemsPSDrive is used as root (entry point) when mounting the PSDrive:New-PSDrive -Name $Name -PSProvider SHiPS -Root \\\"ntSystemsPSDrive#Home\\\" -Scope Global -ErrorAction StopTo create such a node and its contents, we define a class like this :class Home : SHiPSDirectory {    # required constructor for root nodes    Home([string]$name): base($name) {    }    # The method GetChildItems is called when listing directory content    [object[]] GetChildItem() {        $obj = @()        $obj += [ntSystemsType]::new(\\\"Category\\\")        $obj += [ntSystemsType]::new(\\\"Tags\\\")        $obj += [ntSystemsType]::new(\\\"Author\\\")        $obj += [ntSystemsType]::new(\\\"Language\\\")        return $obj    }}The above example contains the constructor required for root nodes as well as a method GetChildItem that returns an array of objects when it gets called.See it in action:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\Posts by Category\\\\PowerShell\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\Posts by Category\\\\ntSystems\\\\Jekyll Fun: Consuming ntSystems with PowerShell' Pretty cool, right? Thanks for reading, have fun!TomLinks  SHiPS  SHiPS Architecture\"\n},{\n  \"title\": \"Powershell Script to enable specific Office 365 Service\",\n  \"url\": \"/post/powershell-script-to-enable-specific-office-365-service/\",\n  \"date\": \"February 5, 2019\",\n  \"category\": \"Azure\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"author\": \"dni\",\n  \"content\": \"Currently I’m in an Exchange Migration project to migrate all mailboxes from Exchange onPremise to Exchange Online. Yeah.. of course.. killing Exchange onPrem… again :)I have the following situation that all users already have Office 365 Licenses assigned like E1 / E3 or E5. There are some users that don’t have all Office 365 services the license includes enabled and so there are some disabled services. The license situation is not really structured.. When I’m going to migrate the mailboxes to Exchange Online I need to enable the Exchange service for every user so they can access the mailbox.It doesn’t sound like a big deal but the tricky part is I want to preserve the disabled services for every user. I cannot apply a default license to all users and I’m too lazy to click through all users and enable the Exchange Online switch manually..So now I want to share with you a script that does all the magic automatically.. Maybe its also helpful for you in some situations.Please consider:I’m not a DEV :)  The Scripts works for one service at a time  The Script works for E1 / E3 / E5 licenses but can easily extend to include other license types  I write out a LOG file with the detail the script does  The user list can also be a CSV file# ConnectConnect-MsolService# Load User List$UserList = \\\"User1@domain.local\\\",\\\"User2@domain.local\\\",\\\"User3@domain.local\\\"$LogFile = \\\"C:\\\\Users\\\\nitz_\\\\LOG\\\\LicenseLog.txt\\\"# Troubleshoot#$UserList = \\\"user1@domain.com\\\"#$User = \\\"user1@domain.com\\\"ForEach($User in $UserList){    If (Get-MsolUser -User $User)    {        #Variable        $UserLicense = $Null        $ChangeLicense = $false        # Check what License the user has        $LicensesAssigned = (Get-MsolUser -User $User).Licenses.AccountSkuId        If ($LicensesAssigned -like \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -notlike \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -notlike \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E5\\\"            $LicenseToActivate = \\\"EXCHANGE_S_ENTERPRISE\\\"            $UserLicense = \\\"ENTERPRISEPREMIUM\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E5\\\"        }        ElseIf($LicensesAssigned -notlike \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -notlike \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -like \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E3\\\"            $LicenseToActivate = \\\"EXCHANGE_S_ENTERPRISE\\\"            $UserLicense = \\\"ENTERPRISEPACK\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E3\\\"        }        ElseIf($LicensesAssigned -notlike \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -like \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -notlike \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E1\\\"            $LicenseToActivate = \\\"EXCHANGE_S_STANDARD\\\"            $UserLicense = \\\"STANDARDPACK\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E1\\\"        }        Else{            Write-Host \\\"User $User has License mismatch, please check\\\" -ForegroundColor Red            Add-content $Logfile -value \\\"ERROR -- User $User has License mismatch, please check\\\"        }        # Change License        If($ChangeLicense)        {            $DisabledLicenses = @()                $License = (Get-MsolUser -User $User).Licenses | where{$_.AccountSkuId -like \\\"*$UserLicense*\\\"}                ForEach($LicenseOption in $License.ServiceStatus){                    If($LicenseOption.ProvisioningStatus -eq \\\"Disabled\\\"){                        If($LicenseOption.ServicePlan.ServiceName -eq $LicenseToActivate){                            Write-Host \\\"Skip disabling License $LicenseToActivate for User $User\\\" -ForegroundColor Green                        }Else{                            If($DisabledLicenses -eq $Null){$DisabledLicenses = $LicenseOption.ServicePlan.ServiceName}                            Else{$DisabledLicenses = $DisabledLicenses + $LicenseOption.ServicePlan.ServiceName}                                        }                    }                }                Add-content $Logfile -value \\\"User $User has disabled Plans $DisabledLicenses\\\"                # Assign new License Option                $LicenseOptions = New-MsolLicenseOptions -AccountSkuId $License.AccountSkuId -DisabledPlans $DisabledLicenses                Write-Host \\\"Applying License Option to User $User\\\" -ForegroundColor Green                Set-MsolUserLicense -UserPrincipalName $User -LicenseOptions $LicenseOptions                Add-content $Logfile -value \\\"User $User assigned new License Option\\\"        }    }else{        Add-content $Logfile -value \\\"ERROR -- User $User NOT FOUND\\\"    }}Feel free to use this script or just to take the basic functions and improve it to fulfill your special needs.Daniel\"\n},{\n  \"title\": \"Windows Server 2019 and RADIUS\",\n  \"url\": \"/post/windows-server-2019-radius/\",\n  \"date\": \"January 31, 2019\",\n  \"category\": \"Server\",\n  \"tags\": [\"Security\",\"Firewall\"],\n  \"author\": \"tto\",\n  \"content\": \"First of all, happy new year :) Today we will have a quick look at Windows Server 2019, more specifically the Network Policy Server role.BackgroundI was recently asked to help with an enterprise WiFi deployment and decided to use a RADIUS server for authentication purposes. I went on to deploy a new Windows 2019 VM and installed the NPS role. After adding the RADIUS client and configuring the required policies, I added the NPS server’s IP address to the WiFi controller and tried to authenticate. A simple task generally, but this time it did not work.TroubleshootingThe RADIUS server was located behind a NAT device so my first guess was that I had misconfigured a policy or mistyped an address or something. I double checked the configuration and, as it looked ok, started to scratch my head. In order to better understand what was going on, I installed wireshark on the NPS machine and saw packets incoming from the WiFi controller quite happily. But packet were only incoming, I could not find a single response coming from NPS. The Security Event Log on the VM, where you would typically find NPS logs, had no events related to NPS. So basically the NPS was not responding to RADIUS messages at all.SolutionAfter a quick google search for “Windows 2019 NPS” I found an entry in the TechNet Forums (link below) where someone explained the Windows Firewall had to be configured to allow RADIUS (udp/1812, udp/1813) traffic even though such a rule did already exist. Sure enough, after adding the firewall rule, authentication worked.DHCP Relay (update)So today, half a year later, I had a very similar problem with DHCP relay. The Windows 2019 DHCP Server would receive DHCP requests from a relay agent but it would never respond to them. I configured the local firewall to allow traffic on UDP ports 67 and 69 and voilà, DHCP started working.Links  TechNet Forums  User Voice\"\n},{\n  \"title\": \"Sending events to Splunk's HTTP Event Collector with PowerShell\",\n  \"url\": \"/post/sending-events-to-splunks-http-event-collector-with-powershell/\",\n  \"date\": \"December 2, 2018\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Using Invoke-RestMethod to send events to a Splunk instance.SplunkIf you don’t know Splunk this article is not going to give a thorough introduction. Let’s just say it’s a pretty fancy log collector/analytics tool. According to the company’s profile, Splunk turns machine data into answers. The goal of this article is to demonstrate how to use PowerShell to send events to the HTTP Event Collector which is Splunk’s REST interface to ingest logs.Enable Event Collector and create API Key (Token)Connect to your Splunk’s web interface with appropriate permissions and using Settings, Data inputs, click on HTTP Event Collector. If you are not already using the Event Collector service it has to be enabled using the Global Settings button in the top right corner.Then use the New Token button to create a new API key and configure how Splunk handles data it receives using this token. In the first step, give a name to the token you are about to create.The second step is about handling the data, select an appropriate source type, I use json in this case, and the the right App Context. I select the search app for this example, though it can be any installed Splunk app. At the bottom of step two, select the index where Splunk will store the data. If you are not sure which index to use, create a new one. I created an index with the name of PowerShell and assigned it to the search application as selected before.Review the configuration in the last step and create the new token. Take note of the Token Value, you will need it later.Once the token has been created, you can click on Start Searching and Splunk will automatically create the right search for you. As we have not yet sent data, the search should not return any results.PowerShell Send-SplunkEventI put together a quick wrapper for Invoke-RestMethod that makes sending logs to Splunk relatively easy. All you need is the API key (Token Value) from above and the URI of your event collector service. For this example I am using a Splunk instance on my local machine, so the Uri is “http://localhost:8088/services/collector”, for a production environment, you would probably use https and replace localhost with the name of your instance.The idea behind the script was to sort through logs from different systems in PowerShell, turn them into structured data and send them to Splunk. As logs originate on systems other than the one where this script runs, the HostName parameter can be used to specify the ‘host’ property of the event and the DateTime parameter can be used to set the ‘time’ property.Examples and usageThe script has two required parameters, InputObject and Key. Use the InputObject parameter to pass an object (or hashtable) to the script. This will be turned into json, using PowerShell’s ConvertTo-Json and then sent to the REST API using Invoke-RestMethod.Use the Key parameter to pass the HTTP Event Collector token that we created above to the script..\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\"Hello Splunk!\\\";severity=\\\"INFO\\\"} -Key &lt;token&gt; Get-Service wuauserv | .\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; -Uri http://localhost:8088/services/collectorThe first example just sends a custom hashtable with the two fields message and severity. The second example gets a service object and converts it into a json object before sending it.Note: The Uri parameter defaults to localhost, you will have to specify it like in the second example, if sending to a remote instance.SearchNow search for the events in the newly created PowerShell index: index=\\\"powershell\\\" sourcetype=_jsonPerformanceAs the script is making a new RESTful call for every single event, this is not the fastest way to get logs into Splunk. I have made some tests to compare WindowsPowerSell with the Core edition, here is what I’ve found:Measure-Command { Get-Process | .\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; }The above command takes 30 seconds on WindowsPowerShell, while it takes about 280 seconds on Core (tested with 6.1.0 and 6.2.0 preview 2).Download &amp; Source forThe Script is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    Links:  Send-SplunkEvent  Splunk REST API Reference  PowerShell Invoke-RestMethod\"\n},{\n  \"title\": \"lost & found: FFmpeg and Skype4B, Security Baseline for RS5\",\n  \"url\": \"/post/lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5/\",\n  \"date\": \"October 7, 2018\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"Skype4B\",\"WSL\",\"Client\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"A quick edition of lost &amp; found on how to use FFmpeg on WSL to create audio files that can be used for Skype for Business announcements. And an observation about the recently published security baseline for Windows 10 1809 and Server 2019.FFmpegAccording to it’s website, FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.Packages are available for various operating systems but since Ubuntu runs just fine on Windows 10, I started using linux-style command-line tools in the Windows Subsystem for Linux.Check if you are running the latest version using ffmpeg -version or install to tool using sudo apt-get install ffmpeg.According to @greiginsydney a 16 kHz, mono, 16-bit Wave file is recommended for best performance.To convert an MP3 file to Wave with the above specifications, we can use something like this:ffmpeg -i Downloads/ringtone.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ringtone.wavSecurity BaselineMicrosoft recently released the draft of the security baseline configuration for RS5 builds, that’s Windows 10 v1809 and Windows Server 2019. You can find more information about that on the Security Guidance blog, I just wanted to share a quick note for the Office 365 Admins out there:The security baseline configuration contains a setting to disable Basic Authentication for the WinRM client. After applying the baseline configuration, I was no longer able to connect to Exchange Online or Skype for Business Online remote PowerShell Sessions as they rely on basic authentication.Set the following configuration to Not Configured on your admin machines:Administrative Templates\\\\Windows Components\\\\Windows Remote Management (WinRM)\\\\WinRM Client\\\\Allow Basic authenticationLinks:  Audio file formats for Lync and Exchange  FFmpeg  Security baseline (DRAFT) for Windows 10 v1809 and Windows Server 2019\"\n},{\n  \"title\": \"Remote EMS over IPMI serial-over-lan\",\n  \"url\": \"/post/remote-ems-over-ipmi-serial-over-lan/\",\n  \"date\": \"October 1, 2018\",\n  \"category\": \"Skype4B\",\n  \"tags\": [\"Network\",\"PowerShell\",\"Server\",\"AudioCodes\"],\n  \"author\": \"tto\",\n  \"content\": \"Using standards-based IPMI to get some sort of out-of-band management for AudioCodes’ embedded server modules.BackgroundWe’ve installed a number of session border controllers with embedded server modules for our international customers. The embedded server modules are typically used to run Skype for Business survivable branch servers which provide limited calling services in case of a connectivity issue with the Front End pools. Because IT personnel is not available in branch sites or the devices are installed in data centres with limited access, we relied upon Intel’s AMT for out-of-band management of the earlier version of the server module.AudioCodes upgraded the embedded server module and it turns out, the new version no longer has an AMT chip. Studying the data sheet of the OEM that builds the module, we found that it Supports IPMI v1.5 and Serial-over-LAN function. The OEM couldn’t help much so I basically googled/tried my way to this solution, maybe my experience saves someone a few hours in the future.Intelligent Platform Management Interface (IPMI)First of all, I had to read up on IPMI. According to Wikipedia it provides management and monitoring capabilities independently of the host system’s CPU, firmware (BIOS or UEFI) and operating system. Windows does implement some basic functionality through CIM and the PcsvDevice PowerShell module, but, apart from that, we have to rely on other tools such as ipmiutil to communicate with this interface.ipmiutil is an open-source utility to manage and interpret IPMI systems with common software. If used inside the OS on the server, it can access and configure the local Baseboard Management Controller (BMC). Once configured, the utility can be used to invoke IPMI functions remotely.IPMI configurationTo show the current configuration of the local BMC we can use the following examples:.\\\\ipmiutil.exe config.\\\\ipmiutil.exe lan -lTo set an IP address and the username/password to use for remote connections, we can use something like this:.\\\\ipmiutil.exe lan -e -I 192.168.120.131 -S 255.255.255.0 -G 192.168.120.254 -L 5 -p ipmipass -u ipmiadminThe above example sets the IP address of the BMC to 192.168.120.131/24 and the default gateway to 192.168.120.254. Additionally, we set the username to ipmiadmin and the password to ipmipass.We verify the configuration using the ipmiutil config from the first example, if it looks good, we can try the same from a remote system:[PS] ~\\\\ipmiutil&gt; .\\\\ipmiutil.exe config -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil config ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0### ipmiutil config, GetPefEntry ...# GetPefEntry(1): ret = 193 Invalid Command### ipmiutil config, GetLanEntry for channel 5 ...LanParam 5,0,0:  00LanParam 5,1,0:  14LanParam 5,2,0:  14 14 14 14 00LanParam 5,3,0:  c0 a8 78 83# LanParam(5,3,0) IP address: 192.168.120.131LanParam 5,4,0:  01LanParam 5,5,0:  c4 00 ad 01 f5 73...In the above example, we run ipmiutil config on another machine and use the -N parameter to specify a remote host, -U and -R are used to specify the username and password, respectively. The output shows the connection succeeded and thus, we have remote connectivity.Now we have an way to manage certain features of the remote system independently from the operating system that’s installed on said system. We can, for example, use ipmiutil reset to control the systems power state..\\\\ipmiutil.exe reset -c -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\ipmiutil.exe reset -d -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\ipmiutil.exe reset -u -N 192.168.120.131 -U ipmiadmin -R ipmipassThe above lines power cycle, power down or power up the remote system. Use with caution.If the BMC is not reachable from a remote system, I’ve found ipmiutil reset -k useful. This does reset the BMC, without affecting the OS.Serial over LAN (sol) and Emergency Management Services (EMS)Apart from controlling the systems power state, IPMI also implements serial-over-lan connectivity. This can be used to connect to a remote system’s serial console using an IP connection. Now on Windows servers we do not typically use serial connections, at least not for management. But, as it happens, the Emergency Management Services console provides exactly that: a special management console over serial connections. The Emergency Services are not enabled by default, so we have to enable it and make sure it uses our serial-over-lan connection.To do this, we use the bcdedit utility (from an administrative command-line), first to redirect the EMS console to serial port #2, then to enable EMS for the current Windows installation:bcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200bcdedit /ems on To activate the change and enable EMS, Windows must be rebooted. After that, we can go ahead and start our first sol session using the following command:[PS] ~\\\\ipmiutil&gt; .\\\\ipmiutil.exe sol -a -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil sol ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0Opening lanplus connection to node 192.168.120.131 ...[SOL session is running, use '~.' to end, '~?' for help.]SAC&gt;The SAC prompt indicates we are now connected to the special administration console. This console can be used to retrieve information about the system, it’s network interfaces and running processes. We can also connect to the OS via cmd.SAC&gt;cmdSAC&gt;ch -si 1The above example creates a new cmd channel and connects to it. It will prompt for credentials to connect to Windows and, upon success, we have a remote cmd.exe interface. Type in powershell and enjoy :)Finally, we can use -d to disconnect from the sol session:.\\\\ipmiutil.exe sol -d -N 192.168.120.131 -U ipmiadmin -R ipmipassThis is also useful if the sol session fails with the message: “SOL payload already active on another session”.SecurityNow as you can see, enabling IPMI and making the SAC available over serial-over-lan, adds another way of managing the system. This can be convenient but it also increases the system’s attack surface. Make sure to limit access to IPMI endpoints and don’t use high-privilege accounts when logging into the SAC remotely.Links:  Sourceforge download and man page  AudioCodes 1000 sbc  Boot Parameters to Enable EMS Redirection\"\n},{\n  \"title\": \"Network assessment with policy-based QoS and iperf3\",\n  \"url\": \"/post/network-assessment-with-policy-based-qos-and-iperf3/\",\n  \"date\": \"September 22, 2018\",\n  \"category\": \"Skype4B\",\n  \"tags\": [\"Network\",\"Skype4B\",\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"In Skype for Business and, more recently, Teams deployments, a solid network and a good knowledge of it are fundamentally important.We typically work very closely with the network/security departments and make sure to involve them from the beginning to have their support throughout the project. After deploying QoS, ideally before rolling out voice/video for the end-users, we run some tests to verify the QoS configuration, measure the reserved bandwidth and whether it remains stable over some amount of time. There are various tools available for this task, I mostly use iperf3 to generate traffic and measure basic parameters.iperf3 basicsAccording to the GitHub page, iperf3 is “a tool for active measurements of the maximum achievable bandwidth on IP networks”. It is primarily developed on Linux but Windows executable are available from various sources. I’m using the version 3.6 build that can be found on NeoWin (see below).After copying the files to the machine, we can start the server using the the following command line. This starts a listener at tcp/udp 5201 and waits for iperf clients to connect..\\\\iperf3.exe -sOn the client side, we have multiple options, as stated above, iperf’s goal is to measure the maximum bandwidth, so if we start the client without parameters, that is what it will do: .\\\\iperf3.exe -c 192.168.120.185 Connecting to host 192.168.120.185, port 5201[  5] local 192.168.120.160 port 52070 connected to 192.168.120.185 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec   530 MBytes  4.44 Gbits/sec[  5]   1.00-2.00   sec   607 MBytes  5.09 Gbits/sec...Note that in the above example, iperf uses TCP and measures end-to-end available bandwidth between the client and server. This may saturate network links in between. Use with caution.We can also try to simulate RTP media (small UDP packets) by specifying the following parameters: .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200Note that with UDP, the target bitrate defaults to 1 Mbit per second, this can be changed with the -b parameter. Also, when using UDP, jitter and packet loss are measured.More information: NeoWin, GitHub, Documentation (outdated)Now that we have a tool to generate traffic and measure bandwidth, we can go ahead and put some DSCP tags on the traffic to see how the network handles quality of service.  iperf has a –dscp parameter, this does not work on Windows as applications are not trusted to set DSCP values. The only way (that I know of) to tag packets with DSCP values is policy-based QoS.Creating the QoS PoliciesWe would typically use group policies to manage policy-based QoS settings but since this is a test, we can go ahead and use the NetQos PowerShell module on the client/server machines to create temporary policies.A quick Get-Command -Module NetQos shows that the module provides four cmdlets, we can Get, Set, Remove, and create New QoS policies with the respective *NetQosPolicy cmdlet.So we create two policies for the iperf server and client applications. The server listens on port 5201 by default, so all traffic originating from the server will use that source port.New-NetQosPolicy -Name \\\"iperf_server\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPSrcPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreThe client will communicate with the server by sending to the port 5201, so all traffic originating from the client will use that destination port.New-NetQosPolicy -Name \\\"iperf_client\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPDstPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreNote: By specifying ActiveStore as the policy store, the QoS policy will not be persistent. On the next reboot of the system, it will be gone.  We want to measure both directions, so we create both policies on the server and both on the client.Test and traceNow it’s time to start a network trace on the client and the server and run iperf again. If QoS has been configured, we should see packets leaving the client tagged with DSCP 46 and this tag should be preserved and be displayed on the server-side as well. I run the following two tests on the client, the -R parameter reverses the flow, so in the second case, the server sends packets to the client: .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -J --logfile send.json .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -R -J --logfile recv.jsonThe following screenshots show a trace from the above test on the client (1) and on the server (2). We can see that packets from client to the server (source: 192.168.120.160, destination: 192.168.120.185) are tagged on the client…… and the tag is still present when the server receives them.After switching the stream’s direction (with -R), we observe the same: packets leave the server tagged, and are received by the client with the tag still on.With the -J and --logfile parameters we instruct iperf to write output in JSON format and redirect it to a text file. With PowerShell we can now easily work with that data:$send = Get-Content send.json -Raw | ConvertFrom-Json$send.intervals.streams | Out-GridView$send.end.sumAt this point, it’s important to note that until now we have only proved, that the network does not remove the DSCP tags we put on our test packets. Whether the network actually prioritizes such packets is not yet clear. The easy way to verify that, would be to log into the network devices (QoS policies are typically enforced on routers) and get some counters/statistics. If that is not possible, we have to find out how much bandwidth is reserved for a given class empirically. To do that, we need a link that can be saturated (no congestion, no prioritization) and then run the above test again.More about QoS PoliciesWhen configuring policy-based QoS, either by group policy or by PowerShell, check the event log to see if the system refreshed the policy correctly. The following event is logged, when a policy change is detected:Log Name:      Microsoft-Windows-Policy/OperationalSource:        Microsoft-Windows-EQoSEvent ID:      2Level:         InformationDescription:   Computer QoS policies successfully refreshed. Policy changes detected.The NetQos module is a wrapper for the WMI/CIM objects managing the quality of service policies. We can also manipulate the CIM instance directly, e.g. to delete policies:Get-CimInstance -Namespace ROOT/StandardCimv2 -ClassName MSFT_NetQosPolicySettingData | Remove-CimInstanceLinks:  How to validate VPN throughput to a virtual network\"\n},{\n  \"title\": \"Exchange Hybrid Observations\",\n  \"url\": \"/post/exchange-hybrid-observations/\",\n  \"date\": \"June 16, 2018\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Office365\",\"Hybrid\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Like I did here with Skype for Business, I’m collecting some observations and useful snippets about Exchange in hybrid environments.Completing individual migration usersRecently we have been using the CompleteAfter flag in favour of the older SuspendWhenReadyToComplete to set a date for migration batches to complete. To update this timestamp for a single mailbox in a batch, we can use the following command:Get-MoveRequest tom | Set-MoveRequest -CompleteAfter (Get-Date).AddHours(-1)In the above example, the move request for the mailbox tom will be completed immediately without affecting other mailboxes in the batch.Getting details about BadItemsPart of every migration are mailboxes with items that are either corrupt or cannot be imported to Exchange Online for some reason. Now if we don’t just increase the BadItemLimit counter but want more information about the corrupt items, we can get more information by using the -IncludeReport parameter with the Get-MigrationUser cmdlet:$Stats = Get-MigrationUserStatistics -Identity tom@ntsystems.it -IncludeReport $Stats.Report.BadItemsRecipient PermissionsThe *RecipientPermission cmdlets are used to manage SendAs permissions in Exchange Online. A nice goody of the Get-RecipientPermission cmdlet is the option to find permissions by assignee, i.e. by user to whom the permissions are granted. To get all entries that grant permissions to the user tom we use the -Trustee parameter like this:Get-RecipientPermission -Trustee tomLikewise, we can find all permissions by access right using the -AccessRights parameter. The following example gets all entries that grant SendAs permissions:Get-RecipientPermission -AccessRights SendAsShared MailboxesStarting with the June 2018 quarterly updates (2013 CU21 and 2016 CU10), the management of shared mailboxes in hybrid scenarios got easier. A -Shared parameter got added to the *RemoteMailbox cmdlets, instead creating a shared mailbox on-prem and then moving it to Exchange Online, we can now use New-RemoteMailbox -Name Office -Shared.You have already updated to CU21/CU10 but the Shared parameter is not available? Run .\\\\setup.exe /PrepareAD /IAcceptExchangeServerLicenseTermsMore Info: KB4133605Tom\"\n},{\n  \"title\": \"lost & found: Updates and no more tracking on ntSystems.it\",\n  \"url\": \"/post/lost-found-no-tracking-on-ntsystems/\",\n  \"date\": \"June 3, 2018\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve recently updated the sources of the blog and moved to the gem-based version of the minima theme. This should make the site easier to maintain in the future.On the old, blogengine-based site, we used Google Analytics to get some information about our readers.  Since the migration to GitHub pages and Jekyll, I’ve tried to remove external scripts and tracking as much as possible.This is just a static website with some free (as in beer) content we’d like to share. We do no longer inject any tracking code and the few scripts we use are served directly from GitHub pages. But, until recently, there was one last exception to this: the comments. We’ve used Disqus comments for a long time now and I don’t really see a need to change that.However, as the comments iFrame is loaded from an external source (and may include tracking code), I’ve decided to stop automatically loading the iFrame and instead give you, the reader, an option to load it.From now on, you’ll see a “Show comments.” link at the bottom of each post and only after clicking the link, external content is loaded.What do you think? Leave a comment below ;)Tom\"\n},{\n  \"title\": \"Azure Functions: Building a Telegram Bot with PowerShell 2\",\n  \"url\": \"/post/azure-functions-building-a-telegram-bot-with-powershell-2/\",\n  \"date\": \"May 20, 2018\",\n  \"category\": \"Azure\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"Welcome back to the second part of our little fun experiment with Telegram and Azure Functions. In the first part we created the function app and the bot, now let’s hook them up.Connecting the bot with the Azure FunctionWe can get updates from Telegram bots in two ways, there is a getUpdate method that can be polled periodically, or we can use Webhooks. Our HTTP trigger function in Azure will run whenever it receives a http request, so it is just perfect for the latter.To configure our Azure Function as a destination for the bot’s webhook, we use the setWebhook method and pass a hashtable with an URL parameter:Invoke-RestMethod -Uri https://api.telegram.org/bot528059907:AAxxVs/setWebhook -Body @{    \\\"url\\\"=\\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\"} -Method PostTo verify that the URL has been set correctly, we can call getWebhookInfo:[PS] C:\\\\&gt; Invoke-RestMethod https://api.telegram.org/bot528059907:AAxxVs/getWebhookInfo  ok result  -- ------True @{url=https://ntsystemsbot.azurewebsites.net/api/Listener?code=Waa...At this point our function will get a http request every time someone writes to the Bot account. So now it’s time to do something with it.OverviewFirst of all: I am sure there are a hundred ways this can be done better… What I am trying to accomplish with this simple example is a demonstration of Azure Functions and the different triggers, inputs, and outputs it provides. That said, here’s what I came up with:Our first function, the Listener, uses a HTTP trigger as input and Azure Queue Storage as output. This function will run, whenever a user sends a message to our bot and it will take the message and write it to a Storage Queue.Another function, I called it UpdateData uses a timer trigger to get information from the blog and write it to Azure Blob Storage.The third function, our Worker, uses Azure Queue Storage as trigger and Azure Blob Storage as input. The trigger is the same Queue that the Listener writes to, so a request coming from Telegram will be written to a Queue by the Listener function and trigger this Worker function.A last function, the Responder, finally sends a POST request to the Telegram bot. This function is triggered by the Worker’s output queue and uses no other inputs or outputs.To summarize, the Storage Queues are connected like this:  Listener &gt; Worker &gt; ResponderThe FunctionsThere are different ways to create or modify functions. The Azure console provides an easy-to-use GUI to configure triggers, inputs and outputs. It even has an editor for the functions’s code :) For the more advanced stuff, we can connect to the functions Kudu Services and upload files directly or use the debug consoles. Each function basically consists of a folder, the folder contains a function.json file which describes the function (type, trigger, input, output) and a run.ps1 file which contains the PowerShell code.The ListenerAs mentioned before, the first function just listens for a http request by the Telegram Bot and writes it to a storage queue.The function.json file defines the trigger httpTrigger and the input/output variables. The following is the actual configuration file for my Listener function:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"req\\\",      \\\"type\\\": \\\"httpTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"webHookType\\\": \\\"genericJson\\\"    },    {      \\\"name\\\": \\\"res\\\",      \\\"type\\\": \\\"http\\\",      \\\"direction\\\": \\\"out\\\"    },    {      \\\"type\\\": \\\"queue\\\",      \\\"name\\\": \\\"outputQueueItem\\\",      \\\"queueName\\\": \\\"listenerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}The name defined in each object is made available as variable in the function’s code and contains a file path. That allows us to use Get-Content $req to get the HTTP request’s body. As well as Out-File $outputQueueItem and Out-File $res to write to the Storage Queue or respond to the HTTP request, respectively. How cool is that?!The functions code, in the run.ps1 file is as simple as that:# POST method: $req$requestBody = Get-Content $req -Raw # Wirte input to QueueOut-File -FilePath $outputQueueItem -Encoding Ascii -inputObject $requestBody# Respond to the incoming web requestOut-File -Encoding Ascii -FilePath $res -inputObject $trueThe request body is made available through the $req variable, we read the variable and write it to the $outputQueueItem which represents the Storage Queue listenerqueue\\\\outputQueueItem in the AzureWebJobsDashboard storage account.We do also respond to the incoming web request by writing to the $res variable.The WorkerThe next function is triggered by the same listenerqueue\\\\outputQueueItem we write to in the first function, so it will always run, after the first function finished. The content of the storage queue is made available through the $triggerInput variable:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"triggerInput\\\",      \\\"type\\\": \\\"queueTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"queueName\\\": \\\"listenerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\"    },    {      \\\"type\\\": \\\"blob\\\",      \\\"name\\\": \\\"inPosts\\\",      \\\"path\\\": \\\"outcontainer/posts\\\",      \\\"connection\\\": \\\"AzureWebJobsStorage\\\",      \\\"direction\\\": \\\"in\\\"    },    {      \\\"type\\\": \\\"queue\\\",      \\\"name\\\": \\\"outputQueueItem\\\",      \\\"queueName\\\": \\\"workerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}This function does not send HTTP responses, so there is no need to define an HTTP output. The only output for the Worker is another storage queue.As you’ve noted, we define another input for this function, namely outcontainer/posts, we’ll get to that later.The PowerShell code in run.ps1 does the actual work, so it evaluates the input and decides what to do with it.# Read input from StorageQueue$requestBody = Get-Content $triggerInput -Raw | ConvertFrom-Json$posts = Get-Content $inPosts -Raw | ConvertFrom-Json | Select-Object -Expand items...Out-File -Encoding Ascii -FilePath $outputQueueItem -inputObject ($outObj | ConvertTo-Json)Again, we simply read the input using Get-Content and write the output to the defined variable. I’ve omitted the actual code, to make this readable. You can find the code here:             ntsystemsit/ntsystemsbot    The ResponderThe responder is finally triggered by the workerqueue\\\\outputQueueItem and sends an http request to the Telegram Bot API, thereby responding to the user. The configuration is basically the same as above, and you can find it in the GitHub repo.To actually send a message to the Telegram Bot, I’ve created the following helper function. It uses Invoke-RestMethod to send a POST request to the /sendMessage API endpoint.function New-TelegramMessage {    [cmdletbinding()]    param(        $ChatId,        $Text,        $Mode = \\\"Markdown\\\",        $ReplyId,        $ReplyMarkup    )    $body = @{        \\\"parse_mode\\\" = $mode;        \\\"chat_id\\\"= $ChatId;        \\\"text\\\" = $Text;    }    if($ReplyId) {        $body.Add(\\\"reply_to_message_id\\\",$ReplyId)    }    if($ReplyMarkup) {        $body.Add(\\\"reply_markup\\\",(ConvertTo-Json $ReplyMarkup -Depth 5))    }    Invoke-RestMethod -Uri https://api.telegram.org/bot$env:TG_Token/sendMessage -Body $body -Method Post}  Note: The URL must contain the Bot’s API key. As I wanted to publish the code, I’ve stored the key in the function’s application settings. These settings are available as environment variables in the code, so I can access the key thorough: $env:TG_Token.Update DataThe last piece we need for our little example is the UpdateData function. This one uses a timer trigger and just gets all posts of our blog and stores them in an Azure Storage Blob.The function definition contains the schedule and the Storage Blob we want to write to:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"myTimer\\\",      \\\"type\\\": \\\"timerTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"schedule\\\": \\\"0 0 1 * * *\\\"    },    {      \\\"type\\\": \\\"blob\\\",      \\\"name\\\": \\\"outPosts\\\",      \\\"path\\\": \\\"outcontainer/posts\\\",      \\\"connection\\\": \\\"AzureWebJobsStorage\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}The schedule is in a cron-type format, so this function will run at 01:00 hours every day.Again, the PowerShell code is simple enough:(Invoke-WebRequest https://ntsystems.it/api/v1/posts/ -UseBasicParsing).content | Out-File -Encoding ascii -FilePath $outPostsThe Bot in actionOk, so with all of our code in place, we should now be able to communicate with our Bot using the Telegram messenger. Just search for the ntsystemsbot account and try it out :)This turned out to be a long story and there is so much left to explore. I hope the first two posts of this little series helped you understand the basics of Azure Functions, if someone finds a more practical use case a PowerShell-based Chatbot, I’d like to hear about it :)Thanks for reading!TomMore Information:  Telegram Bot Api  Azure Functions Webhooks\"\n},{\n  \"title\": \"Azure Functions: Building a Telegram Bot with PowerShell 1\",\n  \"url\": \"/post/azure-functions-building-a-telegram-bot-with-powershell-1/\",\n  \"date\": \"May 19, 2018\",\n  \"category\": \"Azure\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"Today I’ve got a fun one, we’re going to use Azure Functions to build a Telegram Bot with PowerShell. Sounds interesting? Well here we go. Before diving into the technical details, lets have a quick overview of what we’re trying to do.A Telegram Bot is an application that runs inside Telegram; users can interact with a Bot by sending them messages (or commands). The bot’s administrator controls the bot through a https-based API.Azure Functions is a serverless platform that lets us run pieces of code (functions) without worrying about the infrastructure. It’s called serverless because we just deploy code, no need to install virtual machines or applications. Azure functions support different programming languages, one of them is PowerShell. It’s still in experimental state, but it works just fine for what we’re going to do.So yes, we’re going to hook up our bot with a function app running PowerShell code in Azure.Azure FunctionsIn order to deploy our Azure Function, we have to login to the Azure Portal and create a new resource. Select the “Serverless Function App” which is currently listed in the Popular section of the marketplace, if it doesn’t show up, search for “Function App” and click Create.We’ll have to give a name to our app and select a storage account and location for the deployment. Once the deployment is finished, we can find the application through the All resources button on the left side in the Azure portal. Click the function app and add a new function. As noted before, PowerShell support is still experimental, so we have to create a new custom function, enabling the “Experimental Language Support”.Functions can have different triggers as well as various inputs and outputs. For our example, we’ll go with the “HTTP trigger” function. This function will run whenever it receives a HTTP request. Set the Language to PowerShell and the Authorization level to Function.The function is created with some basic code to get started, I’ve changed it a bit so that it will just return the object we pass to it.# POST method: $req$requestBody = Get-Content $req -Raw | ConvertFrom-Json# Response: $resOut-File -Encoding Ascii -FilePath $res -inputObject ($requestBody | ConvertTo-Json)Please make note of the function URL, right there next to the Run button. Remember that we selected an Authorization level of Function when creating the function, so we need to use a key when calling the function. This makes sure, that only our bot can call the function.To test the function, we can use Invoke-RestMethod to send a POST request:[PS] C:\\\\&gt; Invoke-RestMethod -Uri \\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\" -Body '{\\\"Name\\\": \\\"Tom\\\"}' -Method PostName----TomOk, so now that we’ve got a working function, let’s go ahead and create the bot.Telegram BotTo create a Telegram bot, well, we use a bot. Look up the @BotFather account and follow the instructions.For this basic example, it was enough to specify a name and account name:The BotFather will guide you through the process and, at the end, give you access token for the http API. To edit the bot after the fact, just use the /myBots command. To test the access token and verify the bot has been created, we can call the following URL:https://api.telegram.org/bot&lt;AccessToken&gt;/getMeReplace &lt;AccessToken&gt; with the actual token, just like that:[PS] C:\\\\&gt; Invoke-RestMethod -Uri \\\"https://api.telegram.org/bot528059907:AAxxVs/getMe\\\"  ok result  -- ------True @{id=550258749; is_bot=True; first_name=ntSystems.it; username=ntsystemsbot}Ok, now we should have a working Azure function app and a barebones Telegram bot. Continue to part two for the next steps.\"\n},{\n  \"title\": \"lost & found: ntSystems Onion Service, Cloudflare DNS\",\n  \"url\": \"/post/lost-found-onion-service-cloudflare-dns/\",\n  \"date\": \"April 6, 2018\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"It’s Friday and here’s another edition of lost &amp; found.We’re on torOur few twitter followers may already know it, for the rest of you here’s the news: Our little website is now also available as an Onion Service. Check it out at: ntsystcp…id.onionI’ve made some changes to the site in order to improve our readers privacy. Basically trying to serve all content directly and, for the Onion version, there are no Disqus comments as that requires external content and automatically loads some tracking scripts.Cloudflare launches 1.1.1.1We have been using Cloudflare to enable TLS and IPv6 (and more) for quite some time now. They launched a consumer DNS service on the first day of April. No, it was no joke. The Service is available at 1.1.1.1 and 1.0.0.1 and, interestingly, supports DNS over HTTPS.I have not been aware of DoH until now, and even though there don’t seem to be any existing client implementations, it enables some nice use cases. We can now use PowerShell’s Invoke-RestMethod to make DNS queries :)Here’s a quick function that does it:function Resolve-HttpsDns {    param(        [Parameter(Mandatory=$true)]        [string]        $Name,        [string]        $Type = \\\"A\\\",        [ipaddress]        $Server = \\\"1.1.1.1\\\"    )    $uri = -join(\\\"https://\\\",$Server,\\\"/dns-query\\\")    Invoke-RestMethod -Uri $uri -Body @{        ct = \\\"application/dns-json\\\"        name = $Name        type = $Type.toUpper()    } | Select-Object -ExpandProperty Answer}And there is a much more advanced module on GitHub and the PowerShell Gallery.Sun’s out, so let’s have a cold one. Nice weekend!Tom\"\n},{\n  \"title\": \"Skype for Business Hybrid Observations\",\n  \"url\": \"/post/skype-for-business-hybrid-observations/\",\n  \"date\": \"March 15, 2018\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Office365\",\"Lync\",\"Skype4B\",\"Hybrid\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"A collection of information about Skype for Business in hybrid environments.Hosting ProviderExchange Online Hosted VoiceMailNew-CsHostingProvider -Identity 'ExchangeOnline' -Enabled:1 -EnabledSharedAddressSpace:1 -HostsOCSUsers:0 -ProxyFqdn \\\"exap.um.outlook.com\\\" -IsLocal:0 -VerificationLevel UseSourceVerificationSkype for Business OnlineNew-CsHostingProvider -Identity \\\"SkypeforBusinessOnline\\\" –Enabled:1 -ProxyFQDN \\\"sipfed.online.lync.com\\\" – EnabledSharedAddressSpace:1 -VerificationLevel UseSourceVerification – HostsOCSUsers:1 -AutodiscoverUrl 'https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root'  Note: Make sure the Edge Servers can lookup the _sipfederationtls records for your domains. The targets must be the Edge Server’s external interface.Push NotificationFor the push notification service to work, make sure the Skype for Business Online hosting provider has been configured and add push.lync.com to the allowed domains. Then enable the Push Notification Configuration:New-CsAllowedDomain -Identity \\\"push.lync.com\\\"Set-CsPushNotificationConfiguration -EnableMicrosoftPushNotificationService $True – EnableApplePushNotificationService $TrueExchange Online Integration# SFB Online PowerShell: Get Tenant Guid(Get-CsTenant).TenantId.Guid# SFB On-Premises PowerShell: OAuth ConfigurationNew-CsOAuthServer microsoft.sts -MetadataUrl \\\"https://accounts.accesscontrol.windows.net/&lt;GUID from above&gt;/metadata/json/1\\\"New-CsPartnerApplication -Identity microsoft.exchange -ApplicationIdentifier 00000002-0000-0ff1-ce00-000000000000 -ApplicationTrustLevel Full -UseOAuthServerSet-CsOAuthConfiguration -ServiceName 00000004-0000-0ff1-ce00-000000000000# SFB On-Premises PowerShell: Export SfB OAuth Certificate (on Front End Server)$thumbprint = (Get-CsCertificate -Type OAuthTokenIssuer).ThumbprintExport-Certificate -Cert Cert:\\\\localMachine\\\\my\\\\$Thumbprint -FilePath C:\\\\oAuth.cer# SFB On-Premises PowerShell: Point Autodiscover to EXOSet-CsOAuthConfiguration -ExchangeAutodiscoverUrl \\\"https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc\\\"# MSOnline PowerShell: Publish OAuth Cert and Add Service Principal Name$certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate$certificate.Import(\\\"C:\\\\oAuth.cer\\\")$binaryValue = $certificate.GetRawCertData()$credentialsValue = [System.Convert]::ToBase64String($binaryValue)New-MsolServicePrincipalCredential -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000 -Type Asymmetric -Usage Verify -Value $credentialsValue# Add Service Principal Name (sfb pool web services)$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\"00000004-0000-0ff1-ce00-000000000000/sfbwebext.uclab.eu\\\")$MsolSP | Set-MsolServicePrincipalThe Service Principal Names can alternatively be set using the *-AzureRmADServicePrincipal cmdlets from the AzureRM module.Once the configuration is complete, we can test Exchange Storage connectivity with the following command:Test-CsExStorageConnectivity -SipUri \\\"sip:tom@uclab.eu\\\" -Verbose  Note: The Front End Servers must be able to communicate with Exchange Online (directly or via proxy), otherwise the “Add Skype meeting” button will not be visible in Exchange Online OWA. This is also required for Modern Hybrid Authentication.To troubleshoot the Exchange Online Integration, run an UCWA (Web Infrastructure) trace on the Front End Servers. You should see incoming requests from Exchange Online and the corresponding responses from the Front End.# Request: Start-Line: POST /ucwa/oauth/v1/applicationsStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/defaultValuesStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/customInvitationStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/phoneDialInInformation...User-Agent: Exchange/15.20.588.14/OnlineMeetingContent-Type: application/vnd.microsoft.com.ucwa+jsonAccept: application/vnd.microsoft.com.ucwa+jsonX-ExCompId: OnlineMeeting# Response:Start-Line: 200 OKContent-Type: application/vnd.microsoft.com.ucwa+json; charset=utf-8{\\\"accessLevel\\\": \\\"Everyone\\\",\\\"entryExitAnnouncement\\\":\\\"Enabled\\\",\\\"attendees\\\":[],\\\"automaticLeaderAssignment\\\":\\\"SameEnterprise\\\",\\\"description\\\":\\\"\\\",\\\"leaders\\\":[],\\\"onlineMeetingId\\\":\\\"RMANN9FF\\\",\\\"onlineMeetingUri\\\":\\\"sip:tom@uclab.eu;gruu;opaque=app:conf:focus:id:RMANN9FF\\\",\\\"onlineMeetingRel\\\":\\\"myOnlineMeetings\\\",\\\"organizerUri\\\":\\\"sip:tom@uclab.eu\\\",\\\"conferenceId\\\":\\\"257150\\\",\\\"phoneUserAdmission\\\":\\\"Enabled\\\",\\\"lobbyBypassForPhoneUsers\\\":\\\"Disabled\\\",\\\"subject\\\":\\\"\\\",\\\"joinUrl\\\":\\\"https://meet.uclab.eu/tom/RMANN9FF\\\",\\\"2c04865e-a621-4a4d-81e0-8047131f87d8\\\":\\\"please pass this in a PUT request\\\",\\\"_links\\\":{\\\"self\\\":{\\\"href\\\":\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF\\\"},\\\"onlineMeetingExtensions\\\":{\\\"href\\\":\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF/extensions\\\"}},\\\"rel\\\":\\\"myOnlineMeeting\\\",\\\"etag\\\":\\\"3055269905\\\"}...Modern AuthenticationTo use modern authentication with Skype for Business, the ADFS Server has to be prepared using the sfbadalscripts. More information about how to use the scripts can be found here. The script has to be run on the ADFS server, be sure to include all internal and external URLs of the Skype deployment in the PoolIds parameter..\\\\Setup-Adfs2016OAuthTrustForSfB.ps1 -PoolIds 'https://sfbwebext.uclab.eu/','https://sfbwebint.uclab.eu/'When the ADFS Server has been prepared, the following commands can be used to enable modern authentication.  Note: This can only be configured globally, double-check the prerequisites and, even though existing sessions will not be re-authenticated, schedule a maintenance window.# Create new OAuth ServerNew-CsOAuthServer -Identity uclabFS -Type ADFS -MetadataURL \\\"https://fs.uclab.eu/FederationMetadata/2007-06/FederationMetadata.xml\\\"# Require Authorization using ADFSSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity uclabFSAfter that just wait for the management store replication to publish the change and test it with a client or the Test-CsRegistration cmdlet.  To roll back the change simply set the ClientAuthorizationOAuthServerIdentity parameter to $null.Hybrid Modern AuthenticationFor hybrid authentication to work, we need to add more SPNs to the MSOL Service Principal. Add all internal and external Web Services URLs of the Skype deployment to the list:# MSOnline PowerShell$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\"https://sfbwebext.uclab.eu\\\")$MsolSP.ServicePrincipalNames.Add(\\\"https://sfbwebint.uclab.eu\\\")$MsolSP | Set-MsolServicePrincipalThen, add the evoSTS (Azure AD Federation Service) to the Skype for Business OAuth configuration and enable it using:# Create new OAuth ServerNew-CsOAuthServer -Name evoSTS -IssuerIdentifier sts.windows.net -MetadataUrl \\\"https://login.windows.net/common/FederationMetadata/2007-06/FederationMetadata.xml\\\" -Type AzureAd -AcceptSecurityIdentifierInformation $True# Require Authorization using Azure ADSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity evoSTSOn the client, make sure to set AllowAdalForNonLyncIndependentOfLync and Enable Modern Authentication if required.$a = New-CsClientPolicyEntry -name AllowAdalForNonLyncIndependentOfLync -value \\\"True\\\"Set-CsClientPolicy -Identity Global -PolicyEntry @{Add=$a} HKEY_CURRENT_USER\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\1x.0\\\\Lync\\\"AllowAdalForNonLyncIndependentOfLync\\\"=dword:00000001Hybrid VoiceIf we move enterprise voice users to the cloud they can still use our on-perm PSTN connectivity to make and receive calls. For that to happen, we need Skype for Business Edge Servers and the edge’s next-hop pool must also be running Skype. Then we configure a PSTN Usage for the online users as well as an Online Voice Routing policy. In it’s most basic form we need the following:# SFB Online PowerShell: Create the PSTN UsageSet-CsOnlinePstnUsage  -Identity Global -Usage @{Add=\\\"Unrestricted\\\"}# Create and assign the Voice Routing policyNew-CsOnlineVoiceRoutingPolicy OnlineVRP -OnlinePstnUsages UnrestrictedGrant-CsOnlineVoiceRoutingPolicy -Identity tom@uclab.eu -PolicyName OnlineVRPTo move a user from on-premises to Skype for Business Online, use the following:Move-CsUser -Identity tom@uclab.eu -Target sipfed.online.lync.com -Credential (Get-Credential)To move a user from Skype for Business Online to on-premises, use the following:Move-CsUser -Identity tom@uclab.eu -Target sfb01.uclab.eu -Credential (Get-Credential) -HostedMigrationOverrideUrl https://admin1e.online.lync.com/HostedMigration/hostedmigrationService.svcThe host part of the HostedMigrationOverrideUrl parameter can change based on where your tenant is hosted. To determine the host part, open the legacy Skype for Business admin center and copy the URL. It should look something like this: https://webdir1e.online.lync.com/LSCPThen replace webdir with admin and LSCP with HostedMigration/hostedmigrationService.svc. You think I am making this up, right? Read more here.Skype for Business Online users must be assigned an E5 license or have PSTN calling added to their E1/E3 plans to be able to make and receive calls.To be continued ;)Tom\"\n},{\n  \"title\": \"Azure AD Connect: Failed to load configuration information\",\n  \"url\": \"/post/aad-connect-failed-to-load-configuration-information/\",\n  \"date\": \"February 22, 2018\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Cloud\",\"Azure\",\"Office365\"],\n  \"author\": \"tto\",\n  \"content\": \"When upgrading Azure AD Connect (ADSync), the wizard fails with the error: “Failed to load configuration information from primary ADFS server”.ProblemThis can happen if the federation service was moved to a different machine after installing Azure AD Connect. Subsequent updates to the synchronization service fail with the above error message. This is because AD Connect stores the name of the original ADFS server in the PersistedState XML file.The fils is located at: C:\\\\ProgramData\\\\AADConnect\\\\PersistedState.xmlThe ADFS servername is stored in the IAdfsContext.TargetAdfsServers property, oh and it’s Base64 encoded. PowerShell can be used to easily read the file:[xml]$xml = Get-Content \\\"C:\\\\ProgramData\\\\AADConnect\\\\PersistedState.xml\\\"$xml.PersistedStateContainer.Elements.PersistedStateElementSolutionSimply update the value of the IAdfsContext.TargetAdfsServers with the servername of the new ADFS machine, as the servername has to be Base64 encoded, the following PowerShell code can be used to convert a string:$name = \\\"adfs01.example.com\\\"[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($name))Cheers,Tom\"\n},{\n  \"title\": \"Tunneling SSH through Tor\",\n  \"url\": \"/post/tunneling-ssh-through-tor/\",\n  \"date\": \"December 24, 2017\",\n  \"category\": \"Privacy\",\n  \"tags\": [\"WSL\",\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve been using Onion Services aka. Hidden Services to connect to remote machines for some time now. Tor clients can connect to such services through the Tor network, there is no need to know the IP address of the destination machine, likewise there is no need to configure inbound port mappings or firewall rules.Destination (running the Onion Service)On the destination machine, we need to install Tor. For best results follow the instructions here.Once installed, we configure the hidden service in the /etc/tor/torrc configuration file. Find the section dedicated to hidden services in the file and create a new service or uncomment on of the examples.HiddenServiceDir /var/lib/tor/my_hidden_service/HiddenServicePort 80 127.0.0.1:80HiddenServicePort 2244 127.0.0.1:22The above example, creates a service with the name of my_hidden_service which will listen on port 80 and provide whatever runs on 127.0.0.1:80 over the Tor network. It will also listen on port 2244 and provide ssh (which runs on 127.0.0.1:22) as a hidden service.Securing SSHAs you are essentially making your sshd accessible to the whole Tor network, it might be a good idea to disallow password authentication and root access. To do that, make sure your /etc/ssh/sshd_config contains the following lines:PasswordAuthentication noPermitRootLogin prohibit-passwordHostname and KeysAfter configuring the Onion Service, restart the Tor service: sudo service tor restart. After it has started, the hidden service directory (as configured in HiddenServiceDir) will have been created and we can find two files in the directory. The hostname file contains the hostname that we need on the client side in order to connect to the service.sudo cat /var/lib/tor/my_hidden_service/hostnamexxxxxxx.onionClient (accessing the Onion Service)To connect to the first hidden service, a website running on port 80, we can simply use Tor Browser and open the hostname we found in the hidden service directory above. To connect via SSH, there are multiple options but first, we do also need to install Tor. Again for best results follow the official instructions.On WSL I was able to install it by simply using sudo apt-get install tor. We will also need the nc tool from the netcat-openbsd package, if it is not available on your system, install it using: sudo apt-get install netcat-openbsd.Once installed, start tor by typing tor --runasdaemon 1.torifyTorify comes with the installation of the Tor package on the client and is a simple wrapper that tries to connect a given application through Tor.torify ssh tom@xxxxxxx.onion 2244The above example connects ssh to the .onion address on port 2244. On my system, torify throws a few errors but finally works well enough..ssh/configAnother option is to add the destination hostname to the ssh config file of the client. This can typically be found in the users profile directory at .ssh/config.Simply add a line for each destination you want to connect to. The ProxyCommand uses the nc tool, to tunnel the connection through 127.0.0.1:9050 which is the clients Tor endpoint.Host t01 HostName xxxxxxxx.onion port 2244 ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %pPlease note, on Mac OS I had to use ncat instead of nc, so the ProxyCommand looks like:   proxyCommand ncat --proxy rhel01:9050 --proxy-type socks5 %h %p  A final note on privacy: This guide is meant to help connect to remote systems behind NAT routers or firewalls with and changing public IPs. Think connect to your home network from work. It is not meant to provide the best possible privacy. For that, please refer to the official documentation.Have fun!Tom\"\n},{\n  \"title\": \"Testing CoinHive\",\n  \"url\": \"/post/testing-coinhive/\",\n  \"date\": \"September 22, 2017\",\n  \"category\": \"ntSystems\",\n  \"tags\": [\"ntSystems\",\"Crypto\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve recently stumbled upon coinhive and with all the recent fuzz about crypto currencies, I decided to have a look at it. So what’s that all about?coinhive: A JavaScript Monero MinerMany crypto currencies rely on a https://en.wikipedia.org/wiki/Proof-of-work_system algorithm in order to verify transactions. There are quite a few different algorithms out there, some of them more difficult than others. Bitcoin for example uses hashcash which, at current difficulty levels, can only be feasibly generated on specialized hardware (ASIC).Another one of those PoW algorithms is CryptoNight which has been designed to be ASIC resistant and can feasibly be generated on modern CPUs and GPUs. Monero, a private and censorship-resistant digital currency, happens to use the CryptoNight algorithm, which means it can be mined efficiency on consumer devices.That’s what the coinhive miner does. It essentially runs a JavaScript application in the users web browser and uses the devices CPU to mine Monero. The mined Monero will then be payed out to a wallet we own.ntSystemsNow as this website is a side-project and does not make us any money at all (and we don’t like Ads), we decided to test drive coinhive for a week.  Starting today, by visiting our side your device will be used to mine Monero and, by doing so, help us maintain the site and deliver more awesome content.After the first week’s trial we will publish the stats and discuss the ethics behind “abusing” our visitors spare CPU cycles.The following code has been added to the site’s footer in order to start the miner:/edit: removed codeUpdateAfter one week of testing here are the results of this little experiment. This site has between 300 and 600 active users on a given day, not a lot but it’s something. So with the above code, we are using up to 90% of the visitors CPU cycles to generate Monero using coinhive’s JavaScript miner.This resulted to be about 468 hashes per second totalling about 173.82 million hashes in a week. According to monerobenchmarks.info, these figures can be compared to what a not-very-modern GPU with 4GB of memory would produce.The final balance after the weeks test is 0.02582 xmr, worth about 2€ at the time of this writing.Another UpdateSoon after the last update, ad-blockers started blocking the download of the javascript and the hashrate dropped quite a bit. I’ve since decided to remove the code and stop (ab)using our visitors CPUs.Thanks!Tom\"\n},{\n  \"title\": \"The Invisible Internet Project and WSL\",\n  \"url\": \"/post/the-invisible-internet-project-and-wsl/\",\n  \"date\": \"August 10, 2017\",\n  \"category\": \"Privacy\",\n  \"tags\": [\"PowerShell\",\"WSL\",\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"The Windows Subsystem for Linux can be used to run quite a few interesting things on Windows, one of them is the Invisible Internet Project or i2p.Install i2pFirst of all we’ll have to install i2p on our system. Before starting the installation, we have to add the required repository:sudo apt-add-repository ppa:i2p-maintainers/i2psudo apt-get updatesudo apt-get install i2pAfter the installation we can start the i2prouter with the following command:i2prouter startAs soon as the service  is running, we can access the homepage using http://127.0.0.1:7657/home likewise the configuration page is available at http://127.0.0.1:7657/configConfigure ProxyFor testing, we don’t have to change anything in the home or configuration pages and we can just point our systems proxy configuration to i2p. The i2prouter listens on ports 4444 and 4445 for http and https traffic, respectively.Now you will soon notice that pointing your system’s proxy to i2p will allow you to browse .i2p sites but the “clear” intertnet will no longer work very well.Unlike tor, i2p is not intended to be used as proxy to the internet, but it’s purpose is to enable secret communication to resources inside the i2p network. Therefore it does not make a lot of sense to route all internet traffic trough i2p, it’s enough if we use the i2prouter to access *.i2p domains.Install PrivoxyTo get that done, i.e. routing only requests to .i2p domains to the i2prouter, we’ll need another small proxy that is capable of routing requests based on pattern. Let’s install privoxy:sudo apt-get install privoxyAfter installing privoxy, we’ll have to configure it so that it routes requests to *.i2p domains to i2prouter which runs at localhost:4444:Use your favorite editor to update the config file at /etc/privoxy/config and add the following line:forward .i2p localhost:4444Now restart privoxy sudo /etc/init.d/privoxy restart and set the systems proxy configuration to 127.0.0.1:8118.Setting the proxy with PowerShell and PACConstantly changing the proxy configuration does not work really well, I forget that I’ve set the proxy and if privoxy is not running, I have to disable the proxy in order to access the internet. In the first iteration, I wrote two quick and dirty PowerShell functions to enable/disable the proxy settings:Function Disable-Proxy {    $reg=\\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 0    Set-ItemProperty -Path $reg -Name ProxyServer -Value \\\"\\\"}Function Enable-Proxy {    param($proxyServer = \\\"localhost:8118\\\")    $reg=\\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 1    Set-ItemProperty -Path $reg -Name ProxyServer -Value $proxyServer}I put these in my $PROFILE and used them for a few days. It was ok, but there had to be a better solution… So I started to look into PAC or “Proxy auto-config” which is a configuration file that defines how web browsers can automatically choose the appropriate proxy server. Read more on WikipediaLong story short, I ended up using the following configuration file:function FindProxyForURL(url, host) {        // .onion URLs need a proxy:        if (shExpMatch(host, \\\"*.onion\\\"))        {                return \\\"PROXY localhost:8118\\\";        }        // other requests go directly        return \\\"DIRECT\\\";}Save the function above to a text file called proxy (without extension) and put it in C:\\\\Windows\\\\system32\\\\drivers\\\\etc\\\\ and set the systems AutoConfigUrl to: file://C:/Windows/system32/drivers/etc/proxyEnjoyTom\"\n},{\n  \"title\": \"PowerShell and Variable References\",\n  \"url\": \"/post/powershell-and-variable-references/\",\n  \"date\": \"May 18, 2017\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve come across an interesting behavior (or feature) of PowerShell the other day. As I don’t really understand what’s going on, I decided to write it up, maybe someone out there can help explaining this.ExpectedI’m writing a script that contains multiple functions and objects get passed from one function to another. As it happens the functions modify the objects that are passed in and output the modified information. So far so good, but what I found is, that the original object gets updated. So in the end I don’t need the function to output anything and can just carry on using the passed-in object.Confused? Well I am, so let’s try it with an example:$var = 1function Update-Value ([int]$InputObject) {    $InputObject++    Write-Output $InputObject}In the above example we define a variable with a value of 1 and a simple function that increases the value by 1 and outputs the increased value. That works as I would have expected, if we run the code, the output is:C:\\\\&gt; Update-Value $var2C:\\\\&gt; $var1UnexpectedNow if we do the same exercise with an object instead of a simple integer, the outcome is not exactly as I would have expected it to be. Here goes another example:$obj = New-Object -TypeName psobject -Property ([ordered]@{ a=1; b=2; c=3; })function Update-Value ([psobject]$InputObject) {    $InputObject.a++    Write-Output $InputObject}The idea is basically the same as above, the variable in this case contains a custom object with three properties: a, b, c. The function is still increasing the value on the input object, only that now we access the “a” property and increase it’s value.The output is as follows:C:\\\\&gt; Update-Value $obja b c- - -2 2 3C:\\\\&gt; $obja b c- - -2 2 3Now apparently the variable $obj gets updated as well. While in the first example, the integer in $var did not change, i.e. after running the function it was still 1, the value of $obj.a does change when I run the function.In my script I just decided to change the function so that it does no longer output the modified object and instead, I just call the function and carry on with my original variable. I do think the variable referencing in memory might be different when using a single integer vs. an object. It works for now, but as stated above, I don’t understand why and that worries me to some degree…Thanks to anyone who cares to comment and offer an explanation!TomUpdateAfter posting this to /r/PowerShell someone referred me to this thread which explains the behavior quite well.The variable $InputObject in my case does not contain the object but is just a pointer to $obj, which is therefore updated directly.\"\n},{\n  \"title\": \"Jekyll on WSL\",\n  \"url\": \"/post/jekyll-on-wsl/\",\n  \"date\": \"April 24, 2017\",\n  \"category\": \"ntSystems\",\n  \"tags\": [\"Jekyll\",\"WSL\",\"ntSystems\"],\n  \"author\": \"tto\",\n  \"content\": \"Today we are looking at running Jekyll on WSL or Bash on Ubuntu on Windows.Install WSLFirst of all we’ll have to make sure our system fulfills the prerequisites to run the “Windows Subsystem for Linux”. We need a 64-bit version of the Windows 10 Anniversary (build 14939) or newer for that. Then we’ll have to enable the “Developer mode” using “Settings”, “Update &amp; Security” and finally “For Developers”.Once the above prerequisites are met, we can go ahead and enable the WSL using the control panel or the following command in an elevated PowerShell session:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-LinuxAnd finally we can type bash into an administrative command prompt to download and install bash.A detailed installation guide is available on MSDNInstall JekyllAfter setting up Bash on Ubuntu on Windows we can now install the required packages for Jekyll using the following commands.sudo apt-add-repository ppa:brightbox/ruby-ngsudo apt-get -y updatesudo apt-get install git build-essential libcurl4-openssl-dev zlib1g-devsudo apt-get install ruby2.4 ruby2.4-devAfter installing ruby verify the the installed version using ruby -v. Jekyll requires a version greater that 2.Now let’s install nodejs and finally Jekyll:curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -sudo apt-get install -y nodejssudo gem install jekyll bundlerServeNow that the prerequisites are installed, we can go ahead and build our static website. To get started with Jekyll, head over to the official documentation page. In my case, I just want to serve up a local copy of this great blog, so I clone the git repository and build the site locally using:git clone https://github.com/ntsystemsit/ntsystemsit.github.iocd ntsystemsit.github.io/bundle installbundle exec jekyll serve -d /tmp/ntsystemsNote: There seems to be a bug related with WSL. I have to use the --force-polling switch with the serve command on Windows 10 1607, on 1703 it works without that switch. Check the  following issue on GitHub.Well, what can I say? I really like the possibility to natively run Linux packages on Windows 10. Even though it doesn’t make the Linux part less complicated, at least I don’t need a VM anymore :)So long,Tom\"\n},{\n  \"title\": \"Keeping track of PowerShellCore releases on GitHub\",\n  \"url\": \"/post/keeping-track-of-powershellcore-releases-on-github/\",\n  \"date\": \"April 16, 2017\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\",\"GitHub\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve been using PowerShell Core on my MacBook for a while now. As the code is still in its early stages, there’s no way of managing/updating the software one is running, at least none that I would be aware of. I did miss some updates and, as a result, had problems with Visual Studio Code. So I’ve put together a quick function that checks the latest release on GitHub and can conveniently be put into my $PROFILE.GitHub Releases feedPowerShell Core was open-sourced some time ago and the team behind it is using GitHub to manage the code. The latest version for all the supported operating systems can be found in the PowerShell repository. Every so often, a new release is published to the Releases feature of GitHub and it happens that GitHub does provide an atom feed for releases. This feed can be accessed by simply appending “.atom” to the URL.Get-PSVersionGitHubArmed with this information, I wrote the following simple function. It just gets the latest release from the repository’s atom feed and adds the information to a hash table, which is then output as a custom object:Now I just put the function into my $PROFILE and make it run every time PowerShell starts.Easy enough, right?Tom\"\n},{\n  \"title\": \"Jekyll Fun: Consuming ntSystems with PowerShell\",\n  \"url\": \"/post/jekyll-fun-consuming-ntsystems-with-powershell/\",\n  \"date\": \"March 31, 2017\",\n  \"category\": \"ntSystems\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"author\": \"tto\",\n  \"content\": \"As you might have read before, our little blog is powered by Jekyll. Well I stumbled over the jsonify filter the other day, and so I built a little “kind-of” API :) Sound interesting? Read on.HowIt all started with search, I was looking for a search feature for our blog. After some testing with Algolia I stumbled over this great post by Katy. She’s using lunr.js with Jekyll. I liked the client-side approach of lunr.js and that it has no external dependencies, so I adopted Katy’s implementation for our site and, voilà, we have search. So, why do I keep talking about search? Well lunr.js consumes data in as json objects, so that’s how I learned about the jsonify filter.After some playing around with curly braces and the forloop in liquid I ended up creating the first version of our so-called API.Basically, what I’m doing is looping through the posts and creating json objects.I created a few different folders to expose different information, but more about that in the examples below.Use Invoke-RestMethod to consume the jsonThere are various “endpoints” available, we can get meta information about the site at /meta/ or a list of all pages and posts at /pages/and /posts/, respectively.In the following example, we’re getting all posts with a Category of ntSystems and then just select the tags property:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Where-Object category -eq ntSystems | Select-Object tagstags----{migrate, jekyll}{migrate, jekyll}{update, jekyll}Alternatively, we can get list of all categories, just like that:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Select-Object Category -Uniquecategory--------CloudAzureDev...Awesome, right?Well, that’s all for today. Enjoy your weekend!Tom\"\n},{\n  \"title\": \"My takeaways from MS Tech Summit\",\n  \"url\": \"/post/my-takeaways-from-ms-techsummit/\",\n  \"date\": \"March 25, 2017\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"Daniel and I have attended the Microsoft Tech Summit in Milan earlier this week. Overall it was a pretty good event, especially taking into account that it was free. The keynote was quite interesting, so much so, that I thought I’d share my takeaways.  Focus on solutions (not individual components) and add valueThis, for me, is the message that came across most clearly. Focus on helping your business, brining value by enabling new processes and possibilities. Don’t waste your valuable time upgrading the umpteenth server or migrating from v14 to v15. Move to the cloud where it makes sense and free-up resources.  Infrastructure continues to lose importance and platform services get more importantSure, there is a huge uptake in IaaS but that can only be an interim solution. If any organization is going to really benefit from using cloud services, the managing of virtual machines (just like on-prem) should not be part of the equation.  Skills change!In a modern world, the IT pro’s focus can no longer be a single nitty-gritty technical thing. Many of us almost ignored the business’ evloving needs while pursuing mastery in that single discipline. In this increasingly cloud-first world, we will have to change. Radically.  GDPR: General Data Protection RegulationThis thing is coming and fast. The business must be prepared and IT can should play a key role in implementing the right tools and policies to follow the regulation. Oh, and tell me about changing skills ;)  Cloud adoption in Italy is above average and growingIt was really interesting to see that the economic turbulences were a driver for cloud adoption in Italy. A great customer story with a well-known, Italian media outlet showed how a sensible approach to cloud technologies could both, enable exciting new scenarios and drive down cost.Sessions and slide decks can be downloaded from the Tech CommunityWhat do you think about the changing role of IT? Leave a comment below!Tom\"\n},{\n  \"title\": \"Azure Site Recovery Deployment Planner\",\n  \"url\": \"/post/aure-site-recovery-deployment-planner/\",\n  \"date\": \"March 15, 2017\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Azure\",\"ASR\"],\n  \"author\": \"dni\",\n  \"content\": \"Today I was super excited about the first tests with the Azure Site Recovery Deployment Planner. Sometimes calculating the Bandwidth, Storage, local infrastructure needed for Site Recovery can be very tricky. Therefore, I’m happy that Microsoft released a helpful tool to get the right information needed.The planner is a command-line tool in public preview for VMWare only, so the final version is not completed yet. Profiling the environment can be done remotely, so no agents or pieces of software on ESX Server or vCenter is needed. The planner provides following details:  Compatibility assessment  Network bandwidth need versus RPO assessment  Azure infrastructure requirements  On-premises infrastructure requirementsRequirementsThe planner needs following components:  Windows Server 2012 R2  .Net Framework 4.5  VMware vSphere PowerCLI 6.0 R3  Microsoft Visual C++ Redistributable for Visual Studio 2012  Microsoft ExcelProfilingFirst of all, we have to start profiling the VM’s that we want to protect with Azure ASR. The tool connects to the vCenter server (or ESX) to collect performance data. There is no performance impact on the VM’s because the performance data of the vCenter is taken and no data from inside the VM. The tool basically queries every 15 minutes the vCenter to get the performance data.As first step we create a VM list with VM’s we want to profile. Connect to the vCenter with the VMWare CLI:Connect-VIServer -ServerExport the list of all VM’s to a Text FileGet-VM |  Select Name | Sort-Object -Property Name &gt;  C:\\\\Service\\\\Output.txtYou should get a list like this. I deleted the not needed VM’s from the Textfile and saved the changes.Now we are ready to start profiling. Microsoft recommends to profile at least 15 days. In our test we will profile 24 hours. From a Powershell window we can start profiling with the following command:.\\\\ASRDeploymentPlanner.exe -Operation StartProfiling -Directory “C:\\\\vCenter1_ProfiledData” -Server vCenter1.FQDN -VMListFile “C:\\\\Service\\\\Output.txt” -NoOfDaysToProfile 0.04 -User vCenterUser1A complete list of all switches can be seen here.If you see following output in powershell you are all right. In my case, there are some VM’s not running and therefore a warning is displayed because the tool can obviously not collect performance data.Generate reportAfter profiling is completed we can see that the tool created some performance CSV Files:Now we can run the tool in report-generation mode to get the report.\\\\ASRDeploymentPlanner.exe -Operation GenerateReport -Server vCenter1.FQDN -Directory “C:\\\\vCenter1_ProfiledData” -VMListFile “C:\\\\Service\\\\Output.txt”A complete list of all switches can be seen here.The report is named as “DeploymentPlannerReport” and can be opened with Excel.What we can see from the Excel Report is basically the number of profiled, compatible and incompatible VM’s. If we click on details, we can get the name of the not compatible VM. In my case a VM’s has a Disk with 10TB VMDK attached. (Azure has a limit of 1TB per disk).I selected in the right corner a desired RPO with 15 minutes. Based on this value the report start calculating the Mbit/s needed.In the Required Network Bandwidth section there are 3 graphs:  To meet RPO 100 percent of the time: The recommended bandwidth in Mbps to be allocated to meet the desired RPO 100 percent of the time.  To meet RPO 90 percent of the time: If we cannot set the bandwidth needed to meet your desired RPO 100 percent of the time, we can choose to go with a lower bandwidth setting that can meet a desired RPO 90 percent of the time. (In my case 100 and 90 RPO are both 2 Mbit.. maybe there is still a bug with the calculation. Because the tool is in preview I guess this will be fixed before GA)  Achieved Throughput: This is the real Throughput that can be measured with the following command:ASRDeploymentPlanner.exe -Operation GetThroughputIn my case this is $Null because I have to change the QoS rules and didn’t execute the test acutally.Based on the storage activity the planner recommends the storage accounts needed. I have one VM with heavy storage operations that needs Premium disks (SSD).Very interesting is the recommendation about the local infrastructure. In my case, only one server is needed to replicate the VM’s to Azure.The WhatIf Graph shows what would happen if we decide to use a throughput to meet 90% of the RPO. Actually, I don’t fully understand the sense of the graph. Helpful would be to choose the bandwidth in a combo box or something similar and then see what happens.In the Recommended VM batch size for initial replication section, Microsoft shows the recommendation of number of VMs that can be protected in parallel to complete the initial replication within 72 hours with the suggested bandwidth to meet desired RPO 100 percent of the time being set. The value can be changed using the GoalToCompleteIR parameter during report generation.Let’s switch to the “Input” Tab in Excel. Here we can see some very interesting values. The most interesting values for me is: Total Data to be replicated for initial replicationConclusionSome things don’t work as expected. But we have to consider that the tool is in public preview, so many changes and improvements are expected. Stay tuned for further updates.Daniel\"\n},{\n  \"title\": \"Get Going with Go!\",\n  \"url\": \"/post/get-going-with-go/\",\n  \"date\": \"February 24, 2017\",\n  \"category\": \"Dev\",\n  \"tags\": [\"Go\",\"Basics\"],\n  \"author\": \"tto\",\n  \"content\": \"Everyone is talking about Go these days so I decided to have a look at it and see what it could do for me.BasicsSo what is Go? Well according to golang.org  Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.Ok, so another programing language, why do I care you ask? Well that’s a story for another day, for now, let’s say that I’m just generally interested in awesome technology.Installing on macOSThe first “Hello World” kind of program can easily be done using tour.golang.org but I wanted to get it up and running on my MacBook so I installed the package using brew, it’s easy enough with: brew install goAfterwards, a quick go version confirmed that the latest and greatest version of Go has been installed. 1.8 at the time of writing.go version go1.8 darwin/amd64Environment VariablesBefore firing up an editor, some environment variables need to be set in order for Go to work and store projects and dependencies in some user-defined path. I’ve added the following to lines to my bash profile:export GOPATH=$HOME/git/goexport GOBIN=$(go env GOPATH)/binexport PATH=$PATH:$GOBINWhat this does, is setting the GOPATH and GOBIN environment variables to a folder in my home directory and adding the GOBIN directory to the systems’ PATH variable. The first variable instructs Go to look for and install sources and packages in the specified folder, the second variable defines where binaries are located and adding this to the systems’ PATH simply makes running Go programs easier.Hello World with Visual Studio CodeOn the Mac, I’m mostly using VS Code to write/edit text files, as it has some extensions for Go, I figured it would do the trick for the beginning. So I opened up my GOPATH directory in VS Code and created a new folder under src, hello in my case. In this folder I created a hello.go file, and at this point, Visual Studio Code recognises the Go language and downloads some required tools to the GOPATH directory.After a restart, I created the following hello world program:package mainimport \\\"fmt\\\"// SayHelloTo takes a string and prints it to the console.func SayHelloTo(s string) {\\tfmt.Println(\\\"Hello \\\" + s + \\\"!\\\")}// The main function just invokes SayHelloTo with a stringfunc main() {\\tSayHelloTo(\\\"Tom\\\")}Run / Build / InstallTo run the above program, just change into the hello folder and run go run hello.go which should result in the following output:ttor$ go run hello.goHello Tom!Now if I wanted to create a binary and install it, I could simply run go build hello.go which leaves me with the executable file. To install it, into Go’s bin directory (GOBIN) I use: go install hello.goAfter that, I can run hello and again get the above output:ttor$ helloHello Tom!Well that was my quick introduction to Go, we’ll soon see if there’s more to come…Nice weekend!Tom\"\n},{\n  \"title\": \"Get started with Azure ARM Templates\",\n  \"url\": \"/post/get-started-with-azure-arm-templates/\",\n  \"date\": \"February 20, 2017\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"Azure\",\"RM\"],\n  \"author\": \"dni\",\n  \"content\": \"To start with the deployment using Azure ARM Templates is quite easy. A first step can be to deploy an Azure SQL Database. But let’s start with a bit of background information:TemplatesWe can create a template (in JSON format) that defines and configures the Azure solution. When we create a solution from the portal, the solution automatically includes a deployment template. So, we don’t have to create our template from scratch but we can download the templates for the existing deployments. To get the templates open the “Resource Group” section in the Azure Portal and click on DeploymentsClick on “View Templates”What we can see now is the Template and Parameter file. When we start a new deployment, we have to define parameters for the resource template, these needs to be entered in before the deployment can start.You can find other ARM templates on the following Microsoft WebsiteDeploymentWe are going to deploy a new SQL Database, so my template looks like this:{    \\\"$schema\\\": \\\"http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#\\\",    \\\"contentVersion\\\": \\\"1.0.0.0\\\",    \\\"parameters\\\": {        \\\"collation\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"databaseName\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"edition\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"requestedServiceObjectiveId\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"maxSizeBytes\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"serverName\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"serverLocation\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"diagnosticStorageAccountId\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        },        \\\"diagnosticsTemplate\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        },        \\\"sampleName\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        }    },    \\\"resources\\\": [        {            \\\"type\\\": \\\"Microsoft.Sql/servers/databases\\\",            \\\"name\\\": \\\"[concat(parameters('serverName'), '/', parameters('databaseName'))]\\\",            \\\"apiVersion\\\": \\\"2014-04-01-preview\\\",            \\\"location\\\": \\\"[parameters('serverLocation')]\\\",            \\\"properties\\\": {                \\\"collation\\\": \\\"[parameters('collation')]\\\",                \\\"edition\\\": \\\"[parameters('edition')]\\\",                \\\"maxSizeBytes\\\": \\\"[parameters('maxSizeBytes')]\\\",                \\\"requestedServiceObjectiveId\\\": \\\"[parameters('requestedServiceObjectiveId')]\\\",                \\\"sampleName\\\": \\\"[parameters('sampleName')]\\\"            }        }    ]}Let’s focus on the parameter file that specifies the deployment. It should look like this:{    \\\"$schema\\\": \\\"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#\\\",    \\\"contentVersion\\\": \\\"1.0.0.0\\\",    \\\"parameters\\\": {        \\\"collation\\\": {            \\\"value\\\": \\\"SQL_Latin1_General_CP1_CI_AS\\\"        },        \\\"databaseName\\\": {            \\\"value\\\": \\\"Database3\\\"        },        \\\"edition\\\": {            \\\"value\\\": \\\"Basic\\\"        },        \\\"requestedServiceObjectiveId\\\": {            \\\"value\\\": \\\"dd6d99bb-f193-4ec1-86f2-4fe4rscbc49c\\\"        },        \\\"maxSizeBytes\\\": {            \\\"value\\\": \\\"2147483648\\\"        },        \\\"serverName\\\": {            \\\"value\\\": \\\"sqllogicalz2010\\\"        },        \\\"serverLocation\\\": {            \\\"value\\\": \\\"westeurope\\\"        },        \\\"diagnosticStorageAccountId\\\": {            \\\"value\\\": \\\"\\\"        },        \\\"diagnosticsTemplate\\\": {            \\\"value\\\": \\\"\\\"        },        \\\"sampleName\\\": {            \\\"value\\\": \\\"AdventureWorksLT\\\"        }    }}I modified that Database Name because I want my new Database to be called “Database3”. Lets save both files to the local machine (or GitHub if you want). Name the template file NewSQLDatabase.json and the parameter file Parameter-NewSQLDatabase.json.The Template and Parameter files are now ready for deployment. Lets fire up Powershell and push the change to Azure. First, we have to connect to the Azure Account and select our subscription# Connect to Azure RM AccountLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId c2a12a42-0179-*************With the “New-AzureRmResourceGroupDeployment” cmdlet we start the deployment process using our template and parameter file as attributes.# ARM Template SQL DatabaseNew-AzureRmResourceGroupDeployment -Name SQLDatabase -ResourceGroupName rg_Z2010 -TemplateFile \\\"F:\\\\Templates\\\\SQL Database\\\\NewSQLDatabase.json\\\" -TemplateParameterFile \\\"F:\\\\Parameters\\\\SQL Database\\\\Parameter-NewSQLDatabase.json\\\"After we executed the command we should see similar output and the Database is running on Azure :)Stay tuned for further postsDaniel\"\n},{\n  \"title\": \"Disable Azure Backup Protection for a VM with Azure PowerShell\",\n  \"url\": \"/post/disable-backup-protection-for-azure-vm/\",\n  \"date\": \"February 15, 2017\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\",\"Azure\",\"RM\"],\n  \"author\": \"dni\",\n  \"content\": \"My Azure credits burn faster than expected :) So I decided to remove some VM’s and Backup that I used for a customer’s demonstration. Since I don’t use the Azure Portal for configuration anymore, I fired up Powershell and did the Job. With the following commands, I show you how to stop the Backup for a Virtual Machine and delete the associated Recovery Points.Disable and delete VM BackupLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId ***************$container = Get-AzureRmRecoveryServicesBackupContainer -Name VIRTUAL-MACHINE-NAME  -ContainerType AzureVM$BackupItem = Get-AzureRmRecoveryServicesBackupItem $container -WorkloadType AzureVM Disable-AzureRmRecoveryServicesBackupProtection -Item $BackupItem -RemoveRecoveryPointsI know you may think this is quite simple and why is this guy writing a post with only 3 lines of code.  It’s because Tom moved our blog to Git and this is my first blog post that I try to upload and don’t wanted to wait :)Greetings\"\n},{\n  \"title\": \"Migrating from BlogEngine to GitHub Pages: Fixing the links\",\n  \"url\": \"/post/migrating-blogengine-to-github-pages-2/\",\n  \"date\": \"October 31, 2016\",\n  \"category\": \"ntSystems\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"author\": \"tto\",\n  \"content\": \"In this episode of our little series on migration we are having a look at the URL structure of Jekyll and some of the less visible stuff that was associated with the old ntSystems.All the existing URLs on our BlogEngine-based blog used both, upper- and lowercase letters, and had an filename extension of .aspx. Now Jekyll does not use filename extensions (or at least doesn’t display them) and it uses all lowercase letters in URLs.Additionally we moved from https-enabled to https-only and the usage of a www. hostname was not defined. So all of those URLs would have worked on the old blog:  http://ntsystems.it/CONTACT.aspx  https://ntsystems.it/contact.aspx  http://www.ntsystems.it/contact.aspx  …You see, it was a mess. On the current version of ntSystems, only the following URL will work:  https://ntsystems.it/contact/But what about existing links from social media, other blog posts, or where ever else, you ask? Well the solution is twofold. First, enter…CloudflareWe have been using Cloudflare for a while to easily enable IPv6 and and https even for our old blog. Now another feature, Page Rules, comes in very handy indeed. In fact a single rule is enough to get rid of the .aspx extensions:If the URL matches *ntsystems.it/*.aspx forward the request to https://ntsystems.it/$2 where $2 is the stuff that was matched by the second asterisk * in the matching pattern. Easy enough!Jekyll URL structureThe second part of getting URLs right is instructing Jekyll to make them the same as before, without .aspx. And it turns out, that’s not to hard, either:The following setting in our _config.yml file tells Jekyll to build all posts in the /post/ directory.permalink: /post/:titleThe title property was copied into the front matter by the script we used to migrate the posts. Quite ready, but not yet.We still have to deal with the uppercase/lowercase filenames in the URLs. We ended up using JekyllRedirectFrom to work around that. We just added the 'jekyll-redirect-from' gem to our Gemfile and used the migration script to add an uppercase version of the filename to the front matter like this:redirect_from: [\\\"/post/Azure-File-Services\\\", \\\"/post/azure-file-services\\\"]URLs. Check.RSSBlogEngine used a number of .axd scripts/handlers as endpoints for things like the RSS feed, the sitemap file, or a metaweblog extension. Obviously, the /syndication.axd URL does no longer work on Jekyll, a simple /feed.xml file is used instead.I tried various redirection methods but found that RSS clients (like The Old Reader) ignored them and the feed would go dead.After some testing I found that I could create a directory with the name of syndication.axd and simply put an index.html into it. Jekyll does not show the index.html in the URL, therefore the URL would still be /syndication.axd. I copied the content of feed.xml into the /syndication.axd/index.html and, voilá, the existing RSS link continued to work.SitemapThe URL of the sitemap.axd file is less important as it’s only used by search engines and not by users. So we just created a new sitemap.xml file and pointed the search engines to this new file. Additionally, we updated the Sitemap property in our robots.txt file.Well, and that’s it for today. Happy Halloween! :)Tom\"\n},{\n  \"title\": \"Introducing: TAK\",\n  \"url\": \"/post/introducing-tak/\",\n  \"date\": \"October 28, 2016\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"Over the years I did create, find, copy, paste, quite a few lines of PowerShell code. Some of which I’m turning into re-usable functions and collecting in a module, creatively called “Tom’s Admin Kit” or TAK. I hope you find it useful.I try to credit the sources for the stuff that I just copied off of the interwebs, even though I don’t actually remember all of them.PesterAs written before, Pester is  a unit testing framework for PowerShell code. So one can write simple tests to verify the code actually does, what it is supposed to do. Not all functions are covered by tests, yet, but I try to be better at that. The existing tests can be found in the GitHub repo for the module.CI&amp;D: GitHub and AppVeyorI read a lot about this continuous integration and delivery and I thought it would be nice to play with some of the involved tools myself. So I created a small-ish release pipeline/workflow for this module using GitHub, AppVeyor and the PowerShell Gallery. Here is how it works: When a new commit is pushed to GitHub, AppVeyor picks up the latest code and deploys it to a test machine. It then runs all the pester tests and, upon success, publishes the module to the PowerShell Gallery.The tests that should be run to verify the code, are defined in the appveyor.yml file in the GitHub repository.test_script:    - ps: |        $testResultsFile = \\\".\\\\TestsResults.xml\\\"        $res = Invoke-Pester -OutputFormat NUnitXml -OutputFile $testResultsFile -PassThru        (New-Object 'System.Net.WebClient').UploadFile(\\\"https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)\\\", (Resolve-Path $testResultsFile))        if ($res.FailedCount -gt 0) {            throw \\\"$($res.FailedCount) tests failed.\\\"        }Just like the deployment task, that will be invoked if the tests passed.deploy_script:  - ps: |      Install-PackageProvider -Name NuGet -Force      $manifest = Join-Path -Path $pwd -ChildPath \\\"TAK\\\\tak.psd1\\\"      (Get-Content $manifest -Raw) -Replace(\\\"1\\\\.0\\\\.0\\\\.\\\\d{1}\\\", $env:APPVEYOR_BUILD_VERSION) | Out-File $manifest      Publish-Module -NugetApiKey $env:psgkey -Path ($PublishPath = Join-Path -Path $pwd -ChildPath TAK) -Confirm:$falseHelpMost functions include comment-based help and a HelpUri that links to the online version of the help article. Just add the -Online parameter when getting help, like in the following example:Get-Help Test-TCPConnection -OnlineA full list of available help files can be found here: TAKDownload &amp; Source forThe Module is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    More information about the PowerShell Gallery can be found in the FAQGive it a try, and, if you spot a bug or have an idea for improvement, just create in a pull request.So long,Tom\"\n},{\n  \"title\": \"AzureStack POC TP2 on VMware\",\n  \"url\": \"/post/azure-stack-poc-tp2-on-vmware/\",\n  \"date\": \"October 19, 2016\",\n  \"category\": \"Cloud\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve been trying to make the Azure Stack Proof-of-Concept (Preview 2) run on VMware and here is what I found. First of all, the documentation to set this stuff up can be found here: Deploy Azure Stack POCPrepare VMAs I currently run VMware in my lab and didn’t want to re-install the physical server, I tried to get the Azure Stack up and running in a VMware VM. Following the recommendation for sizing, I created a VM with 100GB of RAM, 24 vCPUs, one vNIC and 5 hard disks with 200GB each. The many vCPUs are actually not necessary, as the hardware check does fail even though enough cores should be available. More on that later.Additionally, I did enable the “Hardware virtualization” feature in the VM’s CPU settings. You can do this using the vSphere Web Client or use the following quick-and-dirty PowerCLI function for it:As the Virtual Machine will run Hyper-V and some guest VMs, we have to disable the security features on the virtual Port Group where the VM is connected to:Get-VDSecurityPolicy -VDPortgroup VLAN95 |Set-VDSecurityPolicy -AllowPromiscuous:$true -MacChanges:$true -ForgedTransmits:$true  Note in the above example I’m using a distributed virtual Port Group. For a standard virtual Port Group use Set-SecurityPolicy.Prepare WindowsThe next step is to install Windows and the VMware tools, download the Azure Stack TP2 support files (see documentation link above) and copy the CloudBuilder.vhdx file to the root of the C drive of our VM. Then I started .\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath and was confronted with an error, stating “The server is currently already booted from a virtual hard disk…”Fortunatelly, the fix is easy: Open the PrepareBootFromVHD.ps1 file and find the following section:if ((get-disk | where {$_.isboot -eq $true}).Model -match 'Virtual Disk')     {    Write-Host \\\"The server is currently already booted from a virtual hard disk, to boot the server from the CloudBuilder.vhdx you will need to run this script on an Operating System that is installed on the physical disk of this server.\\\"    Exit    }Now either remove the section or just remove the Exit. That way, it will still display a warning but no longer stop the execution of the script.Again, start .\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath which should now succeed and prompt for a reboot of the machine.Install the CloudThe VM restarts and boots from the CloudBuilder.vhdx file with the typical OOBE asking for an admin password and the product key. Once set, startup continues and we can log-in to the VM. At this point, we’ll have to install the VMware tools again. The next step is to initialize the additional hard disks for the machine. The disks must be “empty” so do not create any volumes. I just run Get-Disk | Initialize-Disk and move on.Now the documentation wants us to open an administrative PowerShell console, change into the C:\\\\CloudDeployment\\\\Configuration folder and run the installation script. As a few checks are built-in to prevent this kind of setup (and verify hardware resources) this will fail with the following error message:2016-10-13 08:03:58 Error    Task: Invocation of interface 'Validate' of role 'Cloud\\\\Infrastructure\\\\BareMetal' failed: Function 'Test-BareMetalRole' in module 'Roles\\\\PhysicalMachines\\\\PhysicalMachines.psd1' raised an exception:One or more validation test failed for Role 'BareMetal' on machine 'WIN-MUTSIQJMO43'For detailed test results look at file '\\\\\\\\WIN-MUTSIQJMO43\\\\C$\\\\CloudDeployment\\\\Logs\\\\Tests\\\\TestResults_WIN-MUTSIQJMO43_BareMetal_2016-10-13-08-03-44.xml'Test Failed: Validate that the computer 'WIN-MUTSIQJMO43' is a physical machine.Test Failed: Validate that at least 12 cores are available in computer WIN-MUTSIQJMO43.At C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1:875.+         Trace-Error $messageat Trace-Error, C:\\\\CloudDeployment\\\\Common\\\\Tracer.psm1: line 52at Start-Test, C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1: line 875at Test-BareMetalRole, C:\\\\CloudDeployment\\\\Roles\\\\PhysicalMachines\\\\TestPhysicalMachines.psm1: line 86at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 08:03:58 Verbose  Step: Status of step '(DEP) Validate Physical Machines' is 'Error'.So the two tests that failed use the following CIM Instances (WMI) to query information about the host system: Win32_ComputerSystem, Win32_Processor Now even though I did configure 24 vCPUs for my VM, the NumberOfEnabledCore attribute of Win32_Processor shows a value of “0”.Here too, there’s an easy fix: Find the BareMetal.Tests.ps1 file in the C:\\\\CloudDeployment\\\\Roles\\\\PhysicalMachines\\\\Tests directory and make the following tests pass:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        $physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        ($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}Again, we could just remove the actual test (the expression inside the It {} statement) or make it a comment or modify the code to make it pass. I ended up with the following, slight modification:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        #$physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        #($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}By the way, you’ll see that this script is signed, so in order to make it run, remove the signature and save the script.Install the Cloud #2Now we can go ahead and invoke the install script to actually install Azure Stack inside the virtual machine. As there is no DHCP Server available in the network into which I’m deploying, I specify a few options when invoking the installation script:$installParams = @{    NatIPv4Subnet = \\\"172.16.8.0/24\\\";    NatIPv4Address = \\\"172.16.8.212\\\";    NatIPv4DefaultGateway = \\\"172.16.8.254\\\";    EnvironmentDNS = \\\"172.16.8.120\\\";}.\\\\InstallAzureStackPOC.ps1 @installParamsNote that this script has a rerun parameter, so if execution failes, it can be invoked again and will continue where it left off: .\\\\InstallAzureStackPOC.ps1 -RerunNote that at some point of the installation, the VM is rebooted and logged in automatically to the account “azurestack\\\\azurestackadmin”. From that moment on, all installation related tasks (such as a -Rerun) should be performed using this account.I did stumble over another prolem, installation stopped with the following error:2016-10-13 13:48:18 Error    Task: Invocation of interface 'Configure' of role 'Cloud\\\\Fabric\\\\NC' failed: Function 'ConfigureNC' in module 'Roles\\\\NC\\\\NC.psd1' raised an exception:Task failed with the following error: 'The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota.'.At C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1:83.+         $status.ErrorMessageat Trace-Error, C:\\\\CloudDeployment\\\\Common\\\\Tracer.psm1: line 52at Start-PSScriptUsingTask, C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1: line 83at ConfigureNC, C:\\\\CloudDeployment\\\\Roles\\\\NC\\\\NC.psm1: line 620at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 13:48:18 Verbose  Step: Status of step '(NET) Configure NC on VMs' is 'Error'.Apparently the default value of 500 for MaxEnvelopeSize is not enough, I used the following command to increase the size to 8192:winrm set winrm/config '@{MaxEnvelopeSizekb=\\\"8192\\\"}'ResultOnce the InstallAzureStackPOC.ps1 script finished running, there will be 13 VMs running on our “Host VM”, consuming about 52GB of RAM:Get-VMName         State   CPUUsage(%) MemoryAssigned(M) Uptime           Status             Version----         -----   ----------- ----------------- ------           ------             -------MAS-ACS01    Running 0           8192              00:46:18.2560000 Operating normally 8.0MAS-ADFS01   Running 0           1164              01:33:39.1820000 Operating normally 8.0MAS-ASql01   Running 0           4096              01:00:02.6710000 Operating normally 8.0MAS-BGPNAT01 Running 0           1460              01:46:26.7640000 Operating normally 8.0MAS-CA01     Running 0           844               01:32:56.9940000 Operating normally 8.0MAS-Con01    Running 0           4096              01:39:16.7620000 Operating normally 8.0MAS-DC01     Running 0           4096              02:09:00.7000000 Operating normally 8.0MAS-Gwy01    Running 0           4096              00:54:18.0770000 Operating normally 8.0MAS-NC01     Running 0           2048              01:19:39.9240000 Operating normally 8.0MAS-SLB01    Running 0           4096              01:04:11.8220000 Operating normally 8.0MAS-SUS01    Running 0           2048              01:37:49.5430000 Operating normally 8.0MAS-WAS01    Running 1           8192              01:36:31.2300000 Operating normally 8.0MAS-Xrp01    Running 0           8192              01:34:04.3710000 Operating normally 8.0If you encounter problems during installation, make sure to check the summary.log.xml file in C:\\\\CloudDeployment\\\\Logs.To actually log in to the Azure Stack Portal, open the MAS-Con01 VM’s conole and find a link to the portal on the desktop:Ok, so with that: Have fun with Azure Stack and happy hacking ;)Tom\"\n},{\n  \"title\": \"Migrating from BlogEngine to GitHub Pages: BlogML to Markdown\",\n  \"url\": \"/post/migrating-blogengine-to-github-pages-1/\",\n  \"date\": \"October 17, 2016\",\n  \"category\": \"ntSystems\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"author\": \"tto\",\n  \"content\": \"As promised here, I’m sharing the first part of our migration process from BlogEngine to GitHub Pages. A major part is, obviously, the migration of the content of the blog itself.BlogMLAccording to Wikipedia “BlogML is an open format derived from XML to store and restore the content of a blog.” Luckily, BlogEngine has an export option that exports all content (posts and pages) to a XML file.  Note: The XML file contains only the text content. So images, files and other assets have to be migrated separately.I downloaded the BlogML file and started to look around for solutions to somehow convert the stuff to something Jekyll could use. After some googling, I found this blog describing something very similar. Apparently he was using a ruby script to create a properly formatted markdown (.md) file for each post in the BlogML file. Thankfully, the script could be found in his GitHub Repo.The script was almost perfectly suited for our purposes after some small modifications I started it like so:$ ruby -r './blogml.rb' -e 'Jekyll::BlogML.process(\\\"BlogML.xml\\\")'Note that in my case the BlogML.xml file is located in the same directory as the script and a new directory named “_posts” is created in the same path. Any existing directory with the same name will be deleted.The modified version of the script is available here.WritingOnce the posts (and the rest) was migrated, one has to start writing new stuff. Posts are written in plain text with markdown formatting so no super fancy editor is required and I’m getting along well with VS Code. I’m using the “Spelling and Grammar Checker” extension hoping it catches to most obvious typos ;)Stay tuned for more.Tom\"\n},{\n  \"title\": \"Welcome to our new blog!\",\n  \"url\": \"/post/welcome-to-the-all-new-ntsystems/\",\n  \"date\": \"October 5, 2016\",\n  \"category\": \"ntSystems\",\n  \"tags\": [\"Update\",\"Jekyll\",\"GitHub\"],\n  \"author\": \"tto\",\n  \"content\": \"This site has been running on Azure Web Sites for some time. As we are doing this for fun and are not making any money with the site (see any ad?) we had to use the “Shared” pricing tier which was economically acceptable but from a performance and feature point-of-view, well, not great. We used Cloudflare to get some caching and enable stuff like https and IPv6 for the site and it was OK :) Then came……JekyllRecently I started publishing some of the PowerShell code I’m writing to GitHub and while browsing around, I stumbled over a static page generator, called Jekyll. I was quite impressed and started hacking around for a little while… after a couple of train rides I was happy with the result and decided to give it a go. So, that’s it:  Welcome to our new home on GitHub!As of 2016-10-02 we moved to Jekyll. The current version of our little blog is hosted on GitHub Pages and uses a slightly modified version of the default Minima theme for Jekyll.ToolsAs this is now, essentially, a static website, we have to use some tools to make it as awesome as possible:  Cloudflare: Security, IPv6, TLSv3, Page Rules… and more awesomeness  Algolia: Search as a Service  lunr.js: Full-text search in your browser  Favicon Generator  Shariff: Share without compromising privacy  Disqus: CommentsWork in progressThis migration is a work in progress and therefore not all features the good, old ntsystems.it are available as of today. I intend publishing a few lines about the migration itself, and keeping it up-to-date as we move along and build new features into the site.We do hope you enjoy our new look. It is all open source, so if you are interested in how we do stuff, just check out our repoOh and if you find any errors you’d wish to correct, please just send us a pull-request :-)So long,Tom\"\n},{\n  \"title\": \"PowerShell on macOS\",\n  \"url\": \"/post/powershell-on-macos/\",\n  \"date\": \"October 2, 2016\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"PowerShell\",\"macOS\",\"GitHub\"],\n  \"author\": \"tto\",\n  \"content\": \"Just sharing some quick notes on how to run PowerShell (and dotnet core) on macOS Sierra.OpensslPowerShell requires dotnet core which, in turn, requires openssl to be installed (and linked correctly). Using brew, one can easily install openssl, if it is already installed, use brew list to show the installation location:$ brew install openssl$ brew list openssl.../usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib/usr/local/Cellar/openssl/1.0.2j/lib/libssl.1.0.0.dylib...As of 2016-10 it is required to create symlinks for the above listed libraries (libcrypto, libssl) at /usr/local/lib, use ln -s like so:$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/lib$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/libNote: Make sure that the path used in the link (ln) actually matches the one given by the `brew list` output..NET CoreHead over to https://www.microsoft.com/net/core#macos and download a copy of the installer. Installation is straight-forward, just double-click the .pkg and follow instructions.After installation, verify that dotnet works by creating the “Hello World” app as suggested on the download site:$ mkdir testapp$ cd testapp$ dotnet newCreated new C# project in /Users/tom/testapp.$ dotnet restore$ dotnet runPowerShellGet the latest .pkg at https://github.com/PowerShell/PowerShell/releases. Again, installation is simple, just double-click the .pkg and follow instructions. To verify installation, open a terminal and run powershell`$ powershellPowerShellCopyright (C) 2016 Microsoft Corporation. All rights reserved.PS /Users/tom&gt; $PSVersionTableName                           Value----                           -----PSVersion                      6.0.0-alphaPSEdition                      CorePSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}BuildVersion                   3.0.0.0GitCommitId                    v6.0.0-alpha.10CLRVersionWSManStackVersion              3.0PSRemotingProtocolVersion      2.3SerializationVersion           1.1.0.1Note: It's still early days, the above procedure might be simplified soon Enjoy :)\"\n},{\n  \"title\": \"Deploying Labs using Azure Resource Manager\",\n  \"url\": \"/post/deploying-labs-using-azure-resource-manager/\",\n  \"date\": \"July 23, 2016\",\n  \"category\": null,\n  \"tags\": [\"en\",\"Azure\",\"Cisco\"],\n  \"author\": \"tto\",\n  \"content\": \"I did a demo of Cisco CSR 1000v on Azure the other day and the easy deployment of a small test-network was part of that demo. I really enjoyed deploying the lab using ARM templates, so why not share the love?So what’s ARM?Azure Resource Manager is the “new” deployment model for all kinds of resources within Azure. The great thing about it is, that it works with template and parameter files, so we can easily prepare an environment and deploy it over and over again, with either the same or different parameters.CSR 1000v?That’s what the customer wanted to see and why I got do a demo on Azure in the first place. Cisco provides images in the Azure Marketplace (https://azure.microsoft.com/en-us/marketplace/) so that customers can run a fully featured IOS XE router in the cloud.The Lab networkSo as mentioned above, i wanted to demo the setup of a quick lab along with the CSR, having only the router and no endpoints to connect to, doesn’t make to much sense. I used the Azure Resource Manager to create a new resource group and a new virtual network with two subnets. One of which would be CSR’s “public” facing subnet (with a Public IP associated) the other one was my “backend” network for cloud workloads (without Public IPs). A Nano Server was quick to deploy and provided the “backend” for my lab.The templateI did use Visual Studio to modify and adapt the ARM template to my needs, but really any text editor/ISE can be used.The template consists of two files, the template itself and a file for parameters. In my case, I did use the parameter file just for the passwords of the CSR and the Nano Server, the other parameters are assigned directly in the template file. There is room for improvement in this case, as the template would be more flexible if it had less “hardcoded” information.The template specifies how the virtual network, subnets and eventually the CSR and Nano Servers should be deployed.DeployOnce ready, the template can be be deployed to any Azure Subscription using a number of methods: One can deploy directly from Visual Studio or PowerShell or even from the cross-platform CLI on a Mac.Using PowerShellFirst, we have to create a Resource Group to which the template will be deployed:$RGName = 'rg-tomt-lab' $RGLocation = 'westeurope' New-AzureRmResourceGroup -Name $RGName -Location $RGLocation Then we prepare a variable which specifies the resource group, the template file and the parameters file.$Params = @{     'ResourceGroupName' = $RGName    'TemplateFile' = 'C:\\\\azure\\\\azure_arm_csr_nano_template.json'    'TemplateParameterFile' = 'C:\\\\azure\\\\azure_arm_csr_nano_parameters.json' }Using the Test-* cmdlet we can simulate deployment and verify that all checks out:Test-AzureRmResourceGroupDeployment @Params -VerboseAnd if everything looks good, we can go ahead and finally create the deployment:New-AzureRmResourceGroupDeployment @Params -VerboseUsing the xPlat CLIAlmost the same thing can be be done using the cross-platform CLI, which is what I use on my Mac.Create a Resource Group:azure group create -n rg-csr-lab -l \\\"West Europe\\\"Deploy the templateazure group deployment create -f azure_arm_csr_nano_template.json -e azure_arm_csr_nano_parameters.json -g rg-csr-lab -n CSR01Find the template, parameters file and more detailed information for deployment at my GitHub: https://github.com/tomtorgglerSo, once the template is prepared, deployment is just a piece of cake! That’s how deploying labs just got a lot quicker, don’t you think?Enjoy,— Tom\"\n},{\n  \"title\": \"Veeam direct restore to Azure\",\n  \"url\": \"/post/veeam-direct-restore-to-azure/\",\n  \"date\": \"July 13, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\",\"Veeam\"],\n  \"author\": \"dni\",\n  \"content\": \"Today I tried to restore a Veeam backed up VM directory to Microsoft Azure. Veeam gives you a free piece of software to get this done quickly with few easy steps. Lets jump into the configuration First of all we deploy the Veeam Direct Restore to Azure preconfigured VM from the Azure marketplaceWhen the VM starts up, we connect and have to specify some configuration parameter. We click on “Configuration”Veeam asks us to specify the configuration File for the subscriptionWe can download the configuration file with the following lines of codeNow the Veeam Part in Azure is configured and ready to convert Veeam Backup files to Azure virtual machines. We create a backup of a machine and upload the files to the Veeam virtual machine in Azure. After the files are available we start the restore process and specify the BackupFile:We can choose which restore point we want to restoreAfter that we can select the region and size of the virtual machine&nbsp;After we specified the Network and storage account the restore begins&nbsp;After few minutes the machine is restored from a Veeam backup and available in Azure. &nbsp;With Veeam Version 9.5 a direct restore to Azure with API and without a convert VM is also possible. Stay tuned for Version 9.5Greetingdn\"\n},{\n  \"title\": \"Lync SDN API and Cisco WLC\",\n  \"url\": \"/post/lync-sdn-api-and-cisco-wlc/\",\n  \"date\": \"June 26, 2016\",\n  \"category\": \"Skype4B\",\n  \"tags\": [\"Lync\",\"Cisco\",\"en\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Some days ago I had the chance to test Cisco’s Wireless LAN Controllers with the Lync Software Defined Networking (SDN) API.For those who don’t know what SDN API is, a quick overview: You can basically think of the SDN API as a little add-on, that can be installed on Lync Front End Servers, and that allows Lync to “let the network know” what’s going on from it’s perspective. The SDN API is made up of two components, the Lync Dialog Listener (LDL) and the Lync SDN Manager (LSM). The LDL component is installed on each Front End Server, and sends information to the LSM. The LSM forwards information to a so called SDN Controller, which, in our case, is the Cisco WLC.More information and the API documentation is available on the MSDN: https://msdn.microsoft.com/en-us/library/office/dn387071.aspxThe WLC SideThe SDN Controller has to accept and process information coming from the LSM, Cisco has built this  functionality into it’s Wireless LAN Controller software from 7.6. We used 8.2 in this example. First we need to define a port, protocol, and enable the “Lync Server” option globally. This can be done using the “Lync Server” option in the “Wireless” tab:Now that the WLC listens for information, we’ll have to tell it, what to do with. Using the “WLANs” tab, we created a new SSID, enabled “Lync Server” and selected the appropriate QoS policy for each type of traffic:A quick excerpt from show wlan shows the QoS settings:Local Policy---------------Policy Name                                       Priority---------------                                   --------  Lync State ...................................... EnabledAudio QoS Policy................................. PlatinumVideo QoS Policy................................. GoldApp-Share QoS Policy............................. SilverFile Transfer QoS Policy......................... BronzeThe Lync SideMeanwhile, we’ve installed the Lync SDN Manager on a dedicated server, as it’s not recommended to run it on the Front Ends (and it didn’t work either). The LSM is configured through a configuration file SDNManager.exe.config, which can be found in the LSM’s installation directory: C:\\\\Program Files\\\\Microsoft Lync Server\\\\Microsoft Lync SDN API\\\\The configuration is quite simple, the value submituri specifies the WLCs IP Address and Port, additionally, the value for backwardcompatibility must be set to true:&lt;appSettings&gt;    &lt;add key=\\\"submituri\\\" value=\\\"http://172.25.81.105:15120\\\"/&gt;    &lt;add key=\\\"backwardcompatibility\\\" value=\\\"true\\\"/&gt;With the LSM configured, we installed the Dialog Listener on the Front End Server. During setup, we are asked for the submituri so we don’t even have to edit the config file in this case. Note that the submit URI for the LDL points to the LSM. The configuration file for the LDL can be found here: C:\\\\Program Files\\\\Microsoft Lync Server\\\\Microsoft Lync SDN API\\\\LyncDialogListener.exe.config:&lt;appSettings&gt;  &lt;add key=\\\"submituri\\\" value=\\\"http://srv01.ccielab.local:9333/LDL/CallInfo\\\"/&gt;The Client SideNow we were ready for some testing and connected our clients to the new SSID. After signing into Lync and making some calls, we were able to verify that they appeared in the WLC’s “Monitoring” tab.Using Wireshark, we were able to verify the DSCP values for incoming packets from the WLAN:Last but not least, we had a look at the POST requests from the LSM to the WLC. As we are not using https, they are sent in clear-text and can be analyzed using Wireshark’s “Follow TCP stream” feature:POST /LDL/CallInfo HTTP/1.1Content-Type: text/xmlAccept: text/xmlHost: srv01.ccielab.local:9333Content-Length: 2823Expect: 100-continue&lt;/p&gt;HTTP/1.1 100 Continue&lt;LyncDiagnostics Version=\\\"1.0\\\"&gt;  &lt;ConnectionInfo&gt;    &lt;FrontEnd&gt;s4b&lt;/FrontEnd&gt;    &lt;CallId&gt;8a5ee59e7f24cc47a8a5e5ef5408164b&lt;/CallId&gt;    &lt;CSEQ&gt;3&lt;/CSEQ&gt;    &lt;ConversationId&gt;AdHItACZ40eYIzsElkmUXxEpJfdLYA==&lt;/ConversationId&gt;    &lt;TimeStamp&gt;2016-06-17T16:36:16.0502033Z&lt;/TimeStamp&gt;  &lt;/ConnectionInfo&gt;  &lt;StartOrUpdate Type=\\\"audio\\\"&gt;    &lt;From&gt;      &lt;Id&gt;1c36b0157b&lt;/Id&gt;      &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;      &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;      &lt;IP&gt;172.25.81.237&lt;/IP&gt;      &lt;Port&gt;21448&lt;/Port&gt;    &lt;/From&gt;    &lt;To&gt;      &lt;Id&gt;94b8a54712&lt;/Id&gt;      &lt;EPId&gt;213808492931&lt;/EPId&gt;      &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;      &lt;Contact&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local;      opaque=user:epid:vaj8zwoldfc0zkl6hghhoaaa;gruu&lt;/Contact&gt;      &lt;IP&gt;172.25.81.238&lt;/IP&gt;      &lt;Port&gt;11616&lt;/Port&gt;    &lt;/To&gt;    &lt;Properties&gt;      &lt;Protocol&gt;UDP&lt;/Protocol&gt;      &lt;EstimatedBandwidth Codec=\\\"SIREN/16000\\\"&gt;        &lt;Low&gt;52600&lt;/Low&gt;        &lt;High&gt;68600&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"PCMU/8000\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"PCMA/8000\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"RED/8000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"CN/8000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"CN/16000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"telephone-event/8000\\\" /&gt;    &lt;/Properties&gt;  &lt;/StartOrUpdate&gt;…&lt;StartOrUpdate Type=\\\"video\\\"&gt;  &lt;From&gt;    &lt;Id&gt;94b8a54712&lt;/Id&gt;    &lt;EPId&gt;213808492931&lt;/EPId&gt;    &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;    &lt;IP&gt;172.25.81.238&lt;/IP&gt;    &lt;Port&gt;15150&lt;/Port&gt;  &lt;/From&gt;  &lt;To&gt;    &lt;Id&gt;1c36b0157b&lt;/Id&gt;    &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;    &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;    &lt;Contact&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local;    opaque=user:epid:a_6tcapa01gtycf5ts8qnqaa;gruu&lt;/Contact&gt;    &lt;IP&gt;172.25.81.237&lt;/IP&gt;    &lt;Port&gt;6490&lt;/Port&gt;  &lt;/To&gt;  &lt;Properties&gt;    &lt;Protocol&gt;UDP&lt;/Protocol&gt;    &lt;EstimatedBandwidth Codec=\\\"x-rtvc1/90000\\\"&gt;      &lt;Low&gt;460000&lt;/Low&gt;      &lt;High&gt;2510000&lt;/High&gt;    &lt;/EstimatedBandwidth&gt;  &lt;/Properties&gt;&lt;/StartOrUpdate&gt;As you can see, the LSM uses simple http POST requests to send information to a network controller. The network controller just has to “listen” for such data and act on it.This concludes our journey into the wireless network for today, hope you enjoyed it as much as I did :)Many thanks to my colleague and fellow call-quality-optimizer KD!Cheers,Tom\"\n},{\n  \"title\": \"Azure Backup - Part Three\",\n  \"url\": \"/post/azure-backup-part-three/\",\n  \"date\": \"April 17, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\"],\n  \"author\": \"dni\",\n  \"content\": \"In my previous posts I gave you an overview of Azure Backup und explained the “Direct Backup Azure VM to Backup Vault” solution a bit in detail. Lets now focus on the Azure Backup Server option which we can backup Files and Applications like ActiveDirectory, SQL, Sharepoint, Exchange and Hyper-V. InstallationFirst of all you have to access the Backup vault and download the Microsoft Azure Backup Agent.Select a server in your organization that is domain joined where you want to install the Backup software. Before the server uploads the data to the backup vault it saves at least one copy to a local drive. Give the server an empty volume with some space.At the end you pair the server with our backup vault with a vault credential file. The file can be downloaded from the backup vault. Specify a Passphrase to encrypt your backups.The server is now registered in visible in the backup vault.Prerequisites and a more detailed description can be found here: https://azure.microsoft.com/en-us/documentation/articles/backup-azure-microsoft-azure-backup/Backup planThe next step is to define a Backup plan for the servers we want to protect. This task is pretty straight forward, I explain only the most important parts:We specify Disk and online protection. Disk protection represents the short term and online the long term protection.We specify how much restore points we keep on local disk for short term protectionNext step is to define the online Backup schedule and retention policy. In this example we configure the schedule to upload restore points daily at 09:00 PM.&nbsp;Simple restoreThe Backup runs now everyday and uploads the restore point to the backup vault. If we want to restore data we can see where the server recovers them from:&nbsp;Full restoreLets assume we backup our whole infrastructure with the Backup Server and upload the restore points to Azure. The local infrastructure isn’t available due to fire / server damage and we cannot access the backup server (and short term backups) anymore. All of our backups are in the cloud and we want to restore the whole infrastructure.It's a bit more complicated: To get access to the Azure Backups we have to install a Backup Server. To install the Backup Server we need a machine that's domain joined. Because of this prerequisites we have to follow some additional steps to recover the whole environment.Here are the steps we have to do to get the full restore done: Install a new server Create a temporary domain and make the server its domain controller Install a second new server Join the server to the temporary domain Install Azure Backup Server on the second server Join the Backup Server to the Azure Backup vault. We have now access to the restore points Restore the system state backup from a domain controller to a network location Throw away everything except the restored backup Install a new server, this will be the domain controller Restore the system state backup on the new domain controller Verify that the restored AD is working properly Install a new server as the Azure Backup Server Join the new Azure Backup Server to the restored domain Install Azure Backup Server and connect it to the Azure Backup vault Restore the DPM database Start restoring everything else according to your DR plan&lt;/ul&gt; Greetings\"\n},{\n  \"title\": \"lost & found: Nano Server, GitHub, PSGallery, Pester\",\n  \"url\": \"/post/lost-found-nano-server-github-psgallery-pester/\",\n  \"date\": \"April 16, 2016\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"en\",\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Nano Server status updateIt would be about time for the next post in the series about hyper-converged-infrastructure with Nano Server. Over the past few days I deployed Nano on some real hardware and I can't wait to share my findings. But, unfortunately I'm facing a few issues, probably related to hardware, with the lab servers and I didn't have a lot of time to investigate further. As TP5 should be out any day now, I decided to wait for that before wasting too much time. GitHubIn the meantime I have started to move some of my PowerShell scripts to GitHub for source control and publish them to the PowerShell Gallery for easy installation. I thought it might be interesting to share my process, so here we go.First of all, I’m not your typical developer, so I had a general idea about source control and I knew GitHub existed but never really used it, much less with PowerShell. The ongoing discussions about Continuous Integration and DevOps and what not, sparked my interest and so I decided to give it a try. The benefits of putting scripts under version control are obvious, the more you commit, the more history you get and the easier it gets to track code changes and errors. Additionally I really enjoy the community that has formed around PowerShell and publishing code to GitHub is one of many ways to contribute and give back to said community.Should you like to get started with git and don’t now where to start, this article helped me a lot when setting it up on my machines.And you can find my stuff at: https://github.com/tomtorgglerPowerShell GalleryIn case you didn’t know, Windows 10 (actually WMF5) comes with package management, yes that’s right, kind of like you know it from Linux or OSX. OneGet was introduced a while ago and eventually evolved into the PackageManagement module that is now included in WMF5. The PSGallery is already configured as a PackageSource and can therefore be used right away. Just try Find-Script or Find-Module and install whatever you find interesting with Install-Script or Install-Module. Now anyone can publish scripts to this PSGallery thing, which is exactly what I did with Invoke-SEFAUtil.ps1 and Restore-VMPermission.ps1.Other Package Sources can obviously be added, find out more at: https://msdn.microsoft.com/en-us/powershell/wmf/oneget_cmdletsPesterAlong with the move to GitHub I started to write some Unit Tests for my code. So what does that mean? Well I told you, I’m not your typical developer so I’m still figuring this thing out :) The basic idea of unit testing is to write additional code that tests your code automatically. So when you change something in a script, you run the tests and if everything is green, the script is ready to go into production. Pester is a unit testing framework for PowerShell, that can be used to achieve exactly that. Once I have found out enough to explain it in a better way, there might be a dedicated post :)&nbsp;With that, have a great weekend!Tom\"\n},{\n  \"title\": \"Azure Storage Explorer, the easy way to manage your storage\",\n  \"url\": \"/post/azure-storage-explorer/\",\n  \"date\": \"April 6, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\"],\n  \"author\": \"dni\",\n  \"content\": \"Today I gave a try to the new Azure Storage Explorer. Its actually in preview but already amazing. You can download the Explorer from the official website.When you open Azure Storage Explorer the first time the program asks for an subscription:After you specify username and password you are able to see your storage accounts.Within the explorer you can manage all of your Azure Storage Accounts, copy Blob containers, delete VHD’s or copy them to another location and much more:&nbsp;&lt;/p&gt; &lt;/code&gt; Give it a tryGreetings\"\n},{\n  \"title\": \"Azure Backup - Part Two\",\n  \"url\": \"/post/azure-backup-part-two/\",\n  \"date\": \"April 4, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\"],\n  \"author\": \"dni\",\n  \"content\": \"Let’s focus on Option 1 the direct Azure VM Backup:The Backup TasksWe are now going to Backup an Azure VM from the Web interface. First of all, you have to start a discovery search.When the discovery search is completed you can select the VM you want to Backup. Keep in mind: Today it’s not possible to Backup VM’s that's located on the Azure premium storage (SSD) or VM’s in created with the Resource Manager model.  The next step is to create a Backup policy. You can have a single policy that works for all servers or multiple policies with different settings regarding Backup Windows and retention period. This step should be known from other Backup solutions.  On the retention range page you specify how long protected VM’s are kept.  We have created the Backup policy and can now assign it to our VM. From now a VM Backup will be started on a daily basis. Lets restore a VM To restore a VM you basically highlight the VM in the Backup Vault and select the Restore function.   After you selected the restore point you want to restore, the wizard asks you some information. This step is important because you can specify the name and VNET the VM will belong to. Be careful to not place you restores VM in the same Network as the productive one as this is only a test.   A nice log shows the progress and result of the restore request.  When the restore is done a new VM with the specified name is visible in the Virtual Machine section of Azure. We can start this VM, restore our files or put the VM into production if this was a real restore. Greetings          \"\n},{\n  \"title\": \"Azure Backup - Part One\",\n  \"url\": \"/post/azure-backup-part-one/\",\n  \"date\": \"March 27, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\",\"en\"],\n  \"author\": \"dni\",\n  \"content\": \"On Azure you can choose basically between two different Backup Options:1. Direct Backup Azure VM to Backup Vault2. Backup Applications like SQL, Sharepoint… and Files, System State through Microsoft Azure Backup ServerToday I will give you a short overview of the service.  &lt;/a&gt; Prerequisites - Backup Vault: First of all you have to create a Backup Vault (Thomas described this already in a former post)- If you use Microsoft Azure Backup Server a Internet Connection is needed Costs The costs are counted by instance and space used. An instance is either a Azure VM Server using Backup Option 1 or a Server to Backup specified with Microsoft Azure Backup Server using Option 2. (Price table from 12.2015)  When you create the Backup Vault you can choose between LRS or GRS. This can only be specified at the beginning.If you started already some Backups the GRS storage cannot be switched to LRS anymore. You have to recreate the backup vault.   &nbsp; For the Backup Data Azure Block Blob Storage is used. The costs can be seen from the following price table from 12.2015  &nbsp; In Part 2 I create a Backup Plan for some Azure VM’s and restore a Test-VMPart 3 covers a OnPrem Backup using Option 2 with Microsoft Azure Backup Server. I make a full Backup and full restore assuming the VM’s don’t exist anymore. Greetings\"\n},{\n  \"title\": \"Hyper-Convergence with Nano Server: Part 3\",\n  \"url\": \"/post/hyper-convergence-with-nano-server-part-3/\",\n  \"date\": \"March 24, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"en\"],\n  \"author\": \"tto\",\n  \"content\": \"In this post we are going to configure the Hyper-V part of our hyper-converged Nano-Server-Cluster. We already deployed the VMs in part 1 an configured Storage Spaces Direct in part 2.Hyper-VWhen creating the Nano Server VHD files, I installed the Hyper-V role by selecting the –Compute parameter. As we have already created the cluster and the virtual disk, we could simply go ahead and create VMs now. Before doing that, I wanted to configure the Hyper-V Servers to&nbsp; store VM configurations and VHD files on the Cluster Shared Volume and I created a virtual Switch that can be used by the VMs:As you can see, I’m using the $cimSessions variable from part 1 again. This variable contains CIM Sessions to my four Nano Servers, so that the above lines do configure all servers at once. Here’s how I’ve created those sessions: $cimSessions = New-CimSession -ComputerName n01,n02,n03,n04VMsNow we are ready to create the VMs and add them to the cluster. I copied the “win2012r2.vhdx” file over to the ClusterStorage and used this as a parent disk for my VMs: That was pretty easy, so lets have a look at what our current environment looks like in the Failover Cluster Manager.We see all the VMs that were added to the cluster and we can go ahead and move them around between nodes using the Failover Cluster Manager. The same goes for the “nodes”, we see all four Nano Servers participating in the cluster and we can control the nodes status:In the storage folder of the FCM we see the virtual disk and some information about health status and capacity:&nbsp;Ok, that is pretty basic stuff if you just look at the Hyper-V part. The interesting point however, is that those same servers do also provide the shared storage that the hypervisors use.Stay tuned for more Tom\"\n},{\n  \"title\": \"Hyper-Convergence with Nano Server: Part 2\",\n  \"url\": \"/post/hyper-convergence-with-nano-server-part-2/\",\n  \"date\": \"March 10, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"en\"],\n  \"author\": \"tto\",\n  \"content\": \"In this post, we build on the Nano Servers that were set-up in the part one, we are going to create a Failover Cluster and enable Storage Spaces Direct.Cluster NetworkWhen creating the Nano Server vhd files, I did add the package for failover clustering by using the –Clustering parameter of New-NanoServerImage. So now that the servers are running, I can use remote server management tools or PowerShell to create a cluster. But, before doing that, I went ahead and configured the second network adapter with static IP addressing. Remember that I created the Nano VMs with two network adapters, one connected to my lab network – where DHCP provides addressing – the other connected to an internal vSwitch, as it’ll be used for cluster communication only.Failover ClusterBefore creating a cluster I run the “Cluster Validation Wizard” to make sure my configuration checks out. We could run that wizard using the GUI tools or using the following line of PowerShell:Test-Cluster –Node n01,n02,n03,n04&nbsp; –Include “Storage Spaces Direct”,Inventory,Network,”System Configuration”Some summary information as well as the location of the html report will be printed to the screen. In the report we can actually see the results of the tests that were run. Problems are pointed out and some level of detail is provided.The only warning I got was the following: Failed to get SCSI page 83h VPD descriptors for physical disk 2. This was because my VMs originally used the default “LSI Logic SAS” controller for the OS disk, while the additional, 100GB disks were connected to the SATA Controller. To fix this, I did connect the OS disk to the SATA Controller as well.All green, so we can go ahead and create the cluster:New-Cluster -Name hc01 -Node n01,n02,n03,n04 –NoStorageThis will create another html report at a temporary location, the path will again be printed to the screen. My cluster has an even number of nodes, so I decided to use a File Share Witness. Using the following commands, I created a quick share on my management server (tp4):New-Item -ItemType Directory -Path c:\\\\hc01witness New-FileShare -Name hc01witness -RelativePathName hc01witness -SourceVolume (Get-Volume c) -FileServerFriendlyName tp4Get-FileShare -Name hc01witness | Grant-FileShareAccess -AccountName everyone -AccessRight FullAfter that, I used the following to update the cluster quorum configuration:Set-ClusterQuorum -Cluster hc01 -FileShareWitness \\\\\\\\tp4.vdi.local\\\\hc01witness Storage Spaces DirectAt this point, we have a running cluster and we can go ahead and configure storage spaces.But again, before doing that, I want to point something out. If we open the Failover Cluster Manager at this point, we can connect to the cluster just as we are used to. If we expand the “Storage” folder in the newly created cluster, we can see there are no Disks, no Pools and no Enclosures present at this time.Using the following command, I enabled storage spaces direct for the cluster:Enable-ClusterS2D -S2DCacheMode Disabled -Cluster hc01And using the following command, I create a new storage pool using the “Clustered Windows Storage” subsystem:If we go back to the Failover Cluster Manager after the above steps, we can see that now there is a Pool as well as four Enclosures, one representing each server:Ok, so far it is looking quite good, and we can go ahead an create a volume (or virtual disk):Our new virtual disk will automatically be added to the Cluster Shared volumes, we can verify that using:Get-ClusterSharedVolume -Cluster hc01Alright, we are getting close. In the next post, we are going to configure the Hyper-V roles and create some virtual machines. Sounds great? Stay tuned :)&nbsp;Cheers,Tom\"\n},{\n  \"title\": \"Azure File Services\",\n  \"url\": \"/post/azure-file-services/\",\n  \"date\": \"March 7, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\"],\n  \"author\": \"dni\",\n  \"content\": \"Today I mapped an Azure File Share to my local computer  First you have to create a Storage account and a File ServiceWithin the Webinterface you can create folders and upload filesWhen you click on “Connect” you can get the commands to map the volume. Its basically a normal Network drive.The access key can be taken from the Settings / Key sectionIf you execute the command or simply mount the network volume you have the Azure File Service connected as Volume.Greetingsdn\"\n},{\n  \"title\": \"Re-register Azure MFA Server\",\n  \"url\": \"/post/re-register-azure-mfa-server/\",\n  \"date\": \"February 22, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Azure\"],\n  \"author\": \"dni\",\n  \"content\": \"If you also installed the Azure MFA Server with a MSDN Subscription and now want to switch to another subscription without re-installing the Server, you have to do the following. (Please keep in mind you loose all the settings you made within the MFA console) Export your users Make some screenshots of you configuration (Radius, Company settings ect..) Make a Backup of this folder: C:\\\\Program Files\\\\Multi-Factor Authentication Server\\\\Data Stop the service “MultiFactorAuthSvc” Delete the folders content Start the service “MultiFactorAuthSvc” When you open the console the registration wizards starts and you can register the server with another subscriptionGreetings\"\n},{\n  \"title\": \"Hyper-Convergence with Nano Server: Part 1\",\n  \"url\": \"/post/hyper-convergence-with-nano-server-part-1/\",\n  \"date\": \"February 19, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"In this post I’m walking through the steps creating the images for my Nano Servers and then deploying them. Like in this post, I’ll use WDS for the deployment, so some steps might already be familiar.Create Nano Server ImagesI installed a Windows 2016 TP4 Server with full desktop experience that serves as DHCP, WDS and management machine. I’ll run all of the scripts from there, you might as well use Windows 10 for it. So the first step is to create a new image, which is really quite similar as described in the post mentioned above.What’s different, is that I’m creating an image for each node and I’m using the DominBlobPath parameter, so before creating the images, I have to harvest the blobs using “djoin.exe”. My servers are going to be named n01 trough n04, so I’m using a little foreach loop to get all four blobs and build the four images:As noted in the intro post to this series, I’m running the first version of this lab on virtual machines, as I’m using ESXi as hypervisor, I needed to add the OEMDrivers as well as drivers for vmxnet3 NICs to the image. Those vmxnet3 drivers are located at DriversPath. I do also add Compute, Storage and Clustering packages, as we need them to provide Hyper-V and Storage Spaces Direct.Do note that the boot image needs to include drivers for vmxnet3 as well, they can be added using the WDS admin console quite easily.Once the images are created, we need to import them into WDS.Import into WDSAgain, I’m going to use the foreach loop to import all VHD files as WDS install images:Now we are ready to create the Nano Server VMs and deploy from WDS.VMsI create four VMs with the following specs on my lab ESXi host:NumCPU = 2;MemoryGB = 16;DiskGB = 20;DiskStorageFormat = 'Thin';GuestID = 'windows9Server64Guest'Then I remove the default NIC and add two of the Type ‘vmxnet3’ and make sure they are connected at startup. Finally, I add two hard disks to the VMs:StorageFormat = 'Thin';CapacityGB = 100;DiskType = 'Flat'Once again, please note that I had to use the SATA controller for these data disks, using default LSA or even the VMware paravirtual controllers, resulted in the following error in the Cluster Validation Wizard:  Disk partition style is GPT. Disk has a Microsoft Reserved Partition. Disk type is BASIC. The required inquiry data (SCSI page 83h VPD descriptor) was reported as not being supported.Using a SATA controller, and attaching the hard disks to that controller, solved the problem.To install the Nano Servers, all I need to do now, is to boot the VMs, press F12 and select the right image on the Windows Deployment Service. About a minute later my server is ready :)Yes, I did also create the VMs with PowerShell, look for a post on that soon…ish.Verify VMsOnce the VMs are installed, I create a CIM session and test connectivity by getting the system uptime like this. As all commands above, these are issued on my management machine (tp4):\"\n},{\n  \"title\": \"Install Office Web Apps Server 2013 on Server 2012 R2\",\n  \"url\": \"/post/install-office-web-apps-server-2013-on-server-2012-r2/\",\n  \"date\": \"February 13, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"A quick hint about installing WAC Server. As it happens, Office Web Apps Server&nbsp;2013&nbsp;only added support for 2012R2 with SP1, and even though SP1 is about 3x the file size of RTM, you cannot install it without RTM;&nbsp;RTM setup fails and that’s where I found myself this morning. Copy SP1 files to ‘updates’ folder Download the service pack 1 for WAC Server from this link: http://go.microsoft.com/fwlink/p/?LinkId=510097 Then extract the service pack using /extract to a folder on the disk. Like this:  wacserversp2013-kb2880558-fullfile-x64-glb.exe /extract:C:\\\\temp\\\\wacsp1 Now copy all the extracted files into the “updates” folder of the RTM install files. Once the updates are there, RTM setup works on 2012R2 and automatically installs SP1, too. Note: Make sure to follow other requirements, as listed on TechNet Enjoy, Tom \"\n},{\n  \"title\": \"Hyper-Convergence with Nano Server: Intro\",\n  \"url\": \"/post/hyper-convergence-with-nano-server-intro/\",\n  \"date\": \"February 8, 2016\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"This is the first post of a series about building a hyper-converged solution with Nano Server in Windows Server 2016 Tech Preview 4. Over the next weeks, I’m going to cover the following parts of my journey:   building the nano servers  creating a cluster and setting up storage spaces direct  bringing in hyper-v  testing and breaking stuff&lt;/ul&gt;   Hyper…what? Before we get started, my quick introduction to hyper-converged, just in case you’ve never heard about it. The basic idea is to bring storage closer to the CPU and so minimize delay. This is achieved by creating groups of servers with local discs and, through the magic of software, pool all the disks into volumes that span the entire group. Such a solution does offer some benefits when we think about scale: adding nodes to the cluster gives you more storage as well as more processor/memory capacity. Obviously we will also see some interesting problems introduced by the complexity of said solutions where troubleshooting will require a great deal of knowledge in multiple fields. While in the old days we had storage, network and compute as cleanly separated silos, hyper-convergence brings all of that together.  So, what I’m going to build and test in this lab is cluster of four Nano Servers running Storage Spaces Direct as well as Hyper-V. The local disks of all Nano Servers will be used to create a virtual disk, that will then be used to store the virtual machines.   Building blocks In the first parts of the series I will build the solution using virtual machines, it’s all about proof-of-concept and learning the basics before getting access to lab equipment. Later I’d like to apply the topics and test the setup on actual hardware, measuring performance data and pulling some disks :)  The requirements for my lab are quite simple, I need an Active Directory domain, one 2016 TP4 Server where I can build and deploy the Nano Server images and later manage the cluster, and four VMs that will be running Nano Server.  DC01: Domain Controller, DNS, Certificate Authority  TP4: DHCP Server, Windows Deployment Services  N01..4: Nano Servers&lt;/ul&gt; I took to visio for a quick diagram, kindly think of the database symbols as disks:  So in the first post of the series, I’m going to build the Nano Server images and deploy them to my virtual machines using Windows Deployment Services. &nbsp; so long,Tom\"\n},{\n  \"title\": \"lost & found: Onyx\",\n  \"url\": \"/post/lost-found-onyx/\",\n  \"date\": \"January 4, 2016\",\n  \"category\": \"lost and found\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Another version of lost and found, another fling I’d like to share: &nbsp;https://labs.vmware.com/flings/onyx\"\n},{\n  \"title\": \"Happy holidays and some numbers\",\n  \"url\": \"/post/happy-holidays-and-some-numbers/\",\n  \"date\": \"December 31, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\"],\n  \"author\": \"tto\",\n  \"content\": \"It’s this time of the year again, everybody is trying to relax a bit and maybe making some plans for the coming year. Well at least that’s what I’m up to these days.NumbersI thought this would be a good opportunity to share some statistics of our blog. So a little more than a year ago, we moved to azure and cloudflare, I took the following numbers mostly from cloudflare.We are blogging here since July 2009, that’s almost six and a half years or around 2350 days. wow.In this time, we produced 250 posts, some in german, some in english. Even though there have been some times with lower activity, that’s still about one post every 10 days.All of this started over a few beers, and neither of us would have thought that it might last this long. Yet here we are, making plans for 2016 and beyond.Now according to cloudflare around&nbsp;8000 unique visitors are stopping by our little site each month, around 300 every single day. Not really mind-blowing, but also not bad.Greetings With that said, we’d like to wish all of you a happy new year and we do certainly hope to see you around.&nbsp;Cheers, Tom\"\n},{\n  \"title\": \"lost & found: OpenLiveWriter, RackHD, EHC, diskspd\",\n  \"url\": \"/post/lost-found-openlivewriter-rackhd-ehc-diskspd/\",\n  \"date\": \"December 18, 2015\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"Client\",\"en\",\"Server\",\"VMware\"],\n  \"author\": \"tto\",\n  \"content\": \"Another quick and dirty edition of “lost &amp; found”, just sharing stuff that I thought is interesting. Open Live WriterSo this is the first post published (and written) using the open-sourced version of Live Writer. I always liked Live Writer, so I am very happy to have it back. More info at Github: https://github.com/OpenLiveWriter/OpenLiveWriterEMC RackHDAnother open source project I stumbled upon the other day is RackHD from EMC {code}. This comes a vendor independent management and orchestration solution for the datacenter. Now I know, that sounds a lot like everything and nothing but why not have a look: http://blog.emccode.com/2015/12/08/introducing-rackhd-automate-bare-metal/VMware Embedded Host ClientThis is especially awesome for the MAC users out there, as you no longer need a Windows VM to run the C# vSphere Client. So you simply install a VIB package on your ESXi (lab) servers and point your browser to https://hostname/ui to manage the host. More Info: https://labs.vmware.com/flings/esxi-embedded-host-clientInstallation is simple and doesn’t require a reboot.esxcli software vib install -v /tmp/esxui-signed.vibThe same is true for removal:  esxcli software vib remove -n esx-ui And a quick look at what you’ll get.  DiskSpd Heard of SQLIO? Meet it’s sequel, DiskSpd. A handy little tool that generates synthetic workload to help asses storage performance. There is a good post on TechNet going into quite a bit of detail. Get the tool and documentation in the TechNet Gallery. &nbsp; Thats all for tonight, so long Tom\"\n},{\n  \"title\": \"Domain-joining the vCenter Server Appliance 6\",\n  \"url\": \"/post/domain-joining-the-vcenter-server-appliance-6/\",\n  \"date\": \"December 10, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\",\"VMware\"],\n  \"author\": \"tto\",\n  \"content\": \"In this post, we started out by deploying the VCSA to a new environment, today we'll see how to join the VCSA to an Active Directory domain and authenticate using domain accounts.&nbsp;&nbsp;PrepareTo join a domain we need the distinguished name of the organizational unit where we want the VCSA's computer object to be created, as well as an account with the required permissions to join a machine to the domain.To get the DN use your tool of choice, like PowerShell: Get-ADOrganizationalUnit -Filter {Name -like \\\"servers\\\"} | Select-Object -ExpandProperty DistinguishedName &nbsp;&nbsp;Before joining the vCenter Server Appliance to the domain, make sure DNS is working perfectly, that includes reverse lookup.&nbsp;&nbsp;JoinNow sign-in to the vCenter using the local SSO domain created during setup and go to Administration/System Configuration/Nodes. Select the VCSA from the list of Nodes and in the right pane, go to Manage/Active Directory and click the \\\"Join\\\" button on the right.&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Specify the domain name and DN of the organizational unit as well as the credentials to use.&nbsp;&nbsp;\\t&nbsp;&nbsp;After joining the domain, a restart is required. To perform a restart, either use SSH or use the \\\"Reboot\\\" button in the \\\"Actions\\\" menu.&nbsp;&nbsp;Once the VCSA is restarted we can see that a Computer object has been created in AD. Now we log-in again, still using the local account, and go to Administration/Configuration where we select \\\"Identity Sources\\\" in the right pane, using the \\\"+\\\" button, add a new Identity Source. &nbsp;&nbsp;\\t&nbsp;&nbsp;Configure PermissionsOnce the Identity Source has been added, we can configure roles and permissions for AD accounts. This can be done using Administration/Global Permissions. Using the \\\"+\\\" button, we assign an AD user or group to a vCenter Role.&nbsp;&nbsp;Alternatively, we can add AD users or groups to the preconfigured groups that can be found in the \\\"Single Sign-On\\\" section of the Administration menu.&nbsp;&nbsp;\\t&nbsp;&nbsp;Verify Finally we can log-out of the local admin account and log-in using our AD user, which should be able to access resources, as specified by the assigned roles. Note: Users with no assigned roles will also be able to log-in, obviously they won't see any objects.&nbsp;&nbsp;TroubleshootNow if some of the steps don't work, for example you cannot log-in or you cannot access AD users or groups in the configuration, double-check DNS and have a look at the following log files:/var/log/vmware/sso/vmware-sts-idmd.log&nbsp;/storage/log/vmware/sso/ssoAdminServer.log&nbsp;I got \\\"Cannot load the users for the selected domain\\\" in the Web Client and found the &nbsp;following lines in the above mentioned logs:&nbsp;Failed to get non-GC connection to domaincom.vmware.identity.idm.IDMException: Failed to establish server connection\"\n},{\n  \"title\": \"Azure Backup: Restore\",\n  \"url\": \"/post/azure-backup-restore/\",\n  \"date\": \"December 3, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Cloud\",\"de\"],\n  \"author\": \"tto\",\n  \"content\": \"In diesem Post habe ich beschrieben, wie man Daten mit Azure Backup sichert, nun wollen wir diese wiederherstellen.&nbsp;&nbsp;Backup AgentDie Wiederherstellung wird über den Azure Backup Agent gestartet, im ersten Schritt wählt man aus, welcher Server wiederhergestellt werden soll.&nbsp;&nbsp;\\t&nbsp;&nbsp;Anschließend werden die wiederherzustellenden Dateien über die Suche oder einen Filesystem Browser ausgewählt. &nbsp;&nbsp;\\t&nbsp;&nbsp;\\t&nbsp;&nbsp;Wie üblich kann man die Dateien am ursprünglichen Ort wiederherstellen, oder einen anderen Pfad angeben. Außerdem kann ausgewählt werden, ob die Berechtigungen (ACL) wiederhergestellt werden sollen. &nbsp;&nbsp;\\t&nbsp;&nbsp;Nach der Bestätigung wird der Wiederherstellungsprozess gestartet, dieser wird auch im Azure Portal angezeigt und protokolliert.&nbsp;Weitere Infos und Doku: https://azure.microsoft.com/en-us/documentation/services/backup/\"\n},{\n  \"title\": \"Installing Nano Server using WDS and PxE \",\n  \"url\": \"/post/installing-nano-server-using-wds-and-pxe/\",\n  \"date\": \"November 26, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Technical Preview 4 of Windows Server 2016 brings along new \\\"packages\\\" for Nano Server, it can now run DNS and IIS along other roles. See TechNet for a complete list. So to get started with Nano, I tried to deploy it via WDS.&nbsp;&nbsp;PrepareNano Server is not installed like other editions of Windows Server, one has to build a customized image with the roles and packages one needs. This underscores the very nature of Nano Server, being a minimal install with minimal overhead.Now to create this image we have to mount the Windows 2016 TP4 ISO on our workstation. In the NanoServer folder right at the root of the ISO, we find the .wim along with two PowerShell scripts. There is quite a detailed guide available on TechNet so I am not going into to much detail here:&nbsp;&nbsp;First import the Module: ipmo .\\\\NanoServerImageGenerator.psm1&nbsp;&nbsp;As I ran the New-NanoServerImage cmdlet before, it already converted the WIM to VHD (that's the VHD you'll find at the \\\"BasePath\\\") so I can omit \\\"MediaPath\\\" for subsequent runs and save a little time:&nbsp;&nbsp;New-NanoServerImage -BasePath C:\\\\nanotemp -TargetPath C:\\\\Nano\\\\Nano_dns.vhd -OEMDrivers -Packages Microsoft-NanoServer-DNS-Package -ComputerName nano_dns -DomainName tomt.it -Language en-us&nbsp;&nbsp;\\t&nbsp;&nbsp;Note: I had to specify the Language parameter as I my system is not using en-us. I am planning to run the VHD on VMware, that's why I included \\\"OEMDrivers\\\" and not \\\"GuestDrivers\\\".&nbsp;&nbsp;WDS The steps above created a VHD at the target path and in the next step I am adding this VHD as an install image to WDS:&nbsp;&nbsp;\\t&nbsp;&nbsp;I changed the name to avoid confusion :)&nbsp;&nbsp;\\t&nbsp;&nbsp;The same can be achieved using PowerShell:&nbsp;&nbsp;Import-WdsInstallImage -Path C:\\\\nano\\\\Nano_dns.vhd -NewImageName \\\"Nano_dns_10.0.10586\\\"&nbsp;&nbsp;That's basically it, now we have to create a new VM an pxe-boot from the WDS.&nbsp;&nbsp;InstallI created a new VM using the \\\"Windows 2016\\\" template in Fusion, but before installing I reduced the size of the new virtual disk to 10G, which still is way to much ;)&nbsp;&nbsp;\\t&nbsp;&nbsp;\\t&nbsp;&nbsp;Very few miutes later our new DNS server is ready.&nbsp;&nbsp;\\t&nbsp;&nbsp;There is nothing really to be done on the server console, the \\\"Emergency Console\\\" can be used to configure networking, the rest is done with RSAT or PowerShell remoting.&nbsp;&nbsp;DNSTo test the functionality of my newest Nano Server, I actually set up DNS:&nbsp;&nbsp;So first of all, using Get-WindowsFeature I checked which features were installed and which ones were available. As you can see from the screenshot, there are not very many features available:&nbsp;&nbsp;\\t&nbsp;&nbsp;Using the following command, I installed DNS Server role: Add-WindowsFeature -ComputerName nano_dns -Name DNS&nbsp;&nbsp;After that, I was able to add the Server to the DNS Management console and configure DNS zones:&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Oh, and of those of you who care, the size of the virtual harddisk is 626,6MB. Awesome, right? :)&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Enjoy, Tom\"\n},{\n  \"title\": \"lost & found: TP4, TH2, Win32-OpenSSH, VS Code\",\n  \"url\": \"/post/lost-found-tp4-th2-win32-openssh-vs-code/\",\n  \"date\": \"November 25, 2015\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"Client\",\"en\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Tech Preview 4The latest preview of Windows Server 2016 has been released, it brings many new features including options for Containers and Nano Server.Download it from the Evaluation Center: http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview\\tWindows 10 1511Aka. Threshold 2 was released, pulled, and re-released, apparently because of some privacy settings. Windows Insiders got it a little earlier and so it landed on my Surface Pro 3. It leaves much more of a stable impression than \\\"RTM\\\" and fixed most of the problems I had.OpenSSH comes to WindowsYes, that's right, some folks at Microsoft heard the calls and started a project on GitHub, aiming to bring OpenSSH to the Windows-world. The wiki page at GitHub has some info about installing, which is quite simple:Once downloaded, run the following commands from an administrative PowerShell:Expand-Archive .\\\\OpenSSH-Win32.zipcd .\\\\OpenSSH-Win32\\\\OpenSSH-Win32\\\\.\\\\ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key.\\\\sshd.exe installStart-Service sshdAnd don't forget to create a firewall rule: New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSHThen I was able to connect from my MacBook: \\tFind more info, a wiki and the download over at GitHub: https://github.com/PowerShell/Win32-OpenSSH\\tVisual Studio CodeA free, cross platform code editor with interesting language support.https://code.visualstudio.com\\t&nbsp;Have fun,Tom\"\n},{\n  \"title\": \"Getting started with vCenter Server Appliance 6\",\n  \"url\": \"/post/getting-started-with-vcenter-server-appliance-6/\",\n  \"date\": \"November 1, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\",\"VMware\"],\n  \"author\": \"tto\",\n  \"content\": \"So I’ve done some work with VMware in the past and even got certified on vSphere 4, but then I changed jobs and ended up working, almost exclusively, with Microsoft software. That included a little bit of Hyper-V but mostly I worked “higher up” in the stack, with applications like Exchange and Lync, that is. As I changed jobs again and find myself focusing on Datacenter technologies now, I decided it was time to reactivate some VMware skills and get to know the latest version.I deployed a vCenter Server Appliance in a new environment the other day, and thought it might be a good starting point.PrepareYou may have heard that VMware want’s to ditch the good ol’ vSphere client and switch to a Web Client kind of a thing, this has been going on for a while, but in every release they are getting more serious about it. New features almost always come “web only”. Unfortunately they decided to make this a flash-based client, yeah, it’s almost as bad as java, but that’s another story.So get yourself a machine with a web browser and install/enable the flash plugin. I had troubles with Safari, Chrome and IE11 so I ended up using Firefox (think about that for a sec…).&nbsp;Download the VCSA from vmware.com, it comes as an ISO image that you will have to mount on your management machine. The idea is, basically, to use a website to deploy an OVF template to one of your vSphere hosts.Install&nbsp;Inside the ISO you’ll find the Web Client Plugin, which is required to deploy the OVF template, it’s located at: \\\\vcsa\\\\VMware-ClientIntegrationPlugin-6.0.0.exeOnce the Client Plugin has been installed, open the \\\\vcsa-setup.html file and follow the wizard.Most steps are straightforward, first select the target ESXi host and configure the VM name and a password for the root account.Then select how the Platform Services Controller is deployed. As far a I know, this is a new role in vCenter 6, which controls Licensing, SSO and Certificates. I selected to deploy an embedded PSC.&nbsp;The next step is to configure Single Sign-On. In my case I created a new SSO domain, as this was the first vCenter Server in the environment. Remember the “SSO Domain name” you use, it will be required to log on later. The SSO domain name must be different than the Active Directory domain name.&nbsp;Note: Make sure to check documentation when upgrading an existing vCenter, as the SSO configuration has changed quite a bit.Select an appliance size and which datastore to use for the VCSA appliance.Finally you can configure network settings. When entering a FQDN for the vCenter appliance, make sure it is already configured in DNS and the VCSA can reach the DNS server you specify. Deployment will fail if DNS doesn’t check out. As I had no NTP Server handy, I selected to synchronise the VCSA’s time with the ESXi host. And no, I would not recommend this.Now after the deployment of the OVF finishes, we should be able to logon to the vSphere Web Client using a browser, or to the classic vSphere Client installed on Windows. Make sure to logon using the administrator@ssodomain account, you wont be able to do much configuration as root!Stay tuned for more :)Tom\"\n},{\n  \"title\": \"Netscaler as ADFS Proxy\",\n  \"url\": \"/post/netscaler-as-adfs-proxy/\",\n  \"date\": \"September 28, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"ADFS\",\"Citrix\",\"en\"],\n  \"author\": \"dni\",\n  \"content\": \"I decided to use Netscaler to publish my ADFS server to the internet instead of a dedicated server in the DMZ. I checked several blogs and the official Citrix documentation but this looked overloaded. Citrix documentation: NetScaler as ADFS Proxy Deployment Guide - CitrixBlogs: http://blogs.citrix.com/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/, http://cividan.blogspot.it/2015/02/use-citrix-netscaler-as-replacement-for.htmlSo I searched a way to:- Publish ADFS to the Internet with URL filter- Do not pre-authenticate with Netscaler (Customizing multiple pre-authentication Websites can be very time consuming per tenant)- Modify the Header that ADFS server understands the request comes from externalThere was no blog post that explained the whole configuration, so I decided to write down the required steps:1. The serviceFirst create the service and specify to forward the Client IP (Header: X-MS-Forwarded-Client-IP)&nbsp;2. The vServer&nbsp;Create the vServer not directly addressable to not trash an IP address and bind the certificate3. Content switch policyCreate a content switch policy to forward only /adfs and the exact hostname to the vServer4. Content Switch vServerCreate the content switch vServer and apply the content switch policy5. Rewrite ActionsYou want to let the ADFS know that the request comes from extranet. So you can apply different authentication methods in the different zones. You have to add the header X-MS-Proxy to the request. Therefore you create a rewrite actionCreate also a rewrite action to rewrite URL /mex 6. Rewrite Policy7. Bind the PoliciesNow bind the policies to the vServer. Both are rewrite policies for requests. Be careful with the GoTo expression to the Header transformation, this must be “NEXT”8. The MonitorADFS has a probe check build in. If you check /adfs/probe you get a 200 message if everything is OK. Create the monitor and add it to the service    &lt;p&gt;&lt;a href=\\\"/assets/archive/image_684.png\\\"&gt;&lt;img width=\\\"265\\\" height=\\\"339\\\" title=\\\"image\\\" style=\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_682.png\\\" border=\\\"0\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Netscaler configuration is done. You can test now the authentication if you access the URL &lt;a href=\\\"https://portal.office.com\\\"&gt;https://portal.office.com&lt;/a&gt; through Netscaler. Then you will be redirected to the ADFS website for authentication:&lt;/p&gt; &lt;p&gt;&lt;a href=\\\"/assets/archive/image_685.png\\\"&gt;&lt;img width=\\\"438\\\" height=\\\"156\\\" title=\\\"image\\\" style=\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_683.png\\\" border=\\\"0\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For internal requests use split DNS to forward the authentication directly to the ADFS server and not to the Netscaler ADFS proxy. So the Proxy Header is missing and your client will use internal authentication.&lt;/p&gt; &lt;p&gt;Stay tuned for my post series about configuring Exchange in Hybrid mode with Office 365.&lt;/p&gt; &lt;p&gt;Greetings&lt;br&gt;ND&lt;/p&gt;\"\n},{\n  \"title\": \"Azure Backup\",\n  \"url\": \"/post/azure-backup/\",\n  \"date\": \"September 6, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Cloud\",\"de\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit einiger Zeit bieten die Recovery Services in Microsoft Azure die Möglichkeit, virtuelle Maschinen oder ganze Rechenzentren zu sichern. Das ist vor allem für Unternehmen interessant, die sich kein DR Rechenzentrum leisten können/wollen.Mit Azure Backup gibt es dazu auch&nbsp;die Möglichkeit einzelne Server, Clients oder nur bestimmte Daten in die Cloud zu sichern. So kann jeder an den Luxus eines off-site Backups kommen. Im folgenden Beispiel konfiguriere ich Azure Backup für meinen Windows 10 Client.&nbsp;Backup VaultAls Grundvoraussetzung benötigt man natürlich eine Azure Subscription, hier kann man sich das Ganze im Free Trial anschauen: https://azure.microsoft.com/en-us/pricing/free-trial/&nbsp;\\tIn der Subscription wird ein Backup Vault benötigt, dort werden die Backups gespeichert. Um ein Backup Vault zu erstellen, ist nach wie vor das \\\"alte\\\" Management Portal nötig, dieses erreicht man über: https://manage.windowsazure.com&nbsp;\\tUnter New, Data Services, Recovery Services erstellt man das Backup Vault.Einmal angelegt muss man nur noch die \\\"Vault credentials\\\" herunterladen, diese findet man im Dashboard des neu angelegten Vaults.Backup AgentDer Backup Agent wird auf dem Client/Server installiert, welcher in das Azure Backup Vault gesichert werden soll. Der aktuelle Backup Agent kann hier heruntergeladen werden: http://aka.ms/azurebackup_agent&nbsp;\\tEinmal installiert, kann man die lokale Maschine über \\\"Register Server\\\" hinzufügen, in dem Wizard werden die \\\"Vault Credentials\\\" importiert. Diese verwendet der Agent um das Vault zu finden und sich zu authentifizieren. Die Daten werden lokal verschlüsselt und über eine https Verbindung übertragen. Der Benutzer erstellt ein Kennwort für diese Verschlüsselung, die auch in der Cloud erhalten bleibt (at rest). Das Kennwort wird in einer Textdatei gespeichert und sollte sicher aufbewahrt werden.&nbsp;\\tSobald der Client/Server registriert wurde, kann man das Backup konfigurieren. Im ersten Schritt wählt man die Daten aus, welche gesichert werden sollen.\\t\\t&lt;p&gt;Dann gibt man unter Backup Scheduleand Retention Policy an, wann Backups erstellt werden sollen und wie dieseaufbewahrt werden.&lt;/p&gt;&lt;p&gt; \\t&lt;/p&gt;&lt;p&gt;That’s it. Das Backup kann mit Backup Now gestartet werden, oder man wartet bis der geplante Task das erledigt.&lt;/p&gt;&lt;p&gt; \\t&lt;/p&gt;&lt;p&gt;Kosten&lt;/p&gt;&lt;p&gt;Die Kosten für das Backup Vault können unter folgendem Link nachgelesen werden:&lt;/p&gt;&lt;p&gt;http://azure.microsoft.com/en-us/pricing/details/backup/ \\t&lt;/p&gt;\"\n},{\n  \"title\": \"Getting started with OSX\",\n  \"url\": \"/post/getting-started-with-osx/\",\n  \"date\": \"August 23, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"en\"],\n  \"author\": \"tto\",\n  \"content\": \"Well yes, I amswitching to OSX on my work machine. I'm still using my Surface Pro 3 at homeand for meetings, but my primary work computer will be a 13\\\" MacBook Profrom now on. As I had no experience whatsoever working with OSX, here are mynotes on getting started:&nbsp;GetOneNoteOne of the mostimportant productivity tools,for me, is OneNote. Everything from screenshots, recipes, drafts, ideas,writing, learning, to meeting notes goes there. I am simply not functionalwithout it :) so just go to onenote.com and grab the latest version. It's free,too.&nbsp;GetBrew and CaskA package managerfor OSX, once installed you can easily install packages (includingdependencies) just like this:$brew search nmap$brew install nmap&nbsp;And, importantly,updating packages is straightforward to. No more updating all individualapplications, just run (Caution: this will update all packages!):$brew update &amp;&amp; brew upgrade &nbsp;Simple as that. Caskextends brew, and brings along many more packages.&nbsp;KeyboardshortcutsThis was reallyimportant for me, as I am using keyboard shortcuts a lot on windows. There is agood list of possible shortcuts at apple.com.Another importantpart, at least for me, in getting around in OSX are trackpad gestures. The mostimportant can be found in the Trackpad section of \\\"SystemPreferences\\\".&nbsp;PythonThere's noPowerShell on the Mac. Bummer. I decided to look into Python and found a couplegood sites for beginners.&nbsp;Moretools...I use KeePass on myWindows machines, a lot. There are multiple possible solutions on OSX, the onethat worked best for me is MacPass. Itopens kdbx files and there is an autotype feature.As I work a lot withconsole/command-line tools, a decent terminal emulator is key. A colleaguepointed me to iTerm2, and I love it :)Atom is a great, customizable text editor.&nbsp;Whatelse?Am I missingsomething, do you have any suggestions? Comments are highly appreciated :) &nbsp;LinksOneNote: http://onenote.comHomebrew: http://brew.shKeyboard Shortcuts: https://support.apple.com/en-us/HT201236Learn Python thehard way: http://learnpythonthehardway.org/book/Coursera: https://www.coursera.org/course/pythonlearnPython: https://docs.python.org/2/library/index.htmlMacPass: http://mstarke.github.io/MacPass/iTerm2: http://iterm2.comAtom: https://atom.io\"\n},{\n  \"title\": \"Moving on!\",\n  \"url\": \"/post/moving-on!/\",\n  \"date\": \"August 16, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\"],\n  \"author\": \"tto\",\n  \"content\": \"Wie der Eine oder Andere vielleicht weiß, habe ich die vergangenen zwei Jahre in Paderborn verbracht. Dort durfte ich einige sehr spannende Projekte im Bereich Unified Communications umsetzen und konnte sowohl beruflich wie auch persönlich viel lernen. Ein großer Dank gilt hier meinem ehemaligen Arbeitgeber, meinen Vorgesetzten und den lieben Kollegen! ;)Der Ruf der Heimat (=Berge) wurde mit der Zeit immer lauter und so entschied ich mich Anfang des Jahres, wieder nach Südtirol zu gehen. Nachdem ich den Sommer für persönliche und kulturelle Weiterbildung (und viel Urlaub) genutzt habe, geht es für mich nun auch beruflich wieder weiter. Ich bleibe dem Leben als Dienstleister treu, freue mich aber sehr in einen neuen Bereich einzusteigen und somit meinen Horizont zu erweitern. In nächster Zeit geht es für mich weg von UC und hin zu Datacenter, Netzwerk und Storage.Hier im Blog möchte ich, soweit es die Zeit zulässt, weiterhin&nbsp;aus der Praxis erzählen.Bis bald!Tom\"\n},{\n  \"title\": \"How to prepare for Exchange 2013 PF migration and what the Microsoft Guide doesn’t tell you\",\n  \"url\": \"/post/how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you/\",\n  \"date\": \"February 23, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"I’m currently preparing my Exchange 2010 / 2013 environment for the public folder migration from 2010 to 2013. I created a test lab to simulate the migration before I do it on the productive servers. During the test migration I noticed some problems that have to been fixed before you get into the migration.1. Fix wrong aliasesIf you have mail enabled folders with aliases containing special characters like spaces or “@” you get an error when you start the first migration part and Exchange wants to create the hierarchy.You can enumerate mailbox folders with, for example, spaces in aliases with the following query:Get-MailPublicFolder | where{$_.Name -match &quot; &quot;}If you have just less than 10 folders to fix you can do it manually. But if you have more than 50 to correct you can use the script written by Johan Veldhuis (http://www.johanveldhuis.nl/tools/scripts/fix-aliasv20.ps1)2. Set the storage quota for the public folder mailboxes on 2013 to unlimitedDuring migration, I recommend to set the storage quota for the public folder mailboxes to unlimited. I saw very strange problems with hierarchies on 2013 not comparing to 2010 if a folder is over quota. You can change the storage limit after migration is done.3. Set the legacy public folder – folder quota to unlimitedDuring migration I had some problems with mail enabled public folders. On the 2010 side the PF are mail enabled, on the 2013 not all PF’s are mail enabled but the PF’s are able to receive mails. You cannot manage the folders with EAC or porwershell. In my case, this problem was related to a PF quota set on a folder. I have many folders with content that reached the maximum limit. For all of these folders the mail enabled option was not enabled after migration. I recommend setting the PF Quota on PF Database basis to unlimited before migration. Please keep in mind to set the quota for all folders to “use database defaults”. You can do this with the following line of powershell:Get-PublicFolder -Recurse | where{$_.UseDatabaseQuotaDefaults -eq $false} | Set-PublicFolder -UseDatabaseQuotaDefaults $trueAdjust the new storage quotas later on a mailbox basis.Greeting   dn\"\n},{\n  \"title\": \"netsh trace and the Message Analyzer\",\n  \"url\": \"/post/netsh-trace-and-the-message-analyzer/\",\n  \"date\": \"February 15, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Network\",\"en\"],\n  \"author\": \"tto\",\n  \"content\": \"This is just a quick post about a cool feature of netsh and the successor to Microsoft’s NetMon.netsh traceWith Windows 7 / Server 2008R2 and newer versions a cool feature has been added to netsh: the possibility to capture network traces without the need to install any third party software.All you need to do is to start an elevated command prompt (run as Admin) and type the following command:netsh trace start capture=yesThen do the stuff you want to capture and stop the trace by using:netsh trace stopAn .etl trace will be generated and the file path is displayed. Note: if you use the persistent=yes parameter when starting the trace, you can even trace system reboots. Microsoft Message AnalyzerSo NetMon has been around for a while and IT pros around the world still love it, well at least I do ;) Some time ago, Microsoft introduced its successor, a tool by the name of “Message Analyzer”. This tool can to a lot more than just network traces, find some information on the MessageAnalyzer Blog.So I just captured a trace using netsh, copied the .etl file to my machine and then opened it in Message Analyzer. As you can see in the screenshot, the layout is quite a bit different from what we’re used from NetMon but the important things are still there. Filtering is quite intuitive, either write an expression into the text box at the right-hand side, or load a filter from the library. Alternatively, just right-click a property of a packet and select “Add to Filter” Well that’s about all I know about Message Analyzer for now. I was able to verify that packets got tagged with the DSCP values I expected and I did not have to install additional software to capture a trace.Happy tracing,Tom\"\n},{\n  \"title\": \"Considerations when planning for DirectAccess\",\n  \"url\": \"/post/considerations-when-planning-for-directaccess/\",\n  \"date\": \"February 4, 2015\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2012-R2\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve seen a fair share of DirectAccess installations recently. Here are some quick questions to ask before you or your customer start getting into the technical titbits. Licensing: DirectAccess requires the Enterprise Edition of Windows on the Client side!  Version:   Client: DirectAccess works with Windows 7 and later, Windows 8.1 i preferred as the technology has evolved  Server: DirectAccess works with Windows Server 2008R2 and later, but Windows 2012 is highly recommended as NAT64 and DNS64 have been included.&lt;/ul&gt; IPv6: Yep, DirectAccess is an IPv6 technology. Make sure your applications support IPv6 and make sure applications always use DNS names to connect to the Servers. If the client is configured to connect to an IPv4 address directly, DirectAccess will not work.  Windows Firewall: It’s sad but I do still see many organizations disabling Windows Firewall via Group Policy. Well in that case, not only are you putting your users at risk, DirectAccess will also not work. Windows Firewall must be enabled as DA uses Connection Security Rules.  Dual NIC: The DircetAccess Server should be configured with to NICs, one for external/dmz connectivity and one for connectivity to the internal network.  Static Routing: As you set the the default gateway to the external NIC, static routes will have to be created for internal networks. Make sure to use “New-NetRoute” as “route add” is no longer recommended.  Firewall: DirectAccess requires tcp/443 to be allowed from the Internet to the external network adapter of the DA server.  Public DNS: A name must be registered in the public DNS zone, clients will use this name to connect to the corporate network.  Public Certificate: A certificate issued by a publicly trusted Certification Authority is highly recommended for the DirectAccess server’s public DNS name. The DA Client checks the Certificate Revocation List before connecting, so if you are using an internal CA, make sure the CRL is available without connectivity to the corporate network.  No Schema or AD changes required: The only requirement for DirectAccess is a Windows Server 2012 (preferably 2012R2) member server. As long as you are on a 2003 or later domain level, you are good to go.  Probe Host: Clients try to connect to a “Probe Host” do determine whether or not a DirectAccess connection should be attempted. This host should, obviously, only be accessible from inside the corporate network. The DirectAccess Wizard resolves name in the Probe Host certificate’s subject, if there is no DNS record, or the DNS record points to an incorrect IP address, the Wizard will fail. Also if the probe host fails, Clients will attempt DA connections even if they are connected to the corp. network, which may lead to problems.  2FA: DirectAccess can be configured for two-factor authentication. Force Tunnelling is not supported in that scenario.  High Availability: Multiple DirectAccess Servers can be deployed for high availability. Windows Network Load Balancing can be used but I’d recommend you use an external Load Balancer.  VPN: The Remote Access Server can be configured for VPN as well.&lt;/ul&gt; &nbsp; Phew. I don’t like bullet lists… Whatever, with those in mind you should be able to plan your remote access strategy :) Tom\"\n},{\n  \"title\": \"WMF 5 Preview: Update is not applicable to your computer\",\n  \"url\": \"/post/wmf-5-preview-update-is-not-applicable-to-your-computer/\",\n  \"date\": \"October 21, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"I just stumbled upon this one on a new machine I was working with:&nbsp;&nbsp; Are you trying to install the Windows Management Framework 5 Preview, to get all the new PowerShell stuff, and see an error like this one?\\\"The update is not applicable to your computer\\\"    This preview actually requires the system local to be set to \\\"en-US\\\", you can easily check this using Get-Host within PowerShell:    In my example, the CurrentUICulture was set to \\\"en-GB\\\" and, apparently, that's why the update failed to install. Once I changed my regional settings and downloaded the \\\"en-US\\\" language pack, the update installed just fine.  In case you haven’t heard of the preview as of yet, you can grab it here: http://www.microsoft.com/en-us/download/details.aspx?id=44070  The issue is also listed in Connect: https://connect.microsoft.com/PowerShell/feedback/details/877188/update-is-not-applicable-to-your-computer-windows-management-framework-5-0-preview-may-2014  &nbsp; Have fun,Tom \"\n},{\n  \"title\": \"Windows 10 VHD Boot\",\n  \"url\": \"/post/windows-10-vhd-boot/\",\n  \"date\": \"October 9, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit einigen Tagen ist die Technical Preview von Windows 10 verfügbar. Auf meinem Notebook nutze ich Windows 8.1 und habe das Hyper-V Feature aktiviert um virtuelle Maschinen betreiben zu können. In so einer VM habe ich auch Windows 10 installiert und getestet.Nach ersten erfolgreichen Tests, wollte ich dann doch mein Notebook mal mit Windows 10 booten, also habe ich mit “bcdedit” einen neuen Eintrag im Bootloader erstellt und die virtual Hard Disk der Windows 10 VM als “device” und “osdevice” angegeben.Wichtig: Vor einer Änderung sollte man die aktuelle Konfiguration immer sichern:bcdedit /export \\\"C:\\\\Users\\\\thomas\\\\Documents\\\\bcdedit\\\"Dieser Befehl kopiert den Boot Configuration Eintrag für das aktuelle Betriebssystem. Der neue Eintrag erhält eine eigene GUID, diese wird gleich ausgegeben und wird in den darauffolgenden Befehlen verwendet.bcdedit /copy {default} /d \\\"Win10 Preview”Mit folgenden Befehlen werden die Einstellungen für den neuen Eintrag angepasst, die virtuelle Festplatte der Windows 10 VM wird als “device” konfiguriert, die GUID des oben erstellten Eintrags muss verwendet werden: bcdedit /set {&lt;new-GUID&gt;} device vhd=[C:]\\\\temp\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} osdevice vhd=[C:]\\\\temp\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} detecthal on&lt;/code&gt; Wenn das Notebook jetzt neu gestartet wird, kann ich im Bootloader zwischen Windows 8.1 und der Tech Preview von Windows 10 wählen. Auch die virtuelle Maschine kann nach wie vor verwendet werden. Viel Spaß,Tom&nbsp; \"\n},{\n  \"title\": \"lost & found: Windows Tech Preview, Delve, Sway and Keybase.io\",\n  \"url\": \"/post/lost-found-windows-tech-preview-delve-sway-and-keybaseio/\",\n  \"date\": \"October 6, 2014\",\n  \"category\": \"lost and found\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"WindowsSome days ago, on September 30, @tmyerson and @joebelfiore introduced Windows 10 and announced the availability of a Technical Preview. The announcement and some demos are on YouTube. Some interesting new features such as snap for 4 windows and continuum, which switches between the start menu and the start screen based on whether or not a keyboard is connected, are coming to Windows 10.The preview can be downloaded at: http://windows.microsoft.com/en-us/windows/previewAlong with the tech preview of Windows 10 came the preview for the next version of Windows Server. A ton of new features will come to the next gen server OS, a notable one might be the SDN controller role, which provides a interface between higher layer applications (think SCVMM) and the software defined networking stack in Windows.The preview for Windows Server can be downloaded at: http://technet.microsoft.com/evalcenter/dn781243DelveThe long rumored and previously shown “Office Graph” aka “Oslo” has started rolling out to Office 365 customers under the new name: “Office Delve”. To get a chance to test new features before regular users get them, one needs to enable “First Release” in the Office 365 Admin Center. SwayAnother addition to the Office family, by the name of “Sway”, started a limited preview a couple of days ago. More information and some demos can be found here: https://sway.com/Keybase.ioAfter signing up some time ago, I finally received an invite for https://keybase.io. Keybase is an interesting approach to make public key cryptography more accessible to users, among many other features it provides&nbsp; a simple way of finding someone’s public key, based on their social media and web identities, in order to be able to encrypt messages for them. It is available as a command-line tool but the website works as client, too.View my publicly-auditable identity here: https://keybase.io/tomt So long,Tom\"\n},{\n  \"title\": \"SCVMM–HyperV Script to reboots VM’s with powershell\",\n  \"url\": \"/post/scvmm-hyperv-script-to-reboots-vms-with-powershell/\",\n  \"date\": \"August 19, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"dni\",\n  \"content\": \"Today I wondered that with Hyper-V there is no option to „reboot“ a VM with right clicking on it. With ESX I have the option to reboot the guest and so I created a script to schedule the reboot with the help of VMWare Powershell and VMWare tools.   The Hyper-V modules on SCVMM gives you the option to shut down and start a VM. Therefore I wrote a simple script that shutdown all VM machines in a specified list (you can use an argument if you want to work with multiple lists). The shutdown is initiated with the “-RunAsynchronously“ switch so that the Powershell command does not wait until the vm is powered off. Immediately after sending the shutdown command a “do while” loop begins to work and waits until one of the machines is powered off. If a machine is switched off the loop powers the VM machine on. The loop ends when all machines are started up.As I have also a VMWare vCenter connected in SCVMM I only touch VM machines with a filter: VirtualizationPlatform = “HyperV”   &#160;# Import Module   Import-Module -Name &quot;virtualmachinemanager&quot;# Clear Variables   [String[]] $VMsToStart = $Null# Get List of VM's to reboot   $VMsToReboot = Get-Content &quot;C:\\\\Program Files\\\\Scripts\\\\ServerList.txt&quot;# Shutdown each VM   Foreach($VMToShutdown in $VMsToReboot){    &#160;&#160;&#160; $VMToShutdownObject = Get-SCVirtualMachine $VMToShutdown    &#160;&#160;&#160; If ($VMToShutdownObject -ne $Null){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToShutdownObject.VirtualizationPlatform -eq &quot;HyperV&quot; -and $VMToShutdownObject.VirtualMachineState -eq &quot;Running&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Shutdown-VM -VM $VMToShutdownObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart += $VMToShutdown    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }Else{    &#160;&#160;&#160; Write-Verbose (&quot;Machine &quot; + $VMToShutdown + &quot; not found&quot;)    &#160;&#160;&#160; }    }# Start each VM after graceful shutdown   Do{    &#160;&#160;&#160; ForEach($VMToStart in $VMsToStart){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMToStartObject = Get-SCVirtualMachine $VMToStart    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToStartObject.VirtualMachineState -eq &quot;PowerOff&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Start-VM -VM $VMToStartObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart = $VMsToStart | ? {$_ -ne $VMToStart}    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }    }while($VMsToStart.Count -ne 0)    \"\n},{\n  \"title\": \"Lync 2013 backend on SQL Cluster with mixed authentication mode\",\n  \"url\": \"/post/lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode/\",\n  \"date\": \"August 15, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"en\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"So I came across this issue at a customer’s site the other day. EnvironmentThe customer runs multiple Lync 2013 Front End Servers in an enterprise pool with the backend and monitoring databases being hosted on a SQL 2008R2 Cluster (default instance) that is also used for other applications and, thus, uses mixed authentication mode.A SQL admin was present during the initial installation of the Lync Pool, and his credentials were used to perform the DB installation.ProblemSo far so good, but when the SQL admin was gone and the Lync Admins (members of RTCUniversalServerAdmins) tried to access the databases with cmdlets like Test-CsDatabase, Update-CsAdderssbook or Install-CsDatabase, they got a nasty little error like:Command execution failed: Property DefaultSchema is not available for Database '[LcsCDR]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.We verified the Logins and permissions on the SQL cluster and everything looked OK, meaning the logins and permissions for all the RTCUniversal… groups were there, just as expected. Still, the error would not go away.  The problem seems to be, that Active Directory groups cannot be used with mixed mode authentication??  Solution? The only solution we found, was to add the user account of the Lync Admin as a login on the SQL cluster and assign permissions directly to the user. Once the user was granted permissions directly (and not through an AD group membership), the error disappeared and the cmdlets worked just fine. This, by the way, explains why the initial setup worked just fine: The SQL admin, whose account was used during setup, had a login and permissions configured for his AD user. The solution is OK for a temporary workaround, but is not very feasible for an enterprise deployment. If anyone has a better solution, I’d love to hear from you :) &nbsp; Cheers,Tom\"\n},{\n  \"title\": \"Moving to Azure…\",\n  \"url\": \"/post/moving-to-azure/\",\n  \"date\": \"August 7, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"… well there is not much more to say. We have been using aruba.it as hosting provider since the beginning of ntSystems info|tech in 2009. On the upside, their simple “hosting windows” plan worked pretty OK and was very affordable, on the downside, they didn’t really care to update the servers and were not able to provide us with IPv6 or a possibility to manage the DNS zone for ntsystems.it.So after testing out various platforms and providers Daniel and I decided to move the blog to Windows Azure. It’s simple, up to date and the new “shared infrastructure” pricing tier is not to expensive, either. We are now in control of the DNS zone and use CloudFlare to improve the sites performance and easily enable IPv6.As you may already have noticed, we took advantage of Azure’s up-to-date hosting platform to migrate to the latest version of the .NET blog engine. &nbsp;We hope you enjoy the new design as much as we do and continue to find our postings helpful and interesting :)Cheers!Tom \"\n},{\n  \"title\": \"NoOp and NAT Traversal\",\n  \"url\": \"/post/noop-and-nat-traversal/\",\n  \"date\": \"July 29, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"In a recent Lync project I came across an interesting issue with SIP Trunks, fortunately we had an AudioCodes SBC so there was a simple solution to the problem. Problem In some call-forwarding scenarios no audio connection could be established, a debug trace on the gateway would show no RTP packets at all.&nbsp;Signaling was working just fine, all the right IPs and Ports were listed within the SDP messages, as you see in the screenshot, though, no RTP packets can be seen.SolutionApparently the SIP provider used some kind of NAT or security device in front of their SIP equipment, and pinholes were only opened when this device received any incoming packets from our side of the communication.That’s when I learned about the “NoOpEnable” parameter which is designed for problems, just like this one. Once the “NoOpEnable” parameter is set to “True”, the SBC will send one RTP packet (with payload No-Op) to each IP involved in the session (retrieved from SDP). The following Screenshot shows another debug trace, please note the first to RTP packets:This did the trick, whatever device the remote side was using, it let RTP packets through once it received an incoming packet.For more Information on the No-Op Payload Type, check out the following IETF Draft: A No-Op Payload Format for RTPEnable NoOpThe NoOpEnable parameter can be configured using the devices AdminPage, which can be found at: https://&lt;IPAddress&gt;/AdminPage Another way, the one I prefer nowadays, is to use the SSH command-line interface, simply connect to the device using PuTTY or TeraTerm and use the following syntax:configure voip    media RTP-RTCP    &nbsp; no-operation-enable 1    &nbsp; activate&nbsp;Lessons learnedAlways use an SBC if dealing with SIP trunks :) &nbsp;Tom\"\n},{\n  \"title\": \"IPv6 im Unternehmen\",\n  \"url\": \"/post/ipv6-im-unternehmen/\",\n  \"date\": \"June 10, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Network\"],\n  \"author\": \"tto\",\n  \"content\": \"In diesem Artikel versuche ich ein paar Argumente für IPv6 in Unternehmensnetzwerken zu erklären, die meisten Netzwerker und Admins mit denen ich zu tun habe sind verunsichert oder schlecht informiert und versuchen aus diesen und anderen Gründen IPv6 als unwichtig oder gar unnötig abzutun.Warum?Diese Frage hört man immer wieder, dabei gibt es einige Gründe die für IPv6 sprechen. Ich teile diese Frage in zwei Bereiche auf, IPv6 im Unternehmensnetzwerk und IPv6 im Internet. IPv6 im InternetViele neuen Trends in der IT haben eines gemeinsam: immer mehr Geräte wollen immer mehr Informationen an immer mehr Teilnehmer senden. Dazu werden immer mehr Verbindungen und immer mehr Adressen benötigt. Das Internet of Things, immer-online Smartphones und viele Cloud Produkte sind ohne IPv6 bereits jetzt schon nicht mehr denkbar. Facebook stellt derzeit sogar das interne Netzwerk wegen Adressmangel auf IPv6 um.Aus der Sicht eines Unternehmens ist IPv6 spätestens dann interessant, wenn man Geschäftspartner in Regionen mit wenigen öffentlichen IPv4 Adressen hat. So werden z.B. in Asien, Afrika und Osteuropa nur noch IPv6 Anschlüsse verkauft, nur selten ist es möglich einige IPv4 Adressen zu ergattern. Durch Übergangstechnologien (transition technology) bietet der Provider zwar die Möglichkeit weiterhin auf IPv4 Inhalte zuzugreifen, aber will man sich als Unternehmen wirklich darauf verlassen, dass potentielle Kunden und Partner die Website schon irgendwie erreichen werden? Dass Emails mit Aufträgen schon irgendwie ankommen werden?Um Problemen mit Übergangstechnologien (Tunneling, CGN…) aus dem Weg zu gehen, sollten bestimmte Dienste aus dem nativen IPv6 Netzwerk erreichbar sein. Die bereits angesprochenen Aufträge oder Webzugriffe sind dabei nur ein Grund, Mitarbeiter (und Führungskräfte) reisen in Regionen in denen IPv6 Internet bereits Normalität ist und auch von dort wollen diese auf das Firmennetzwerk zugreifen und Emails abrufen.Wegen des einfachen (und für den Benutzer kaum merkbaren) Fallbacks ist E-Mail ein Dienst, der relativ einfach über IPv6 erreichbar gemacht werden kann, hier profitiert man sofort von einer besseren Erreichbarkeit und kann den Umgang mit der Technologie lernen.IPv6 im internen NetzwerkBei der Entwicklung von Windows Vista und Server 2008 wurde der Netzwerkstack komplett neu geschrieben, dabei wurde großer Wert auf die Implementierung von IPv6 gelegt. So ist IPv6 ab Windows Vista/2008 nicht nur standardmäßig aktiv, es wird auch bevorzugt. Bekommt ein Client also sowohl ein IPv4 als eine IPv6 Adresse für eine DNS Abfrage zurück, versucht dieser die Verbindung über IPv6 zuerst.Da Windows XP hoffentlich nicht mehr zum Einsatz kommt, kann man davon ausgehen, dass in den meisten Unternehmen bereits jetzt IPv6 großflächig ausgerollt wurde! Leider passiert das häufig ohne detaillierte Planung und manchmal sogar ohne das Wissen der Admins bzw. Netzwerkverantwortlichen. Während das IPv4 Netzwerk genau geregelt wird, Firewalls und IPS Systeme in regelmäßigen Audits gecheckt werden, hat man einen zweiten, nicht berücksichtigen, nicht verwalteten Netzwerkstack. Aus Sicht der Netzwerksicherheit ist dies deshalb kritisch, weil Windows teilweise automatisch Tunnel aufbaut welche dem Client einen ungefilterten Zugriff auf das wachsende IPv6 Internet geben. Da IPv6 bevorzugt wird, kann man mit einem IPv6 “Router Advertisement” einfache Man-in-the-Middle Attacken ausführen und z.B. den gesamten Traffic eines Subnets über einen Proxy umleiten. Security Features wie DHCP Snooping und ARP Inspection sind weiterhin wichtig um das IPv4 Netzwerk zu schützen, in diesem Fall sind diese aber nutzlos.Spätestens zu diesem Zeitpunkt sollte man sich Gedanken über IPv6 machen! Man muss nicht gleich das gesamte Netzwerk umstellen, wichtiger ist eine genaue Planung und die Übertragung der bestehenden Sicherheitsrichtlinien auf IPv6.MigrationDas (langfristige) Ziel einer IPv6 Einführung ist die komplette Migration des Netzwerkes auf natives IPv6, trotzdem wird man IPv4 über eine lange Zeit weiter betreiben. Wie bei jeder Einführung oder Migration ist auch hier die Planung ein wichtiger, erster Bestandteil.Dabei sollten folgende Punkte berücksichtigt werden:   Adressplan: Welche IP Adressen, Subnets? Im Enterprise Umfeld Providerunabhängige Adressen    Übergangstechnologie: Nativ, Tunnel oder eine Mischung?    Bestehendes Equipment: Können benötigte Features abgebildet werden? Firmware Update nötig? Der erste Schritt bei der Einführung ist das Aktivieren des IPv6 Zugriffes am Übergangspunkt des Netzwerkes, hier muss in der Regel mit dem ISP gearbeitet werden. Sind Routing und Sicherheitsrichtlinien eingerichtet, kann IPv6 von außen nach innen ausgerollt werden. Beginnen sollte man mit einer Labor oder Testumgebung, diese kann in einer DMZ, nahe am Übergangspunkt angesiedelt werden, so kann man Erfahrungen sammeln ohne IPv6 ans letzte Ende des Netzwerkes zu transportieren.Nach ausgiebigem Test bieten sich E-Mail und DNS als erste Dienste an, die in einer produktiven Umgebung für IPv6 aktiviert werden können. Beide fallen ohne Probleme auf IPv4 zurück, sodass Benutzer im Problemfall nicht betroffen sein sollten.Ein weiterer interessanter Punkt sind Load Balancer oder Application Delivery Controller, diese veröffentlichen bereits jetzt Systeme und stellen eine Verbindung zwischen öffentlichem und privatem Netzwerk dar. In aktuellen Versionen bieten viele dieser ADCs die Möglichkeit auch über IPv6 mit dem öffentlichen Netzwerk zu kommunizieren. Verwendet der ADC eine Technologie wie NAT64 ist dies für den veröffentlichten Dienst (SharePoint, Exchange, Web…) transparent und dieser muss nicht geändert werden.Möglichkeiten und VorteileDie Einführung von IPv6 bietet, neben der Vielfalt an Adressen weitere Vorteile, so können Router z.B. schneller arbeiten da der IP Destination Header immer an derselben Stelle im Paket zu finden ist. Außerdem erledigen sich die Themen ARP und Broadcasts, für die Auflösung der L2 Adressen wird ICMPv6 verwendet, die sogenannte Neighbor Discovery findet immer über Multicast statt.Ein weiterer Punkt der in IPv4 Netzwerken häufig zu Problemen führt ist MTU und Paketfragmentierung, auch das gibt es in IPv6 Netzwerken nicht mehr. Über ICMPv6 wird die Path MTU ermittelt, so weiß der Client wie groß seine Pakete für den Server sein dürfen, bevor er diese losschickt.Die Automatische Konfiguration von Clients wird oft als Vorteil genannt, dies kann in kleineren Netzwerken sicher interessant sein, im Unternehmen wird es weiterhin DHCP und statische Adressierung für Server geben.Eine der größten Krücken und der Grund aus dem viele immer noch an IPv4 festhalten, ist NAT oder Network Address Translation. Diese Technologie hat es überhaupt erst ermöglicht die Einführung von IPv6 so lange hinaus zu zögern, gleichzeitig hat sie aber auch jede Menge Probleme für Applikationen mit sich gebracht. Mit einem global skalierbaren IPv6 Adressplan wird eine End-to-End Kommunikation von Geräten endlich möglich, das wechseln zwischen Netzwerken kann so für den Benutzer einfacher werden. In einer mobile-first Welt ein nicht unwichtiger Punkt ;)Natürlich ist auch Sicherheit ein wichtiger Aspekt und auch da bietet IPv6 einige Vorteile, so ist IPSEC z.B. standardmäßig implementiert und jeder Host kann (theoretisch) verschlüsselt kommunizieren. Allerdings sieht man auch hier, dass es sich schon um ein älteres Protokoll handelt, einige Standardheader gelten heute als unsicher und es gibt schon einen Nachfolger für Neighbor Discovery, SEND oder SEcure Neigbor Discovery.ProblemeWie bei jeder neuen Technologie gibt es auch bei der Einführung von IPv6 bestimmte Fallstricke, so kann es z.B. sein dass Clients zwar die IPv6 Verbindung bevorzugen, das Routing dafür aber einen weniger optimalen Pfad wählt und die Verbindung deshalb langsamer ist. Aktives Monitoring, saubere Dokumentation und gutes Configuration Management sind wie bei IPv4 unerlässlich. Hier gilt es bestehende Prozesse an die neue Technologie anzupassen. &#160;Einige hilfreiche Links zum Thema hab ich hier gesammelt: IPv6 Learning Resources&#160;Ich hoffe in diesem Artikel das Interesse an IPv6 geweckt zu haben :)Happy hacking!   Tom\"\n},{\n  \"title\": \"Work Folders Demo mit Microsoft Azure\",\n  \"url\": \"/post/work-folders-demo-mit-microsoft-azure/\",\n  \"date\": \"May 29, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Vor einigen Tagen wollte ich in einer Demo das neue Windows Feature “Work Folders” zeigen, da ich gerade keine passende Umgebung hatte, habe ich kurzerhand zwei virtuelle Maschinen in Microsoft Azure IasS gestartet.ÜbersichtDa es sich um eine einfache Demo handelt verwende ich nur zwei Server die ich aus dem Windows 2012R2 Image in Azure erstelle. Auf dem ersten werden die Rollen Domain Controller, ADFS, Zertifizierungsstelle und Work Folders installiert, der zweite wird als Web Application Proxy für die Veröffentlichung verwendet. Da die beiden Server miteinander kommunizieren sollen, verwende ich ein virtuelles Netzwerk in welches die beiden Server ausgerollt werden. Work FoldersWork Folders ist ein Feature von Windows 2012R2 und kann mit OneDrive/Dropbox verglichen werden. Work Folders bieten dem Benutzer eine einfache Möglichkeit auf Daten zuzugreifen und diese über mehrere Geräte zu synchronisieren. Leider gibt es derzeit nur Unterstützung für Windows 7 und 8/8.1, Clients für mobile Geräte wurden noch nicht angekündigt.Im ersten Schritt stufe ich den ersten Server zum Domain Controller hoch und installiere/konfiguriere die Zertifizierungsstelle. Eine spezielle Konfiguration dieser Rollen ist nicht notwendig, die einzige Anpassung ist das Erstellen eines neuen Zertifikattemplates welches später für die ADFS und WAP Zertifikate verwendet wird.DNSVor der Konfiguration der AD FS Rolle überlege ich mir einen Namen über welchen die Federation Services später erreichbar sein sollen, hier entscheide ich mich für adfs.uclab.eu. Damit ich interne Anfragen direkt zum AD FS Server leiten kann, erstelle ich ein DNS Zone für diesen Eintrag: Der A-Record verweist auf meinen Domain Controller und AD FS Server.AD FSNach der Installation der Active Directory Federation Services sind folgende Schritte für die Konfiguration notwendig.Ein Zertifikat mit dem Namen für die Federation Services sowie dem internen Servernamen wird angefordert. Hier verwende ich ein Kopie des WebServer Templates als Zertifikatsvorlage. Sobald das Zertifikat installiert wurde, kann die AD FS Farm installiert werden, dafür wird der Thumbprint der Zertifikates benötigt, diesen kann man sich per PowerShell einfach anzeigen lassen:Get-ChildItem Cert:\\\\LocalMachine\\\\my -DnsName adfs*Außerdem wird ein Service Account für den AD FS Dienst benötigt, dafür verwende ich ein normales AD User Account. Jetzt kann die Farm installiert werden, dabei wird das Service Account mit Get-Credential abgefragt:Install-ADFSFarm -CertificateThumbprint 9EA51F4DAA939C077602DF0B7EE7426F61E2DE0A -FederationServiceDisplayName \\\"Uclab Demo\\\" –FederationServiceName adfs.uclab.eu -OverwriteConfiguration -ServiceAccountCredential (Get-Credential) -ErrorAction Stop In der AD FS Management Konsole sehen die Federation Service Properties folgendermaßen aus:&nbsp;AD FS Relying TrustJetzt wird ein Relying Party Trust hinzugefügt, dazu klickt man in der AD FS Management Konsole mit rechts auf “AD FS” und wählt “Add Relying Party Trust”. Die Daten müssen manuell eingegeben werden, ein Name wird für den Trust gewählt. Das AD FS Profil wird verwendet, die Auswahl des Zertifikates für Token Signierung sowie die Konfiguration der URLs für WS-Federation und SAML können übersprungen werden.Als Identifikation muss “https://windows-server-work-folders/V1” verwendet werden. Multi Faktor Authentifizierung ist in meiner Demo nicht nötig und wird auch übersprungen. Der letzte Schritt kann auch übersprungen werden, anschließend wird der Trust erstellt. Jetzt müssen noch “Claim Rules” definiert werden. Folgende Attribute werden definiert: Jetzt müssen per PowerShell noch folgende Eigenschaften konfiguriert werden:Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -EnableJWT:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” –Encryptclaims:$false Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -AutoupdateEnabled:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -IssueOAuthRefreshTokensTo:’AllDevices’Der AD FS Server ist jetzt soweit bereit für die Authentifizierung der Work Folders.File and Storage Services: Work FoldersJetzt kann die Work Folders Rolle installiert werden, das geht am schnellsten per PowerShell:Install-WindowsFeature –Name FS-SyncShareServiceNach der Installation erfolgt die Konfiguration der Work Folders über den Server Manager, die Konfiguration ist (wie die Server Rolle) unter “File and Storage Services” zu finden.Ein neuer “Sync Share” wird angelegt, hier wird ein lokaler Pfad für die synchronisierten Daten angegeben. Anschließend wird ausgewählt wie die Ordner auf dem Server benannt werden sollen: Dann können die Berechtigungen vergeben werden, Standardmäßig wird die NTFS Vererbung unterbrochen und der Benutzer erhält exklusiven Zugriff auf sein Sync Share. Über Client Richtlinien kann geregelt werden ob die Work Folder Dateien lokal verschlüsselt werden müssen und ob das Gerät mit einem Passwort gesperrt wird. Nachdem der Sync Share erstellt wurde, muss die Authentifizierung auf ADFS geändert werden, dazu muss man im Server Manager auf Server klicken und den lokalen Server auswählen, dann kann mit einem Rechtsklick “Work Folders Settings” ausgewählt werden:Ich gebe die vorher erstellte AD FS Farm für Authentifizierung an.  Web Application ProxyJetzt ist es an der Zeit den Reverse Proxy auf meinem zweiten Server zu installieren, dieser ist nicht Mitglied der AD Domain, die Authentifizierung erfolgt über AD FS.Noch auf dem Domain Controller fordere ich ein Zertifikat für den Proxy an, hier verwende ich wieder den Namen der AD FS Farm sowie einen weiteren Namen über den ich die Work Folders veröffentlichen werde: Dieses Zertifikat exportiere ich am Domain Controller und importiere es auf dem Reverse Proxy, da dieser nicht Mitglied der Domain ist, muss auch das Root Zertifikat importiert werden.Jetzt kann die Rolle Web Application Proxy installiert werden, diese geht wieder am schnellsten per PowerShell:Install-WindowsFeature –Name Web-Application-ProxyAnschließend wird die Rolle konfiguriert, dafür kann die “Remote Access Management Console” verwendet werden, da sich diese aber nach pre-Beta anfühlt bevorzuge ich auch hier PowerShell. Ein guter Tipp für unbekannte oder selten verwendete cmdlets ist “Show-Command” so kann man sich seinen Befehl einfach zusammenstellen: Der Befehl für die Konfiguration des Web Application Proxy ist dann:Install-WebApplicationProxy -CertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -FederationServiceName adfs.uclab.eu -FederationServiceTrustCredential (Get-Credential)Nun kann die Work Folder Applikation erstellt werden, auch dafür verwende ich wieder “Show-Command” um den PowerShell Befehl zu erstellen.Der Befehl für das veröffentlichen der Applikation ist:Add-WebApplicationProxyApplication -BackendServerUrl https://wfdemo.intra.uclab.eu -ExternalCertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -ExternalUrl https://workfolders.uclab.eu -Name WorkFolders -ADFSRelyingPartyName WorkFolders -ExternalPreauthentication ADFS –UseOAuthAuthenticationNachdem die Applikation über den WAP veröffentlich wurde, muss diese nur noch von außen erreichbar gemacht werden. Dazu werden in der öffentlichen DNS Zone zwei CNames erstellt, einen für die AD FS Farm den anderen für den Namen der Work Folders. Diese CNames zeigen auf den Cloud Service der Reverse Proxy VM in Microsoft Azure. Der Reverse Proxy bekommt einen HTTPS Endpunkt und wird somit erreichbar gemacht: DEMONach all diesen Schritten wird es Zeit die AD FS Authentifizierung zu testen, dazu kann folgende URL verwendet werden:https://adfs.uclab.eu/adfs/ls/idpinitiatedsignon.htm  Das sieht schon mal gut aus, also können wir die Work Folders testen, diese finden sich in der Systemsteuerung: Die URL für die veröffentlichte Applikation wird angegeben, es gibt die Möglichkeit diese in der Registry oder einem AD Attribut für Auto Discovery zu hinterlegen, beide Varianten sind aber nur auf Domain Clients interessant. Für die Anmeldung werde ich auf AD FS umgeleitet: Dann kann ich einen lokalen Speicherort auswählen und werde auf die Richtlinien hingewiesen:  In der Übersicht sieht man Status der Synchronisation und den verfügbaren Speicherplatz am Server. Viel Spaß mit den Work Folders und ein schönes, langes Wochenende :)Tom\"\n},{\n  \"title\": \"ActiveDirectory DisplayName mit Umlauten und AudioCodes ISDN\",\n  \"url\": \"/post/activedirectory-displayname-mit-umlauten-und-audiocodes-isdn/\",\n  \"date\": \"May 4, 2014\",\n  \"category\": \"Skype4B\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Vor einigen Tagen bin ich in einem Lync Projekt auf das Problem gestoßen, dass bestimmte Benutzer keine Anrufe in das PSTN (ISDN E1) tätigen konnten. Der Kunde setzt ein AudioCodes Gateway ein, die Syslogs des Gatways sind zur Fehlersuche sehr gut geeignet. Das Gateway bekommt die SIP Signalisierung von Lync sowie die Q.931 Signalisierung aus dem ISDN mit.Nach kurzer Suche hat sich herausgestellt, dass Benutzer welche keine Anrufe tätigen konnten, folgenden Fehler verursachten:&lt;132&gt;[S=831454] Error Indication: Last Command (Primitive) was not performed due to cause 100  [Trunk:0 Bchannel:1 ConnID:2] [Code:0x23127] &lt;133&gt;[S=831455] (   lgr_psbrdex)(833974    )   recv &lt;-- UnHandled event: EV_ISDN_ERROR_INDICATION (317) &lt;133&gt;[S=831456] [SID:766997237] (   lgr_psbrdex)(833975    )   pstn recv &lt;-- CALL_RELEASED Trunk:0 Conn:2 RetCause:73 NetCause:255 &lt;132&gt;[S=831457] REPORT_TYPE_ERROR_IN: ErrorCauseString = Incorrect parameter type, DiagnosticString= Condition unknown, ErrorCause = d, Diagnostic =  [Trunk:0 Bchannel:-1 ConnID:-1] [Code:0x23127] &lt;133&gt;[S=831458] [SID:766997237] (   lgr_psbrdif)(833976    )   pstn send --&gt; PlaceCall: Trunk:0 BChannel:1 ConnID:2 SrcPN=xxx SrcSN= DstPN=151xxxxxxxx DstSN= SrcNT=4 SrcNP=1 SrcPres=0 SrcScrn=0 DstNT=2 DstNP=1 ServiceCap=M RdrctNum= RdNT=0 RdNP=0 RdPres=0 RdScrn=0 RdRsn=-1 Excl=1 Display=Müller, Max IE= UUIE=0, RawData:0 CLIRReason:-1 OrigPN= OLI=-1 OffhookInd=0 &lt;133&gt;[S=831462] [SID:766997237] (   lgr_psbrdif)(833980    )   Abnormal Disconnect cause:255#?reason(255)? Trunk:0 Conn:2Die Normalisierung der Nummern ist bei allen Benutzern identisch, daran konnte es nicht liegen, nach einiger Zeit ist mir aufgefallen, dass Benutzer die keine Anrufe tätigen konnten einen Umlaut im Active Directory Anzeigenamen hatten… Dieser Namen wurde bei einem Benutzer zu Testzwecken umbenannt und schon konnte dieser auch telefonieren.LösungDas Attribut DisplayName bei allen Benutzern zu ändern kam natürlich nicht in Frage, glücklicherweise gibt es eine Einstellung auf dem AudioCodes Gateway mit der man das Verhalten steuern kann.Eine Möglichkeit ist es, den Calling Name nicht ins ISDN zu signalisieren, dazu kann man den Parameter Remove Calling Name auf dem entsprechenden Trunk auf Enable setzen.Alternativ kann über die AdminPage (oder die INI Datei) der Parameter ISO8859CharacterSet auf “0” gesetzt werden, dieser ändert die Umlaute in Latin-Only Zeichen, so wird “ä” zu “a”, “ö” zu “o” usw…Dieser Parameter kann auch über das CLI gesetzt werden, dazu verbindet man sich per SSH auf das Gateway. Die Einstellung versteckt sich hier:configure voip  gw digitalgw digital-gw-parameters   iso8859-charset no-accentedTom\"\n},{\n  \"title\": \"App-V and the start menu folder redirection issue\",\n  \"url\": \"/post/app-v-and-the-start-menu-folder-redirection-issue/\",\n  \"date\": \"April 4, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"AppV\",\"en\"],\n  \"author\": \"dni\",\n  \"content\": \"If you are using redirected start menu and App-V you might get into some issues with the management of the App-V application shortcuts. First let&rsquo;s start with some background information.Start Menu The Windows start menu is located in the following folder&hellip;. If you are using folder redirection, you can redirect the folder to a fileserver. This is a very often seen scenario in RDS and Citrix deployments.App-V and the Start Menu When you publish an application for a group of users, App-V can create the folder and shortcuts in the start menu. You can manage this in the management website from App-V.App-V and the System Account After you install the App-V Client on your desktop or terminalserver machine, you can find the following service &ldquo;Microsoft App-V Client&rdquo; in the services. The App-V Client services runs with the local system account. If you change this account to a domain user account with the needed permissions, you get errors when publishing / un-publishing applications.The issue: You are using redirected start menu and remove an user from an App-V publishing group. The App-V Client does not delete the programs folder and shortcuts in the users start menu.The reason is, that the local System account, under which the App-V Client services runs, doesn&rsquo;t have the permissions to delete the folder and shortcuts from the fileserver where your start menu is located.There are 2 work around1. Don&rsquo;t redirect the start menuIf you don&rsquo;t use start menu redirection, you don&rsquo;t run into this issue2. Redirect the start menu and use a script to delete death program shortcutsI don&rsquo;t want to disable the start menu redirection and wrote a script to find &ldquo;death&rdquo; shortcuts and delete them with the appropriate folder. You can specify the following script as user logon script:Start-Sleep -Seconds 10$ErrorActionPreference = \\\"SilentlyContinue\\\" $StarMenuPath = \\\"REDIRECTED_FOLDER\\\" + [Environment]::UserName + \\\"\\\\Start Menu\\\"$Shortcuts = gci $StarMenuPath -Recurse -Filter \\\"*.lnk\\\" ForEach ($Shortcut in $Shortcuts) { &nbsp;&nbsp;&nbsp; $WshShell = New-Object -ComObject WScript.Shell &nbsp;&nbsp;&nbsp; $LocalAppDataPath = $env:LOCALAPPDATA &nbsp;&nbsp;&nbsp; $Link = $WshShell.CreateShortcut($Shortcut.Fullname) &nbsp;&nbsp;&nbsp; $PathToApp = $Link.TargetPath &nbsp;&nbsp;&nbsp; $PathToApp = $PathToApp.replace(\\\"C:\\\\Windows\\\\system32\\\\config\\\\systemprofile\\\\AppData\\\\Local\\\",$LocalAppDataPath) &nbsp;&nbsp;&nbsp; IF((!(Test-Path $PathToApp)) -and ($PathToApp.Contains(\\\"AppV\\\"))){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-item -LiteralPath $Shortcut.Fullname -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = $Null &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = gci $Shortcut.Directory.FullName -Recurse &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If($RemainingFiles -eq $Null){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Item $Shortcut.Directory.FullName -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } }Microsoft will fix this I opened a MS call and last week I got an email that the issue for this problem will be fixed in the upcoming Spring release.Greetings dn\"\n},{\n  \"title\": \"Lync: SIP inter-domain federation with Cisco Unified Presence - 2\",\n  \"url\": \"/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-2/\",\n  \"date\": \"March 3, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"In my last post I went through the required configuration steps on the Cisco Unified Presence Server, in this post I will cover the Lync Server configuration as well as some troubleshooting aspects.Lync configurationOn the Lync server side we have to create a trusted application pool along with a trusted application in order for Lync to accept SIP requests from the CUPS. This is done using the Lync Server Management Shell:New-CsTrustedApplicationPool -Identity cups.tomt.local -Registrar lync01.tomt.local -ThrottleAsServer $true -TreatAsAuthenticated $true -OutboundOnly $false -RequiresReplication $false -Site 1 New-CsTrustedApplication -TrustedApplicationPoolFqdn cups.tomt.local -Port 5062 -ApplicationId CUPSAfter that we need a static route pointing to the CUP Server so that Lync knows where to find Users within a certain address space (@tomt.local in our case).$r = New-CsStaticRoute -TLSRoute -Destination cups.tomt.local -Port 5062 -MatchUri tomt.local -UseDefaultCertificate $true      Set-CsStaticRoutingConfiguration -Route @{Add=$r}Note: As we are using TLS as transport protocol, we create a new TLSRoute, the destination parameter specifies where requests for a certain domain (MatchUri) are routed to, as always with TLS, the common name of the certificate must match the FQDN entered as destination. I am using Port 5062 because that is the default port for the “Peer Authentication Listener” on CUP. Once this configuration is in place, we need to make sure the Lync Server trusts the certificate used on the CUPS, so I made sure the CA that issued the CUPS certificate was present in the Lync Servers “Trusted Roots” store.Nice work, Lync users can now see Cisco users presence states and they can even chat with each other :) &#160; Ok, now that we have a working configuration, let’s have a look at troubleshooting.Problem PointsNote: This post is in progress, I will add more troubleshooting steps over the next couple of days.I will list some of the more problematic points here, so just in case you have a half working configuration, make sure to check for the following issues:Unsupported CertificateIf the Lync Server certificate does not include the Enhanced Key Usage of “Client Authentication”, the TLS handshake fails. As the error occurs before the two systems are speaking SIP, we will have to rely on NetMon or Wireshark to troubleshoot the TLS Handshake, sure enough it shows an “Encrypted Alert”:&#160; In the Binary data of the handshake we can see the alert value is 2B (hex) which translates to decimal 43 an means: unsupported certificate. So to fix this, re-issue the Lync Server certificate (Default, Web Services don’t matter here) and make sure the template includes the Client Authentication enhanced key usage.Lync Client signs out when searching for federated userThis is one of the oddest behaviors of the Lync 2013 clients that I have ever seen. A Lync user searches for another user which is homed on the Cisco Unified Presence server. As soon as the user completes the entry of the sip address (and the Lync Server sends a SUBSCRIBE message to the CUPS) the Lync user is signed out of the client.Same thing happens if a CUPS user sends an IM to the Lync user. The Lync client log shows that CUPS is trying to do MD5 authentication (yes md5 in 2014….) and that the Lync Clients handles this by signing out.### client error log ###Check the ACL configuration on the CUP Server, all Lync Servers and Clients must be excluded from MD5 authentication. Also check that your static Route on Lync points to the Peer Authentication listener.&#160;So long,    Tom\"\n},{\n  \"title\": \"Lync: SIP inter-domain federation with Cisco Unified Presence - 1\",\n  \"url\": \"/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-1/\",\n  \"date\": \"March 3, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"As a consultant I do have the pleasure to be working with new customers on a regular basis. Recently I had the interesting request to make Lync 2013 talk to a Cisco Unified Presence 9.1 server. The goal for the customer was, to provide Lync users with the presence information available in the Cisco world.Luckily the configuration was setup with multiple domains, Lync using the public (tomt.it) and Cisco Unified Presence using an internal only (tomt.local) domain. What’s possible?Before you get your hopes to high, here goes a quick list of what functionality will be available, once the federation is in place.   Presence     Contact List (users from both domains can add each other)     IM (Peer to Peer only)  That’s it. Sure you can use Jabber to make your Cisco Desk Phone call a Lync endpoint, if you have a SIP trunk configured between the two systems, but that’s got nothing to do with the presence federation.Basic TopologyThe topology I was working with, consisted of a single Lync 2013 Standard Edition Front End Server with an associated Edge server. Lync was completely configured and operational, the SIP domain I’m going to use in this example is: @tomt.itThe Cisco Unified Presence Server was a standalone box, too. It was hooked up to a clustered CUCM installation, though that should not matter in this example. The SIP domain on the CUPS was @tomt.localAll of my test VMs are located in the 10.1.1.0/24 subnet.CUPS configurationThere are a couple of requirements on the Cisco side of things. First let’s talk certificates.The recommended configuration uses TLS as transport for the federation, not only is it more secure, it’s interesting enough that it’s easier to setup, too.So we need a certificate on the Unified Presence server, to complete this step, log in to the “OS Administration” website of the CUP Server, to connect to the OS Administration website, use /cmplatform. Once signed-in, go to Security, Certificate Management and:    Import the internal certification authority’s certificate to CUPS. Select the Type: “cup-trust”     Create a new certificate signing request (CSR). Select the Type: “cup”     Issue the certificate using a template that uses Server Authentication and Client Authentication as “Enhanced Key Usage”. Note: You’ll need a CA running on Windows Server Enterprise Edition for that, the default WebServer template does not include Client Authentication.     Import the issued certificate on the CUPS. Select the Type: “cup”  After that, my Certificate Management looked like this: The next step is setting up the SIP Federation, this requires you to log-in to the “IM and Presence Administration” website, it can be found at /cupadmin.Using Presence, Inter-Domain Federation, SIP Federation, Federated Domain we add the Lync Servers SIP Domain (tomt.it) as inter-domain federation:Note: Some documentation state that you need to check the “Direct Federation” box, I found that it will work either way. If someone with CUP knowledge reads this, please do get in touch.The next step is setting up a static route from the CUP Server to Lync. This is done using the Presence, Routing, Static Routes menu. We configure a destination pattern with an associated next hop and transport protocol, do note the notation used for the destination pattern! Important: Select TLS as “Protocol Type” and User as the “Route Type”. 5061 is the default port on which a Lync Server will listen for TLS requests.While we are in the “IM and Presence Administration” there are another couple of things to configure:The Lync Servers FQDN (i.e the Common Name on the Lync Pools Certificate) must be added as TLS Peer Subject using System, Security, TLS Peer Subjects:Then, using System, Security, Peer Auth Security Context add the newly created TLS Peer Subject: Also make sure to check the “Disable Empty TLS Fragments” box and add the TLS_RSA_WITH_3DES_EDE_CBS_SHA cipher to selected ciphers.Still in System, Security we need to configure ACLs. The ACLs are not traditional ACLs which allow or block IP:Port combinations, these are used to configure whether or not a communication partner has to be authenticated using MD5. Neither Lync Servers nor Lync Clients support SIP Digest authentication using MD5, so we need to make sure that they will not be prompted for authentication:The following show my incoming and outgoing ACL entries:The last configuration step on the CUP Server is to update the public FQDN using System, Service Parameters, Federation Routing Parameters:Note: The documentation and help context for this parameter state that it should not be changed, although I found the Federation Routing FQDN will be used in the Record-Route Header (maddr field) and if Lync does not have a Trusted Application Pool for this FQDN, communication will fail.Lastly we’ll have to restart some services on the CUP Server in order for the configuration changes to become active. To do this, we need to log-in to the “IM and Presence Serviceability” website, which can be found at /ccmservice.Navigate to Tools, Control Center, Feature Services and restart SIP Proxy Service, then navigate to Tools, Control Center, Network Services and restart the XCP Router Service.Ok, so that’s it on the Cisco side of things. Click here for the Lync Server Configuration.Tom\"\n},{\n  \"title\": \"Lync Conf 2014 Keynote\",\n  \"url\": \"/post/lync-conf-2014-keynote/\",\n  \"date\": \"February 19, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Gestern wurde die zweite Lync Conference in Las Vegas er&ouml;ffnet. In der Keynote gab es einige interessante Ank&uuml;ndigungen:Skype und MobileUnter anderem hat Derek Burney die lange erwartete Video Kommunikation mit Skype demonstriert. Weitere Infos dazu gibt&rsquo;s auf dem Skype Blog und auf dem Offical Microsoft Blog, hier schreibt der neue (alte) Pr&auml;sident der Lync &amp; Skype Engineering Gruppe, Gurdeep Singh Pall auch &uuml;ber weitere Ziele. Die Unterschiede in Bedienung und Funktion der Technologien die wir im privat- bzw. Arbeitsleben einsetzen, sollen wegfallen. Der Fokus liegt auf Work-Life-Balance und sogenannten Digital Natives.All diese &Auml;nderungen und Ziele werden unter dem neuen Schlagwort Universal Communications zusammengefasst.In einer weiteren Demonstration wurde das Lync Mobile App f&uuml;r Android Tabled vorgestellt, dieses soll in den n&auml;chsten Monaten ver&ouml;ffentlicht werden. Damit gibt es mobile Clients f&uuml;r:Windows Phone 8Windows 8.1 / Windows RTiOS: iPhone und iPadAndroid: Phone und TabletInteropInteressant f&uuml;r viele Kunden mit bestehenden Videokonferenzsystem d&uuml;rfte der &ldquo;Interop Server&rdquo; sein, dieser soll als Bestandteil der n&auml;chsten Lync Server Version ausgeliefert werden und erm&ouml;glicht u.a. die Anbindung von Tandberg VTC an Lync.VideoSeit einiger Zeit wird das Thema WebRTC mehr oder weniger hei&szlig; diskutiert, es w&auml;re sicher interessant wenn anonyme Benutzer ganz ohne Plug-in an einer Konferenz teilnehmen k&ouml;nnten. Nun konnte sich die Industrie allerdings noch nicht wirklich auf einen gemeinsamen Weg einigen, dementsprechend wenig Informationen gab es &uuml;ber die Demo eines Video Gespr&auml;ches direkt im Browser.Bei der Technologie handelt es sich um einen Javascript Wrapper f&uuml;r die Unified Communications Web API (http://ucwa.lync.com), welche Codecs verwendet wurden und ob ein Plug-in ben&ouml;tigt wird, hat Derek allerdings nicht angesprochen.Lync OnlineAuch f&uuml;r das Cloud Angebot hat Microsoft ein neues Feature angek&uuml;ndigt, so soll es Unterst&uuml;tzung f&uuml;r Meetings mit bis zu 2000 Teilnehmern geben. Die Unterst&uuml;tzung f&uuml;r Enterprise Voice in der Cloud wurde erneut angek&uuml;ndigt, auch hier fehlen weitere Details.Die Keynote wurde aufgezeichnet und kann hier angesehen werden.http://www.lyncconf.comNa dann, willkommen im Zeitalter der Universal Communications :)Tom\"\n},{\n  \"title\": \"Exchange 2010 Update-HybridConfiguration\",\n  \"url\": \"/post/exchange-2010-update-hybridconfiguration/\",\n  \"date\": \"February 12, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Office365\",\"de\"],\n  \"author\": \"tto\",\n  \"content\": \"Ein schneller Tipp für Hybrid-Admins ;)Beim ausführen des Hybrid Configuration Wizard auf einem Exchange 2010 Server tritt folgender Fehler auf:Fehler beim Aktualisieren der Hybridkonfiguration: 'System.Management.Automation.Remoting.PSRemotingTransportException: Beim Ausführen von Daten vom Remoteserver ist folgender Fehler aufgetreten: [ClientAccessServer=DB3PR05CAXXX,BackEndServer=db3pr05mbXXX.eurprd05.prod.outlook.com, RequestId=ce4f8474-2bcc-4b3b-b4e4-5089f60f2372,TimeStamp=2/11/2014 10:11:28 AM] The request for the Windows Remote Shell with ShellId FC244D6B-C78E-4605-B7E1-91A480CD914B failed because the shell was not found on the server. Possible causes are: the specified ShellId is incorrect or the shell no longer exists on the server. Provide the correct ShellId or create a new shell and retry the operation. Weitere Informationen finden Sie im Hilfethema &quot;about_Remote_Troubleshooting&quot;.&lt;/p&gt;    Weitere Informationen zur Fehlerbehebung finden Sie in der Protokolldatei &quot;Update-HybridConfiguration&quot; unter C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\Logging\\\\Update-HybridConfiguration\\\\HybridConfiguration_2_11_2014_10_10_45_635277102457617512.log.&lt;/code&gt;  Wieder mal hat das Problem mit den unterschiedlichen Datumsformaten zu tun, der Server hatte deutsche Regionaleinstellungen.      Diese müssen auf English (USA) geändert werden und schon läuft der Wizard ohne Probleme durch.  Gruß,   Tom\"\n},{\n  \"title\": \"Lync 2013 Hosting Pack v2 and Skype federation\",\n  \"url\": \"/post/lync-2013-hosting-pack-v2-and-skype-federation/\",\n  \"date\": \"February 8, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"dni\",\n  \"content\": \"With the hosting pack v2 for Lync 2013 Microsoft made the Skype federation available for hosting environments. To configure the federation, follow the official Microsoft guide.If you have configured Skype federation, you have to enable Federation on to tenant:Import-Module LyncOnline Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowFederatedUsers $true Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowPublicUsers $trueIf you try to send some IM&rsquo;s to a Skype user, you get the following error message in the OCS loggerms-diagnostics: 27000;reason=\\\"To-Uri Domain is not in the sender-tenant allow list\\\";To get the federation working, you have to add the following domains to the tenant allow list. This is the way Microsoft do this on Office 365.$d1 = New-CsEdgeDomainPattern -Domain \\\"br.live.com\\\" $d2 = New-CsEdgeDomainPattern -Domain \\\"hotmail.ch\\\" $d3 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.il\\\" $d4 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.jp\\\" $d5 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.th\\\" $d6 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.uk\\\" $d7 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com\\\" $d8 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com.ar\\\" $d9 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com.tr\\\" $d10 = New-CsEdgeDomainPattern -Domain \\\"hotmail.es\\\" $d11 = New-CsEdgeDomainPattern -Domain \\\"hotmail.de\\\" $d12 = New-CsEdgeDomainPattern -Domain \\\"hotmail.fr\\\" $d13 = New-CsEdgeDomainPattern -Domain \\\"hotmail.it\\\" $d14 = New-CsEdgeDomainPattern -Domain \\\"live.at\\\" $d15 = New-CsEdgeDomainPattern -Domain \\\"live.be\\\" $d16 = New-CsEdgeDomainPattern -Domain \\\"live.ca\\\" $d17 = New-CsEdgeDomainPattern -Domain \\\"live.cl\\\" $d18 = New-CsEdgeDomainPattern -Domain \\\"live.cn\\\" $d19 = New-CsEdgeDomainPattern -Domain \\\"live.co.in\\\" $d20 = New-CsEdgeDomainPattern -Domain \\\"live.co.kr\\\" $d21 = New-CsEdgeDomainPattern -Domain \\\"live.co.uk\\\" $d22 = New-CsEdgeDomainPattern -Domain \\\"live.co.za\\\" $d23 = New-CsEdgeDomainPattern -Domain \\\"live.com\\\" $d24 = New-CsEdgeDomainPattern -Domain \\\"live.com.ar\\\" $d25 = New-CsEdgeDomainPattern -Domain \\\"live.com.au\\\" $d26 = New-CsEdgeDomainPattern -Domain \\\"live.com.co\\\" $d27 = New-CsEdgeDomainPattern -Domain \\\"live.com.mx\\\" $d28 = New-CsEdgeDomainPattern -Domain \\\"live.com.my\\\" $d29 = New-CsEdgeDomainPattern -Domain \\\"live.com.pe\\\" $d30 = New-CsEdgeDomainPattern -Domain \\\"live.com.ph\\\" $d31 = New-CsEdgeDomainPattern -Domain \\\"live.com.pk\\\" $d32 = New-CsEdgeDomainPattern -Domain \\\"live.com.pt\\\" $d33 = New-CsEdgeDomainPattern -Domain \\\"live.com.sg\\\" $d34 = New-CsEdgeDomainPattern -Domain \\\"live.com.ve\\\" $d35 = New-CsEdgeDomainPattern -Domain \\\"live.de\\\" $d36 = New-CsEdgeDomainPattern -Domain \\\"live.dk\\\" $d37 = New-CsEdgeDomainPattern -Domain \\\"live.fr\\\" $d38 = New-CsEdgeDomainPattern -Domain \\\"live.hk\\\" $d39 = New-CsEdgeDomainPattern -Domain \\\"live.ie\\\" $d40 = New-CsEdgeDomainPattern -Domain \\\"live.in\\\" $d41 = New-CsEdgeDomainPattern -Domain \\\"live.it\\\" $d42 = New-CsEdgeDomainPattern -Domain \\\"live.jp\\\" $d43 = New-CsEdgeDomainPattern -Domain \\\"live.nl\\\" $d44 = New-CsEdgeDomainPattern -Domain \\\"live.no\\\" $d45 = New-CsEdgeDomainPattern -Domain \\\"live.ph\\\" $d46 = New-CsEdgeDomainPattern -Domain \\\"live.ru\\\" $d47 = New-CsEdgeDomainPattern -Domain \\\"live.se\\\" $d48 = New-CsEdgeDomainPattern -Domain \\\"livemail.com.br\\\" $d49 = New-CsEdgeDomainPattern -Domain \\\"livemail.tw\\\" $d50 = New-CsEdgeDomainPattern -Domain \\\"messengeruser.com\\\" $d51 = New-CsEdgeDomainPattern -Domain \\\"msn.com\\\" $d52 = New-CsEdgeDomainPattern -Domain \\\"passport.com\\\" $d53 = New-CsEdgeDomainPattern -Domain \\\"sympatico.ca\\\" $d54 = New-CsEdgeDomainPattern -Domain \\\"tw.live.com\\\" $d55 = New-CsEdgeDomainPattern -Domain \\\"webtv.net\\\" $d56 = New-CsEdgeDomainPattern -Domain \\\"windowslive.com\\\" $d57 = New-CsEdgeDomainPattern -Domain \\\"windowslive.es\\\" $d58 = New-CsEdgeDomainPattern -Domain \\\"outlook.com\\\" Greetings nd\"\n},{\n  \"title\": \"Lync Client certificate warning Exchange Autodiscover\",\n  \"url\": \"/post/lync-client-certificate-warning-exchange-autodiscover/\",\n  \"date\": \"February 8, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"I’ve seen this problem at a customer the other day, even though I had a solution to fix it, I do still not fully understand why it happens. So I’m going to document it here, we’ll see if that sheds more light… :)The Problem As the title implies, the problem is similar to this one I described earlier, it does however also affect Lync 2010 clients. Once signed-in, the Lync Client will show a certificate warning, indicating that it wants to connect to some Exchange Server but the certificate was not ok, only after double (triple) checking, the certificate really was ok.BackgroundSure enough, the problem only appears in certain environments, the one I was in used different domains for the SIP address and the users primary SMTP address. So, here goes an example:UserPrincipalName: user@contoso.com     PrimarySMTPAddress: user@contoso.com     msRTCSIP-PrimaryUserAddress: user@fabrikam.comWhen this users signs into Lync, the client will perform an Exchange Autodiscover request, in order to retrieve the Exchange Web Services Endpoint. The certificate used on the Exchange Server had the following attributes:CN=exchange.contoso.com    DNS=exchange.contoso.com     DNS=exchange.fabrikam.com     DNS=….Now the warning in the Lync Client says there was a problem connecting to exchange.contoso.com, even though the certificates CN was exactly the same name, that the client tired to reach. Makes sense? Not to me…WorkaroundThe workaround I described in the earlier article still applies, just add the Exchange Servers domain to the clients TrustModelData registry entry. The registry key locations change depending on the client version:            Lync 2010                 HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Communicator\\\\TrustModelData                         Lync 2013                 HKEY_CURRENT_USER\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync                         Type        Reg_SZ                  Value        contoso.com contoso.eu        So if anyone has more information on this one, please do get in touch.Cheers,    tom\"\n},{\n  \"title\": \"Migration: ntSystems Mail von Aruba nach Office 365\",\n  \"url\": \"/post/migration-ntsystems-mail-von-aruba-nach-office-365/\",\n  \"date\": \"February 1, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Office365\"],\n  \"author\": \"tto\",\n  \"content\": \"Nachdem einigem &uuml;berlegen haben wir uns entschieden Mail f&uuml;r die Domain ntsystems.it nach Office 365 zu migrieren. Wir verwenden einen E1 Plan, dieser bietet f&uuml;r 6,5&euro; pro User und Monat eine Exchange Mailbox, Lync, SharePoint und SkyDrive sowie Yammer.ArubaDer aktuelle Provider (und auch Hoster dieser Seite) ist Arbua. An dieser Stelle muss ich sagen, dass wir bisher zwar keine gr&ouml;&szlig;eren Probleme mit unseren Mails hatten, das Mail System allerdings nicht mehr wirklich zeitgem&auml;&szlig; ist, so fehlen z.B. Features wie Kalender, Active Sync und die Anmeldung erfolgt standardm&auml;&szlig;ig &uuml;ber http (ja richtig, unverschl&uuml;sselt. Im Jahr 2014.). Freundlicherweise wird ein Link zu einer &ldquo;Secure Version&rdquo; angezeigt&hellip;DNSEs gibt leider kein Angebot von Aruba, bei dem WebHosting und das Verwalten der DNS Zone m&ouml;glich w&auml;ren. Nach einigem hin und her, konnte ich den Support schlie&szlig;lich dazu bewegen, die ben&ouml;tigten DNS Eintr&auml;ge f&uuml;r Office 365 zu erstellen. Damit die Domain zu Office 365 hinzugef&uuml;gt werden kann, muss zun&auml;chst ein TXT Record mit einem von Microsoft vorgegebenen Wert erstellt werden:Type: TXT Name: @ TXT Value: MS=ms93664998 TTL: 1 HourJetzt kann die Domain verifiziert werden, sobald dieser Vorgang abgeschlossen ist, k&ouml;nnen Benutzer hinzugef&uuml;gt werden. Diesen Schritt habe ich &uuml;bersprungen und stattdessen der Domain ein Verwendungszweck zugewiesen. In unserem Fall: Exchange Online.Sobald der Verwendungszweck ausgew&auml;hlt ist, werden weitere DNS Eintr&auml;ge ben&ouml;tigt, diese sind:&nbsp;Auch diese Eintr&auml;ge hat der Support freundlicherweise erstellt, wichtig ist hierbei, dass Office 365 die Eintr&auml;ge &uuml;berpr&uuml;ft, der MX Eintrag muss also die Priorit&auml;t 0 haben und auch der TTL Wert muss &uuml;bereinstimmen, damit die Domain hinzugef&uuml;gt werden kann.MailEine serverseitige Migration der Inhalte war nicht m&ouml;glich, Inhalten konnten &uuml;ber einen Client (Outlook) oder &uuml;ber das &ldquo;Connected Account&rdquo; Feature von Office 365, &uuml;bernommen werden. Mit diesem Feature kann ein Benutzer bis zu f&uuml;nf Postf&auml;cher zu seinem Office 365 Konto hinzuf&uuml;gen. Unterst&uuml;tzt werden Konten die POP oder IMAP unterst&uuml;tzen.Viele Gr&uuml;&szlig;e aus der Cloud :) Tom\"\n},{\n  \"title\": \"Connect to Office 365 with Powershell\",\n  \"url\": \"/post/connect-to-office-365-with-powershell/\",\n  \"date\": \"January 5, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Office365\"],\n  \"author\": \"dni\",\n  \"content\": \"In this Post I explain how to connect to Office 365 with Powershell and manage Exchange and Lync.1. Install Microsoft Online Services Sign-In Assistant for IT Professionals BETA http://www.microsoft.com/en-us/download/details.aspx?id=392672. Install the Office 365 cmdlets http://go.microsoft.com/fwlink/p/?linkid=2362973. Set Execution Policy to Remote Signed Set-ExecutionPolicy RemoteSignedExchange Online4. Connect to Exchange OnlineImport-Module MSOnline $ExchangeOnlineCred = Get-Credential $ExchangeOnlineSession = New-PSSession &ndash;ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $ExchangeOnlineCred -Authentication Basic -AllowRedirection Import-PSSession $ExchangeOnlineSession -AllowClobber Connect-MsolService &ndash;Credential $ExchangeOnlineCredNow you are connected to Exchange Online:Lync Online4. Install Windows PowerShell Module for Lync Online http://www.microsoft.com/en-us/download/details.aspx?id=393665. Connect to Lync OnlineImport-module lynconlineconnector $LyncOnlineCred = Get-Credential $LyncOnlineSession = New-CsOnlineSession -Credential $LyncOnlineCred Import-PSSession $LyncOnlineSessionGreetings dn\"\n},{\n  \"title\": \"Import Certificate to RD\",\n  \"url\": \"/post/import-certificate-to-rd/\",\n  \"date\": \"January 5, 2014\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\",\"en\",\"Server-2012-R2\",\"RDS\"],\n  \"author\": \"dni\",\n  \"content\": \"With Server 2012 the MMC “Remote Desktop Session Host Configuration” doesn’t exist anymore. If you want to import a specific certificate to the RD Session Host you can do the following:1. Import the certificate to the machines personal store2. Then use the following commands to import the certificate to the Session Host:$pass = ConvertTo-SecureString “CERTIFICATE-PASSWORD” -AsPlainText –Force    $thumbprint = (Import-PfxCertificate -Password $pass -CertStoreLocation cert:\\\\localMachine\\\\my -FilePath '\\\\\\\\LocationToCertificate\\\\certificate.pfx').thumbprint    $path = (Get-WmiObject -class &quot;Win32_TSGeneralSetting&quot; -Namespace root\\\\cimv2\\\\terminalservices -Filter &quot;TerminalName='RDP-tcp'&quot;).__path    Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash=&quot;$Thumbprint&quot;}Now the certificate is imported.Greetings   dn\"\n},{\n  \"title\": \"PAL: Performance Analyse\",\n  \"url\": \"/post/pal-performance-analyse/\",\n  \"date\": \"December 21, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Neulich bin ich über ein interessantes Codeplex Projekt gestolpert, Performance Analysis of Logs (PAL) ToolHier handelt es sich um ein Tool, welches Perfmon Dateien (.blg) auswerten und einen schönen Report generieren kann. Interessant ist die Möglichkeit “Threshold files” zu auszuwählen, diese werden Teilweise mitgeliefert oder können selbst hinzugefügt werden. In diesen XML Dateien sind Performance Counter und entsprechende Schwellwerte hinterlegt.InstallationDie Installation erfolgt typischerweise auf einer Workstation, folgende Komponenten werden benötigt:   .NET Framework 3.5    Microsoft Chart Controls for Microsoft .NET Framework 3.5 (Download) Das PAL Tool selbst ist ein Instsaller der aus Codeplex heruntergeladen werden kann. Die Installation erfolgt nach C:\\\\Program Files\\\\PAL\\\\PAL\\\\ wo auch die mitgelieferten XML Dateien abgelegt werden. Weitere Threshold Files findet man z.B. in der TechNet Gallery, hier der Linkfür den Lync Server 2013.AnalyseInteressant an den XML Dateien ist, dass man daraus Templates für Perfmon Data Collector Sets erstellen. Man muss also nichtmehr mühsam Counter aus der Produtkdoku suchen und diese dann einzeln hinzufügen, es reicht PAL (PALWizard.exe) zu starten und im Reiter “Threshold File” auf “Export Perfmon template” zu klicken.&#160;Aus diesem Template erstellt man dann ein Data Collector Set auf den Systemen die analysiert werden sollen, die Standardwerte für den Dateipfad und die Laufzeit des Sets sollte noch angepasst werden. Ist die Datensammlung abgeschlossen, wird die .blg Datei wieder auf die Workstation mit dem PAL Tool kopiert.Die .blg Datei wird im PAL Tool ausgewählt: Anschließend müssen im Reiter “Questions” noch drei Fragen zu den analysierten Servern beantwortet werden: Unter “Output Options” wird das Verzeichnis angegeben in welchem die Reports erstellt werden sollen.Viel Spaß,   tom\"\n},{\n  \"title\": \"Windows Azure – Point to Site VPN\",\n  \"url\": \"/post/windows-azure-point-to-site-vpn/\",\n  \"date\": \"December 6, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Cloud\"],\n  \"author\": \"tto\",\n  \"content\": \"An interesting feature in Windows Azure is the possibility to expand the local network to the Cloud. This feature comes in two options, a site-to-site tunnel can be created, as well as a simple client VPN, or point-to-site connection. A site-to-site tunnel is configured on a firewall device or router within the corporate network, essentially connecting the Cloud like any other remote site. This post is about clients connecting to the Cloud, so called point-to-site VPN connections. This feature might be of less interest to corporate customers, however, I find it quite cool for lab and dev/test scenarios.Azure Virtual NetworkTo get started we need to configure a virtual network in Windows Azure, chances are that if you have been using Azure virtual machines, you might already have a virtual network configuration. It is required to have VMs communicate with one another.So, in the management portal, create a new virtual network using the “Custom Create” option. After specifying a Name and Affinity Group, configure the DNS Server, this will be the DNS Server for the virtual machines in this virtual network. A quick hint: Azure virtual machines cannot be configured with static IP addresses, but the address assignment always starts with .4, so the first virtual machine that is started will get the .4 address. I do make sure to start my DNS server before starting anything else. Since we are configuring point-to-site VPN, we need to check the corresponding check box. In the next screen we are configuring an IP address range that will be used by the virtual network. This is not yet the subnet for the VM, it is just the address range within which the individual subnets will be created. And in the last screen we are actually configuring the subnets. We need one ore more subnets (within the address range configured before) for the virtual machines, as well as a “Gateway subnet”. This subnet will be used for the gateway. Once the virtual network has been created, we need to add a subnet for the VPN clients that will connect to the virtual network. This is done using the “Configure” tab in the virtual network’s properties. The last step is to create the gateway, using the “Create Gateway” button in the “Dashboard” tab of the virtual network. This process creates the required configuration within Windows Azure, an IP address and a hostname are assigned for clients to connect. Voila, that’s it from a network configuration point of view. AuthenticationNow when Clients are connecting to a VPN some form of authentication is required, in our case of point-to-site VPN, the Azure virtual network uses an SSTP connection with certificates for authentication.The first step is to upload the Certification Authority’s certificate (public key) to the virtual network. Certificates issued by this CA can then be used to authenticate and connect to the VPN. I am using my lab CA and had to install the CA certificate in my clients “Local Machine” trusted root store. After uploading the CA certificate, I requested a new certificate for my user account (using the “User” template). In order to connect to the virtual network in the Azure Cloud one last step is required, we need to download the Client VPN package which is available in the “Dashboard” tab in the virtual network configuration. The installation is simple and once installed, a new VPN connection will be available. And that’s it. Now I am able to connect my notebook to the Azure virtual network, making it possible to connect “directly” to the VMs running in the Cloud :)A quick ipconfig shows that my client got an IP address from the address range I configured earlier, the DNS servers have been assigned, too.&#160;&#160;Ok, enough for tonight, time to get my head out of the clouds :-)    Tom\"\n},{\n  \"title\": \"CNG Certificates and Lync/ TMG\",\n  \"url\": \"/post/cng-certificates-and-lync-tmg/\",\n  \"date\": \"October 29, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"The other day I had a problem assigning certificates to a Lync 2013 Edge Server, today I had the same thing with TMG 2010. Here’s a quick summary, and the solution ;)ProblemI tried to assign an existing certificate to a Lync Edge Server. It did not work using the Deployment Wizard, I tried the PowerShell command and it didn’t work, either.Every time I tried to “Set-CsCertificate” I would get the following error:„Set-CsCertificate: Command execution failed: The buffer supplied to a Function was too small.”Kind of the same thing happened with TMG Server, I tried to assign a certificate to a Web Listener and it would not show up in the Wizard. When I unchecked the “Show only valid Certificates” checkbox, the certificate in question would show with an Error saying:“Incorrect Key Type”SolutionThe solution is to export the certificate, including private key, to a .pfx file. Copy the .pfx file to some workstation with Firefox installed and import the certificate in Firefox. Now use Firefox to “backup” the certificate, this will create a .p12 file, again containing the private key. Copy the .p12 file back to the Server delete the existing certificate and then import the .p12 file using MMC Certificates.Warning: Before deleting the certificate from the Server, make sure you have a working backup (like the .pfx file) or you will have to get a new one.Try to assign the Certificate to a Lync Service or a TMG Web Listener and enjoy.I realize that this sounds pretty silly at first, if you want more detail, keep on reading :)BackgroundIf you are still reading, there is a little more information for you. The certificates in question were using something called “Cryptography Next Generation”, which seems to be some new set of APIs that was introduced in Windows Vista and Server 2008. When creating a custom certificate request, one can select the “Template” to use, this is not the certificate template, but the “Crypto Provider” if you will.The certificates that I mentioned, have all been requested using the CNG Template. Importing/ Exporting them in Firefox seems to fix this, maybe because Firefox prefers CAPI over CNG? If you have any information on this topic, please leave a comment.More info on Crypto Next Generation is available on TechNet: http://technet.microsoft.com/en-us/library/cc730763(WS.10).aspxCheers,   tom\"\n},{\n  \"title\": \"How to build an UAG 2010 Array for Exchange publishing–Part 2\",\n  \"url\": \"/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-2/\",\n  \"date\": \"October 27, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"uag\",\"Skype4B\"],\n  \"author\": \"dni\",\n  \"content\": \"Finally I finished Part 2 of the UAG 2010 publishing post. I spent days with the UAG configuration to publish Exchange 2013 in the right way but with no success. There are some problem with Lync and OWA that I cannot fix. I decided to disable URL filters. Now my Exchange publishing works and in this final post I explain how my configurations looks like.First step is to create a new Trunk for Exchange publishingThen you have to create the Applications for Exchange. First create the Outlook Web Access Application:Select the Exchange CAS Servers or the CAS Server VIP.Configure the authentication and authorize all users.Next step is to rerun the Wizard to publish Outlook Anywhere and Exchange Active Sync.Configure Authentication, Kerberos for OWA and Basic for AutodiscoverDon&rsquo;t forget to configure SPN&rsquo;s and delegation in ActiveDirectory for Kerberos to work. You can export the settings needed into an LDIF File with the &ldquo;Export KCD settings&rdquo; wizard in UAG and import it in AD. Or you can set the SPN&rsquo;s manually:You can check the SPN&rsquo;s and export the file:When you created the applications you have an application list like this:Configure Portal Homepage Change the Portal Home page and uncheck display Home Page within portal frameDisable component installation To prevent UAG installing the client, disable component installation.Redirect HTTP to HTTPSTo redirect HTTP connections to HTTPS create the redirection Trunk in the &ldquo;HTTPS Connections&rdquo; section and select the Exchange Trunk.&nbsp;The basic configuration is done and Exchange is now published via UAG. But there are some issues:Lync: Lync Clients cannot get autodiscover settings In my environment Lync clients couldn&rsquo;t get the autodiscover configuration from Exchange. After checking the UAG logs I noticed that UAG has a problem when Lync announces his Client Agent.Solution: Disable scripting on the trunkOWA: 500 error message when you open another mailbox from OWA In my environment it was not possible to open another users mailbox without getting the following 500 error message:Solution: Disable &ldquo;verify URLs&rdquo; on the OWA ApplicationConclusionI&rsquo;m sure with deeper troubleshooting there must be exist a better way to fix this errors but in my opinion UAG is not the right product for publishing Exchange. Better you use a load balancer or II ARR. I my next publishing post I explain how to publish Exchange 2013 with Citrix Netscaler.\"\n},{\n  \"title\": \"Connect Sharepoint 2013 with Exchange 2013 to sync tasks\",\n  \"url\": \"/post/connect-sharepoint-2013-with-exchange-2013-to-sync-tasks/\",\n  \"date\": \"October 15, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\",\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"To sync Tasks with Exchange and Sharepoint 2013 some base functionality has to be prepared:- Running user profile synchronization - Work management service deployed - SSL for the Web Application with valid certificateUser profile synchronization There are some nice how to&rsquo;s how to get this service running. In simple words you need an user account that has &ldquo;Replicating Directory Changes&rdquo; rights in ADThen you have to start the User Profile Service Application in the Sharepoint Central Administration.If everything works both ForeFront Services are running and you can configure the user profile service.&nbsp;Work management The Work management Service application doesn&rsquo;t need extra configuration. It only has to be deployed and working. On Technet is a short description how to create this service application.http://technet.microsoft.com/en-us/library/fp161254.aspxSSLThe Web Application needs to be SSL enabled. This can be done easily in IIS by enabling the HTTPS binding:To verify that this works you can check if the Exchange server can access the AuthMetadataUrl with the browser. AuthMetadataUrl: https://intranet.domain.local/_layouts/15/metadata/json/1If you can access the 1.json file without authentication this step worked.Tip: If you have to enter credentials, check the authentication methods in IIS for the Web Application. Anonymous needs to be activated:&nbsp;Now you can connect Sharepoint with Exchange:On Sharepoint 2013 1) Download EWSManagedAPI.msi from http://www.microsoft.com/en-us/download/details.aspx?id=35371 2) Install the EWS API with the following switches: msiexec /i EwsManagedApi.msi addlocal=\\\"ExchangeWebServicesApi_Feature,ExchangeWebServicesApi_Gac\\\" 3) Reset IISOn Exchange 2013 1) Switch to the following directory: C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\Scripts 2) Configre Enterprise Partner Application .\\\\Configure-EnterprisePartnerApplication.ps1 -ApplicationType Sharepoint -AuthMetadataUrl https://intranet.domain.local/_layouts/15/metadata/json/1You should get the following outputNow you are able to sync Tasks with Sharepoint and Exchange 2013:Tip: If this does not work and - you are not in the same Domain with Exchange (maybe in a subdomain) - you have an error with Exchange Autodiscover in the Sharepoint logs - you have authentication errors with Exchange in the Sharepoint logs  check that your subdomain (for example subdomain.domain.local) is added to the accepted domains in Exchange.Greetings dn\"\n},{\n  \"title\": \"ActiveSync devices ask for authentication\",\n  \"url\": \"/post/activesync-devices-ask-for-authentication/\",\n  \"date\": \"October 15, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"One of the first steps in an Exchange 2010 to 2013 migration is to make Exchange 2013 internet facing to handle the requests from external and internal clients.After my first attempt to switch from Exchange 2010 CAS and TMG to UAG and Exchange 2013 CAS servers on the frontend I noticed that some Android and iPad ActiveSync users got authentication requests.First thing I checked was the eventlog on the CAS machines and if the inheritance was enabled on the user accounts. Both were ok so I began to check the IIS logs first on the 2013 and then on the 2010 machine because the 2013 CAS proxies the requests to the 2010 CAS.On the 2013 CAS I could see that this users tried to logon but the session ended with a HTTP 401 (Unauthorized) Error:On the CAS 2010 I checked the logs and filtered users and time when they tried to logon. The result was that in the IIS logs the domain of the users that did not sync was different from the users that worked.User1 &ndash;&gt; domain\\\\User1 User2 &ndash;&gt; domain.local\\\\User2 User3 &ndash;&gt; domain.local\\\\User3I checked the devices of User2 and User3 and find out that the domain was missing in the account settings. Previously when Exchange 2010 with TMG were internet facing, TMG made this stuff working.To get this fixed with Exchange and UAG you can set the default domain in IIS on the Exchange 2013 CAS servers if the device does not send the domain.After an IIS reset the devices can successfully connected.Greetings dn\"\n},{\n  \"title\": \"Lync 2013 Survivable Branch Server – Installation\",\n  \"url\": \"/post/lync-2013-survivable-branch-server-installation/\",\n  \"date\": \"October 4, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"de\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Nach dem Planen und Veröffentlichen der Topologie kann der Server installiert werden. Wie bereits erklärt, werden nicht alle Lync Rollen installiert, weshalb die Liste der Systemvoraussetzungen deutlich kürzer ausfällt:Windows 2012 SystemvoraussetzungenAdd-WindowsFeature Windows-Identity-FoundationSobald die Windows Identity Foundation installiert ist, kann das Lync Setup wie gewöhnlich ausgeführt werden. Dafür wird der Deployment Wizard verwendet und im ersten Schritt der lokale “Configuration Store” installiert.Anschließend werden im Schritt zwei und drei die Lync Komponenten installiert und ein Zertifikat zugewiesen. Das Zertifikat fällt auf dem Survivable Branch Server deutlich einfacher aus, was wieder auf die reduzierten Serverrollen zurückzuführen ist. Webservices und Lyncdiscover werden nicht installiert, je nach DNS Konfiguration muss man allerdings den Eintrag für SIP berücksichtigen. In meinem Lab sieht das sieht das Zertifikat so aus:CN = ly15-sba.tomt.local      DNS Name = ly15-tomt.local       DNS Name = sip.tomt.itIst das Zertifikat zugewiesen, können die Dienste gestartet werden, der Erfolg wird am Besten per PowerShell überprüft:Get-CsWindowsServiceInfrastrukturDie Verfügbarkeit von Infrastrukturdienste wie DNS und DHCP muss in Außenstellen natürlich auch berücksichtigt werden.Gibt es in der Außenstelle Telefone mit Lync Phone Edition sollte der DHCP Dienst lokal verfügbar sein, sonst verlieren diese Telefone bei Ablauf der Leases die Verbindung.Die DHCP Optionen werden dabei folgendermaßen konfiguriert:Option 42 (NTP): lokaler NTP Server, z.B. Router      Option 43 (Certificate Provisioning): Front End Server, ly15.tomt.local       Option 120 (SIP Registrar): SBS, ly15-sba.tomt.local&lt;/p&gt;    DHCPUtil -SipServer ly15-sba.tomt.local -WebServer ly15.tomt.local&lt;/code&gt;  Bei DNS kann man nicht immer eine separate Konfiguration darstellen, gibt es einen Domain Controller in der Außenstelle, stellt dieser für gewöhnlich die Active Directory integrierte Zone zur Verfügung. Das ist für Lync allerdings kein Problem, für das WebTicket benötigt der Client ohnehin eine Verbindung zum Front End Server. Wird der Benutzer dann auf den SBS verschoben, teilt der Lync Front End Server das im Anmeldeprozess mit.  Benutzer  Wenn der Survivable Branch Server einsatzbereit ist, können Benutzer auf diesen verschoben werden um von der höheren Verfügbarkeit zu profitieren. Dies kann über das Lync Server Control Panel oder die Lync Management Shell gemacht werden:  Move-CsUser –Identity user10@tomt.it –Target ly15-sba.tomt.local  Dieser Befehl verschiebt den Benutzer user10 auf den SBS. Der Anmeldeprozess am Client sieht jetzt folgendermaßen aus:  Das Erste REGISTER geht an den Lync Front End Server (10.1.1.27), dieser wurde über DNS Autokonfiguration ausgewählt, der Dienst Eintrag für _sipinternaltls.tomt.it zeigt nach wie vor auf diesen Server.     Der Front End Server antwortet mit einem “301 Redirect” und teilt dem Client seinen Home Server für die Anmeldung mit. Der Client sendet dann erneut ein REGISTER an diesen neuen “Home Server” (10.1.1.21).     Nach der erfolgreichen Anmeldung sehen wir in den Konfigurationsinformationen, dass der Client mit dem SBS Pool verbunden ist (Connected Lync Server). Außerdem fällt hier auf, dass der Client nach wie vor die Web Services des zentralen Lync Pools (Front End Server) nutzt.    Fällt die WAN Verbindung (oder der Lync Pool) aus, wechselt der Client in einen Modus mit eingeschränkter Funktionalität und zeigt eine Warnung an. Diese erinnert den Benutzer, dass er zwar seine Buddy Liste verliert, allerdings nach wie vor telefonieren kann. In diesem Fall ist es vorteilhaft wenn der Client ein lokales Adressbuch hat, die Client Policy für Benutzer auf dem SBS sollte entsprechend konfiguriert werden.    Natürlich kann auch der SBS ausfallen, in diesem Fall meldet sich der Lync Client wieder am Front End Server an und kann weiterhin die kompletten Features nutzen.  &#160;  Grüße,    Tom\"\n},{\n  \"title\": \"Hyper-V General access denied error\",\n  \"url\": \"/post/hyper-v-general-access-denied-error/\",\n  \"date\": \"September 27, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Hyper-V\"],\n  \"author\": \"tto\",\n  \"content\": \"Like many others in the ITPro world, I am using many VMs to demo, learn, troubleshoot all different kinds of products and customer scenarios. I also mess with the disk files a lot. Every now and then I get the following error when trying to start a VM:Hyper-V Manager &lt;/p&gt;    An error occurred while attempting to start the selected virtual machine(s).     'dc02' failed to start. (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02' Microsoft Emulated IDE Controller (Instance ID 83F8638B-8DCA-4152-9EDA-2CA8B33039B4): Failed to Power on with Error 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02': IDE/ATAPI Account does not have sufficient privilege to open attachment 'C:\\\\Users\\\\Public\\\\Documents\\\\Hyper-V\\\\Virtual hard disks\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02':&#160; Account does not have sufficient privilege to open attachment 'C:\\\\Users\\\\Public\\\\Documents\\\\Hyper-V\\\\Virtual hard disks\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708) &lt;/code&gt;  Problem  The problem is rather simple, and since Hyper-V has been around for some time now, it should also be well-known to most of us: The VM does not have the necessary (read, write) permissions to use the assigned .vhd or .vhdx disk. So how do you restore the permissions?  Solution  As always, there are many solutions, one could use Hyper-V manager, remove the disk from the affected VM and then add it again. You could even use icacls to somehow get the ACLs right.  Or, simply use my Restore-VMPermission script :)  It’s a PowerShell script that can be used to easily restore permissions for a specific VM (or all VMs) on your Lab Host, it requires the Hyper-V PowerShell Module to get the VMId and then builds the required ACE and adds it to the virtual disk file’s ACL.  As always, please don’t use this in production without thoroughly testing. This is meant for Lab environments.  Verify  Just try to start your VM again, or have a look at the .vhd or .vhdx files security settings and find a similar looking entry:     &#160;  so long,    tom \"\n},{\n  \"title\": \"Lync 2013 Survivable Branch Server – Planung\",\n  \"url\": \"/post/lync-2013-survivable-branch-server-planung/\",\n  \"date\": \"September 21, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Immer häufiger ersetzen Unternehmen klassische Telefonanlagen (PBX) mit Unified Communications Lösungen wie Microsoft Lync. Da Telefonie immer schon gute Verfügbarkeit hatte, müssen in der Lync Umgebung Konzepte her um diesen hohen Anforderungen gerecht zu werden.Für das Rechenzentrum In Außenstandorten sieht das meist anders aus, durch die Zentralisierung der IT-Dienste gibt es wenige (oder gar keine) Server und kein Personal das sich um die Wartung einer komplexen Umgebung kümmern kann. Die Clients in der Außenstelle hängen also von einer zuverlässigen Verbindung zum Rechenzentrum ab. Fällt diese Verbindung aus, ist der Lync Pool nicht mehr erreichbar und somit auch Telefonie nicht mehr verfügbar.Survivable Branch…?Genau in diesen Szenarien kommen Survivable Branch Server oder Applicances ins Spiel. Diese werden eingesetzt um Telefonie in Außenstellen unabhängiger von der Verbindung in das Rechenzentrum zu machen.Folgendes Schaubild habe ich im TechNet gefunden, Benutzer die sich in der “Branch Site” aufhalten sollen weiterhin telefonieren können, wenn die WAN Verbindung (und dadurch der Lync Pool) nicht verfügbar ist. Features wie Konferenzen, Response Groups oder die Buddy List sind bei einem Ausfall der WAN Verbindung trotz SBS nicht verfügbar, es geht hier nur um Telefonie.Quelle: http://technet.microsoft.com/en-us/library/gg398095.aspxDie Grundvoraussetzung ist natürlich eine Verbindung in das Telefonnetz, die von der WAN Verbindung unabhängig ist. Üblicherweise hat man dafür einen Amtsanschluss und ein passendes Media Gateway in der Außenstelle. Appliance oder Server?Eine Survivable Branch Appliance ist, wie der Name schon sagt, eine Hardware Appliance. Diese kommt entweder direkt mit dem PSTN Gateway oder wird nachträglich eingebaut. Auf der Appliance läuft ein Windows Server, bei der Einrichtung werden die benötigten Lync Rollen installiert.Ein Survivable Branch Server ist ein “normaler Server” (auch virtuell) auf dem die benötigten Lync Rollen installiert werden.Bei beiden varianten, SBA und SBS, wird kein vollständiger Lync Front End Server, sondern “nur” die Rollen Mediation Server und Registrar, installiert. So erklärt sich auch, warum ein SBS zwar die Telefonie aufrechterhalten, aber z.B. keine Konferenzen hosten kann.Eine SBA kann für Außenstellen mit bis zu 1000 Benutzern verwendet werden, während ein SBS bis zu 5000 Benutzer bedienen kann.Beide Varianten benötigen keine Lync Server Lizenz, Windows muss natürlich entsprechend lizenziert werden.VorbereitungWie immer bei Lync, muss man die Konfiguration erst mal im Topology Builder planen, bevor es an die Installation geht.Wir erstellen also eine neue “Branch Site” in der Topologie, dabei vergeben wir einen Namen und weitere Eigenschaften wie City, State und Country. Die Branch Site wird immer einer Central Site zugewiesen:Die Checkbox für “Open the new SBA wizard…” ist Standardmäßig aktiv. Für die Lync Topologie gibt es den Unterschied zwischen SBS und SBA nicht, wir legen also im nächsten Schritt den FQDN für unseren SBS fest: Clients in der Branch Site benötigen Zugriff auf einen Front End und Edge Pool für die meisten Funktionen, diese Pools werden im Wizard angegeben: Im letzten Schritt wird das Gateway angegeben, welches in der Außenstelle für Telefonie verwendet wird:&#160;Die Topologie muss veröffentlich werden, bevor der Survivable Branch Server installiert werden kann, auch dieser holt sich die Informationen über die zu installierenden Rollen aus dem Central Management Store. Achtung: Das Computerkonto für den SBS sollte vor dem veröffentlichen der Topologie existieren, da einige Active Directory Berechtigungen gesetzt werden. Gibt es das Konto noch nicht, protokolliert der Topology Builder eine Fehlermeldung. Sobald der SBS Mitglied der Domain ist, muss die Topologie erneut veröffentlicht werden.Im nächsten Beitrag installieren wir die Lync Rollen auf dem Survivable Branch Server und schauen uns die Funktionalität der Clients an.   Schönes Wochenende!    Tom\"\n},{\n  \"title\": \"Lync Private Line\",\n  \"url\": \"/post/lync-private-line/\",\n  \"date\": \"September 14, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"I was at a customer’s site the other day when we he received the following request.ProblemUser A (the Boss) forwards his phone to User B (the Assistant). As someone calls the Boss, obviously the Assistants phone rings and she picks it up, it turns out the caller is important and needs to talk to the Boss. The Assistant transfers the call to the Boss… and that’s it. Since the Bosses phone is forwarded, nobody will be able to reach him.Interestingly, in the ancient PBX world there was a “feature” (I’d call it bug) where the Assistant could “break through” the forwarding setting and therefore transfer calls to the Boss.After bouncing some ideas we came up with a pretty simple solution. As the title implies, it makes use of Private Line feature in Lync 2013.SolutionAfter some testing we configured a Private Line on the Bosses account and again, set up call forwarding to the Assistant in his Lync client.Now, if someone calls the Boss, the Assistants phone would ring. If the caller wants to talk to the Boss, the Assistant can now simply forward the call to the Bosses private line. Call forwarding settings are not applied to this line, so his client would ring and he would be able to take the call. Alternative solutionsSure enough, there is no “one” solution, other possibilities would be the use of the Delegate or even Team Call features. In this particular case, though, we decided to use the Private Line.Update: Another solution for this particular problem would be to have the Boss configure the Assistant as his delegate, and the configure “Forward to Delegate” in her Lync Client. This enables User B to put calls through to User A, even though User A’s client is configured to forward calls. You can use my wrapper script for SEFAUtil to configure this, too..\\\\Invoke-SefaUtil.ps1 –Server ly15.tomt.local –UserName boss@tomt.it –AddDelegate assistant@tomt.it –FwdToDelegates Thanks to @jpborth for pointing this out!ConfigurationThe Private Line feature requires Lync Server 2013, and is not exposed in the Lync Control Panel. The Set-CsUser cmdlet is used to configure a private line for a user:Set-CsUser –Identity boss@uclab.eu –PrivateLine “tel:+39123123”Note: TechNet says, private line is new in Lync 2013, next time I’m in a pure 2010 environment, I’ll check if this feature can be configured on Lync 2010, too.&#160;so long,    tom \"\n},{\n  \"title\": \"date_modified: Invoke-SEFAUtil\",\n  \"url\": \"/post/updated-invoke-sefautil/\",\n  \"date\": \"September 8, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"PowerShell\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Some weeks ago, I’ve written about my PowerShell wrapper function for SEFAUtil.exe, the original post can be found here: /post/Invoke-SEFAUtil-a-PowerShell-wrapper-function.aspxGUIFirst of all, in case you haven’t seen it yet, MVP Johan Veldhuis created an AWESOME GUI wrapper. Check it out: http://johanveldhuis.nl/en/sefautil-gui/If you still want to run it via PowerShell, keep on reading ;)Updated ScriptAfter playing around with my script I figured it would be cool if it would return more “PowerShell like” objects instead of the plain text returned by sefautil.exe. I also wanted it to take pipeline input and updated the related links to point to a help page instead of the blog article. Turning a bunch of strings into a PowerShell objectLooking at the text output of the tool, we can see it has a format of “description : value”. Sample output:User Aor: sip:ttorggler@uclab.eu      Display Name: Thomas Torggler       UM Enabled: True       Simulring enabled: False       User Ring time: 00:00:30       Call Forward No Answer to: voicemailAs they have the same structure, this does immediately bring PowerShell dictionaries (hashtables) to mind. I simply used the –split method to split the strings at “: “ (colon space) and saved the result to a new array.$SEFAResultSplit = $SEFAResult -split ': 'This worked as expected, so I went ahead and created my custom object like this:$data =&#160; @{$SEFAResultSplit[0] = $SEFAResultSplit[1];      $SEFAResultSplit[2] = $SEFAResultSplit[3];       }After testing it in the lab, I realized, even though this worked, it was less then ideal. Sefautil returns a dynamic amount of strings depending on which features are configured for the given user. So while it was reasonably sure that ”$SEFAResultSplit[0]” would always be “User Aor”, I would have no way of knowing the value of the next strings. And, more importantly, I would not know how many strings to expect, a more dynamic approach was needed.This is what I came up with after some serious head scratching:for ($i = 0; $i -lt $SEFAResultSplit.Count; $i++) {      &#160;&#160;&#160; if ([bool]!($i%2)) {       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $j = $i + 1       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $outData += @{$SEFAResultSplit[$i] = $SEFAResultSplit[$j]}       &#160;&#160;&#160; }       }And here is what it does: The array that contains the split strings would always contain the “description” at an even number while the actual values would be found at odd numbers. So, the script loops through the array, and for each even number it creates a new “Key : Value” pair that is saved to a hash table. Whatever object in the array is at the even index number would be used as key, and that even number +1 would be used as value. Sweet.Why?Well, first of all, because it’s cool ;)Then, think about this:Get-CsUser –OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\Invoke-SEFAUtil.ps1 –Server ly15.tomt.local | Where-Object {‘Simulring enabled’ –eq $true}First the Get-CsUser cmdlet is used to get all users within a specified organizational unit, the user objects are then piped into my wrapper script and the output can be filtered just like any other PowerShell output. Of course it could also be converted to html or exported to csv, the point is returning objects instead of text.Sure enough, we can now also take advantage of pipeline input processing to set call forwarding settings for multiple users:Get-CsUser -OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate user1@tomt.itAgain, we use Get-CsUser to get some Lync Users and pipe them to the script, which adds user1@tomt.it as a delegate to the every one of the users. DownloadI’ve updated the script on my Sky Drive, find a link at the new help page.Cheers,    tom\"\n},{\n  \"title\": \"Exchange Unified Messaging Sprachauswahl\",\n  \"url\": \"/post/exchange-unified-messaging-sprachauswahl/\",\n  \"date\": \"August 31, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Lync\",\"Exchange\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit Exchange 2007 integriert die Unified Messaging Rolle klassische Anrufbeantworter in Exchange und schafft so eine neue, “unified” Mailbox für Benutzer.Seit es die Exchange Unified Messaging Rolle gibt, kann man diese durch die Installation von Sprachpaketen anpassen. In diesem Post beschreibe ich eine Änderung in der Funktionsweise die mir in den vergangen Tagen einiges an Kopfzerbrechen bereitet hat.SzenarioAnhand folgender Test Benutzer versuche ich das Verhalten in den jeweiligen Exchange Versionen zu erklären. “Bekannt” und “Unbekannt” bezieht sich hier auf die Exchange Umgebung, “bekannt” heißt der Benutzer hat eine Mailbox, die für UM aktiviert wurde, in der Exchange Umgebung, “unbekannt” heißt er hat keine Mailbox.In dem Beispiel wurde das Sprachpaket für Deutsch auf dem Exchange UM Server installiert, außerdem gibt es einen Exchange Dial Plan, die Standardsprache des Dial Plans ist Deutsch.Benutzer A = bekannt, Regionaleinstellung: Deutsch    Benutzer B = bekannt, Regionaleinstellung: Englisch     Benutzer C = Unbekannt, z.B. Partner, KundeSubscriber Access: Ein bekannter Benutzer ruft eine in Exchange konfigurierte Nummer an, um auf seine Mailbox zuzugreifen.Call Answering: Ein bekannter oder unbekannter Benutzer wird auf ein UM Postfach weitergeleitet, da der ursprünglich Angerufene Teilnhemer das Gesrpäch nicht annehmen konnte.Exchange 2010 SP2 und neuerRuft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B oder C auf die UM Mailbox von Benutzer A weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Wenn Benutzer A oder C auf die UM Mailbox von Benutzer B weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Exchange 2007 bis 2010 SP1Ruft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer A auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer C auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)Wenn Benutzer C auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)UnterschiedeDas mag in Textform etwas verwirrend wirken, der Unterschied ist für mich jedoch beträchtlich:Bis Exchange 2010 SP1 benötigt man einen Dial Plan um alle Sprachen abzudecken, da Exchange rücksichft auf die Sprache der Mailbox nimmt.Ab Exchange 2010 SP2 benötigt man für jede Sprache die unterstützt werden soll einen eigenen Dial Plan, da die Sprache der Mailbox ausschließlich für Subscriber Access berücksichtigt wird.&#160;Tom\"\n},{\n  \"title\": \"Lync Server Backup\",\n  \"url\": \"/post/lync-server-backup/\",\n  \"date\": \"August 28, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"As with all systems a sound backup and recovery strategy is key when deploying Lync. This post will cover some basic ideas about what (and how) to backup in a Lync Topology. Lync, being essentially a SIP proxy, does not store a lot of data. It cannot be compared to the likes of Exchange or SQL, systems that are all about storing stuff. With Lync, we need availability, the rest is real time traffic/ presence information, only interesting in the moment when it happens.What?So what does Lync store then?Topology, Policies, Configuration The topology contains all relevant information about Lync Servers and applications. Once the servers are set up, administrators start configuring voice and client policies, trunk settings and all the other good stuff.We can export all of this configuration settings using the cmdlet: Export-CsConfiguration.User Settings, Buddy Lists After configuring the server side of things it’s time to enable some users for Lync, as the admin does so, configuration about the users, like their RegistrarPool ,SipAddress and LineUri are saved within the Lync system. Once the user logs on and starts to add contacts to their buddy list, those get stored on the Lync Servers as well.We can export all of this information using the cmdlet: Export-CsUserDataResponse GroupIf Lync Response Groups are configured there is some configuration information to store for them as well. This can be exported using the cmdlet: Export-CsRGSConfigurationLocation ServiceThe same idea applies to the Location Services, if configured, the configuration can be exported using the cmdlet: Export-CsLisConfigurationLync File StoreSure enough, the Lync file store needs to be included in the backup plan as well. This is not stored inside Lync, it typically resides on a highly available fileserver.Now if that external fileserver is backed up regularly, just make sure it is included in your backup/recovery documentation and try to restore it regularly. If it is not included in existing backup strategies consider using robocopy.Monitoring and Archiving DataMonitoring and Archiving data are not really stored inside Lync, either. Data is stored within the LcsCDR, QoEMetrics and LcsLog databases on a SQL server. There are no Lync tools available to backup this data, it is typically backed up using existing backup software for SQL or through SQL Management Studio.As with the Lync file store, make sure to include backup/restore dependencies and scenarios in the Lync documentation.Persistent Chat DataLync 2013 introduced the persistent chat feature, now for the first time we really do store instant messages and attachments sent by users.Data is stored within the Persistent Chat Database and can be exported using the cmdlet: Export-CsPersistentChatData. If existing backup software for SQL is available, the persistent chat database is typically backed up like any other application database.How?Now that we know what there is to backup, let’s have a look at how. I did point out the Export-* cmdlets and they’re the tool of choice for backing up Lync configuration information and settings.  Note: The account used to run the Export-* cmdlets needs to be member of the RTCUniversalServerAdmins group.I’ve come up with a quick script that invokes the mentioned Export-* cmdlets. The script can be found on my Github.Find more information about the script on the help page.Tom\"\n},{\n  \"title\": \"Outlook Autodiscover and what to do when migrating from Exchange 2010 to 2013\",\n  \"url\": \"/post/outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013/\",\n  \"date\": \"August 15, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Outlook Clients &gt;= 2007 use Autodiscover to detect the connection settings to connect to the Exchange Server.When a CAS Server is installed, the server hosts a virtual directory in IIS named &ldquo;Autodiscover&rdquo;.Outlook and mobile phones contact this virtual directory and download the autodiscover.xml file if one of the following condition occurs:- When you configure a mailbox - When the mailbox is already configured but Outlook or the mobile phones is unable to connect to the Exchange server - Outlook contacts periodically the Autodiscover service to update the connection settings if neededThe client discovers and connects to the Autodiscover service in a different way if located internal and external.If Outlook is externalWhen the Outlook Client is outside the cooperate network it uses DNS to discover the Autodiscover URL by searching an A Record with autodiscover.domain.com or an SRV record that points to the public name.If Outlook is internalWhen the Outlook Client is inside the cooperate network it searches in AD for a SCP (service connection point) object. The SCP object is an entry for each CAS server in ActiveDirectory that contains the Autodiscover URL. You can check the SCP object by using the cmdlet Get-ClientAccessServer or ADSIedit. If you want to update the SCP records, use the cmdlet instead of ADSIedit.What do I have to do if I&rsquo;m upgrading from Exchange 2010 to 2013?When you upgrade from Exchange 2010 to 2013 one of the first steps is to make the CAS 2013 internet facing. So clients get the autodiscover.xml file and settings via the Exchange 2013 servers. The CAS knows if the mailbox is hosted on an Exchange 2013 server, then the CAS sends you the settings to connect to the 2013 environment, or on the old 2010, then the CAS sends you the settings to connect to Exchange 2010 (CAS 2013 proxies the requests to 2010).This is OK for external Clients. But for internal clients connections you have to update the SCP object from the old 2010 Exchange CAS server to point to the new 2013 CAS server. This is necessary because Exchange 2013 servers provide additional AutoDiscover information to clients to improve the discovery process. From this time when internal clients connect to the Autodiscover service they contact every time the 2013 CAS and get the connection settings. You can update the SCP object and so updating the URL by using the cmdlet Set-ClientAccessServer like in the following example:Set-ClientAccessServer CAS2010SERVER -AutoDiscoverServiceInternalUri https://cas2013server.domain.local/Autodiscover/Autodiscover.xmlGreetings dn\"\n},{\n  \"title\": \"Troubleshooting Sharepoint Error Messages\",\n  \"url\": \"/post/troubleshooting-sharepoint-error-messages/\",\n  \"date\": \"August 11, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"When you get a Sharepoint error message, they are sometimes not very helpful and it can be tricky to figure out what’s going wrong.At this point the Sharepoint EventLog can help you getting more details. With the Powershell commandlet get-splogevent you can search the corresponding exception message. The correlation ID is the key.If I’m searching the corresponding exception message from the error shown on the printscreen above, I execute following command:get-splogevent | where-object {$_.Correlation -eq &quot;88ab369c-71dd-108f-df09-ea6c74999562&quot;} | flGreetings    dn\"\n},{\n  \"title\": \"Lync: Music on Hold / Wartemusik\",\n  \"url\": \"/post/lync-music-on-hold-wartemusik/\",\n  \"date\": \"August 10, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Nach einiger Zeit mal wieder ein Artikel in deutscher Sprache :)Heute wollen wir uns die Music On Hold Thematik in einer Lync Enterprise Voice Umgebung anschauen. In diesem Artikel betrachten wir nur den Lync Client, MoH Konfiguration für IP Phones und Gateways werden in einem eigenen Artikel beschrieben.Was ist Music on Hold?Das kennt eigentlich jeder, trotzdem zur Erklärung: Teilnehmer A spricht mit Teilnehmer B, B möchte A weiterleiten und ruft C an. Bevor B ein neues Gespräch aufbauen kann, muss das aktuelle Gespräch gehalten werden. Damit A sich gut aufgehoben fühlt bekommt er Musik oder einen Text (“Sie werden mit dem gewünschten Teilnehmer verbunden…”) vorgespielt.Wer spielt die Musik?Jetzt wird das Thema interessant: Woher kommt die Musik? In der klassischen Telefonie wird für gewöhnlich ein “Medienserver” dafür verwendet, dieser hängt zentral an der TK Anlage und stellt Music on Hold für alle Gegenstellen zur Verfügung.In einer End-to-End Infrastruktur wie Lync ist das nicht mehr so einfach, der Medien Datenstrom (Sprache) zwischen Teilnehmer A und B ist direkt, auch für die Signalisierung sind die User Agenten zuständig. Will also Teilnehmer B das aktuelle Gespräch halten, muss er dies Teilnehmer A irgendwie mitteilen und diesem dann, wenn gewünscht, Musik vorspielen.In einer Lync Umgebung ist also der Lync Client von Teilnehmer B für die Musik zuständig.Welche Musik?In den Einstellungen des Lync Clients kann eine Audio Datei, die als Music on Hold gespielt wird, ausgewählt werden.  Möchte man sich für diese Aufgabe nicht auf seine Benutzer verlassen, kann man dies in einer CsClientPolicy vorgeben.New-CsClientPolicy &quot;MusicOnHold&quot; -EnableClientMusicOnHold:$true –MusicOnHoldAudioFile:&quot;C:\\\\Program Files (x86)\\\\Microsoft Office\\\\Office15\\\\MEDIA\\\\DefaultHold.wma&quot;&lt;/p&gt;    Grant-CsClientPolicy –Identity “Username” –PolicyName “MusicOnHold”&lt;/code&gt;  Diesen Pfad bekommt der Lync Client per in-band provisioning mit, das sieht im Log so aus:     Achtung: Das setzen von EnableClientMusicOnHold:$true alleine ist nich ausreichend, der Benutzer muss hier nach wie vor die Datei selbst auswählen.  Dateipfad  Der aufmerksame Leser hat das Problem in der obigen Konfiguration sicher bereits gesehen, der Dateipfad für die Musik liegt im Installationsverzeichnis des Lync Clients. Dies unterscheidet sich allerdings von Lync 2010 zu Lync 2013 sowie bei 32 und 64 Bit Installationen.  Standardpfad Lync 2013: &quot;C:\\\\Program Files (x86)\\\\Microsoft Office\\\\Office15\\\\MEDIA\\\\DefaultHold.wma&quot;   Standardpfad Lync 2010: &quot;C:\\\\Program Files (x86)\\\\Microsoft Lync\\\\MEDIA\\\\DefaultHold.wma&quot;  Dies kann problematisch werden, wenn Benutzer sich an mehreren Geräten mit unterschiedlichen OS oder Lync Client Versionen anmelden. In diesem Fall empfiehlt es sich einen “allgemein gültigen“ Pfad in die CsClientPolicy zu schreiben. Dies kann wiederum problematisch werden wenn Benutzer sich von Unternehmensfremden Endpunkten anmelden, diese finden dann am personalisierten Pfad keine Datei, oder können nicht auf eine Freigabe zugreifen… Die aktuell Verfügbaren Konfigurationsmöglichkeiten erlauben es nicht wirklich alle Szenarien abzudecken.  Ausnahme: Response Group Service  Natürlich gibt es eine Ausnahme in der die Musik vom Lync Server kommt, ruft Teilnehmer A eine RGS Nummer an, kommt die Wartemusik vom Lync Server, allerdings nur bis zu dem Zeitpunkt an dem ein Agent das Gespräch entgegen nimmt. Jetzt liegt die Verantwortung beim Lync Client des Agenten, wird das Gespräch vom Agenten gehalten, kommt die Musik vom Client desselben.  Hintergrund: Auf folgender Seite habe ich die SIP Kommunikation zwischen Teilnehmer A und B aus diesem Artikel genauer beschrieben. SIP: Anruf halten     Schönes Wochenende!     Tom\"\n},{\n  \"title\": \"SIP: Anruf halten\",\n  \"url\": \"/post/sip-anruf-halten/\",\n  \"date\": \"August 9, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"An dieser Stelle möchte ich einen Blick auf die SIP Kommunikation in einem Anruf halten Szenario werfen. Die Informationen aus der SIP Kommunikation die ich im folgenden zeige sind auf das absolute Minimum beschränkt, ein wirkliches SIP Paket enthält viel mehr Informationen. Im folgenden Beispiel ruft Teilnehmer A (+49151xxxxxxxx) Teilnehmer B (+39047xxxxx) an, Teilnehmer B nimmt das Gespräch an. Anschließend hält Teilnehmer B das Gespräch. Die Frage die sich stellt ist natürlich wie signalisiert ein Teilnehmer (B) dem anderen (A) dass er das Gespräch halten möchte?INVITE / OKBevor ein Gespräch gehalten werden kann, muss dieses aufgebaut werden. Dazu sendet Teilnehmer A eine INVITE Anfrage an Teilnehmer B. Der Header beschreibt die SIP Sitzung, im Body wird mit SDP die Medien Sitzung beschrieben. Die interessanten Felder fasse ich hier zusammen:Invite Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37     CSeq: 24467 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Invite Body:      c=IN IP4 192.168.1.100     m=audio 54720 RTP/AVP 0 8 115 13 118 97 101Der Lync Client des angerufenen Teilnehmers (B) muss die empfangene Anfrage beantworten und macht dies mit einem 200 OK. In diesem schickt er SDP Informationen mit, welche die RTP Sitzung aus seiner Sicht beschreiben:Ok Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 24467 INVITEOk Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101re-INVITE / OKUm eine existierende SIP Sitzung (Dialog) zu ändern, schickt Teilnehmer B ein INVITE bei dem die Werte für Call-ID sowie From und To Tag identisch mit denen aus der bestehenden Sitzung sind. Man spricht in diesem Fall von einem re-Invite. Das Ziel dieses erneuten Invites ist es die RTP Sitzung zu ändern, also schickt der User Agent des Teilnehmer B neue SDP Informationen an Teilnehmer A, diese enthalten die Beschreibung der RTP Sitzung aus sicht von Teilnhemer B.re-Invite Header:     From: &quot;&quot; &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     To: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 1 INVITEre-Invite Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101     a=sendonlyAuch diese Anfrage muss der Lync Client beantworten, in diesem Fall erhält Teilnehmer A die Invite Nachricht, Teilnehmer B möchte das Gespräch halten.Ok Header:      From: &quot;&quot;&lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;tag=4f75d0c634;epid=ea6d933f37     To: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     CSeq: 1 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Ok Body:      c=IN IP4 192.168.1.100     m=audio 6190 RTP/AVP 8 13 101     a=recvonly\"\n},{\n  \"title\": \"Invoke-SEFAUtil – a PowerShell wrapper function\",\n  \"url\": \"/post/invoke-sefautil-a-powershell-wrapper-function/\",\n  \"date\": \"August 7, 2013\",\n  \"category\": \"PowerShell\",\n  \"tags\": [\"en\",\"Lync\",\"PowerShell\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"I had to use SEFAUtil to get some tasks done the other day. As I prefer using PowerShell over just another command line tool, I decided to come up with a quick wrapper function that is intended to make my life a little easier.If you don’t know what SEFAUtil is and how to configure it, check out this great post or this one if you prefer German ;) In a nutshell, it’s a command line tool to configure Skype for Business (Lync) Voice Features (like call forwarding, team call) on behalf of end-users.Warning: I do not recommend using this in production without understanding what it does, although I did test it in my lab, it may break something!Ok, having that said, how do I use thins thing? First of all you will need a copy of this script on the computer where you have been running SEFAUtil until now. As the computer is authenticated using a certificate (it must be configured as a trusted application), you will not be able to run this from anywhere. Once you’ve downloaded the script, start a Skype for Business Management Shell and use like in the following examples:EXAMPLE 1.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\"OU=users,OU=tomt,DC=tomt,DC=local\\\" | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThe complete online help can be found hereWhat I did in this script, is basically wrap PowerShell around SEFAUtil.exe, I did add some parameter validation, it can only run against Lync users for example. It does write a logfile to the $temp directory and supports PowerShells common parameters like Verbose and WhatIf.Download &amp; Source for Invoke-SEFAUtil – a PowerShell wrapper functionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell      Note: The script requires the Lync Module to be available on the Computer where it will be run, it does also require PowerShell version 3.  Note: Changing the CallAnswerTime only does not work, a limitation of the SEFAUtil.exe does not allow this setting to be changed without also configuring CallForwardingso long,Tom\"\n},{\n  \"title\": \"Your Windows phone does not support this server version…\",\n  \"url\": \"/post/your-windows-phone-does-not-support-this-server-version/\",\n  \"date\": \"August 5, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"This is just a a quick post about an interesting issue I&rsquo;ve seen today, interesting it was, at least to me. I was at a customer&rsquo;s site publishing Exchange 2010 using a Sophos &ldquo;Unified Threat Management&rdquo; box. Well, we all have to live in a post TMG world, don&rsquo;t we?After installing the certificate on the box we configured the &ldquo;virtual web servers&rdquo; and the corresponding &ldquo;real web servers&rdquo;. Outlook Web App worked straight away so we went ahead and tried to connect a Windows Phone 8 using ActiveSync.That didn&rsquo;t go so well, the Phone would not connect and instead give a strange error message saying:Error 85002028: Your Windows phone does not support this server version.Ok, that&rsquo;s where the interesting begins. I quickly fired up Remote Connectivity Analyzer which provided a much clearer error description along with a link to this KB article.It turned out that we had not installed the intermediate CA certificate on the Sophos box. As the Winodws Phone requires the Reverse Proxy to send the whole chain down for verification, this simply didn&rsquo;t work. Here comes a quote from the above KB article.Windows Mobile-based devices do not generally contain intermediate CA certificates in their certificate store. Internet Information Services (IIS) sends the whole certificate chain to the device. However, IIS does this only if it can verify the whole chain. By default, the device does not contain these certificates. Therefore, the server must send them. The device must contain only the root certificate in its certificate store.Makes sense, finally.until next time, tom\"\n},{\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 5\",\n  \"url\": \"/post/migrating-from-exchange-2010-to-2013-part-5/\",\n  \"date\": \"July 14, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Welcome to the last post in this series, we did migrate all mailboxes in part 4, the only thing that is still missing is public folder. So let&rsquo;s go ahead and migrate legacy public folders over to modern public folders.Modern Public Folders, huh?Public folders have been around for quite a while now, and for some time they have been written off, even by Microsoft. Exchange 2007 RTM&rsquo;d without management features, 2010 came along with no real improvements to replication and high availability.Everything changed, Exchange 2013 introduces the shiny, new &ldquo;Modern Public Folders&rdquo;. This shows that the Exchange Team is actually listening to customers, this, and the availability of public folders in Exchange Online (Exchange Team Blog) tells us that modern public folders are here to stay. So what&rsquo;s changed?No more public folder databases, modern public folders are stored in the mailbox database, within special public folder mailboxes. This gives the administrator more flexibility (think DAG) and reduces a lot of the additional complexity that came with managing PF replication. Other nice side effects are that clients do not need to connect to the mailbox servers anymore, CAS is now able to handle ALL incoming connections.The hierarchy is stored within a root public folder mailbox but every public folder mailbox has a read-only copy, so all clients get quick access to it. The root mailbox can be shown using the following cmdlet:Get-OrganizationConfig | select RootPublicFolderMailboxMigrationOnce you are ready to migrate public folder to Exchange 2013, head over to Microsoft&rsquo;s Download Center and download the Public Folder Migration Scripts. I downloaded these scripts to the Exchange 2010 server, as they will be run there. The first script to run is Export-PublicFolderStatistics.ps1, it takes to parameters as input, the first one is a filename the second one is your Exchange 2010 mailbox server..\\\\Export-PublicFolderStatistics.ps1 sizemap.csv EX14.tomt.localThis script creates a file called sizemap.csv in the current directory, this file contains public folder statistics gathered from the server EX14.tomt.local. It&rsquo;s actually a simple list of public folder names and their respective sizes in bytes.The second script, PublicFolderToMailboxMapGenerator.ps1 reads the output file generated by the first one, and takes two additional parameters. The first parameter is the maximum mailbox size in bytes, then comes the sizemap.csv generated by the first script, the last parameter specifies a new file, which will contain a public folder to mailbox mapping based on the maximum mailbox size parameter..\\\\PublicFolderToMailboxMapGenerator.ps1 1073741824 sizemap.csv mailboxes.csvThis example specifies a 1GB mailbox limit, it reads the sizemap.csv from the previous script, and creates a new mailbox to home public folders every time the mailbox size will reach 1GB.As my little lab does not have a huge public folder structure, everything will be placed into the first mailbox. Note that I changed the name of the first &ldquo;TargetMailbox&rdquo; as the default was something like &ldquo;Mailbox1&rdquo;.So now that we have created the mailboxes.csv file, we need to copy it over to the Exchange 2013 mailbox server. In the next step we are going to import the mailboxes.csv file and create the target public folder mailboxes with a little bit of PowerShell:Import-Csv .\\\\mailboxes.csv | select -expand TargetMailbox | foreach {New-Mailbox -Name $_ -PublicFolder -HoldForMigration:$True -IsExcludedFromServingHierarchy:$true}The two parameters HoldForMigration and IsExcludedFromServingHierarchy are used to prevent users from accessing the public folder mailbox for now. To verify that the mailboxes have actually been created use the following cmdlet:Get-Mailbox &ndash;PublicFolderOk, so now that we have created the target mailboxes we can go ahead and start moving data. Again, we will need the mailboxes.csv file, as the New-PublicFolderMigrationRequest cmdlet takes it as input:New-PublicFolderMigrationRequest -SourceDatabase (Get-PublicFolderDatabase -Server ex14.tomt.local) -CSVData (Get-Content .\\\\mailboxes.csv -Encoding Byte)In this example I am getting public folder database information from the server EX14.tomt.local and then reading the content of mailboxes.csv, which has to be in the current location. As the name implies, a new Public Folder Migration Request is generated, it copies data at about two to three GB per hour. The request is created with the PreventCompletion parameter set to $true, that means, once the data has been copied, the request will be AutoSuspended.Users should not have noticed anything about this public folder migration until now, they continue working on the 2010 public folder as usual. Before we can complete the public folder migration request, though, we will need to block user access to the legacy public folders. We will need some time to synchronize the already moved data with latest changes during this window of downtime.So once you&rsquo;ve informed your users, we are going to prevent access to legacy public folders, remember that because of HoldForMigration:$true, we are also preventing access to the modern public folders!Set-OrganizationConfig -PublicFoldersLockedForMigration:$trueThis setting prevents users to access public folders, be sure to allow some time for it to replicate if you have more than one public folder database. Now that no one is able to make changes to the legacy public folders, we can go ahead and set the PreventCompletion flag to $false, and then resume the public folder migration request to finally move all data.Set-PublicFolderMigrationRequest -Identity \\\\PublicFolderMigration -PreventCompletion:$false Resume-PublicFolderMigrationRequest -Identity \\\\PublicFolderMigrationOnce this is done, it is recommended to test access to modern public folders with a few users, before allowing everybody to make changes again. This is the last point in time where you do have a way back without data loss!To test access to the modern public folders, we use the following cmdlet:Set-Mailbox &ndash;Identity user1 &ndash;DefaultPublicFolderMailbox PFMailbox001This overrides the IsExcludedFromServingHierarchy and allows the user user1 to access public folders on the new Exchange 2013 server. Outlook Connection Status will show something like this:If everything is fine, we can finally remove the IsExcludedFromServingHierarchy flag and set the PublicFolderMigrationComplete property to $true.Get-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy:$false Set-OrganizationConfig -PublicFolderMigrationComplete:$trueOk, one last thing: You may have noticed that the Proxy Server in the screenshot above shows the external server name for the connection to Exchange Public Folders. This is due to a bug in Outlook, before a fix becomes available, make sure internal clients can access the external hostname by creating a split DNS record. There is a KB article available, here.Nice, that completes this series on migrating Exchange 2010 to Exchange 2013. Thanks for following along :)&nbsp;so long, see you next time!tom\"\n},{\n  \"title\": \"Web Application Proxy in Windows 2012 R2 preview\",\n  \"url\": \"/post/web-application-proxy-in-windows-2012-r2-preview/\",\n  \"date\": \"June 29, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"The preview of the next version of Windows Server 2012 has been released very recently. Let&rsquo;s have a quick look at some of the features.The taskbar properties feature a new &ldquo;Navigation&rdquo; pane, we can configure stuff like &ldquo;Boot to Desktop&rdquo;, yay :)Web Application Proxy and ADFSAnother desperately needed feature is the new Web Application Proxy server role, many people (including me) think this is going to be the replacement for TMG. So, very keen to play with the new toy I went ahead and added the server role, found underneath &ldquo;Remote Access&rdquo;.&nbsp;Adding &ldquo;Web Application Proxy&rdquo; as a role service.Like in Windows 2012 the server manager kindly reminds me to configure the newly added role:Just in case you want to run this wizard again but can&rsquo;t find it anymore, it can be started from the Remote Access Management Console.The first step in the Wizard asks for a federation service name, now until this moment I didn&rsquo;t really bother researching anything about this new server role. Not the smartest move&hellip; As documentation is still pretty thin for Windows Server 2012 R2 I decided to simply set up an ADFS server in my lab and try to connect the Web Application Proxy to that federation service.Active Directory Federation ServicesThe first step is to add the Active Directory Federation Services server role to an machine in the domain.Again, the Server Manager reminds me to configure the new role, the first thing I do is supplying credentials which are used to perform the configuration:In the next step I select a certificate for the federation service and set a name for it. Obviously I do have to create a DNS record that resolves the federation service name to the IP address of the server that&rsquo;s actually hosting it.Now I have to select a service account for the federation service, note that the federation service name must be added as Service Principal Name to the account. This can be done using &ldquo;setspn &ndash;F &ndash;S host/adfs.tomt.local adfssvc&rdquo;In the last step I select the database to use for the federation service, as I am using only one server I&rsquo;ll give the Windows Internal Database a go.Ok, no we do have a federation service running, so we can go ahead and configure the Web Application Proxy.Web Application ProxyOk, picking up where we left for a quick excursion to ADFS, we are now back on the Web Application Proxy machine and specify the newly created federation service name.&nbsp;&nbsp;A certificate is required on the proxy, too. So after requesting a certificate from my internal CA, I can go ahead and select it here. Make sure that the certificate&rsquo;s subject alternative names include the federation service name!Ok, the last step shows the PowerShell code that get&rsquo;s executed and if everything works out, you&rsquo;ll see a message that the Proxy was configured successfully.A few caveats: Make sure DNS resolution is ok, the proxy must be able to resolve the federation service, and the ADFS server must me able to resolve the proxy. The certificate on both servers must include the federation service name.Publishing a serviceAfter having configured ADFS and the Web Application Proxy, which also acts as ADFS Proxy, we can finally proceed and publish a server. This is done using the Remote Access Management Console.I hit publish in the tasks pane and in the wizard that comes up, I am asked to select if I want to use pre-authentication or simply pass-trough the requests. After all that pain with installing and configuring ADFS I do definitely want to use pre-authentication :)Ok, so I have to select the ADFS relying party, whatever that is:After that I am prompted to enter a name for the publishing rule, an external and internal URL as well as a certificate.Again, we get to see the actual PowerShell code just before the publishing rule is created. Niiice, we have just successfully configured our first \\\"post TMG&rdquo; publishing rule.TestingNow to make sure that this is really working, let&rsquo;s fire up a client and browse to the published URL, owa.tomt.it in my case. Browsing to a published web site that requires pre-authentication, redirects the client to the AD FS Proxy service.After successfully authenticating against the Web Application Proxy the client gets redirected back to it&rsquo;s intended destination web site.Note: Make sure the client actually behaves like an external client, it must resolve the federation service name to the Web Application Proxy for this to work!Port mappingAnother application that I do publish using TMG frequently is Lync, sure enough I have to map the external web services port from 443 to 4443. This can be done using Web Application Proxy, too. For Lync we don&rsquo;t use pre-authentication:The internal URL contains the port to use:Awesome, that gives us a new possibility to publish web services, obviously we are not yet able to use it in production and time will tell if it get&rsquo;s a few additional features in RTM, all in all, for no additional cost, I think it is already a nice tool to use.Wish list,or: What would be nice to have in the RTM Version of Windows Server 2012 R2:Publish multiple servers for a particular external URL (think load balancing) Health checking of internal servers Maybe some additional authentication possibilities That&rsquo;s it for today, so long tom\"\n},{\n  \"title\": \"Lync and Exchange 2013 OWA integration\",\n  \"url\": \"/post/lync-and-exchange-2013-owa-integration/\",\n  \"date\": \"June 16, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"I configured Lync 2013 to work with Exchange 2013 these days, as it took me a while to get the &lsquo;Online Meeting request&rsquo; up and running, I thought I&rsquo;d post a quick post here.CertificatesThe first thing to consider when thinking about integration between Exchange 2013 and Lync is certificates. The servers use OAuth and TLS connections and we need the certificate common names to match the names that the servers use to access the resource. In my simple environment I do have the CN ly14.ntsystems.local on my Lync server&rsquo;s certificate, the Exchange server&rsquo;s certificate has a CN of ex14.ntsystems.local.Exchange 2013 - Enterprise Partner ApplicationThe first thing we configure, if it&rsquo;s not already set up, is Exchange Autodiscover service. What we actually care about is the internal URI used:Get-ClientAccessServer | fl AutoDiscoverServiceInternalUriIf it looks good, we go ahead and use the following script shipped with Exchange to set up an Enterprise Partner Application.&amp; $exInstall\\\\Scripts\\\\Configure-EnterprisePartnerApplication.ps1 &ndash;AuthMetaDataUrl https://ly15.ntsystems.local/metadata/json/1 -ApplicationType LyncThe &ldquo;&amp;&rdquo; sign tells PowerShell to start the script located at the Scripts folder in the Exchange 2013 installation directory. With the AuthMetaDataUrl we specify the Lync 2013 Pool&rsquo;s Auth Metadata document, this includes public key information for the Partner Application.Lync 2013 - Trusted Application PoolSo next up we have to configure Lync to trust the Exchange Server 2013.New-CsTrustedApplicationPool -Identity ex15.ntsystems.local -Registrar ly15.network.local -Site Bolzano -RequiresReplication $FalseNew-CsTrustedApplication -ApplicationId OutlookWebApp -TrustedApplicationPoolFqdn ex15.ntsystems.local -Port 5199&lt;/p&gt;New-CsPartnerApplication -Identity Exchange -ApplicationTrustLevel Full -MetadataUrl https://autodiscover.ntsystems.local/autodiscover/metadata/json/1Set-CsOAuthConfiguration &ndash;Realm ntsystems.localEnable-CsTopology&lt;/code&gt;Ok, so first we create a new Trusted Application Pool withing Lync, the Identity of the application pool is the Exchange 2013 server, the registrar is the Lync standard edition server. Then we create a Trusted Application and assign it to the trusted application pool configured before. The third thing we configure is a Partner Application and set the OAuth configuration, we need those last steps for the Online Meeting request in OWA, make sure that you actually use the Autodiscover URL, this didn&rsquo;t work if I used the server name instead.Ok, once the configuration is done, publish the topology.Exchange 2013 - Enable Instant MessagingBack on the Exchange side of things we need to configure the OwaVirtualDirectory to enable Instant Messaging.Get-OwaVirtualDirectory | Set-OwaVirtualDirectory &ndash;InstantMessagingEnabled $True -InstantMessagingType OCSNow comes the nasty part, we have to update OWA&rsquo;s web.config file to include the Exchange Servers certificate thumbprint. So first, we use the following cmdlet to get the certificate&rsquo;s thumbprint:Get-ExchangeCertificateCopy the thumbprint of the certificate that is assigned to the IIS service and fire up notepad to open the web.config file of the Owa virtual directory, located here:C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\ClientAccess\\\\OWA\\\\web.configNo we need to Include the following Lines underneath the &lt;AppSettings&gt; node:&lt;add key=\\\"IMCertificateThumbprint\\\" value=\\\"Exchange Cert Thumbprint\\\"/&gt; &lt;add key=\\\"IMServerName\\\" value=\\\"ly15.tomt.local\\\"/&gt;So, after updating that web.config file, there is one step left, we need to actually allow users to use instant messaging in OWA. This is controlled in the Owa mailbox policy, to keep it simple I&rsquo;ll just update the default policy which will enable IM for everybody.&nbsp;Set-OwaMailboxPolicy -Identity \\\"Default\\\" -InstantMessagingEnabled $True -InstantMessagingType \\\"OCS\\\"Wow, now that all configuration is done, I like to do a quick iisreset to make sure all the configuration changes are picked up, obviously this should not be done on production machines&hellip;If users sign in to webmail, they will be able to sign into Lync, set their state and participate in IM chats.And, as a nice little addon, we can now also create Online Meeting requests from OWA:Note, Exchange 2013 CU1 is required for Online Meeting requests and Lyncdiscover has to be set up, too.&nbsp;Enjoy,tom\"\n},{\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 4\",\n  \"url\": \"/post/migrating-from-exchange-2010-to-2013-part-4/\",\n  \"date\": \"June 9, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Hello everybody, after thinking about installation, client access and mail routing, we are getting ready to move some mailboxes.So, we talked about Exchange 2013 CAS being a pretty smart proxy, that&rsquo;s why we had to append ?ExchClientVer=15 to the ECP URL in order to get to the new Admin Center while the Mailbox was still on Exchange 2010. Obviously, once the mailbox gets moved to Exchange 2013 this is no longer required. Another thing that will change as we move mailboxes from Exchange 2010 to 2013 is the Outlook Profile, it does no longer show the RPCClientAccess endpoint as Server, instead it gets updated to show the &lt;Mailbox GIUD&gt;@&lt;Primary SMTP domain&gt;.Moving mailboxes&nbsp;There are a couple of things to take into consideration before moving mailboxes to the 2013 server. As we learned in part two of this series, it is essential to move the namespaces used by Exchange to the new CAS prior to moving mailboxes, users would not be able to access mailboxes if the names would still point to an Exchange 2010 CAS. Another important check is whether new mailbox servers have been provisioned with enough disk space to accommodate the moved users, and if the properties of the mailbox database, such as ProhibitSendReceiveQuota and OfflineAddressBook have been set to desired values. Assuming that everything is fine, we go ahead and create some move requests, very much the same way as we did in Exchange 2010.New-MoveRequest &ndash;Identity user3@tomt.it &ndash;TargetDatabase mbd01This command moves the mailbox of user3 to the target mailbox database mdb01 which is hosted on Exchange 2013. Like in 2010, the move is performed online, so the user is able to work in his mailbox until the move request is finished. Once the move request completes, the user will be prompted to restart Outlook, this is when the Profile gets updated to show the GUID instead of the server name or RPCClientAccessServer property.Note that this is the users mailbox GUID, as that is the user&rsquo;s unique identifier within the Exchange Organization, it will be different for every user. This GUID is used to locate the active mailbox database copy, in Exchange 2013 all protocols are provided to the user by the server that is hosting the active mailbox database copy.Batch movesIn Exchange 2010 we had the ability to do batch move requests, but it was more like creating many move requests and assigning the same BatchName to them, Get-MoveRequest was used to retrieve information about the move requests. Now Exchange 2013 comes with some new cmdlets that are dealing with batch migrations: *-MigrationBach.Honestly I do think those new cmdlets are a little complicated, I guess they were primarily introduced to make hybrid or cloud move requests easier, in an on-premises world they might not be that useful. I created a New-MigrationBatch and then started the migration. The first thing we need is a CSV file with a column called EmailAddress, so let&rsquo;s get all users homed on the Exchange 2010 server, and export them to CSV:Get-Mailbox -Server ex14 | select @{n=\\\"EmailAddress\\\";e={$_.PrimarySmtpAddress}} | Export-Csv -NoTypeInformation -Path .\\\\BatchMove.csvNow we can use this CSV file to create a new MigrationBatch, you see what I mean with a little complicated&hellip;New-MigrationBatch -Local -Name BatchMove -CSVData ([System.IO.File]::ReadAllBytes(\\\".\\\\BatchMove.csv\\\")) -TargetDatabases mdb01It&rsquo;s looking like that in PowerShell:Ok, once we have created the MigrationBatch, we can go ahead and start the migration to actually move data over to the new Exchange.Get-MigrationBatch | Start-MigrationBatchThe Get-MigrationStatistics cmdlet can be used to get information about the ongoing migrations, once all mailboxes are moved, TotalCount and SyncedCount should show the same value. Get-MigrationUser can be used to get information about the individual mailboxes being moved. The Get-MigrationBatch cmdlet includes a Report property containing links to CSV reports about the MigrationBatch.Note that the Start-MigrationBatch does not complete the move requests, use the Get-MoveRequest cmdlet to show the individual move requests and their state, it will be AutoSuspended. The Complete-MigrationBatch cmdlet is used to complete the move requests:Get-MigrationBatch | Complete-MigrationBatchIf we run the Get-MoveRequest cmdlet again, we will finally see that mailboxes have been moved to Exchange 2013.Since there is not much documentation available, yet, I will stick with the &ldquo;old&rdquo; way and just use New-MoveRequest to move mailboxes for now.&nbsp;&nbsp;&nbsp;Outlook ProfileOk so now that we have migrated our users over to the new Exchange it&rsquo;s time to have a look at Outlook, as mentioned above, the profiles will be updated and no longer show a server name, but it will also be using RPC over HTTP on the internal network:The proxy settings of the Outlook profile is updated, too, it will now select &ldquo;On fast networks, connect using HTTP first&hellip;&rdquo; by default.The AutoDiscover.xml file now contains more information for clients, while Exchange 2010 had the following three Type nodes &lt;EXCH&gt;,&lt;EXPR&gt; and &lt;WEB&gt; the new AutoDiscover.xml contains two &lt;EXHTTP&gt; nodes for internal and external OutlookAnywhere settings.It is very important to update Outlook to the minimum required version by Exchange 2013 before moving mailboxes, as older Outlook versions will not be able to interpret the new xml file.Well, and that&rsquo;s it for part four. We do have one big thing left for part five, public folders.&nbsp;Stay tuned,tom\"\n},{\n  \"title\": \"Exchange 2013, Open Public Folder on Exchange 2010\",\n  \"url\": \"/post/exchange-2013-open-public-folder-on-exchange-2010/\",\n  \"date\": \"June 4, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"You may notice that with the Exchange 2013 defualt settings on Outlook Anywhere you are unable to open public folders located on you &ldquo;old&rdquo; Exchange 2010 server. You get an authentication pop up and the following error:Microsoft has released a KB (http://support.microsoft.com/kb/2834139/en-us) article how to get that work.Simply change your Outlook Anywhere settings to use internal and external NTLM with requirement of SSL:Get-OutlookAnywhere &ndash;server ex01 | Set-OutlookAnywhere -ExternalClientAuthenticationMethod NTLM -InternalClientAuthenticationMethod NTLM -ExternalClientsRequireSsl $true -InternalClientsRequireSsl $trueThe next time the client gets the Autodiscover File, it sets the Logon Network Security Settings of the Outlook Profile from &ldquo;Anonymous Authentication&rdquo; to &ldquo;Negotiate Authentication&rdquo; and you can open the public folders located on Exchange 2010.Greetings dn\"\n},{\n  \"title\": \"Configure Exchange 2013 CAS Array with WNLB and enable Kerberos support for OA\",\n  \"url\": \"/post/configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa/\",\n  \"date\": \"June 1, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Like Tom described in his Post Migrating from Exchange 2010 to 2013 &ndash; part 2 the major changes in the Exchange 2013 CAS role, I explain in this post how to configure high available CAS Array with WNLB.First you have to install WLNB on both CAS nodes and create the Cluster and VIP. The CAS Servers need only one NIC, we use the Multicast operation mode.Next we create the Port Rules. In this example I create a port rule for the whole port range. Because there is not need of Affinity we can safely disable the the feature:Now create the Host A Record for the Cluster name excararray01 to point to the VIP.Remember to change the internal URL&rsquo;s of the virtual directories of both CAS servers to use the Cluster name and not the CAS computername.Kerberos supportI have 2 UAG servers that are publishing the Exchange 2013 CAS servers. On the UAG servers I don&rsquo;t want to publish both CAS servers and use the UAG load balancing. I want to publish the CAS Cluster Name and let the WNLB do the load balancing. If you don&rsquo;t configure an alternate service account for the CAS Cluster Name you will no be able to use NTLM authentication for Outlook Anywhere.To use Kerberos authentication you have to create a computer account in AD (the name don&rsquo;t have to match the array FQDN):Then run the following script that is located in C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\Scripts to configure the Alternative Service Account.\\\\RollAlternateServiceAccountPassword.ps1 -ToArrayMembers excasarray01.domain.local -GenerateNewPasswordFor \\\"domain\\\\EXCASARRAY01ASA$\\\" &ndash;Verboseexcasarray01.domain.local stands for the FQDN of the CAS array domain\\\\EXCASARRAY01ASA$ stands for the created computer accountAfter the script has finished configuring we have to register some spn&rsquo;s with the CAS Array FQDNsetspn -s exchangeMDB/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s exchangeRFR/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s exchangeAB/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$Now we can publish the CAS Array FQDN with uag and use NTLM as authentication method for Outlook Anywhere.Greetings dn\"\n},{\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 3\",\n  \"url\": \"/post/migrating-from-exchange-2010-to-2013-part-3/\",\n  \"date\": \"May 26, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Hello again and welcome back to the third part of our journey to Exchange 2013. In the previous two posts (part 1, part 2) we covered preparing and installing Exchange 2013, as well as some news with the Client Access Server role and some design considerations. Now in this part we will try to cover some key aspects of transport in the new Exchange.Hub Transport RoleAs you already know, there is no Hub Transport server role in Exchange 2013, the transport pipeline has been split into three services, one of which is running on the CAS, the other two on the MBX role.Front End Transport serviceThis service is running on the CAS role, like all other CAS services, it is nothing more than a stateless (but smart) proxy for inbound and outbound SMTP connections. Neither message queuing, nor message filtering happens here. The front end transport service talks to the transport service on the MBX server role.Transport serviceThis service runs on the Mailbox server role, like the hub transport role in Exchange 2010, this service performs message queuing, inspection, categorization and so on. Very much NOT like in Exchange 2010, though, this service never talks to a mailbox database. This service routes messages between the front end transport service, the transport service and the mailbox transport service.Mailbox Transport serviceThis service runs on the Mailbox server role, too. It receives messages via SMTP from the transport service and connects via RPC to the mailbox database to deliver the message. It also connects to mailbox databases via RPC to retrieve messages and forward them to the transport service, again using SMTP.This shows one thing very clearly, through the use of SMTP, Exchange 2013 is able to break the close relationship between server roles that existed in previous versions. The front end transport role in CAS does no longer use RPC, an thus, could be running a different software version than the mailbox server, communication between mailbox servers, specifically between the mailbox transport service and the transport service, also uses SMTP and has no requirement to be on the same software version.I used Wireshark to capture an incoming mail proxied through the CAS:The Client (10.1.1.10) connects to the CAS (10.1.1.21) using TCP 25, all SMTP messages are exchanged between those two nodes. Note, that the CAS does only send the &ldquo;250 Queued Mail for delivery&rdquo; after connecting to the transport service on the Mailbox Server (10.1.1.25), since the Front End Transport service does not queue mails locally, this &ldquo;smart proxy&rdquo; functionality ensures that the message gets stored in the mailbox servers queue, before sending an OK to the client. The connection between CAS and MBX uses TCP 2525 and is encrypted using TLS, this is why Wireshark is not able to encode it as SMTP.There is whole section on Transport on TechNet: http://technet.microsoft.com/en-us/library/aa996349.aspxMigration Send and Receive connectorsNow that we know (a little bit) how transport works in Exchange 2013, we can start to include Exchange 2013 servers to the send connectors and configure the appropriate receive connectors.To add Exchange 2013 servers as sources to the existing send connectors, use the Exchange Admin Center and navigate to &ldquo;mail flow, send connectors&rdquo;. Then select the send connector to edit and add the new source server under &ldquo;scoping&rdquo;We could also use PowerShell to add additional SourceTransportServers to the connector, be aware though, that the existing servers have to be included in the command.Set-SendConnector &ndash;Id ToInternet &ndash;SourceTransportServers ex14,ex15Another interesting flag sits under the &ldquo;general&rdquo; node of the send connector&rsquo;s properties: Proxy though client access server&rdquo;So what&rsquo;s that all about? If this flag is checked, outbound mails are not sent directly by the mailbox server&rsquo;s transport role, but are proxied through a Client Access Server. This could be interesting if only a subset of Exchange Servers (CAS) were allowed to connect to the internet via SMTP. With multi role servers, which are recommended for many environments, this flag will have no effect.Ok, so now we have got our outbound mail flow configured, what about incoming mails? Receive connectors are per-server settings, so we have to check the configuration of existing connectors and configure the new server accordingly.Get-ReceiveConnector &ndash;Server ex14 | ft Identity,Enabled,Bindings,RemoteIpRangesThis command shows all receive connectors on the 2010 server, along with the Ports used and the remote IP addresses that are allowed to use this connector. Obviously, if there are custom AD permissions or authentication methods defined, those have to be configured on the new server, too.Nice, now we have got client access and transport covered, the next post will finally include moving some mailboxes to the new Exchange server.&nbsp;so long, tom\"\n},{\n  \"title\": \"Exchange 2013 clean install but many MSExchange Common 106 errors\",\n  \"url\": \"/post/exchange-2013-clean-install-but-many-msexchange-common-106-errors/\",\n  \"date\": \"May 23, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Update: 09.06.2013 Updated the PowerShell script and some additional information about event logs. /tomToday I installed 4 Exchange 2013 servers. All of them have many &ldquo;MSExchange Common&rdquo; 106 errors in the Application Log indicating&nbsp;that Performance Counters could not be updated:Performance counter updating error. Counter name is LDAP Queries Issued by Expanded Groups., category name is Expanded Groups Cache. Optional code: 3. Exception: The exception thrown is : System.InvalidOperationException: The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnlyThe problem is that the performance counters are not registered correctly. I wrote a simple script to re-register all the Exchange 2013&nbsp;performance counters. Now the Application log looks much better First open Powershell in Admin Mode, then execute the following code:Note that New-PerfCounters actually deletes and re-creates the performance counter, there is no need to use Remove-PerfCounters first. The script might throw some errors if performance counters cannot be created or files are invalid, other than that no information is displayed, no news is good news, I guess ;) For more information check the Application Log of the server, two events are logged for every performance counter. Event ID 1001 indicates that the counter has been removed, while Event ID 1000 is logged as soon as the counter has been loaded again.If an antivirus software is running on the server, it could be disabled temporarily to improve performance.Special thanks to @msxfaq&nbsp;:)&nbsp;Greetings nd\"\n},{\n  \"title\": \"How to build an UAG 2010 Array for Exchange publishing–Part 1\",\n  \"url\": \"/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-1/\",\n  \"date\": \"May 22, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"author\": \"dni\",\n  \"content\": \"As TMG is not &ldquo;available&rdquo; anymore, I decided to use UAG 2010 with SP3 for the Exchange / Lync 2013 publishing. UAG SP3 supports Exchange 2013 and Lync 2013. In Part 1 of the Post I&rsquo;m going to explain how to build the UAG 2010 Array.First we have to prepare 2 Windows Server 2008 R2 Server each of them with 2 NIC&rsquo;s and at least 4GB RAM. The NIC&rsquo;s should be configured in this way:INTERNALDefault Gatewayshould not be definedDNS Serversshould be definedRegister this connection&rsquo;s address in DNSEnabledFile and Printer Sharing for Microsoft NetworksEnabledClient for Microsoft NetworksEnabledNetBIOS over TCP/IPEnabledLMHOSTS lookupEnabled&nbsp;EXTERNAL&nbsp;&nbsp;Default Gatewayshould be definedDNS Serversshould not be definedRegister this connection&rsquo;s address in DNSDisabledFile and Printer Sharing for Microsoft NetworksDisabledClient for Microsoft NetworksDisabledNetBIOS over TCP/IPDisabledLMHOSTS lookupDisabledThe order should modified that NIC INTERNAL becomes the first NIC used:The Next steps are to install NLB (without configuring it) and UAG on both nodes. Install UAG in the following order:UAG 2010 SP1 Update 1If Update 1 fails, download and install it manuallyUAG 2010 SP1 Updat 1TMG 2010 SP2UAG 2010 SP2UAG 2010 SP3When UAG is fully installed, we have to configure it. Lets start on the node that becomes the Array Manager.Open UAG and select the Network SettingsThen we have to define the Topology: Select the node as Array Member and specify credentialsBefore you join the 2nd node as the array member, open the TMG console and add the 2nd server to the &ldquo;Managed Server Computers&rdquo; group. Install the Policy.Open the UAG console on the 2nd server and join him to the arrayTIP: If the UAG services on the 2nd node don&rsquo;t start, copy the content of folder C:\\\\Program Files\\\\Microsoft Forefront Unified Access Gateway\\\\von\\\\Conf from the manager to the member server. Then start the services.Now we have to configure the NLB from the UAG console. Open Network Load Balancing from the Admin menu and add the first VIP IP:Next you have to save and activate the configuration. UAG is now building the NLB cluster with both nodes. You can check the activity with the UAG Activation Monitor:Finally we have to open the WebMonitor and navigate to the Array Monitor section. There we have to start the NLB nodes:After you have started the nodes, the NLB status changes to &ldquo;Converged&rdquo;INFO: When you open the NLB manager, you will get RPC errors. The reason is that DCOM does not work with TMG/UAG. But don&rsquo;t worry, the cluster is OK if the Web Monitor doesn&rsquo;t show errors.In Part 2 I will explain how to publish Exchange 2013 OWA / OA and ActiveSync.Greetings dn\"\n},{\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 2\",\n  \"url\": \"/post/migrating-from-exchange-2010-to-2013-part-2/\",\n  \"date\": \"May 20, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Updated: 08.06.2013: The original post had some errors regarding RPC over TCP and the RPCClientAccessServer namespace. You would never want to move this namespace&#160; to CAS 2013 as the new CAS does not understand RPC over TCP.Welcome back, this is the second part of my series on migration to Exchange 2013. I covered prerequisites, installation and a little bit of management in the first post, now we’ll have a look at namespaces and certificates.Namespaces in Exchange 2013After installing Exchange, it’s time to start getting into the planning phase :) Ok, just kidding, I’ll use the newly installed Exchange server to walk through some planning steps, though.First of all, let’s make some assumptions. We do have an Exchange 2010 server and a CAS array with the RpcClientAccessServer endpoint configured to outlook.tomt.local. For OWA, EWS, OAB, EAS and Outlook Anywhere there is only one namespace, mail.tomt.it. Outlook Anywhere is configured with NTLM authentication, more on that later. Internal Outlook clients would connect (via MAPI) to outlook.tomt.local, external clients would use Outlook Anywhere (HTTPS) and connect to mail.tomt.it. The certificate on Exchange 2010 has a Subject of CN=ex14.tomt.local and the following SANs: ex14.tomt.local, mail.tomt.it. Ok, so far so good. Now when migrating to Exchange 2013, it is recommended that the new server takes over the namespace and deals with all incoming client connections. For incoming connections with a mailbox homed on Exchange 2013, our new CAS would simply proxy the request to the mailbox server hosting the mailbox. For mailboxes hosted on Exchange 2010, though, the 2013 CAS would act as HTTP proxy and connect the client with the Outlook Anywhere endpoint (/rpc) of the Exchange 2010 CAS. So what does that mean? First of all, this does not apply for internal, RPC over HTTP clients, the RPCClientAccessServer namespace is not moved to CAS 2013. If you are in the unfortunate situation to have the RPCClientAccessServer namespace match your OutlookAnywhere namespace, there is a very good post over at the Exchange Team Blog.For RPC over HTTP connections, OutlookAnywhere must be enabled on the Exchange 2010 CAS before Exchange 2013 CAS can take over the namespace, and the IIS Authentication methods must include the NTLM. The Exchange 2013 CAS is authenticated by Exchange 2010, this does not work with basic authentication. To make sure Outlook Anywhere is configured, and the IIS Authentication method includes NTLM use the following cmdlet on Exchange 2010.Get-OutlookAnywhere –Server ex14 | fl ExternalHostname, ClientAuthenticationMethod, IISAuthenticationMethodsTo add NTLM as an IIS Authentication method, use the following cmdlet. Note that the ClientAuthenticationMethod does not matter in this case.Set-OutlookAnywhere –Identity ex14\\\\rpc* –IISAuthenticationMethods Basic,NTLMNice, now Exchange 2010 CAS is ready and we can start thinking about the certificate request for Exchange 2013. We want the new CAS to take over the namespace, so we do already know which name to include: mail.tomt.it, but is that enough? Well, the answer is, it depends ;)Protocol specific namesExchange 2013 introduces some radical changes, including how client connections are handled. In 2010, client affinity was everything. Clients would always need to be redirected to the same CAS for a specific session, if that CAS would become unresponsive or if the client would connect to another CAS, re-authentication would occur. When talking about load-balancing, an expensive Layer 7 capable load-balancer was required. The load-balancer would intercept the traffic and make sure client A would always reach server A for a particular session. This had one clear advantage, though, because the load-balancer was L7 aware (knows which endpoint the client asked for), it could check if a particular endpoint was reachable on a CAS, and if not redirect the client to a CAS where it was reachable. This is not the case in 2013 anymore, client to CAS sessions are stateless and a less-expensive Layer 4 load-balancer (or DNS round-robin) could be used with 2013. A L4 load-balancer, on the other hand, would have no idea of what endpoint the client was looking for, it would only see and forward encrypted (https) packets. Protocol specific namespaces are here to solve that problem. If we created a virtual IP and a distinct name for each endpoint on the CAS (OWA, EWS, EAS…) the L4 load-balancer would be aware of what endpoint the client was looking for.So, long story short, we are going to include more names in that certificate. The subject is CN=ex15.tomt.local and the SANs are: ex15.tomt.local, oa.tomt.local, mail.tomt.it, owa.tomt.it, eas.tomt.it, ews.tomt.it, oab.tomt.it. In the DNS configuration we need a CName for all of these names pointing to our new CAS, or an A record pointing to the load-balancers virtual IP. Next, we’ll use the Exchange Management Shell to update the ExternalUrl properties of the virtual directories.Set-OwaVirtualDirectory –Identity ‘ex15\\\\owa (Default Web site)’ –ExternalURL https://owa.tomt.it/owa      Set-EcpVirtualDirectory –Identity ‘ex15\\\\ecp (Default Web site)’ –ExternalURL https://owa.tomt.it/ecp       Set-OabVirtualDirectory –Identity ‘ex15\\\\oab (Default Web site)’ –ExternalURL https://oab.tomt.it/oab       Set-WebServicesVirtualDirectory –Identity ‘ex15\\\\ews (Default Web site)’ –ExternalURL https://ews.tomt.it/ews/exchange.asmx       Set-ActiveSyncVirtualDirectory –Identity ‘ex15\\\\microsoft-server-activesync (Default Web site)’ –ExternalURL https://eas.tomt.it/Microsoft-Server-ActiveSyncAnd last, but not least we configure Outlook Anywhere on the new Exchange 2013 CAS.Set-OutlookAnywhere –Identity ‘ex15\\\\rpc (Default Web site)’ –InternalHostname oa.tomt.local –InternalClientAuthenticationMethod NTLM –InternalClientsRequireSsl:$true –ExternalHostname mail.tomt.it –ExternalClientAuthenticationMethod NTLM –ExternalClientsRequireSsl:$true –IISAuthenticationMethods Basic, NTLM, NegotiateNow that Outlook Anywhere command was pretty long, let’s break it into smaller pieces. First we are setting the InternalHostname, as Exchange 2013 uses Outlook Anywhere for all client connectivity (internal and external) we don’t use the RpcClientAccessServer anymore. Along with that we set the authentication method for internal clients as well as the requirement for SSL. Next we set that same pieces of information for external clients, and the last property is configuring the supported authentication methods by IIS.Wow, now we should finally be able to take over that namespace with our brand new Exchange 2013 CAS. I updated the DNS records for mail.tomt.it to point to the new CAS and created a new CName oa.tomt.local for the internal OutlookAnywhere used in Exchange 2013. Nothing really changes for Outlook when it connects to an Exchange 2010 mailbox from inside the network, it will still use the RPCClientAccessServer endpoint to connect to the mailbox using RPC over TCP.If the mailbox is on Exchange 2013, though, Outlook will use RPC over HTTP and connect to the internal OutlookAnywhere endpoint: From a OWA point of view, all users do log on using the new CAS now:Exchange 2010 mailboxes get proxied to the Exchange 2010 CAS for OWA. After this text heavy post we have a nice little overview of CAS in Exchange 2013, I wanted to cover mail routing in this post, given the length I reckon it be better to save that for the next one.I hope this has been informative for you as the reader, at least it was extremely so for me :)so long,    tom\"\n},{\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 1\",\n  \"url\": \"/post/migrating-from-exchange-2010-to-2013-part-1/\",\n  \"date\": \"May 17, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"This is my first post about migrating from an existing Exchange 2010 environment to Exchange 2013. I&rsquo;ll try do cover everything that seems important to me, if I miss something that you think should be covered&hellip; well, that&rsquo;s what comments are for :)Preparing for Exchange 2013All servers in the Exchange 2010 organization must be running service pack 3, if you haven&rsquo;t already installed SP3, as always it&rsquo;s a very good idea to start with reading the release notes. On the Exchange 2013 side of things, we need Cumulative Update 1, there is a very good post at the Exchange Team Blog about that.Ok, so assuming we are running Exchange 2010 SP3 and have downloaded CU1, let&rsquo;s get started with preparing the first Exchange 2013 server. All the required Windows Features can be installed with the InstallWindowsComponent.ps1 script located in the Setup\\\\ServerRoles\\\\Common directory of the CU1 install files. The script takes several parameters, in this case I&rsquo;ll be installing a multirole server, I want the AdminTools to be installed as well as the Remote Server Admin Tools for Active Directory..\\\\InstallWindowsComponent.ps1 AdminTools, MailBox, ClientAccess -ADToolsNeeded:$TrueNote that the script has no parameter for source files, the server needs internet access to download the required files. That&rsquo;s not always practical, so I edited the script and simply added &ldquo;&ndash;Source wim:d:\\\\sources\\\\install.wim:4&rdquo; to the Add-WindowsFeature cmdlet within the script.After the required reboot, we need to install Unified Communications Managed API 4.0 Runtimethe Office Filter Pack is not mandatory and can be installed later on, it still produces a warning during setup, though.Now that we have the new, designated Exchange 2013 server ready, we need to prepare Active Directory. Obviously, if you don&rsquo;t know what all this is about, don&rsquo;t do it! So, that said, from an elevated command prompt change to the directory containing the Exchange 2013 installation files. You&rsquo;ll need Schema, Enterprise and Domain Admin rights to run the following tasks.In the first step, setup will extend the schema, this is done using:.\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareSchemaThe next step is to prepare the Active Directory Forest, this creates the Microsoft Exchange container (if it doesn&rsquo;t already exist) and universal groups used by Exchange..\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareAD /OrganizationName tomtAnd the last step is to prepare the Domain, this needs to be done for every Domain that will contain Exchange servers or Mail-Enabled users, alternatively use /PrepareAllDomains:.\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareDomainEach step relies on Active Directory to replicate changes throughout the topology, you should absolutely wait for the changes of each step to be replicated before continuing with the next step. In a distributed environment such a change needs to be properly planned and would typically take place during a maintenance window.&nbsp;Installing Exchange 2013With all prerequisites checked, we can now continue with the installation of our first Exchange 2013 server. Easy as it is, I&rsquo;m not going to walk through graphical setup screens, you basically just select the server roles to be installed and click next. There is a command line version of the setup, too. Try setup.exe /help:Install for a list of parameters that can be used to customize the installation. The Exchange setup is pretty smart, meaning that it keeps track of the installation and if errors occur, you will be able to continue right from where the error happened, no need to click through all the windows again. It also provides a lot of information in the ExchangeSetupsLogs folder, located at the root of the drive on which Exchange is installed.Something new with setup is that you cannot remove server roles anymore, the only way to do that would be to completely uninstall Exchange and re-install the role of choice.So, installing Exchange 2013 was pretty easy, let&rsquo;s move on the the more interesting stuff.Managing Exchange 2013The first thing I wanted to see after the setup completed, was the shiny new Exchange Admin Center, so I went straight to IE and typed https://localhost/ecp, I entered my credentials on the neat, new login screen only to see the good, old Exchange Control Panel from 2010. It took some time, but then I realized that that was exactly correct behavior. The Exchange 2013 Client Access Role is a stateless proxy and no longer responsible for rendering OWA (or anything for that matter) and my mailbox was still on Exchange 2010, so my request got proxied to 2010. There are two solutions for this, move your admin mailbox to 2013, or less troublesome, simply add ?ExchClientVer=15 to the URL. https://localhost/ecp?ExchClientVer=15 takes you right to the Admin Center. This is also the only way (I found) to access the Admin Center with a user that has no mailbox.From an Exchange Management Shell point of view, everything is very similar to the way we are used from Exchange 2010, a new remoting session can simply be created using:$Session = New-PsSession &ndash;ConnectionURI &lsquo;http://ex15.tomt.local/PowerShell&rsquo; &ndash;ConfigurationName 'Microsoft.Exchange&rsquo; Import-PsSession $SessionThat&rsquo;s it for the first part, in the second part I&rsquo;ll try to cover the basics of namespace planning, mail routing and maybe move some mailboxes.I see some real world projects coming closer and I know Daniel is working hard on the topic, I&rsquo;m sure there is more content coming&hellip; :)so long, enjoy your weekend!tom\"\n},{\n  \"title\": \"What’s happening these days…\",\n  \"url\": \"/post/whats-happening-these-days/\",\n  \"date\": \"May 15, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"It has been quiet around here for some time, so what have I been up to?Well, on one side, I’m having fun at the Scripting Games (http://scriptinggames.org/) where I learn quite a bit (more from reviewing other entries, than from my own coding) and try to to improve my PowerShell skills. I’ll point out some of the things I’ve learned later on.On the other side, I’ve decided to quit my job in the heart of the Italian Alps and accepted a role in Germany, in the nice city of Paderborn. So the last few weeks have been pretty busy for me, moving my stuff from northern Italy way up to northern (at least for me) Germany. Right now I am trying to get used to my new surroundings and I do learn something every day :)So, what are my key takeaways from the Scripting Games so far?   Standard cmdlet parameter names: While I did know that there was a list of allowed Verbs (Get-Verb), I wasn’t aware that there was something similar for parameter names and types, too. Check out MSDN for more information.    Help and comments should be nested under the function, so if you are used to just press “Ctrl+J” to insert a new “empty” function and start from there, remember to move the help inside the function { } block.    ConvertTo-HTML has some really neat parameters like –Head, –PreContent and –PostContent so you can enhance and customize the HTML report generated by the cmdlet.    I started to use splatting to set parameter values and think this is really useful, basically you assign common values for parameters to a hash table and pass it to the cmdlet. I’ll post quick example later.    Filter, I tend to get every possible bit of information and then use Where-Object to select the few properties I really need, that’s not really efficient as most cmdlets provide a way to filter or just ask for the properties you need. And here comes the example for splatting:if ($Credential) {     &#160;&#160;&#160; $wmiParam = @{'Credential'=$Credential; 'ErrorAction'=&quot;Stop&quot;}      } else {      &#160;&#160;&#160; $wmiParam = @{'ErrorAction'=&quot;Stop&quot;}      }       Get-WmiObject @wmiParam –ComputerName “myComputer” –Class “Win32_Processor”This passes a hash table (wmiParam) to the Get-WmiObject cmdlet, so I don’t have to set the ErrorAction every time and the Credential parameter is only used when a $Credential object exists.&#160;Yeah, and that’s what’s new with me :)tom\"\n},{\n  \"title\": \"Joining WiFi before login on Mac OS X 10.8\",\n  \"url\": \"/post/joining-wifi-before-login-on-mac-os-x-108/\",\n  \"date\": \"April 19, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Network\"],\n  \"author\": \"tto\",\n  \"content\": \"We had an interesting problem at work recently, as the solution was a little complex I decided to write about it here. So, as the title suggests, we are talking Wireless networking, authentication and Mac OS X today. It’ll be fun, trust me :)Some prerequisites: We use EAP-TLS as the authentication protocol for WiFi and SCEP for certificate enrollment. I’ve written about SCEP before, in a different context, though. We also use the iPhone Configuration Utility to deploy configurations to devices, more on that later. The ProblemWe join our MACs to the Active Directory domain and want our users to be able to login using their domain credentials. Obviously you need some sort of connectivity to the AD in order to login, we used to configure Wireless Networks as “System Profile” in OS X in the past. Unfortunately, that GUI went away in more recent versions of that operating system.This is a screenshot of 10.5, simple enough. As we tried to configure that same thing on 10.8, though, we realized that this little option was gone. All Wi-Fi networks would be started AFTER the used login, no AD login was possible. Oops.After scratching our heads for a while, we found a workaround other than installing Windows ;)The SolutioniPhone Configuration Utility was used ever since we had the requirement to connect iOS devices to the wireless network, it can be used to create configuration files that can be deployed to iOS devices. It has been possible for some time to deploy these same configuration files to OS X, too. As they are simple XML files, we took a deeper look into them. Wwith some help from Google we found that we could change the Wi-Fi payload to be a “System Profile” instead of a “User Profile”, and thus be started BEFORE user login.So, first thing is to create a configuration profile using iPhone Configuration Utility. Choose a name, identifier and description for the profile. Add the certification authorities certificate, so we trust certificates issued by our internal CA.  Configure SCEP, the iPhone or MAC is going to connect to the SCEP URL to enroll a certificate using the specified subject. Add the Wi-Fi payload, specifying the SSID and authentication protocol. As we use EAP-TLS we use the SCEP certificate to authenticate.Once the profiles is configured, export it: We get a .mobileconfig file from the export, it can be edited using a simple text editor. Here comes the fun part, we have to add the following lines to the configuration file:&lt;key&gt;SetupModes&lt;/key&gt;      &lt;array&gt;       &lt;string&gt;System&lt;/string&gt;       &lt;/array&gt;       &lt;key&gt;PayloadScope&lt;/key&gt;       &lt;string&gt;System&lt;/string&gt;This part goes just underneath the PayloadOrganization in the AutoJoin section.And we have to change “Configuration” at the very end of the file from:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;Configuration&lt;/string&gt;to “SystemConfiguration”:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;SystemConfiguration&lt;/string&gt;As it is quite important where you change/add the lines, I’ll paste a complete file for reference.&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      &lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;       &lt;plist version=&quot;1.0&quot;&gt;       &lt;dict&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AutoJoin&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPClientConfiguration&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AcceptEAPTypes&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;13&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPACAnonymously&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTUsePAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateAnchorUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EncryptionType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WPA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;HIDDEN_NETWORK&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures wireless connectivity settings.&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WiFi (MYSSID)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.wifi1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SetupModes&lt;/key&gt;        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadScope&lt;/key&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.wifi.managed&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;2CD56B1A-068C-4F3C-AC43-9D4E2115260F&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServer&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;proxy.ntsystems.it&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServerPort&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;8080&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Manual&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SSID_STR&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;MYSSID&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateFileName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MIIDYzCCAkugAwIBAgIQL1CM7d+PQrhAgO7UcdHbyDANBgkqhkiG&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bnBODc20wZMRDAhWuA==       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Provides device authentication (certificate or identity).&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.credential2&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.root&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Challenge&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;4F20EACEDE479165&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Type&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;RSA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Usage&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;0&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Keysize&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;2048&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Name&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Retries&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;3&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;RetryDelay&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;10&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Subject&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;CN&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;macbookair$&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;URL&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;https://scep.tomt.it/certsrv/mscep/mscep.dll&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures SCEP&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;SCEP (tomt-DC01-CA)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.scep3&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.scep&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt-wlan&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadRemovalDisallowed&lt;/key&gt;       &#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160; &#160; &lt;string&gt;SystemConfiguration&lt;/string&gt;        &#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;B58A2BCB-7617-421B-B0C8-12DE22B5A2B1&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &lt;/dict&gt;       &lt;/plist&gt;Now, if we copy that file to the MAC OS X machine, we can import the wireless configuration and it will be a system profile. Phew.(In this case we need some sort of connectivity in order to enroll for a certificate over SCEP, this could be via LAN or an open guest Wi-Fi)SummaryIt might be though to get your head around this if EAP-TLS and SCEP are new, yet the same idea holds through for a Username/Password or even pre-shared key authentication protocol. The problem remains the same, Wi-Fi user profiles are started after the user logs on, rendering Active Directory logins impossible. We couldn’t find a solution to change that behavior without the iPhone Configuration Utility.Would be happy to hear about others experiences with this stuff.Special thanks to my mate @eduriz :)&#160;tom\"\n},{\n  \"title\": \"Patching Office Web Apps Server\",\n  \"url\": \"/post/patching-office-web-apps-server/\",\n  \"date\": \"March 28, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Today I started my day with an Office Web Apps Farm that was not working anymore. After reviewing the Event Log I figured something strange happened… :)The Event Log was basically full with .Net Runtime and Application Errors, I’ll paste some for reference:Log Name: ApplicationSource: .NET RuntimeEvent ID: 1026Application: ppteditingbackendwatchdog.exeFramework Version: v4.0.30319Description: The process was terminated due to an unhandled exception.Exception Info: System.TypeInitializationExceptionStack:&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.ServiceInstanceFinder.GetLocalAgentInstance(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.PrepareRegistrations(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.WatchMachines(Microsoft.Office.Web.Common.OfficeServiceType, CheckServiceInstance, Microsoft.Office.Web.Common.OfficeServiceType, System.String)&amp;#160;&amp;#160; at Microsoft.Office.Server.Powerpoint.Watchdog.EditingBackend.Program.Main(System.String[])...Log Name: ApplicationSource: Application ErrorEvent ID: 1000Faulting application name: ppteditingbackendwatchdog.exe, version: 15.0.4481.1000, time stamp: 0x50ee5a9eFaulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988aa6Exception code: 0xe0434352Fault offset: 0x000000000003811cFaulting process id: 0x94cFaulting application start time: 0x01ce2b83409e789aFaulting application path: C:\\\\Program Files\\\\Microsoft Office Web Apps\\\\PowerPointEditingServicesWatchdog_App\\\\ppteditingbackendwatchdog.exeFaulting module path: C:\\\\Windows\\\\system32\\\\KERNELBASE.dllReport Id: 7e88e5ec-9776-11e2-93f3-0050569e79e3Faulting package full name:Faulting package-relative application ID: There would be the same errors for all of the Web Apps (Excel, Word…) Needless to say, neither SharePoint 2013 nor Lync 2013 would be able to leverage features that required Web Apps Server. So, what’s next?Well I continued digging through the Event Log and realized that the Server was patched and restarted very recently, as part of the patching someone applied KB2760445. Sweet.So I started searching TechNet for information on that Update for Office Web Apps and found a nice article on how to Apply software updates to Office Web Apps Server. Basically it goes like this: After patching the Server, you will have to re-create the Office Web Apps Farm. In my case, I simply removed the farm usingRemove-OfficeWebAppsMachineand then re-used the same cmdlet I used to create the Web Apps Farm initially.New-OfficeWebAppsFarm -InternalUrl \\\"https://myOWAserver.tomt.local\\\" -ExternalUrl \\\"https://office.ntsystems.it\\\" –CertificateName \\\"ntSystems OfficeWebApps\\\" –EditingEnabledAll set.If there is one take-away from this, it is very likely: Read that documentation, oh, and please, do test!Tom\"\n},{\n  \"title\": \"Prepare Windows Server 2012 for Lync 2013\",\n  \"url\": \"/post/prepare-windows-server-2012-for-lync-2013/\",\n  \"date\": \"March 18, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"Skype4B\"],\n  \"author\": \"dni\",\n  \"content\": \"To prepare a Windows Server 2012 for a Lync 2013 installation, install the following features manually before you run the Lync setup:.Net Framework 3.5Windows Identity Foundation 3.5   Media Foundation    HTTP Activation    Use the Powershell to speed up the installation:Install-WindowsFeature –name NET-Framework-Core –source D:\\\\sources\\\\sxs (the Windows 2012 Disk is mounted on D: )Install-WindowsFeature –name Windows-Identity-Foundation,Server-Media-Foundation,NET-HTTP-ActivationIf you have to prepare the AD schema, install also the AD DS Administration Tools.\"\n},{\n  \"title\": \"Installing Lync 2013 Updates\",\n  \"url\": \"/post/installing-lync-2013-updates/\",\n  \"date\": \"March 18, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"Server\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"A few days ago, Microsoft released a bunch of updates for Lync 2013. I will walk through the required steps to upgrade a Lync 2013 Standard Edition server in this post. The February updates for Lync 2013 enable some new features including Lync 2013 mobile Clients, Group Call pick-up and many more…Get Files and read documentationHead over to the download center and download the update files: http://www.microsoft.com/en-us/download/details.aspx?id=36820Make sure you read the corresponding KB article as there are some manual steps required after the update: http://support.microsoft.com/kb/2809243InstallPrior to installing the updates stop the Lync Services, you can use the –Graceful parameter:Stop-CsWindowsService –GracefulYou can use Get-CsPoolUpgradeReadinessState to check if the pool you are going to update is ready.Copy all the files from the download to a local folder on the Lync Server, open LyncServerUpdateInstaller.exe and install the updates by clicking “Install Updates”&#160;After installing the updates, check the folder with the update files for logs. If everything installed correctly, reboot the server.Update DatabasesAfter the reboot, the databases need to be updated, too. On a standard edition front end server, the databases are installed locally, so you can update them using the following cmdlets:Install-CsDatabase -ConfiguredDatabases -SqlServerFqdn lyncfe.ntsystems.local –VerboseThe Central Management Store needs an update too, it is also co-located on the standard edition server:Install-CsDatabase -CentralManagementDatabase -SqlServerFqdn lyncfe.ntsystems.local -SqlInstanceName rtc –VerboseAfter that, the newly published topology needs to be enabled, this can be done using the Enable-CsTopology cmdlet.Enable-CsTopologyNow the last step is to run the Bootstrapper on the updated front end servers, it can be found on the Lync Server in the following path:&quot;%ProgramFiles%\\\\Microsoft Lync Server 2013\\\\Deployment\\\\Bootstrapper.exe&quot;That should be it and the Lync 2013 February updates have been installed.so long,   tom\"\n},{\n  \"title\": \"ActiveSync, ForeFront TMG and AccountLockoutThreshold\",\n  \"url\": \"/post/activesync-forefront-tmg-and-accountlockoutthreshold/\",\n  \"date\": \"February 25, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Server\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"The use of smartphones and other mobile email clients has been increasing for quite some time. With ActiveSync being one of the widest-used protocols comes the need to manage another set of devices. As users are forced to change their domain account&rsquo;s passwords from time to time, some might forget to update their smartphones as well.The ProblemSo, as a user changes their password, the mobile device will continuously try to sync with a wrong set of credentials. Now depending on the rate at which it tries to sync, this might very well lock-out the users AD account, depending on the Domains Password Policy.Another possibility to consider is an attacker who could create quite a disturbance by locking out accounts intentionally, using any published Web Site with Forms Base Authentication.The SolutionForefront TMG 2010 SP2 comes with a new feature, called AccountLockoutThreshold. Forefront TMG keeps track of failed logons and locks the account locally, after a specified amount of failures. After that, any other attempt to authenticate via TMG is not forwarded to Active Directory/LDAP, so that the users account does not get locked-out continuously .The AccountLockoutThreshold feature is local to the Forefront TMG server, so if there is an array of publishing servers, it has to be configured on each of them. It can only be configured for Web Listeners using Forms Based Authentication.To configure AccountLockoutThreshold we need to use PowerShell, there is no GUI that exposes this setting. A great script to control the settings is available in the Script Center. So, we copy the script and save it to a *.ps1 file on the Desktop of the TMG Server, then we use dot-sourcing to load it into an administrative PowerShell session.Example: I saved the script to AccountLockout.ps1 on the Desktop. Use &ldquo;. .\\\\Desktop\\\\AccountLockout.ps1&rdquo; to import the script.The Get-AccountLockoutSetting cmdlet is used to retrieve the current settings.&nbsp;The Set-AccountLockoutSetting cmdlet is used to configure the feature.Example: I use &ldquo;Set-AccountLockoutSetting -WebListener OWA -EnableAccountLockout $true -AccountLockoutThreshold 5 -AccountLockoutResetTime 300&rdquo; to enable the AccountLockout feature, accounts will get locked out for 300 seconds if there are 5 consecutive failed attempts.Once configured, the following event will be logged to the Application Log of the TMG server if an account gets locked out locally:Source: Microsoft Forefront TMG Web Proxy Event ID: 32581 Level: Error Text: limit for consecutive logon failures has been reached. Additional logon attempts by domain.local\\\\user.name will be automatically rejected for the next 300 secondsUnfortunately TMG has been discontinued and is no longer available for customers, but for anyone already using it, this should help you dealing with Account Lockout Policies and ActiveSync devices.&nbsp;so long, tom\"\n},{\n  \"title\": \"Lync 2013 (Client) and LyncDiscoverInternal\",\n  \"url\": \"/post/lync-2013-(client)-and-lyncdiscoverinternal/\",\n  \"date\": \"February 9, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"Client\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"Daniel and I have been quite busy implementing Lync 2013 these days. One interesting gotcha thing we knew, but didn’t give a lot attention about the Lync 2013 client is, that it makes use of the LyncDiscover and LyncDiscoverInternal DNS records. These records were introduced with Lync 2010 Mobility and were used by the mobile clients to locate a sign-in server. Lync 2010 Clients don’t look for them, they use _sipinternaltls._tcp and _sip._tls records for auto sign-in.With the Lync 2013 Client that changed. The new client now queries for the following DNS records in order to sign-in automatically:   LyncDiscoverInternal.ntsystems.it    LyncDiscover.ntsystems.it    _sipinternaltls._tcp.ntsystems.it    _sip._tls.ntsystems.it    sipinternal.ntsystems.it    sip.ntsystems.it    sipexternal.ntsystems.it  So, as you can see, even before trying to locate the SRV records, the 2013 Client tries to connect to the AutoDiscover Web Service. That works just fine, in most situations.But… in a configuration like the following you might run into this bug get a certificate warning when signing into Lync for the first time from the internal network.   You have a disparate namespace (like ntsystems.local for your Lync Servers while ntsystems.it is your SIP domain) AND    You use internal certificates on the Front End Servers AND    You have Split DNS configured (ntsystems.it on the internal DNS servers) AND    You set LyncDiscoverInternal.ntsystems.it DNS record (for public zone on internal DNS server) The certificate warning shows the server name to which Lync is attempting to connect, it also shows the certificate subject and you can view the certificate. You double (triple) check the certificate, subject alternate names, dates, DNS, basically everything and it seems to be just fine. Still, you continue to get the warning.WorkaroundFirst of all, I have to say that I do not fully understand why this happens. The way I see it, is that Lync 2013 connects to the internal Web Service (using LyncDiscoverInternal) and all certificate parameters are fine… As you are probably not going to get a certificate for ntsystems.local from a public CA I wonder what the right solution looks like…The good news: There is a workaround for this, you can use Group Policy to configure Lync 2013 to configure the Trusted Domain List. According to TechNet, this “Lists the trusted domains that do not match the prefix of the customer SIP domain.” – nice. So, I added ntsystems.local to the Trusted Domain List that can be found in User and Computer Configuration under: Administrative Templates/Microsoft Lync 2013/Microsoft Lync Feature PoliciesYou can download the admx/adml files for Office 2013 here. The Group Policy adds the domain to the either “HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync\\\\TrustModelData” or “HKEY_CURRENT_USER\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync\\\\TrustModelData” depending on what you choose in the Group Policy Object. Another workaround would be to simply remove the LyncDiscoverInternal record from the internal DNS zone, which breaks mobile clients (including Lync Windows Store App) on the internal network (Wireless). Not really a solution…Again, I don’t fully understand the problem, this is what I found during my research. If you have a better solution, please drop me a line :)&#160;Happy New Year and have a nice weekend,    tom\"\n},{\n  \"title\": \"Lync 2013 – Installation and Certificates\",\n  \"url\": \"/post/lync-2013-installation-and-certificates/\",\n  \"date\": \"February 2, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"Server-2012\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"This post is the follow-up to the one about AD and topology preparation and I will again use screenshots to walk through the Installation and Certificate request and assignment processes.DNS RecordsThe last post ended with publishing the Topology, after that, the wizard provides a simple To-Do list, summarizing the next steps. Creating the DNS records for our Simple URLs was one of them. So, using DNSmgmt.msc I created CNames for the meet, dialin and lyncadmin URLs, all pointing to the Lync Front End Server.The DNS Records used for automatic sign-in are not mentioned in said To-Do list, though. I created the sip.tomt.local record as just another alias pointing to the Lync FE Server. Automatic Sign-in also needs the following Service Location Record (SRV)_sipinternaltls._tcp.tomt.local SRV service location:     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; port&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 5061      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; svr hostname&#160;&#160; = lyfe01.tomt.localAll in all, I do now have the following DNS Records:            HostName        RecordType        RecordData                  _sipinternaltls._tcp        SRV        [0][0][5061][lyfe01.tomt.local.]                  lyfe01        A        10.1.1.11                  dialin        CNAME        lyfe01.tomt.local.                  meet        CNAME        lyfe01.tomt.local.                  sip        CNAME        lyfe01.tomt.local.                  lyncadmin        CNAME        lyfe01.tomt.local.        Server PrerequisitesThe next step is to install the prerequisites on the Lync Server, for more information check TechNet. I use the following PowerShell cmdlet to install Lync Server prerequisites, make sure you specify a “–Source”.   Add-WindowsFeature NET-Framework-Core, NET-Framework-45-Features, RSAT-ADDS, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Redirect, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Http-Tracing, Web-Windows-Auth, Web-Client-Auth, Web-Basic-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, Web-Mgmt-Console, Web-Scripting-Tools, Web-Request-Monitor, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Mgmt-Compat, Desktop-Experience, Telnet-Client, BITS, Windows-Identity-Foundation –Source ‘D:\\\\sources\\\\sxs’ –Restart&lt;/code&gt;  Now after the reboot open Lync Deployment Wizard again and click &quot;Install or Update Lync Server System&quot;    After installing Local Configuration Store and Lync Server Components, we need to request and assign Certificates for Lync to use.    If you use an online (enterprise) CA, select send request immediately, if you intend to send the request to a public CA, select the offline certificate request option. As I have ADCS installed in my test forest, I use the enterprise CA for this.    Optionally specify credentials and a certificate template, if your current user has permissions to request a certificate using the “WebServer” template, click next. Then specify the friendly name for and the key length for the certificate.    Lync automatically includes the required Alternative Names along with Simple URLs and external pool name. Other details (such as City, Country, Region) typically used in certificate requests can be specified too.    Select the SIP Domains, so that they are included, too. You can optionally add additional SANs, I didn’t need any more than the ones included by the wizard.  Request the Certificate and tick the “Assign this certificate…” checkbox.    If you plan to use Server-to-Server authentication (Office Web Apps, Exchange, SharePoint) also request an OAuth Certificate. The procedure is the same as for the Server certificate.    The OAuth Certificate is a &quot;Global&quot; Certificate, that means that Lync Central Management Store replicates it to all Lync Servers, and all Lync Servers will use the same Certificate for OAuth.  Starting the Services  Phew, now after all those steps, we can finally go ahead and start the services. Give it some time, and check if all services are started using services.msc.  Now, we can use Lync Server Control Panel to check out our work. I prefer to use the Control Panel on my client PC, as it requires Silverlight to be installed. So, on a Computer sporting Silverlight, open the Simple Administration URL specified before.     I will continue to test some features of Lync 2013, stay tuned for more!  &#160;  so long, have a nice weekend!   tom\"\n},{\n  \"title\": \"Lync 2013 – Prepare AD and build Topology\",\n  \"url\": \"/post/lync-2013-prepare-ad-and-build-topology/\",\n  \"date\": \"February 2, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Lync\",\"Server-2012\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"In this post I use the screenshots taken in my test environment to walk through the steps of setting up a Lync 2013 Standard Edition Front End Server in a test environment.Install Deployment ToolsFirst of all we need to install the Lync Deployment Wizard on a server, this doesn’t necessarily have to be the Lync Server, although it’s a good idea to use this server. So, start Setup and select a location for the installation files.&#160;After that installation finishes, we we start the Deployment Wizard and install the administrative tools. Preparing Active DirectoryWarning: This is going to update the AD schema, make sure you are in test environment.From the Lync Server Deployment Wizard click “Prepare Active Directory” and update schema, prepare the forest as well as the current domain. The following cmdlets can be used to check domain/forest readiness.Get-CsAdDomain: If Domain is ready: LC_DOMAINSETTINGS_STATE_READY    Get-CsAdForest: If Forest is ready: LC_FORESTSETTINGS_STATE_READYNow preparing the current domain created some AD groups used by Lync. Add the account used to administer Lync to the CSAdministrator group.Define TopologyAfter preparing Active Directory we are ready to create a new Topology using the Topology Builder. So we start Topology Builder and create a new TopologySpecify a primary SIP domain, additional SIP domains can be specified in the next step.The first thing we need to create is a new Site within our new topology, specify a name and some details for the first Lync SiteStart the New Front End Pool wizard after finishing the New Topology wizard and enter the FQDN of your Lync Standard Edition Server. Specify the Lync Server Features to be installed on this serverAs we add Enterprise Voice and Conferencing we need a Mediation Server, tick the check box to Collocate the Mediation ServerDefine the SQL Store for the front end pool, as we install a Standard Edition Server we cannot change this Select a File Share that has already been added to the Topology builder or create a new one Specify the external URL, this URL will be used by external clientsAssociate an Office Web Apps Server that has already been added to the Topology or add a new one, if you have oneIf you selected the Monitoring on the features page, specify a SQL instance with Reporting Services. This can be installed locally or on a remote SQL server After finishing the new Front End Pool wizard, configure Simple URLs and Associate Central Management Server by right clicking “Lync Server” and selecting Edit Properties in the Topology BuilderCheck the Configured Settings and publish the Topology by selecting Action from the menu and clicking “Publish Topology”Ok, nice work. We have just created and published our Lync 2013 Topology. Time to get the Server ready.In the next post I will walk through the actual installation of the Lync 2013 Standard Edition Front End Server.so long,    tom\"\n},{\n  \"title\": \"Lync 2013 – Voicemail Escape\",\n  \"url\": \"/post/lync-2013-voicemail-escape/\",\n  \"date\": \"January 30, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Lync\",\"Skype4B\"],\n  \"author\": \"tto\",\n  \"content\": \"With the availability of all Office Wave 15 products, Lync 2013 piloting has begun. Exciting times :)So, this is a quick post about a new feature in Lync Server 2013, voicemail escape. What this does is, essentially providing a &ldquo;too soon&rdquo; timer for PSTN calls. Ok, you might say, why do I need such a thing?Well, if an enterprise voice user configures simultaneous ringing on her mobile phone, and that phones battery died or she wandered into an area with no network coverage, her provider&rsquo;s voicemail would answer. Now, even if she was sitting on her desk, she might never get the call, as the caller would always go to her voicemail. Voicemail escape defines a timer using the &ldquo;Set-CsVoicePolicy&rdquo; cmdlet, if a call is answered before that timer elapsed, Lync would ignore that answer and keep the call on premises.Enable the VoicemailEscapeTimer:Set-CsVoicePolicy -EnableVoicemailEscapeTimer:$true -PSTNVoicemailEscapeTimer:5000EnableVoicemailEscapeTimer enabled the timer. PSTNVoicemailEscapeTimer sets the timer (in ms) used to determine whether or not a call has been answered &ldquo;too soon&rdquo;.MonitoringThe Lync Monitoring server shows those ignored answers with a SIP Response Code of 480 and a Reason of: &rsquo;Terminating call as it is answered earlier than the specified voicemail escape timer&rsquo;The Lync Server Logging tool (Component: S4, Level: All) shows the timer in the SIP INVITE packet as:ms-vm-escape-timer: 5000You may have to tune the timer depending on your setup and the providers you are using. I had to set it pretty high to actually see an effect.so long, tom\"\n},{\n  \"title\": \"Windows Server 2012 – Virtualized Domain Controller\",\n  \"url\": \"/post/windows-server-2012-virtualized-domain-controller/\",\n  \"date\": \"January 26, 2013\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"author\": \"tto\",\n  \"content\": \"Hello, welcome and a very happy new year!During Windows Server 8 Beta times, I wrote about virtualizing Domain Controllers and the VM-GenerationID attribute, since the old post was in German and about the beta version, this will be an updated translation.ProblemThe problem in Active Directory versions before 2012 was, that the restore of a snapshot would introduce a condition known as USN-Rollback, breaking replication between Domain Controllers. For that reason, DCs could not leverage all features of a modern, virtualized environment. Cloning a DC was pretty much unthinkable. Until now!VDC Safe RestoreThe Active Directory replication model assigns an ongoing number to every transaction (Update Sequence Number). DCs keep track of these numbers, along with a unique identifier (Invocation ID) for each replication partner. If a DC was rolled back in time (applying a snapshot), that DC would start reusing aged USNs and, therefore, replication partners would refuse the updates and terminate the replication partnership. The only resolution for this problem was to manually remove the DC from the Active Directory.Now, Windows 2012 introduces a feature to tackle that problem. The Hypervisor exposes a VM-Generation ID through the ACPI table, this ID is saved in the Domain Controllers memory. If the VM-Generation ID changes (e.g. when a snapshot is applied), the restored DC knows that something happened and resets it’s invocation ID.&#160;As replication partners have never heard of the new Invocation ID before, they don’t care about USN reuse and replicate like it was a new relationship. Apart from resetting the Invocation ID, the DC also, non-authoritatively restores SYSVOL and logs the following Event to the “Directory Services” Event Log.The new Active Directory attribute used to store the VM-Generation ID is ms-DS-Generation-Id, find more information about that attribute on MDSN.There is no need (and no way) to configure VDC Safe Restore, as long as the Hypervisor supports VM-Generation ID, it automatically works. In a recent blog post VMware announced support for VM-Generation ID for it’s vSphere platform, so now you can choose Hyper-V 2012 and VMware’s ESXi as Hypervisor for your Domain Controllers.A word of caution at the end, never, and I mean NEVER, stop taking regular (AD aware) backups! The feature discussed in this post is meant just to solve the USN-Rollback issue, it is in no way a replacement for a backup as the DC is restored in a non-authoritative way.Stay tuned for DC cloning :)&#160;so long, have a nice weekend!   tom\"\n},{\n  \"title\": \"PowerShell v3 Invoke-WebRequest\",\n  \"url\": \"/post/powershell-v3-invoke-webrequest/\",\n  \"date\": \"December 4, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Today I have a quick function to download the current Sysinternals Suite from http://live.sysinternals.com. I created this mainly to learn/try some concepts of PowerShell, if you have any hints/ideas feel free to drop me a mail.This function leverages the new &lsquo;Invoke-WebRequest&rsquo; cmdlet, available in PowerShell v3, so, obviously V3 is required.Example use:Update-SysinternalsSuite -Path C:\\\\tools\\\\sysinterals &ndash;AsJobThis downloads the Sysinternals Tools to C:\\\\tools\\\\sysinternals. If the specified folder does not exist, the script creates it. It also makes use of background jobs, so you can keep using PowerShell during the download.I&rsquo;ve posted the Function to PoshCode:&nbsp;enjoy, tom\"\n},{\n  \"title\": \"Microsoft NDES and Cisco IOS – part 2\",\n  \"url\": \"/post/microsoft-ndes-and-cisco-ios-part-2/\",\n  \"date\": \"November 30, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\",\"Network\"],\n  \"author\": \"tto\",\n  \"content\": \"This is part two of my article about NDES and Cisco. In the first article, I configured the Windows 2012 NDES role, in this part I will walk you through the enrollment process on a Cisco IOS router.RSA keySo what are we going to do here? We will be leveraging SCEP to obtain a digital certificate from a CA. As a prerequisite to this, the router needs a key-pair, that is, private and public keys. The public key will be sent to the CA (using SCEP), the CA will sign that public key and send the certificate (signed public key) back to the router.If you are already using services like “ssh” or “ip http secure-server” you can use the existing keys. If no keys exist, the router will create a new set of keys as we enroll for a certificate. This auto generated key-pair is only using a 512 bit key, that is not considered secure anymore.To create a new key-pair, using a reasonable secure key length:&#160;TrustpointHaving the keys in place, we need to get the CA certificate. The router will use the CAs public key to authenticate the CA and other digital certificates issued by that same CA.To download the CA certificate we define a new trustpoint and set to enrollment URL to the SCEP URL, if you have no name resolution configured, be sure to use the IP address of the SCEP server instead of the name.The SCEP URL defaults to: http://servername:80/CertSrv/mscep/mscep.dll After configuring the trustpoint, we tell the router to download the CA certificate: ´IOS shows the Thumbprint (fingerprint) of the digital certificate, so one could verify that this is the correct certificate using an out-of-band method.A quick look at the running-config shows that the key was received.EnrollNow that the router does trust our CA we can go ahead and request a digital certificate: IOS prompts for a password that would be used to revoke the certificate, and you can choose to add the IP address or serial number to the certificate. The request gets signed by the CA and the certificate is sent back to the router, you should see the following messages in the log or on “terminal monitor”CRYPTO_PKI:&#160; Certificate Request Fingerprint MD5: 4C9C472F 605AA33F 869EB167 9F097C56    CRYPTO_PKI:&#160; Certificate Request Fingerprint SHA1: E943141D 19A5C4EB 6B5EE5D2 B87AAF57 B829FFED     %PKI-6-CERTRET: Certificate received from Certificate AuthorityThe IIS Log on the SCEP server shows the successful transaction like this:2012-11-30 18:58:19 192.168.1.21 GET /CertSrv/mscep/mscep.dll/pkiclient.exe operation=PKIOperation&amp;message=MIIJUgYJKoZIhvcNAQcCoIIJQzCCCT8CAQExDjAMBggqhkiG…   …2Bw6Q1AJGzQs4wl7jA4GvWvikdP1wnPzAkVP7KZ%2FZ1%2Fz4hCYNpP4%3D%0A 80 - 192.168.1.1 - - 200 0 0 277In the “Certificate Authority” MMC Snap-In you see the certificates that have been issued:  &#160;That was the second, and final part on NDES and IOS routers.so long,tom\"\n},{\n  \"title\": \"Microsoft NDES and Cisco IOS – part 1\",\n  \"url\": \"/post/microsoft-ndes-and-cisco-ios-part-1/\",\n  \"date\": \"November 30, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Network\",\"Cisco\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"With digital certificates being the de-facto standard for authentication, a handy enrollment model is key (pun intended). Microsoft included it’s NDES or Network Device Enrollment Service as a Role in Windows 2008, it has been available as add-on for Windows 2003, too. NDESSo, NDES sounds pretty cool, but what is it, you may wonder. It’s Microsoft’s implementation of SCEP or Simple Certificate Enrollment Protocol, which is a PKI communication protocol that leverages existing PKCS#10 and #7 technology over HTTP. It provides a simple means of requesting and issuing digital certificates across different devices and vendors.&lt;/p&gt;Installing NDES on Windows Server 2012To use SCEP with your existing ADCS based PKI simply add the Role to the Server that provides CA Web Enrollment. I’m not going through the details of setting up a ADCS based PKI here, that might very well be a topic for a future post, though.Add the Role using ServerManager or Windows PowerShell:Install-WindowsFeature –Name ADCS-Device-EnrollmentConfiguring NDESAfter successful installation of the Role, ServerManager informs you that there is some sort of configuration required for the newly added feature.An AD user account is required for the NDES service to use. That account must be member of the local IIS_IUSRS group on the NDES Server. I created a user with the name of scep and added it to the group before starting the configuration wizard.Select the Service Account:Fill in information required for the RA certificate. What happens here, is that the NDES Server is issued two Registration Authority certificates, which are then used for SCEP:Configure cryptographic settings for the RA keys:After reviewing the settings, and clicking Configure you will see the RA certificates in the personal store of the NDES Server: &lt;/p&gt;Configure NDES CA settingsThe certificate template used by NDES defaults to IPSECIntermediateOffline, that can be changed by modifying the following registry keys:HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\\\\MSCEPEncryptionTemplateGeneralPurposeTemplateSignatureTemplateI decide to go with the WebServer template, so I update the registry and restart the certsvc service. Keep in mind, that the service-user account (TOMT\\\\scep, in my lab) needs permissions to enroll for the selected certificate template. This can be configured using the Certificate Templates MMC Snap-In:NDES requires a challenge for every certificate transaction, unfortunately there seems to be no such setting in Cisco’s SCEP implementation. That default can be changed by setting the following registry key to 0:HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\\\\MSCEP\\\\EnforcePassword\\\\EnforcePasswordWarning: This disables the need for a challenge, so that essentially anyone with knowledge of your NDES server can enroll for certificates.Restart the certsvc service after modifying the registry:Get-Service certsvc | Restart-ServiceConfigure NDES IIS settingsIIS request filtering sets the value for MaxQueryString to 2048 by default, a reasonable key length is at least 1024, more often 2048. You see the problem, that value needs to be changed in order to support strong keys.Use appcmd to change the value for MaxQueryString:%systemroot%\\\\system32\\\\inetsrv\\\\appcmd.exe set config /section:system.webServer/security/requestFiltering /requestLimits.maxQueryString:\\\"4096\\\" /commit:apphostIf you don’t update MaxQueryString you will see error 404.14 Query string too long in the IIS log.There is a really good guide to NDES on TechNet Wiki.That’s it for the first part, our NDES on Windows Server 2012 is configured and ready to go. Stay tuned for part 2.— Tom\"\n},{\n  \"title\": \"Get access to a Windows 2012 Server without a password\",\n  \"url\": \"/post/get-access-to-a-windows-2012-server-without-a-password/\",\n  \"date\": \"November 27, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\"],\n  \"author\": \"dni\",\n  \"content\": \"In this article, I will explain how you get access to a Windows Server without a password.When the server boots up you have a nice feature “Easy access” on the logon screen. In the next steps, we change the “Easy Access” function with a cmd command prompt:1. Boot with the Server 2012 CD and select “Repair your computer”2. Select “Troubleshooting” and “Command prompt”       3. Get the drive letter of your System Volume with diskpart4. Rename the utilman.exe file to utilman.old and copy cmd.exe to utilman.exe5. Reboot the server and start the “Easy Access” feature. You will get a command prompt. Now type whoami and you will see that you can run commands under the local system accountND\"\n},{\n  \"title\": \"Sharepoint 2013 change default settings of “Upload Image” Pop-Up\",\n  \"url\": \"/post/sharepoint-2013-change-default-settings-of-upload-image-pop-up/\",\n  \"date\": \"November 16, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"When you upload files or images in Sharepoint you have get a pop-up that asks you about the file, destination library and an option to overwrite extsting files.When the pop-up appears the checkbox “Overwrite existing files” is checked. To change the default setting we have to change 2 aspx files:   Navigate to C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Web Server Extensions\\\\14\\\\TEMPLATE\\\\Layouts    Make a backup of the following files: upload.aspx and uploadex.aspx    Edit the upload.aspx file    Locate the line which contains: &lt;asp:CheckBox id=”OverwriteSingle” Checked=”true” Text=&lt;%$Resources:wss,upload_document_Overwrite_file%&gt;” runat=”server” /&gt;    Change the Checked=”true” to Checked=”false“    Edit the uploadex.aspx file and make the same changes on the same lines    Save the files    Perform an IISRESET The checkbox is now not selected default anymore.Greetings   nd\"\n},{\n  \"title\": \"Exchang 2013, Offline OWA\",\n  \"url\": \"/post/exchang-2013-offline-owa/\",\n  \"date\": \"November 15, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"In the last time I worked a lot on my Exchange 2013, SQL 2012 and Sharepoint 2012 lab. A really nice feature is the Exchange 2013 Offline OWA.You can start using OWA offline from the OWA Website:OWA informs you to that it will save some content of your mailbox on the computer.What you can see now is that OWA safes mailbox content on your local disk under C:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Microsoft\\\\Internet Explorer\\\\Indexed DB&nbsp;Like Exchange also the offline files are some edb an log files.There is a full list of all offline OWA features: http://technet.microsoft.com/en-us/library/aa997437(v=exchg.80).aspxGreetings nd\"\n},{\n  \"title\": \"Windows Server 2012 – DirectAccess\",\n  \"url\": \"/post/windows-server-2012-directaccess/\",\n  \"date\": \"November 11, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"DirectAccess is a feature that has been introduced in Windows Server 2008R2 and Windows 7. It allows secure access to enterprise resources, without requiring a manual VPN connection. A DirectAccess enabled computer establishes a secure connection to the DirectAccess server every time the computer is connected to the internet.Windows Server 2012 and Windows 8 really simplify the configuration required for DA, making it much easier to deploy a remote access solution.RequirementsThe only requirement is the installation of a Windows Server 2012 member server, providing the “head end” of the connection. No Active Directory, schema, forest, domain-level updates are required.The DA Server needs two network adapters, one connected to the internal LAN, the other one connected to a DMZ or public network.&#160;If the DA Server is located behind a firewall, https (tcp/443) has do be allowed from the internet to the “public” network adapter.DirectAccess relies on IPv6 technology, the only hosts that require an IPv6 address are the DirectAccess Server and clients, though. The DA server performs NAT64 and DNS64 in order to enable the DA client to access IPv4 only servers.InstallationUse ServerManager or PowerShell to install the Remote Access server role on the designated DirectAccess server. Once installed, use the “Getting started” wizard to configure DirectAccess. The wizard can be started from ServerManager or from within the “Remote Access Management Console”.Select “Deploy DirectAccess only” in the wizard. Select the network topology to be used, in this example I am using a server with two network adapters, one connected to a DMZ and one connected to my LAN. Specify the name (or public IP) that clients will be using to connect.  And that’s all there is about it, it’s called “simplified deployment”. The Wizard goes ahead and creates Group Policies for DA Servers and Clients, creates DNS records for Network Location. Pretty cool, eh?To modify the settings, click the “here” link on the last page of the wizard, for my test environment I go with the defaults.As the wizard finishes, it shows some information about what it did.DirectAccess Server The DirectAccess Configuration can be shown and changed in the Remote Access Management Console. The Dashboard and Operations Status panels do provide information about the servers status, required services and connected clients. DirectAccess ClientsThe wizard created a Group Policy Object, named “DirectAccess Client Settings” and a WMI Filter, to apply that GPO to Notebooks running Windows 7 or 8 Enterprise editions. So all I had to do was to update the group policies on the notebook (gpupdate). As long as it was connected to the LAN nothing changed, if I connected the notebook to the internet, the DA (Workplace Connection) was established automatically and I was able to access internal resources as if I was on the LAN. I think this “simplified deployment” really does make it easier to get started with DirectAccess, to deploy it in an enterprise network, one should be a little more familiar with the technology :) So this post was meant to be a quick-and-dirty intro, stay tuned for more in-depth information.so long,   tom\"\n},{\n  \"title\": \"Windows 8 – Windows To Go\",\n  \"url\": \"/post/windows-8-windows-to-go/\",\n  \"date\": \"November 10, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"en\"],\n  \"author\": \"tto\",\n  \"content\": \"Windows to Go (WTG) is a new feature available in the Windows 8 Enterprise Edition. It enables the deployment of Windows 8 to USB thumb drives so that an End User can really plug in their USB drive and boot their Enterprise environment on any machine. Now, for security reasons the thumb drive can be encrypted using BitLocker and the User has no access to local hard disks of the &ldquo;host&rdquo;.HardwareWTG requires a &ldquo;fixed drive&rdquo;, that is, you cannot use any USB drive, it must be &ldquo;Certified&rdquo;. I am using a Kingston DataTraveler Workspace (www.kingston.com/wtg) other supported devices are listed on TechNet: Windows To Go: Feature OverviewEven though its not required USB 3 is highly recommended to speed things up. If you have no WTG certified drive handy, try using a USB hard disk.DeployDeployment is really simple, simply open &ldquo;Windows To Go&rdquo; from Control Panel. The WTG Wizard starts, and the first thing you have to select is which drive to use.In the next step you select the Windows 8 Image, for testing I mounted a Windows 8 Enterprise DVD. In a real-world scenario you would use your customized Image for deployment.Set a password to BitLocker the device (highly recommended).Obviously all data on the drive is lost, so if that is not a problem, click &ldquo;Create&rdquo;.Yeah, that&rsquo;s it. In the last step you can choose to reboot the machine or just finish and close.Boot and WorkSo now you have created a new WTG Workspace that can be used to boot Windows from almost any PC. If the PC can run Windows 7 or 8, it almost certainly will run Windows to Go. The first time you boot WTG it takes some time, just as every new Windows installation takes some time. After the quick, first steps you can start working, you&rsquo;ll notice that there is no access to the hard drives of the host computer. If local access is needed, simply open &ldquo;Disk Management&rdquo; and make the disks available (Requires Administrative permissions).If you shut down Windows To Go and remove your USB drive, the local Computer starts, absolutely unaffected by WTG. BYOD just got a lot simpler, IT just needs to hand out USB drives and doesn&rsquo;t need to be supporting all kind of different environments Users might have on their devices.On the other hand, Users do not have to worry about IT enforcing policies on there private-owned devices.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If you ask me, that&rsquo;s pretty cool :) tom\"\n},{\n  \"title\": \"SharePoint 2013 Search Center – Windows 8\",\n  \"url\": \"/post/sharepoint-2013-search-center-windows-8/\",\n  \"date\": \"November 6, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Sharepoint\"],\n  \"author\": \"tto\",\n  \"content\": \"SharePoint 2013 Enterprise Search Center provides powerful indexing and search, not only for the local SharePoint instance but for file shares and other SharePoint farms as well.More info: What's new in search in SharePoint Server 2013Federated SearchWindows 7 and later support the connection of external sources through OpenSearch, which essentially is a Web Service that receives search queries by the client and returns results in either RSS or Atom XML format. This allows users to search remote data and view search results within Windows Explorer.More info: Federated Search in WindowsCreate OSDX FileNow to get SharePoint search into Windows Explorer you need to create an OSDX (OpenSearch Description) file and deploy it to your clients.Here is an example file that works for my SharePoint 2013 and Windows 8:&lt;?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?&gt; &lt;OpenSearchDescription xmlns=\\\"http://a9.com/-/spec/opensearch/1.1/\\\"&gt; &lt;ShortName&gt;SharePoint Search&lt;/ShortName&gt; &lt;Description&gt;Search the SharePoint Search Center&lt;/Description&gt; &lt;Url type=\\\"application/rss+xml\\\" template=\\\"http://intranet.ntsystems.local/sites/searchcenter/_layouts/srchrss.aspx?k={searchTerms}&amp;amp;web.count=50\\\"/&gt; &lt;Url type=\\\"text/html\\\" template=\\\"http://intranet.ntsystems.local/sites/searchcenter/Pages/results.aspx?k={searchTerms}\\\"/&gt; &lt;/OpenSearchDescription&gt; &nbsp;Simply create a new file using notepad, adjust the URLs to point to your SharePoint Enterprise Search Center and save it with the .osdx extension.There are many possibilities for customization within the OSDX specification, check out MSDN to learn more about Creating an OpenSearch Description File.To test the OSDX files, double-click it and click \\\"Add\\\" to add the search connector to Windows Explorer.This adds a link to \\\"Favorites\\\" so you can easily search SharePoint from there.Deploy OSDXNow, to deploy this to more than one client, you could publish a link to the OSDX file and have your users click on that link to add the search provider.Alternatively Group Policy Preferences can be used to deploy the search connector:Copy the .searchConnector-ms file from your Client (%UserProfile%\\\\Searches\\\\) to a share that is available to the clientsCreate a GPO and use the 'Files' GPP to copy the searchConnector-ms file from the share to %UserProfile%\\\\Searches&nbsp;&nbsp;Use the 'Shortcuts' GPP to create a Shortcut in the \\\"User Profile, Links\\\" folder, remember to select a nice Icon&hellip; ;)&nbsp;&nbsp;So that's how to get results from SharePoint into Windows Explorer.&nbsp;So long, tom\"\n},{\n  \"title\": \"Office 2013 Web Apps\",\n  \"url\": \"/post/office-2013-web-apps/\",\n  \"date\": \"November 1, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\",\"Sharepoint\"],\n  \"author\": \"tto\",\n  \"content\": \"So October has been pretty quiet around here, but I have some cool stuff to share with you today.Office 2013 RTM'd some time ago and so did all the server products. So with SharePoint 2013 available on TechNet I decided to set up some demo sites to get a feel for the product, after looking for a new version of the Office Web Apps I realized that there was some change coming here.Office Web Apps ServerOffice 2013 Web Apps are no longer installed on SharePoint servers directly, it became a stand-alone product instead. Not only does that stand-alone product bring new design and scalability possibilities, it is also possible to share the Web Apps with Exchange and Lync 2013.PrerequisitesTo install Office Web Apps Server on a Windows Server 2012 box the following roles and features must be installed as a prerequisite:Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices If you want to use https for the Web Apps a proper certificate must be available on the server, too. To display the certificates installed on a computer try the following command:Get-ChildItem Cert:\\\\LocalMachine\\\\my | select Subject,FriendlyName The Web Apps Server can also be installed on Windows Server 2008R2, find the prerequisites on TechNet.Installing Office Web Apps Server and creating the farmThe actual installation of the Server is pretty straightforward, just download the ISO and double click it (love that&hellip;). The only thing you can choose during setup is the installation path.Once done with the installation, you can go ahead and use PowerShell to create a new Web Apps Farm. Not surprisingly the cmdlet to be used is New-OfficeWebAppsFarm, the following parameters have to be used to create a farm:-InternalUrl: the URL used for internal Clients-ExternalUrl: the URL used for Clients on the Internet-CertificateName: set the FriendlyName of the certificate to be used for the farm-EditingEnabled: enable editing of files in the browser (SharePoint)The following example creates a farmNew-OfficeWebAppsFarm -InternalUrl \\\"https://myOWAserver.tomt.local\\\" -ExternalUrl \\\"https://office.ntsystems.it\\\" &ndash;CertificateName \\\"ntSystems OfficeWebApps\\\" &ndash;EditingEnabled To verify that the farm has been created successfully, open a browser and go to https://myowaserver.tomt.local/hosting/discovery you should see some XML information about your internal and external URLs.SharePoint 2013Now to connect your SharePoint 2013 farm to the brand new Web Apps farm, fire up an administrative SharePoint Management Shell and use the New-SPWOPIBinding cmdlet. Use the &ndash;ServerName parameter to specify the internal URL of the Web Apps farm:New-SPWOPIBinding -ServerName https://myOWAserver.tomt.local &nbsp;After that you can have a look at the WOPI Zone, if users are accessing the SharePoint from internal and external clients you might want to change the zone from its default value of \\\"internal-https\\\" to \\\"external-https\\\":Set-SPWOPIZone &ndash;zone \\\"external-https\\\" &nbsp;Almost done, if you are using https on your SharePoint web applications you should be ready to go. If you are using http for SharePoint you need to set AllowOAuthOverHttp to true. This needs to be done in the SharePoint Management Shell using the following commands:$config = (Get-SPSecurityTokenServiceConfig) $config.AllowOAuthOverHttp = $true $config.Update() &nbsp;To check if it worked, use:(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp Try it&hellip;Ready to see it? Open a browser, go to your SharePoint 2013 sites and create a new Document or open an existing one, should be looking like that:&nbsp;So long,tom\"\n},{\n  \"title\": \"Exchange 2010 and MaxInboundConnectionPerSource\",\n  \"url\": \"/post/exchange-2010-and-maxinboundconnectionpersource/\",\n  \"date\": \"September 15, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Exchange receive connectors do have a setting of MaxInboundConnectionPerSource which limits the maximum number of connections from a single IP address at any moment. So with a default value of 20, there are no more than 20 connections from a specific IP address allowed. The following warning is logged in the transport server's application log if the limit is exceeded:Event ID: 1021Event Source: MSExchangeTransportMessage Text: Receive connector 'Connector Name' rejected an incoming connection from IP address '10.10.10.10'. The maximum number of connections per source ('20') for this connector has been reached by this source IP address.The sender of a mail might receive the following message:Deferred: 421 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel\\\" Status 4.0.0, \\\"Transient failure\\\"According to RFC this is not a permanent error, so the sender's mail server should try to send the message again after some delay.\\\"The command was not accepted, and the requested action did not occur. However, the error condition is temporary, and the action may be requested again.\\\"Set-ReceiveConnectorTo view the configured value of MaxInboundConnectionPerSource use the Get-ReceiveConnector cmdlet, to change the value use the Set-ReceiveConnector cmdlet with the &ndash;MaxInboundConnectionPerSource parameter. The following example increases the value to 100 Get-ReceiveConnector default* | Select Name,MaxInbound*Get-ReceiveConnector default* | Set-ReceiveConnector -MaxInboundConnectionPerSource 100 More info on: TechNet &nbsp;So longtom\"\n},{\n  \"title\": \"Scheduled Jobs in PowerShell v3\",\n  \"url\": \"/post/scheduled-jobs-in-powershell-v3/\",\n  \"date\": \"September 7, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"I am really excited to write about that great feature of PowerShell I started using recently. It's all about scheduling administrative tasks, actually it's more like scheduling everything, to run when I am at home sleeping happily JSo as I have mentioned before I'm no PowerShell expert at all and I'm sure all that stuff can be done many other ways, but then this thing is working for me&hellip;SnippetsIf you have been using PowerShell ISE you might know what Snippets are, if you don't, just open powershell_ise.exe and press 'ctrl+j'. Snippets are code samples that can be added to your script easily. You can create your own snippets like that:$code = @' # this is my sample code '@ New-IseSnippet -Title 'Sample' -Description 'Just a sample' -CaretOffset $code.Length -Text $code -Force &nbsp;This will create a 'Snippets' folder at your Documents\\\\WindowsPowerShell where your new snippet is saved for later use. Having that said let's move on to scheduled jobs.Scheduled JobsUntil now it was quite a pain in the butt to run PowerShell scripts as scheduled tasks, you had to specify the path to powershell.exe and then use some params to make it run the script you choose. You could even pass arguments to those scripts, but it was no real fun. So now we can do all that very easy and directly from within PowerShell.TriggerFor starters we need to create a job trigger, to tell PowerShell when to execute out script.$trigger = New-JobTrigger -At 22:00 &ndash;Once &nbsp;This will create a variable containing our trigger, as you can see the script will be executed today, at 22:00 and it will be executed only once.JobOptionsNext we can define some job options, it's not necessary though$option = New-ScheduledJobOption &ndash;RequireNetwork -StartIfOnBattery -ContinueIfGoingOnBattery &nbsp;Using the New-ScheduledJobOption cmdlet we can specify all kinds of different options, you might already know them from Task Scheduler.ScriptblockNow that we have a trigger and some options we need to define a scriptblock that is going to be executed by our scheduled job.$sb={  param([System.IO.FileInfo]$path,[string]$string)  Add-Content -Path $path -Value $string -Force } &nbsp;This, obviously, is just a simple example. It will simply append a string to a file, should be enough to demo what I mean though.CredentialLast thing we need to specify is the account that should be used to run the task.$cred = Get-CredentialThis will create a variable containing the credential you type in. We will pass this to the &ndash;Credential parameter of the next step.RegisterScheduledJobWe have defined everything we need so we can go ahead and register the job.Register-ScheduledJob -Name \\\"test\\\" -Trigger $trigger -Credential $cred -ScheduledJobOption $options -ScriptBlock $sb -ArgumentList (\\\"c:\\\\temp\\\\test.txt\\\",\\\"abcde\\\") &nbsp;This creates a scheduled task at \\\\Microsoft\\\\Windows\\\\PowerShell\\\\ScheduledJobs, it can be viewed using Task Scheduler or using the Get-ScheduledJob cmdlet.If you want to specify a script file instead of a scriptblock, simply change the &ndash;ScriptBlock param and use &ndash;FilePath.UnregisterScheduledJobThe job can be deleted in Task Scheduler or by using the Unregister-ScheduledJob cmdlet.&nbsp;&nbsp;I hope you will find this feature as exciting as I do, I'll provide you with the code snipped so you can easily use 'crtl+j' to create a task the next time. Just copy the ps1xml file to your Documents\\\\WindowsPowerShell\\\\Snippets folder and enjoy. JScheduled Job.snippets.ps1xml (1.35 kb)&nbsp;&nbsp;So long, have a nice weekend!tom&nbsp;\"\n},{\n  \"title\": \"Exchange 2010, Outlook doesn’t show attachments\",\n  \"url\": \"/post/exchange-2010-attachments/\",\n  \"date\": \"August 13, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Last Week I had into the problem that Outlook 2010 didn’t show some attachments. After a research on technet I found out that this attachment was a not referenced inline-attachment.To fix this behavior and make Outlook showing the attachment you have to do the following:- Stop the Exchange Transport service.    - Locate the EdgeTransport.exe.config file. This file is located in the following path:     C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\Bin\\\\ In the EdgeTransport.exe.config file, add the following entry between the &lt;appSettings&gt; element and the &lt;/appSettings&gt; element: &lt;add key=&quot;TreatInlineDispositionAsAttachment&quot; value=&quot;true&quot; /&gt; - Start the Transport serviceGreetings    dn\"\n},{\n  \"title\": \"GAL Photos reloaded–batch import\",\n  \"url\": \"/post/gal-photos-reloaded-batch-import/\",\n  \"date\": \"August 12, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"About two years ago I&rsquo;ve posted an article about Exchange 2010 and GAL Photos. Now this is not great news anymore, there are two great articles on the Exchange Team Blog, that explain how to configure this, too. Find them here: aka.ms/galphotosand aka.ms/galphotosfaqKey points are the the minor schema change and the maximum file size of 10KB. Images can be max. 96x96 pixels in size.Now in the last couple of days I wrote a &ldquo;cmdlet&rdquo; to make batch importing images easier. For starters, the cmdlet gets all *.jpg files in folder, then it uses the files BaseName to find corresponding Exchange Mailboxes. After that the image&rsquo;s physical dimensions as well as file size are verified, if they are ok, the image is imported using Import-RecipientDataProperty.The folder containing the images can be set using the cmdlet&rsquo;s &ndash;FilePath parameter, the cmdlet takes pipeline input from Get-ChildItem too.Here are two examples of how the cmdlet could be used:PS C:\\\\&gt; Import-GalPhoto -FilePath 'c:\\\\temp\\\\pics' &nbsp; PS C:\\\\&gt; dir 'c:\\\\temp\\\\pics' | Select-Object -First 2 | Import-GalPhotoI&rsquo;ve pasted the function to PoshCode, here it goes:enjoy, tom\"\n},{\n  \"title\": \"Server 2008 R2, Disk Management und DiskPart lässt sich nicht starten\",\n  \"url\": \"/post/server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten/\",\n  \"date\": \"August 6, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2008-R2\"],\n  \"author\": \"dni\",\n  \"content\": \"Mit Windows Server 2008 R2 kommt es manchmal vor, dass ich Volumes nicht extenden konnte und der Wizard folgenden Fehler anzeigt: “Unable to connect to Virtual Disk Service”&#160; Mit Diskpart sieht das dann so aus: “Diskpart encountered an error starting the COM service”&#160; Im EventLog ist folgender Fehler zu finden:Unable to start a DCOM Server: {9C38ED61-D565-4728-AEEE-C80952F0ECDE}. The error:        &quot;1260&quot;         Happened while starting this command:         C:\\\\Windows\\\\System32\\\\vdsldr.exe –EmbeddingWorkaroundHierzu habe ich einen kleinen Workaround um die Disk schnell zu extenden: CMD öffnen und folgendes Kommando starten: C:\\\\Windows\\\\System32\\\\vdsldr.exe –Embedding Nun funktioniert Diskpart und die Disk kann extended werden. Grüße    dn\"\n},{\n  \"title\": \"My PowerShell Profile\",\n  \"url\": \"/post/my-powershell-profile/\",\n  \"date\": \"July 29, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Today I am going to walk you through my PowerShell Profile and try to explain the basics of what a Profile is and how it can be used.So what is a Profile, and where is it?Well, basically a profile is a PowerShell script file (.ps1) that is stored in a preconfigured location and that gets executed every time PowerShell starts. This script enables you to customize your PowerShell session and predefine settings as you find them useful. There is a built-in variable, $Profile, which stores the location of the script that is executed every time PowerShell starts. The profile file is located in the WindowsPowerShell folder in every users “My Documents” folder. It has to be named Microsoft.PowerShell_profile.ps1.By default there is no profile and everything is left to their defaults, to create the profile script you can create the WindowsPowerShell folder and then use notepad to save a file containing some PowerShell commands in that folder. You can also use the New-Item cmdlet to create the folder and an empty file by typing:New-Item –Path $Profile -Type File –Force Example profileNow that we know what a profile is and where it is located we can go on and take a look at an example profile, it’s actually my profile so if you have any tips for me, feel free to leave a comment.I am starting my Profile with setting some variables, some are predefined and some are custom, I use them for the following settings:$MaximumHistoryCount is used to set the number of commands that are stored in History. Defaults to 64. Maximum 32767.    $Transcript is used to set the path for Start-Transcript     $env:PSModulePath is an environment variable (‘env:’) and it is used to customize the path where PowerShell will look for modules to import.     $cert is a variable I use to store my CodeSigningCert to sign scripts.After that I use Get-Host to figure out which version of PowerShell is running in the current session, if version 3 is detected, I set some DefaultParameterValues using $PSDefaultParameterValues. After that I check if the current session was started with “Run as administrator” if it was, the Update-Help cmdlet is run.Since I am writing a module I have a short function to just make my life a little easier, it signs the module file using Set-AuthenticodeSignature and then copies the file to some network share for my coworkers.At the end I am creating a new PSDrive of the FileSystem PS provider, after creating the drive the current location is set to that drive. This is my working directory, it contains all the scripts and test files I need.I pasted the file to http://poshcode.org, I really like their “embed code” feature.&#160;Now again, this is my profile, I use it to simply show what can be done, since I am still a beginner I appreciate ideas and tips from anyone!tom\"\n},{\n  \"title\": \"VB.Net PowerShell Script starten\",\n  \"url\": \"/post/vbnet-powershell-script-starten/\",\n  \"date\": \"July 24, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"dni\",\n  \"content\": \"Vor einigen Tage habe ich versucht ein PowerShell Script über ein VB.Net Programm zu starten.    Hat mich ein wenig Zeit gekostet :)Anbei der Code:Public Function RunCreatePasswordPowerShell(ByVal script As String) As Integer    &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim execProcess As New System.Diagnostics.Process     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim psScriptTextArg = &quot;-Command &quot;&quot;&amp; &quot; + script + &quot; &quot; + &quot;'&quot; + System.Environment.CurrentDirectory + &quot;'&quot; + &quot;&quot;&quot;&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.WorkingDirectory = Environment.SystemDirectory &amp; &quot;\\\\WindowsPowershell\\\\v1.0\\\\&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.FileName = &quot;powershell.exe&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.Arguments = psScriptTextArg     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.UseShellExecute = True     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Return execProcess.Start     &#160;&#160;&#160; End FunctionErklärung:Die Funktion RunCreatePasswordPowerShell wird mit einer String Variable als Argument aufgerufen (script). Diese String Variable beinhaltet den Pfad zu unserem PowerShell Script.    In meinen speziellen Fall geben ich beim zusammenstellen der Argumente noch die den aktuellen Pfad mit. Eventuell noch interessant: Dieses PowerShell Script welches ich hier aufrufe erstellt verschlüsselte PasswordFiles, welche dann über die PowerShell weiter verwendet werden können. Anbei der Code dazu:param(    &#160;&#160;&#160; [parameter(Mandatory = $true)]     &#160;&#160;&#160; [string]$CurrentDirectory     )     $PasswdFilename = read-host &quot;Filename&quot;     $Passwd = read-host &quot;Password&quot; -assecurestring | convertfrom-securestring     $PasswdPathFile = $CurrentDirectory + $PasswdFilename + &quot;-Pass.txt&quot;     $Passwd | Out-File $PasswdPathFileGrüße    dn\"\n},{\n  \"title\": \"NPS Migration von Server 2003 nach 2008 R2\",\n  \"url\": \"/post/nps-migration-von-server-2003-nach-2008-r2/\",\n  \"date\": \"July 24, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2008-R2\"],\n  \"author\": \"dni\",\n  \"content\": \"Den IAS Server von Server 2003 zu Server 2008 R2 zu migrieren ist eine sehr einfache Migration:Zunächst muss das Migrationstool iasmigreader auf den Windows Server 2003 kopiert werden.Das Migrationstool befindet sich entweder auf der Server 2008 R2 CD unter D:\\\\sources\\\\dlmanifests\\\\microsoft-windows-iasserver-migplugin oder auf dem Server 2008 R2 unter C:\\\\Windows\\\\SysWow64Über die Kommandozeile wird das Tool aufgerufen um auf dem 2003 Server die Konfiguration in das vordefinierte Textfile ias.txt zu exportieren.ACHTUNG: Beim Import von 32BIT zu 64BIT Systemen muss folgendes vorher gemacht werden. Sonst gibt es Probleme mit der PEAP Authentifizierungsmethode:Import File öffnen den Wert 0 in SystemInfo auf 0000000009 ändern:  Nun kann das File auf dem 2008 Server importiert werden:    Netsh nps import filename=&quot;paht\\\\ias.txt&quot;Grüße    dn\"\n},{\n  \"title\": \"Automatic IOS configuration backup\",\n  \"url\": \"/post/automatic-ios-configuration-backup/\",\n  \"date\": \"July 20, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Network\"],\n  \"author\": \"tto\",\n  \"content\": \"If you are like me you frequently forget to backup router and switch configurations before making changes. Ok, maybe not so frequently but it happens… There are some ways to prevent this from happening, we can make manual backups or use the automatic archiving feature which is built into IOS.Manual backupA manual backup can always be taken using the ‘copy startup-config' command, typing a question mark ‘?’ after that command lists possible backup destinations:RT#copy startup-config ?      &#160; archive:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to archive: file system       &#160; flash:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to flash: file system       &#160; ftp:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to ftp: file system       &#160; http:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to http: file systemSo to backup a routers current startup-config to a FTP server you would simply type something like this:RT#copy startup-config ftp://user:pass@10.10.10.1The username and password can also be configured so that you don’t need to type them in every time you are performing a backup.RT(config)#ip ftp username tom      RT(config)#ip ftp password secretOk, that’s better but since the backup still has to be started manually chances are that one could forget it…Automatic archiveThe archive feature allows for automatic configuration backup that is triggered by a timer and the ‘write memory’ command. The following example configures the archive feature on router RT to create a backup once every 24 hours and additionally every time someone enters the ‘write-memory’ command, that is, every time someone makes a configuration change and decides to save that change:RT(config)#archive      path ftp://10.10.10.1/History/rt-config-       write-memory       time-period 1440The time-period keyword simply configures how often a scheduled backup runs, if the write-memory command is configured a configuration backup is performed every time someone saves the config. The ‘show archive’ command displays the 10 latest configuration files:RT#show archive      The maximum archive configurations allowed is 10.       The next archive file will be named ftp://10.10.10.1/History/rt-config--&lt;timestamp&gt;-50       Archive #&#160; Name       &#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-51-57.153-47       &#160;&#160; 2&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48       &#160;&#160; 3&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-53-57.337-49Obviously other backup destinations such as tftp or flash can be configured. IOS does not take care of the removal of old files, so even though only the 10 latest configuration versions are shown in the ‘show archive’ output, there might be more on the server.Restoring configurationIf a configuration change needs to be rolled back the ‘configure replace’ command can be used. So if a configuration change had unintended consequences the ‘configure replace ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48’ command could be used to restore the current running-config from a backup.&#160;tom\"\n},{\n  \"title\": \"Steve Ballmer on Exciting Times–Office 2013\",\n  \"url\": \"/post/steve-ballmer-on-exciting-times-office-2013/\",\n  \"date\": \"July 16, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Update: Beta versions of all Server Products are now available, check out the link on the bottom. Added a link to the webcast.Microsoft hold a live webcast today where they kicked off the new Office 15 wave.Ballmer gave a quick overview of the latest announcements, including Surface, Windows Phones 8, Windows 8 and some Server products, before he gets going with the introduction of Office 2013.He calls the new version of Microsoft Office the “most ambitious release of office” ever. It’s was designed for cloud and touch enabled devices, a full featured version of Office 15 will also be available on ARM devices.View the recorded webcast: http://www.microsoft.com/en-us/news/presskits/office/liveevent.aspxBallmer talked about Microsoft’s recent acquisitions, namely Yammer and PPI. Yammer provides integration to all kind of social media for Office 15 client and Server products. PPI build huge, high definition displays which could be great for meetings and collaboration.One of the most important points Ballmer makes is the ability of ink and touch support in every application, so that one can take digital annotations through the new generation of hardware. It seems like a big effort to finally move away from pen and paper.After that, Ballmer introduced Kirk Koenigsberger for some live demo of the product. Kirk is very excited too and shows some sneak peaks of what is to come with a focus on consumer usage. Office 15 is heavily integrated into Skydrive and stores all content in the cloud by default, if you install the Office preview you will soon notice that you can sign-in with you Windows Live ID directly into Office.Office 15 features integration with social networking, multimedia, Skype and Lync offer presence information for the People Card (kind of an evolution from that thing we know from Outlook 2010).Really neat is the “last location” feature, where a toast notification brings you back to the section of the document that you have been editing when you left one device and switched to another.SharePoint 2013 comes with fully featured enterprise social networking, with mentions, #hashtags and like buttons all packed into a sleek, new design. A Newsfeed will provide the user with “Facebook” style updates from co-workers and friends, again using Yammer to aggregate news from different sources into one feed. Office documents and multimedia content can be previewed directly from the new timeline, the People Card quickly shows all contact information and presence status of the team members.Try it nowThe next generation of Office can be downloaded from Office.com.Server ProductsWhat is at least as exciting as the new version of Office client products is that the Server products are already listed on the website. Can’t wait to get my hands dirty on that stuff… http://www.microsoft.com/office/preview/en/try-more-productsso that’s it for now,    tom\"\n},{\n  \"title\": \"Why am I learning PowerShell? And why do I think you should give it a try, too?\",\n  \"url\": \"/post/why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too/\",\n  \"date\": \"July 14, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"To be frank, I am kind of a beginner when it comes to PowerShell or scripting in general, I was working for really small businesses for some time and I didn’t really bother scripting. There were simply not too many repeating tasks and so I went and did most everything manually.So obviously things have changed, for starters I’m not working for said small businesses any more. There are now a lot of tasks that would take hours to be completed manually. And there is this shiny, new toy out there, called Windows PowerShell. Ok, it’s not really new, but a lot of people still stick to there old tools as they knew how they worked for years, so why change something that got the job done in the past? Well, here are my key points:Automation prevents errorsThis is the most important point for me, think about some task where you have to repeat a configuration change for like 8 times. It’s not that scripting or automating is that much faster than making the change manually, that would be the case if it were 100 times or more, but 8, come on. The one key thing is, that by using automation the configuration is exactly the same every single time you have to do it. Sure, you have to spend a little more time in planning your steps (instead of just clicking your way through), you have to write a few lines of script, or just chain together some commands. Once your little tool is complete and tested, you can use it over and over again, it will produce the same result every time you run it. So we are getting to my second point.Create reusable toolsPowerShell enables you to create reusable tools very easily, if you are typing some commands into the command line interface, the exactly same commands can be saved to a ps1 file and executed by a co-worker, a scheduled task or... you get the point. The first point still applies here, if you create a tool and share it with your colleagues or co-workers not only are you simplifying certain tasks, you are again eliminating a common source of error.DocumentationThe transcript feature simply writes anything you type and all output of the current command line window to a file, this file can easily be used to document configuration changes.ResourcesSo where do I start? First of all, remember one key command: Get-Help. It’s simple, it comes with PowerShell and the help content is very, very well written! Try this: ‘Get-Command | Get-Random | Get-Help –Full’A good place to start is the Windows PowerShell Survival Guide on the TechNet Wiki.There are some good books on the topic available, I’m looking forward to PowerShell in Depth by three of the most well-known PowerShell gurus: Don Jones, Richard Siddaway, and Jeffery Hicks.&#160;Have fun!   tom\"\n},{\n  \"title\": \"ActiveSync Organization Settings–Mobile Device Management\",\n  \"url\": \"/post/activesync-organization-settings-mobile-device-management/\",\n  \"date\": \"July 9, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"The growing number of mobile devices requires some sort of mobile device management policy to be in place. Now there are different approaches to enforce such a policy, there are some software vendors offering more or less sophisticated tools and there is Exchange 2010 which comes with basic device management capabilities built-in.If a mobile device connects to an Exchange Server the following sequence evaluates the access state of the device (from TechNet: http://technet.microsoft.com/en-us/library/ff959225.aspx)   Is the mobile device authenticated?&#160;&#160; If not, challenge the mobile device for the correct credentials. Otherwise, go on to the next step.     Is Exchange ActiveSync enabled for the current user?&#160;&#160; If not, return an &quot;access restricted&quot; error to the device. Otherwise, go on to the next step.     Are the mobile policy enforcement criteria met by the current mobile device?&#160;&#160; If not, block access. Otherwise, go on to the next step.     Is this mobile device blocked by a personal exemption for the user?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device allowed by a personal exemption for the user?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Is this mobile device blocked by a device access rule?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device quarantined by a device access rule?&#160;&#160; If so, quarantine the device. Otherwise, go on to the next step.     Is this mobile device allowed by a device access rule?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Apply the default access state per the Exchange ActiveSync organizational settings.&#160;&#160; This grants access, blocks access, or quarantines the current device, depending on the organizational settings.  Default Access StateThe last step in the above list determines the ‘default access level’ organizational setting. This setting defaults to ‘Allow’ so if no other device access rules are configured, all ActiveSync devices (which meet enforcement criteria) are allowed. That means, any user with an ActiveSync enabled mailbox (another default) is able to connect up to 10 devices using ActiveSync.To change this behavior the ‘default access level’ setting can be modified using the ‘Set-ActiveSyncOrganizationSettings’ cmdlet. Other than ‘Allow’ this can be set to ‘Quarantine’ or ‘Block’. Quarantine: Enables devices to connect to the Server but grants only limited access to the device. Users will be able to add content to their calendar, tasks and notes folders, however no content can be retrieved from the server. The user will receive an email stating that the mobile device has been quarantined, that email can be retrieved by the mobile device and will be available in the users mailbox through Outlook and OWA. If a device is quarantined an administrative email address is notified too, so that they can decide to allow or block the device.An admin (or any user with the required privileges) who receives the notification can use the Exchange Control Panel to allow or block the device:Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.Block: Simply blocks all new or unknown devices. Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.If users are already using ActiveSync to access their mailboxes the Exchange Management Shell can be used to add the DeviceID of currently used ActiveSync devices to the ActiveSyncAllowedDeviceIDs property.Set-ActiveSyncOrganizationSettings The following command sets the recipient of the admin notification to support@ntsystems.local. Every time a device is quarantined that email address is notified.Set-ActiveSyncOrganizationSettings –AdminMailRecipients support@ntsystems.localThe following command sets the ‘default access state’ to quarantine.Set-ActiveSyncOrganizationSettings –DefaultAccessLevel QuarantineNeed to scale? Try Device Access Rules!Manual approval might not work for environments with many users or when users change their mobile devices frequently. Device Access Rules can be used to allow or block devices based on Family or Model so that users can connect approved device types without the need to be manually allowed by an admin:Using Device Access Rules allows for some amount of scalability, even though it’s not perfect – it comes with Exchange.&#160;so long,    tom\"\n},{\n  \"title\": \"Passing an array to a {scriptblock}\",\n  \"url\": \"/post/passing-an-array-to-a-scriptblock/\",\n  \"date\": \"June 29, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Some Friday PowerShell fun today.I created a PowerShell script the other day where I was passing a variable to a scriptblock. As long as the variable was a simple string everything was just fine, but when the variable was of the type System.Array only the first item would have been passed to the scriptblock.[more]Example 1 shows what I mean.$myArray = \\\"a\\\",\\\"b\\\",\\\"c\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock -ArgumentList $myArrayThis example would produce an output of &ldquo;a&rdquo; even though I assumed it would output &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.So I was scratching my head for a while and then tried to do it that way:$myArray = \\\"a\\\",\\\"b\\\",\\\"c\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock &ndash;ArgumentList (,$myArray)This one works as expected, so it produces an output of &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.&nbsp;have a nice weekend!tom&nbsp;&nbsp;\"\n},{\n  \"title\": \"We are still out there, somewhere…\",\n  \"url\": \"/post/we-are-still-out-there-somewhere/\",\n  \"date\": \"June 22, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"It has been a while since our last post, but then we are both really busy getting our work done and studying for some certification and other stuff. I’d like to promise that we will publish cool stuff on a more regular basis, not sure if we can keep it though. What I DO promise is that I am going to try!&quot;One must have a good memory to be able to keep the promises that one makes&quot; - F. NietzscheSo, having that said, what was going on that we have not been blogging about:Windows 8 and Windows Server 2012 Release Previews are out!Go, give it a try. And check out all the cool content over at Windows Server Blog and Building Windows 8. Really.Windows Phone 8 has been announced.I’m personally looking forward to that, I came to love my Windows Phone 7 and I think this is going to be even better. Read more on the Windows Phone Blog.        Device encryption: To help keep everything from documents to passwords safe, Windows Phone 8 includes built-in technology to encrypt the entire device, including the operating system and data files.       Better security: Windows Phone 8 supports the United Extensible Firmware Interface (UEFI) secure boot protocol and features improved app “sandboxing,” so the phone is better protected from malware with multiple layers of security.       Remote management: With Windows Phone 8, IT departments can manage apps and phones remotely, with tools similar to ones they now employ for Windows PCs.       Company Hub and apps: Companies can create their own Windows Phone 8 Hub for custom employee apps and other critical business info.    Microsoft Surface has been announced.Hm, looks nice… but we will see.Get more (well, not too much more) at surface.comMoving away from MD5 and keys under 1024 bits.Some efforts are made to put more trust into the struggling SSL Certificate business and I guess it also gives us more security. Personally I think that education is the key point when it comes to “trust” and SSL and IT security in general. People should really be aware of what it means to just ignore Certificate warnings… Its up to us IT Pros to make (our) internal servers trustworthy and sort of train users to rely on SSL and watch out for it.Lets get back to MD5. So, recently there has been a some media coverage of the so called “Flame” malware which used phony certificates to make a man-in-the-middle attack against Windows Update possible. Whoever created the malware used a flaw in Microsoft's Terminal Server Licensing certificate infrastructure to create a code signing certificate that chained up to Microsoft's Root CA. In essence this was possible because of the TS Licensing certs using MD5 hashes which are prone to collision attacks.More information about Flame on: NakedSecurity; Remote Desktop Services Blog; Security Research &amp; Defense; the Security Advisory can be found here.Some days after that I (and other customers) received an email from RapidSSL stating that MD5 is to be abandoned by June 1, that is all (RapidSSL) certificates that have been using the MD5 hashing scheme have been revoked. They did also revoke any certificate using a key size under 1024 bits.Microsoft is also going to release an update that blocks certificates with keys less than 1024 bits. More information on this on the Windows PKI Blog.Exchange 15 rumorsExchange 2010 has been available for little more than two years when Microsoft kicked off the “Office 15” technical preview (for few, select people) back in January 2012. Not much information has been published since then, although a beta is expected for “late summer”. Since the Exchange Conference happens to take place by the end of September I suppose we all will know more by then.&#160;That’s it for now. Have a nice weekend!tom\"\n},{\n  \"title\": \"Wireless Sniffing mit NetMon 3.4\",\n  \"url\": \"/post/wireless-sniffing-mit-netmon-34/\",\n  \"date\": \"April 14, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Network\"],\n  \"author\": \"tto\",\n  \"content\": \"Damit mit Wireshark unter Windows Wlan Traffic analysiert werden kann benötigt man einen speziellen Adapter (AirPcap), der auch im Promiscuous Mode (oder Monitor Mode) betrieben werden kann.Mit Microsoft Network Monitor 3.4 und Windows 7 kann man jetzt auch “normale” Adapter im Monitor Mode betreiben um Wireless Frames zu sniffen.NetMonDazu die entsprechende Version von NetMon herunterladen (x86 oder x64) und installieren.NetMon öffnen und unter “Select Networks” den Wireless Adapter auswählen. Alle anderen Adapter deaktivieren.Dann auf “Properties” klicken und die “Scanning Options” konfigurieren.Der “Monitor Mode” muss aktiviert werden, außerdem kann man den Frequenzbereich sowie den Kanal auswählen. Wählt man keinen Kanal aus, scannt NetMon alle Kanäle.Mit “Apply” werden die Einstellungen übernommen, das Fenster “Scanning Options” muss man offen lassen, der “Network Interface Configuration” Dialog kann mit “OK” geschlossen werden.Jetzt kann man auf “New Capture” klicken und mit “Start” einen neuen Trace starten.AnalyseDie Analyse des Traffics ist mit NetMon etwas ungewohnt, es hilft allerdings sehr wenn man sich von&#160; http://nmparsers.codeplex.com/ die aktuellsten Parser installiert.Alternativ kann man das Ergebnis aus NetMon als “.cap” Datei speichern und mit Wireshark öffnen.&#160;btw. das funktioniert genauso mit Windows 8 Beta &#160;have fun!tom\"\n},{\n  \"title\": \"Windows Server 8–Virtualized Domain Controller\",\n  \"url\": \"/post/windows-server-8-virtualized-domain-controller/\",\n  \"date\": \"March 23, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\"],\n  \"author\": \"tto\",\n  \"content\": \"In bisherigen Version von Windows Server und Active Directory hatte das Betreiben von virtuellen DCs einige Nachteile im Vergleich zu anderen virtuellen Servern. So konnten Domain Controller z.B. nicht von der Snapshot F&auml;higkeit des Hypervisors profitieren, das zur&uuml;cksetzen eines DCs auf einen Snapshot hatte fatale Auswirkungen auf die Gesamtstruktur.VDC Safe RestoreIm Active Direcotry Replikationsmodell wird jede Transaktion mit einer fortlaufenden Nummer (Update Sequence Number) versehen. Domain Controller &ldquo;merken&rdquo; sich diese Nummern sowie eine eindeutige ID des Replikationspartners (Invocation ID) von dem sie die jeweilige &Auml;nderung erhalten haben. Wird ein DC auf einen fr&uuml;heren Zeitpunkt zur&uuml;ckgesetzt (Snapshot) k&ouml;nnte er bereits verwendete USNs wiederverwenden, seine Replikationspartner akzeptieren diese Transaktionen nicht mehr, sie haben diese bereits erhalten. Der wiederhergestellte DC kann nicht mehr replizieren und wird in den sogenannten &ldquo;USN Rollback Protection&rdquo; Status gesetzt. Der DC muss jetzt manuell aus dem AD entfernt werden.In Windows Server 8 Active Directory gibt es ein Feature das dieses Problem verhindern soll. &Uuml;ber die ACPI Table stellt der Hypervisor die VM-Generation ID zur Verf&uuml;gung, diese wird im RAM des jeweiligen Domain Controllers gespeichert.Wird ein Snapshot angewandt, wird diese VM-Generation ID zur&uuml;ckgesetzt, so merkt der Domain Controller dass er wiederhergestellt wurde.&nbsp;Der wiederhergestellte DC setzt seine Invocation ID zur&uuml;ck und da seine Replikationspartner diese ID noch nicht kennen kann die Replikation wieder aufgenommen werden. Au&szlig;erdem wird der SYSVOL Ordner &ldquo;nicht autorisierend&rdquo; wiederhergestellt und folgendes Ereignis wird im &ldquo;Directory Service&rdquo; Event Log protokolliert.Folgendes Active Directory Attribut wird f&uuml;r die VM-Generation ID verwendet. Hier geht&rsquo;s zum entsprechenden Eintrag im MSDN.ms-DS-Generation-IdVDC Safe Restore muss (und kann) nicht konfiguriert werden, sofern der Hypervisor das VM-Generation ID Feature unterst&uuml;tzt ist es automatisch aktiv. Aktuell unterst&uuml;tzt nur Windows Server 8 Hyper-V dieses Feature, andere Herstellen werden hoffentlich bald nachziehen.Achtung, dieses Feature soll die USN Rollback Problematik l&ouml;sen, es ist auf keinem Fall ein Ersatz f&uuml;r ein konsistentes Backup! Der DC wird &ldquo;nicht autorisierend&rdquo; wiederhergestellt.&nbsp;so long,tom\"\n},{\n  \"title\": \"Exchange 2010 Send on behalf for distribution Groups\",\n  \"url\": \"/post/exchange-2010-send-on-behalf-for-distribution-groups/\",\n  \"date\": \"March 12, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Tipp: Damit man die “send on behalf” Berechtigung einem Benutzer für eine Verteilergruppe geben kann, ist ein einfacher Powershell Befehl nötig:Set-DistributionGroup GroupName -GrantSendOnBehalfTo UserName&#160;Grüßedn\"\n},{\n  \"title\": \"Windows 8 to Go\",\n  \"url\": \"/post/windows-8-to-go/\",\n  \"date\": \"March 12, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"de\"],\n  \"author\": \"dni\",\n  \"content\": \"Mit Windows 8 kommt ein neues Feature \\\"Windows 8 to Go\\\", welches bereits in der CP verf&uuml;gbar ist. Damit ist es m&ouml;glich die Windows Umgebung per USB-Stick oder anderen Datentr&auml;ger mitzunehmen.Als erstes muss der USB Stick bootf&auml;hig gemacht werden. Diese Prozedur ist dieselbe, die Thomas bereits in folgenden Post erkl&auml;rt um Windows 7/8 vom USB Stick zu installieren.Anbei nochmal kurz die Befehle:- diskpart- list disk- select disk X (USB Datentr&auml;ger ausw&auml;hlen)- create partition primary- format fs=ntfs quick- active&nbsp;Jetzt muss noch der PC neu gestartet werden und Windows 8 installiert werden. Als Datentr&auml;ger empfiehlt sich hier ein USB 3.0 Speichermedium.&nbsp;Gr&uuml;&szlig;edn\"\n},{\n  \"title\": \"Forefront TMG 2010 SP2–NLB Kerberos\",\n  \"url\": \"/post/forefront-tmg-2010-sp2-nlb-kerberos/\",\n  \"date\": \"March 10, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit kurzem ist das Service Pack 2 f&uuml;r den Nachfolger von ISA 2006 verf&uuml;gbar. Neben Bugfixes und verbesserten Fehlerseiten ist vor allem die M&ouml;glichkeit den Firewall Service als Domain User zu starten interessant. Dadurch erh&auml;lt man die M&ouml;glichkeit den SPN f&uuml;r die virtuelle IP Adresse des NLB Custer auf eine Benutzerkonto zu binden, wenn der Firewall Service dann mit diesem Konto gestartet wird, funktioniert Kerberos Authentifizierung auch im NLB.&nbsp;&nbsp;NLB und KerberosF&uuml;r ein erfolgreiche Kerberos Authentifizierung muss der Service Principal Name den der Client verwendet um sich mit dem Server zu verbinden im Active Directory Account des Servers registriert sein. Der SPN muss im gesamten Forest eindeutig sein, d.h. nur ein Account kann den SPN f&uuml;r die NBL IP Adresse verwenden. Verbinden sich Clients mit anderen Knoten im Cluster schl&auml;gt die Kerberos Authentifizierung fehl, da der SPN nicht stimmt.Bisher konnte der &ldquo;Microsoft Forefront TMG Firewall Service&rdquo; nur als Network Service laufen, d.h. f&uuml;r Kerberos Authentifizierungen wurde das Computerkonto jedes TMG Servers verwendet.Mit Service Pack 2 kann man den Firewall Dienst als Dom&auml;nenbenutzer starten, registriert man auf diesen Dom&auml;nenbenutzer die ben&ouml;tigten SPNs funktioniert die Kerberos Authentifizierung im Clusterbetrieb.Service Account SicherheitAus Sicherheitsgr&uuml;nden sollte man ein eigenes Benutzerkonto f&uuml;r den TMG Service anlegen, dieses Benutzerkonto sollte ausschlie&szlig;lich f&uuml;r TMG verwendet werden und keine weiteren Berechtigungen in der Domain haben. Au&szlig;erdem sollte man das Konto aus der Gruppe &ldquo;Domain Users&rdquo; entfernen, und eine andere Gruppe als prim&auml;re Gruppe definieren. Auch dieses Gruppe sollte kein Berechtigungen in der Domain oder auf einem anderen System haben.Forefront TMG erteilt dem Benutzerkonto automatisch die minimal ben&ouml;tigten Berechtigungen wenn man den Firewall Service f&uuml;r dieses Konto konfiguriert. Auch auf dem TMG ist somit keine Konfiguration von Berechtigungen f&uuml;r das Service Account notwendig.KonfigurationNach der Installation von Service Pack 2 kann man in den Eigenschaften des Arrays, im Reiter &ldquo;Credentials&rdquo; das Konto ausw&auml;hlen unter dem der Firewall Service in Zukunft laufen soll.SPN hinzuf&uuml;genUm einen Serivce Principal Name zum Service Account hinzuzuf&uuml;gen, kann man z.B. das Tool &ldquo;setspn&rdquo; verwenden.Registrierte SPNs anzeigen:setspn &ndash;L benutzername&lt;/p&gt;setspn &ndash;L computername&lt;/code&gt;Neuen SPN registrieren:setspn -S http/myArray.ntsystems.local tmgSvcUsrDer Parameter &ndash;S &uuml;berpr&uuml;ft zuerst ob der SPN nicht bereits von einem anderen Konto verwendet wird, anschlie&szlig;end wird er zum Konto hinzugef&uuml;gt.Verify Kerberos AuthenticationMit einem Netzwerk Analyse Tool sieht man dass vor der Registrierung des SPN NTLM f&uuml;r Proxy Authentifizierung verwendet wird.Wurde der Firewall Service als Domain User gestartet und der ben&ouml;tigte SPN registriert, wird Kerberos verwendet.Der Client verwendet jetzt GSS-API, also Kerberos, um sich zu authentifizieren. Mit &ldquo;klist&rdquo; kann man sehen dass der Client jetzt ein Ticket f&uuml;r den Array Namen hat.Achtung: Es m&uuml;ssen alle Mitglieder im Array aktualisiert werden, bevor der Firewall Service als Domain User gestartet werden kann. Au&szlig;erdem sollte man den SPN erst dann hinzuf&uuml;gen, wenn der Firewall Service als Domain User l&auml;uft da es sonst zu Authentifizierungsproblemen kommt.&nbsp;Weitere Informationen zu &ldquo;Kerberos authentication on an NLB array&rdquo; im TechNet: http://technet.microsoft.com/en-us/library/hh454304.aspxUm Forefront TMG SP2 installieren zu k&ouml;nnen muss Forefront TMG SP1 Update 1 installiert sein, Download: http://www.microsoft.com/download/en/details.aspx?id=11445&nbsp;so long, tom\"\n},{\n  \"title\": \"Windows Server 8 CP–DHCP Server Failover\",\n  \"url\": \"/post/windows-server-8-cp-dhcp-server-failover/\",\n  \"date\": \"March 9, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"author\": \"tto\",\n  \"content\": \"In Windows Server Versionen bis 2008R2 gab es f&uuml;r eine ausfallsichere DHCP Umgebung zwei M&ouml;glichkeiten, ein sogenanntes Split Scope Deployment oder ein Windows Failover Cluster. Beide Varianten haben Nachteile, im Split Scope Deployment teilen sich mehrere DHCP Server einen Bereich. F&auml;llt ein Server aus, gibt es auf den verbleibenden Servern unter Umst&auml;nden nicht genug freie Adressen, auch Leases bzw. Reservierungen sind nicht konsistent. Ein Failover Cluster hat einen gewissen administrativen Aufwand (Shared Storage) und erfordert Windows Server Enterprise Lizenzen f&uuml;r alle Knoten im Cluster.Windows Server 8 DHCP Server FailoverDHCP Server Failover bietet die M&ouml;glichkeit zwei DHCP Server f&uuml;r einen Bereich zu konfigurieren. Es muss sich dabei um Windows 8 DHCP Server handeln, andere Hersteller oder &auml;ltere Server Betriebssysteme werden nicht unterst&uuml;tzt. Im Load Sharing Modus bedienen beide Server Client Anfragen und replizieren die Lease Informationen. F&auml;llt ein Server aus kann der zweite Server bereits bestehende Leases verl&auml;ngern. Au&szlig;erdem verf&uuml;gen beide Server &uuml;ber den gesamten Bereich, Reservierungen und Optionen werden ebenfalls zwischen den Servern repliziert und sind so konsistent.Load Sharing ModeIm Standard Modus wird ein Failover Relationship im Load Sharing betrieben, das bedeuted Clientanfragen werden gleichm&auml;&szlig;ig auf die beiden DHCP Server verteilt. Die Verteilung der Anfragen kann &uuml;ber den Wert load-balancing ratio konfiguriert werden. Der Load Sharing Mode eignet sich f&uuml;r Server im selben Standort.Hot Standby ModeAlternativ k&ouml;nnen die DHCP Server im Hot Standby Mode betrieben werden, dabei ist ein Server &ldquo;aktiv&rdquo; und bedient Clientanfragen. Der zweite Server &uuml;bernimmt diese Aufgabe sobald er erste nicht mehr verf&uuml;gbar ist. Die Entscheidung ob ein Server &ldquo;aktiv&rdquo; oder &ldquo;standby&rdquo; ist, kann f&uuml;r jeden DHCP Bereich getroffen werden, ein Server kann also standby f&uuml;r einen Bereich sein und gleichzeitig aktiv f&uuml;r einen andern. Der Hot Standby Mode eignet sich f&uuml;r Au&szlig;enstellen oder kleinere Standorte an denen kein zweiter Server vor Ort ist und ein Server im entfernten Rechenzentrum nur im Problemfall &uuml;bernehmen soll.DHCP Rolle installierenDie DHCP Server Rolle wird &uuml;ber den Server Manager hinzugef&uuml;gt, dazu verwendet man den Add Roles and Features Wizard.Die entsprechende Rolle ausw&auml;hlen, und entscheiden ob der Server automatisch neustarten soll, das ist f&uuml;r DHCP nicht notwendig.Nach der Installation wei&szlig;t der Post-Install configuration Wizard darauf hin, dass man den Server noch im Active Directory autorisieren muss.Nat&uuml;rlich kann man die Rolle auch mit der PowerShell hinzuf&uuml;gen, verwendet wird dazu das Modul ServerManager (PowerShell v3 importiert Module automatisch, also kein Import-Module):Auch nach dieser Insatllation wei&szlig;t der ServerManager auf notwendige Post-Install Schritte hinEs sind jetzt zwei DHCP Server verf&uuml;gbar, nun geht es an die Failover Konfiguration.DHCP Server Failover Konfiguration&Uuml;ber einen Rechtsklick auf einen DHCP Server im Server Manager &ouml;ffnet man die bekannte dhcpmgmt Konsole (doch nicht &uuml;berall Metro).Ein neuer Bereich wird, wie immer, mit einem Rechtsklick auf den IPv4 Knoten erstellt. Dabei hat sich mit WS8 nichts ge&auml;ndert, man w&auml;hlt einen Namen, das Subnet bzw. den IP Range sowie Optionen wie Gateway und DNS Server.Jetzt kann man entscheiden ob man DHCP Failover f&uuml;r den gesamten Server oder f&uuml;r jeden einzelnen Bereich konfigurieren will. Je nach dem f&uuml;r welche Konfiguration man sich entscheidet, beginnt man mit der Konfiguration auf dem IPv4 Knoten oder auf dem jeweiligen Bereich.Mit &ldquo;Configure Failover&rdquo; wird die Konfiguration gestartet, als ersten Schritt muss man den Partner-Server angeben.Nach der Auswahl des Partner-Servers werden einige Voraussetzungen f&uuml;r eine erfolgreiche Failover Beziehung &uuml;berpr&uuml;ft, unter anderem wird &uuml;berpr&uuml;ft ob der Server erreichbar ist, ob mindestens Windows Server 8 Beta installiert ist, ob der angemeldete Benutzer &uuml;ber ausreichende Rechte verf&uuml;gt (Mitglied der Gruppe DHCP Administrators) und ob auf dem Partner &uuml;berhaupt ein DHCP Server l&auml;uft. Sind die Vorrausetzungen ok, wird ein Dialog f&uuml;r die Konfiguration des Failover Relationships angezeigt.In diesem Dialog wird der Failover Mode konfiguriert. Au&szlig;erdem kann die Load Sharing ratio hier festgelegt werden. Maximum Client Lead Time gibt die tempor&auml;re Lease Zeit f&uuml;r neue Clients an, deren Anfragen der Failover Server bedient. Auch die Zeit nach der ein Server im Partner-Down-State den gesamten Bereich &uuml;bernimmt wird durch die MCLT gesetzt.Wird der Hot Standby Mode gew&auml;hlt, kann anstelle der Load Sharing ratio die Menge an Adressen Konfiguriert werden, welche f&uuml;r den Standby Server reserviert werden. Sollten keine Adressen reserviert werden, kann der Standby Server erst dann neue Clients bedienen, wenn er den gesamten Bereich &uuml;bernommen hat, das dauert standardm&auml;&szlig;ig eine Stunde (MCTLT).Das Auto State Switchover interval gibt an nach welcher Zeit ein Server vom communication interrupted in den partner down state wechselt. Standardm&auml;&szlig;ig passiert das nach 10 Minuten.Hat man die Optionen konfiguriert wird die Partnerschaft konfiguriert. F&uuml;r die Failover Konfiguration wird TCP Port 647 verwendet.In den Eigenschaften des Bereiches gibt es den neuen Reiter Failover, dort kann man den Status der Failover Partnerschaft und die konfigurierten Optionen sehen.Konfiguration &auml;ndern oder l&ouml;schenUm die Konfiguration zu &auml;ndern, &ouml;ffnet man die Eigenschaften des IPv4 Konten und w&auml;hlt dort unter Failover die entsprechende Partnerschaft aus.Mit Edit kann man die ausgew&auml;hlte Partnerschaft &auml;ndern, mit delete wird diese gel&ouml;scht.Verify FailoverMit einem Netzwerk Analyse Tool sieht man die DHCP Kommunikation, hier ist zu beobachten dass der Client zwei DHCP Offers bekommt. Eine von jedem Server in der Failover Konfiguration.Beide DHCP Offers sind bis auf die angebotene Lease Time identisch, der &ldquo;aktive&rdquo; Server bietet eine Adresse mit der im Bereich konfigurierten Lease Time an (8 Tage).W&auml;hrend die Lease Time im Offer des &ldquo;standby&rdquo; Servers der Maximum Client Lead Time entspricht.&nbsp;so long, tom\"\n},{\n  \"title\": \"Wireshark und Windows 8\",\n  \"url\": \"/post/wireshark-und-windows-8/\",\n  \"date\": \"March 9, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"de\",\"Server-2012\"],\n  \"author\": \"tto\",\n  \"content\": \"Eines der ersten Tools das auf meinen Ger&auml;ten installiert wird ist das Analysetool Wireshark.Nach der Installation auf Windows 8 konnte ich keine neuen Captures starten, es war kein Interface verf&uuml;gbar.Das Problem scheint am WinPCAP Treiber zu liegen, die L&ouml;sung war einfach. Ich habe den WinPCAP im &ldquo;Kompatibilit&auml;tsmodus&rdquo; Windows 7 neu installiert.&nbsp;Download WinPCAP: www.winpcap.orghave fun!\"\n},{\n  \"title\": \"Windows Server 8 CP–AD Administrative Center\",\n  \"url\": \"/post/windows-server-8-cp-ad-administrative-center/\",\n  \"date\": \"March 4, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2012\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit Windows Server 2008R2 wurde das Active Directory Verwaltungscenter oder Administrative Center eingeführt. Es sollte das seit Windows 2000 bekannte Active Directory Users and Computers Snap-in ersetzen. Das Verwaltungscenter in Windows 8 Server Beta kommt im Metro Style daher und ist Teil der ADDS Simplified Administration. Es bietet einige sehr nützliche Funktionen, unter anderem endlich eine grafische Oberfläche für PSO und den AD Papierkorb. Außerdem werden die neuen Dynamischen ACLs über das Verwaltungscenter konfiguriert.Da es auf PowerShell aufsetzt, ist ein PowerShell History Viewer integriert.Metro StyleGeöffnet wird das Administrative Center über “Tools” im Server Manager oder man führt “dsac.exe” aus.“Reset Password” und “Global Search” sind schon aus dem ADAC von 2008R2 bekannt, neu ist die PowerShell History im unteren Bereich. Öffnet man diesen sieht man die PowerShell Befehle welche das ADAC zuletzt ausgeführte. Active Directory Recycle BinAuch der AD Papierkorb wurde mit Windows Server 2008R2 eingeführt, die Verwendung war zwar etwas kompliziert (keine grafische Oberfläche), trotzdem war es eine nützliche Erweiterung. Mit Windows Server 8 gibt es ein GUI um gelöschte Objekte einfach zu finden und wiederherzustellen.Sollte der AD Recycle Bin noch nicht aktiv sein, kann man ihn im ADAC gleich aktivieren. Dafür muss sich der Forest im “Windows Server 2008R2” Functional Level befinden.Einfach auf “Enable Recycle Bin…” klicken und den Dialog bestätigen, schon ist der Recycle Bin aktiv. Natürlich muss die Änderung auf alle DCs repliziert werden, erst wenn dieser Vorgang abgeschlossen ist funktioniert er zuverlässig.Im der PowerShell Histroy sieht man sofort welcher Befehl ausgeführt wurde: Enable-ADOptionalFeature -Confirm:$false -Identity:&quot;766ddcd8-acd0-445e-f3b9-a7f9b6744f2a&quot; -Scope:&quot;ForestOrConfigurationSet&quot; -Target:&quot;tomt.local&quot;Löscht man jetzt ein Objetk aus dem AD wird es in den neu erstellten Container “Deleted Objects” verschoben. Dort bleibt es (mit all seinen Attributen und Links) bis die Deleted Objects Lifetime (msDS-DeletedObjectLifetome)abgelaufen ist, dann wird es zum recycled Object. Nach Ablauf der Recylced Object Lifetime (tombstoneLifetime) wird es vom Garbage Collection Process endgültig aus der AD Datenbank gelöscht.Im “Deleted Obejects” Container findet man gelöschte Objekte die nach aktiveren des Recylce Bin Features gelöscht wurden und deren Deleted Objects Lifetime noch nicht abgelaufen ist. Man kann in dem Container suchen und die Ansicht filtern um die gewünschten Objekte zu finden.Hat man die Objekte gefunden kann man diese einzeln oder mehrere zusammen wiederherstellen. Einfach rechts auf das Objekt klicken und “Restore” oder “Restore To…” auswählen.“Restore” stellt die Objekte an ihrem Ursprünglichen Ort wieder her (lastKnownParent), mit “Restore To…” erhält man folgenden Dialog und kann das Ziel auswählen.Auch hier werden in der PowerShell History die ausgeführten Befehle angezeigt:Restore-ADObject -Confirm:$false -Identity:&quot;bb127a94-277f-4a7d-a09b-5893906cb16b&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot;Fine-Grained Password PolicyFine-Grained Password Policies wurden mit Windows Server 2008 eingeführt, sie waren eine wichtige Neuerung und auch sie waren in der Verwendung nicht ganz einfach.Mit dem neuen ADAC gibt es eine GUII für die sogenannten PSOs oder Password Setting Objects. Um ein neues PSO zu erstellen öffnet man den Container Password Settings (“CN=Password Settings Container,CN=System,DC=tomt,DC=local”) und klickt auf New, Password Settings.Im Dialog “Create Password Settings” kann man die Fine-Grained Password Policy konfigurieren und diese gleich einer Gruppe oder einem Benutzer zuweisen. Ist ein Benutzer Mitglied in mehreren Gruppen auf die ein PSO angewendet wird, hat jenes mit dem niedrigerem Precedence Wert (msDS-PasswordSettingsPrecedence) Vorrang.Und auch hier wieder die entsprechenden PowerShell Befehle:Add-ADFineGrainedPasswordPolicySubject -Identity:&quot;CN=pso_group1,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot; -Subjects:&quot;CN=group1,OU=groups,OU=tomt,DC=tomt,DC=local&quot;      &lt;/p&gt;    New-ADFineGrainedPasswordPolicy -ComplexityEnabled:$true -LockoutDuration:&quot;00:30:00&quot; -LockoutObservationWindow:&quot;00:30:00&quot; -LockoutThreshold:&quot;0&quot; -MaxPasswordAge:&quot;42.00:00:00&quot; -MinPasswordAge:&quot;1.00:00:00&quot; -MinPasswordLength:&quot;7&quot; -Name:&quot;pso_group2&quot; -PasswordHistoryCount:&quot;24&quot; -Precedence:&quot;20&quot; -ReversibleEncryptionEnabled:$false -Server:&quot;WIN8CP-DC1.tomt.local&quot;          Set-ADObject -Identity:&quot;CN=pso_group2,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -ProtectedFromAccidentalDeletion:$true -Server:&quot;WIN8CP-DC1.tomt.local&quot;&lt;/code&gt;  Durch diese neuen grafischen Oberflächen wird das ADAC wahrscheinlich mehr Verwendung finden als sein Vorgänger. Auch an den Metro Style wird man sich gewöhnen (müssen).  &#160;  so long,   tom\"\n},{\n  \"title\": \"Windows Server 8 CP–Remote Group Policy refresh\",\n  \"url\": \"/post/windows-server-8-cp-remote-group-policy-refresh/\",\n  \"date\": \"March 4, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit Windows Server 8 kann man einen Group Policy refresh auf remote Computern initiieren. Verwendet wird dazu die GPMC oder natürlich PowerShell.Group Policy Management ConsoleMan wählt die OU aus in der sich die Computerkonten befinden auf denen man das Update ausführen möchte. Achtung: Man kann das GP Update nur auf Computerkonten initiieren, es werden aber Computer und Benutzerrichtlinien aktualisiert.Mit einem Rechtsklick auf die OU kann man “Group Policy Update…” auswählen. Der Dialog um das Update zu bestätigen zeigt an um wie viele Computer es sich handelt.Klickt man auf “Yes” wird “gpupdate /force” auf den erreichbaren Computern ausgeführt.Ein kurzer Report wird angezeigt, in dem evtl. Fehler sichtbar sind.PowerShellMit dem cmdlet “Invoke-GPUpdate” aus dem Modul “GroupPolicy” kann man das GP Update auch per PowerShell starten.Invoke-GPUpdate –Computer “win8cp-dc1”FirewallDamit das Remote GP Update funktioniert müssen folgende Windows Firewall Regeln aktiviert sein (Verbindungen akzeptieren)   Remote Scheduled Tasks Management (RPC)    Remote Scheduled Tasks Management (RPC-EPMAP)    Windows Management Instrumentation (WMI-IN) &#160;tom\"\n},{\n  \"title\": \"Windows Server 8 CP –ServerManager\",\n  \"url\": \"/post/windows-server-8-cp-servermanager/\",\n  \"date\": \"March 4, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit kurzem die Beta des neuen Servers verfügbar, natürlich musste mal wieder ein neuer Name her: Windows Server “8” Consumer Preview.Der neue Server Manager ist natürlich im Metro Style und ist über die RSAT (Remote Server Administration Tools) auch für das neue Client OS (Windows 8 Consumer Preview) verfügbar.Download RSAT (Beta/CP): http://www.microsoft.com/download/en/details.aspx?id=28972DashboardÜber das Dashboard sieht man eine Zusammenfassung der verwalteten Server und Rollen. Der Status wird automatisch aktualisiert, standardmäßig alle 10 Minuten. Man wird so auf evtl. Probleme hingewiesen.Über “Manage” kann man Server hinzufügen oder Rollen und Features auf bereits verwalteten Server installieren.Fügt man einen Server hinzu, kann man diese aus dem Active Directory suchen oder den DNS Namen angeben, außerdem kann man Textdateien die Servernamen enthalten importieren.Damit man einen Server hinzufügen kann muss die Remoteverwaltung (WinRM) dort aktiviert werden, DCOM wird nicht mehr benötigt.Server GroupsMit Server Gruppen können mehrere Server die z.B. dieselbe Aufgabe erfüllen zu einer Gruppe hinzugefügt werden.&#160;&lt;h1&gt;Add Roles and Features&lt;/h1&gt;  &lt;p&gt;Über den Server Manager können Rollen und Features auf allen verwalteten Server hinzugefügt oder entfernt werden. In folgendem Beispiel füge ich einen weiteren Domain Controller hinzu. Alle Schritte führe ich auf meinem Windows 8 CP Client mit RSAT aus.&lt;/p&gt;  &lt;p&gt;Unter “Manage” klicke ich auf “Add Roles and Features” um den Wizard zu starten.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_377.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_375.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle die Art der Installation und den Zielserver aus.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_378.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_376.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle Active Directory Domain Services aus und bestätige dass ich die nötigen Rollen sowie die Management Tools installieren möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_379.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_377.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_380.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_378.png\\\" width=\\\"234\\\" height=\\\"244\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wurden die ADDS Binaries auf dem Zielserver installiert erhält man eine Notification im Server Manager, hier wird auch gleich der “Task” angezeigt um den Server zum Donain Controller zu machen (zu promoten)&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_381.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_379.png\\\" width=\\\"244\\\" height=\\\"132\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich klicke also auf “Promote this server to a domain controller” und komme so zu folgendem Wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_382.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_380.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wie bereits mit “dcpromo” kann man auch hier auswählen ob man den DC zu einer bestehenden Domain, eine neue Domain in einem bestehenden Forest hinzufügen, oder gleich einen neuen Forest erstellen möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_383.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_381.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Im nächsten Schritt werden die DC Options konfiguriert. Der DC soll DNS sowie Global Catalog sein, außerdem wird hier die Site ausgewählt und das DSRM Passwort gesetzt.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_384.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_382.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Man kann noch die Pfade für die ADDS Datenbank und Log Files sowie den SYSVOL Share setzen.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_385.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_383.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ist die Konfiguration abgeschlossen kommt man zur “Review Options” Seite, man kann die ausgewählten Optionen nochmal überprüfen. Das eigentlich interessante an dieser Seite ist jedoch der Button “View Script” er zeigt das PowerShell Script an, welches auf dem Remote Server ausgeführt wird.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_386.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_384.png\\\" width=\\\"244\\\" height=\\\"211\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der Server Manager erledigt alle Tasks mit PowerShell Befehlen, dcpromo kann noch für “unattended” Insatllationen verwendet werden, die Empfehlung von Microsoft ist es allerdings “dcpromo” nicht mehr zu verwenden.&lt;/p&gt;  &lt;p&gt;Server Manager führt einen prerequisite Check auf dem Zielserver durch, dabei wird überprüft ob der Server zum DC promoted werden kann.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_387.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_385.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nach dem Klick auf “Install” gehts los, der Server wird hochgestuft, und DNS sowie die AD Tools werden installiert. Anschließend wird der Server neu gestartet und ich habe einen neuen DC.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;tom&lt;/p&gt;\"\n},{\n  \"title\": \"PowerShell loves WMI – OS Info\",\n  \"url\": \"/post/powershell-loves-wmi-os-info/\",\n  \"date\": \"February 28, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit dem cmdlet Get-WmiObject kann Windows PowerShell auf WMI Objekte zugreifen. Man kann also z.B. die Eigenschaften der Klasse “Win32_OperatingSystem” anzeigen und daraus Informationen über das Betriebssystem erhalten.Die vollständige Liste der Eigenschaften (und Methoden) gibt es im MSDN. Oder natürlich mit folgendem Befehl:Get-WmiObject -Class win32_OperatingSystem -Property * | select *Interessante EigenschaftenOperatingSystemSKU: Enthält die installierte Version des Betriebssystems, z.B. Ultimate, Enterprise, Datacenter Server EditionProductType: Workstation, Domain Controller, ServerBuildNumber: Enthält die Build Nummer des BetriebssystemsOSArchitecture: 32-Bit oder 64-BitFilterMan kann aufgrund dieser Eigenschaften einfache Filter für Scripts erstellen und so z.B. sicherstellen dass ein bestimmtes Script nur auf einem bestimmten Betriebssystem ausgeführt wird.#Variable OS erstellen, enthält alle Informationen der angegebenen Klasse&lt;/p&gt;    $OS = Get-WMIObject –Class Win32_OperatingSystem    if($OS.OperatingSystemSKU -eq &quot;4&quot; -and $OS.Caption -like &quot;*Windows 7*&quot;) {    #Code für Windows 7 Enterprise    } else {    #Code für jedes andere OS    }    if ($os.OSArchitecture -eq &quot;64-bit&quot;){    #Code für x64     } else {    #Code für x86    }&lt;/code&gt;  Das sind natürlich sehr einfache Beispiele, wie mächtig WMI ist kann man sich am besten in der WMI Reference ansehen. Außerdem enthält das Beispiel keine Fehlerüberprüfung, läuft irgendwas schief, wars das.  Remote  Natürlich kann man auch Informationen über einen oder mehrere remote Computer auswerten. Das cmdlet Get-WmiObject hat den Parameter Computername über den man einen oder mehrere Computernamen (getrennt mit Komma) abfragen kann. Über Pipline Input kann man dem cmdlet Computernamen aus einem Textfile oder dem ActiveDirectory übergeben.  Get-WmiObject –Class win32_OperatingSystem –Computer mypc1,mypc2&lt;/p&gt;    Get-ADComputer -Filter 'Name -like &quot;*Server*&quot;'| Get-WmiObject –Class win32_OperatingSystem&lt;/code&gt;  &#160;  so long,  tom\"\n},{\n  \"title\": \"PowerShell Implicit Remoting\",\n  \"url\": \"/post/powershell-implicit-remoting/\",\n  \"date\": \"February 25, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Eine der wichtigsten Funktionen der PowerShell ist die M&ouml;glichkeit cmdlet&rsquo;s (ScriptBlocks) auf remoten System auszuf&uuml;hren. Dazu wird eine PowerShell Sesion mit dem Remote Computer erstellt, die Befehle werden remote ausgef&uuml;hrt und das Ergebnis lokal angezeigt.Nun gibt es verschiedene Module f&uuml;r das Verwalten von Serverrollen wie z.B. Active Directory, Exchange 2010 oder Lync 2010. Will ich von meinem Client aus diese cmdlet&rsquo;s verwenden muss ich die Module installieren. Oder?Session erstellen und Modul LadenMan erstellt eine neue PSSessoin mit einem Computer auf dem das entsprechende Modul installiert ist.$ADSession = New-PSSession &ndash;ComputerName dc01.domain.localDann wird das Modul in der gerade erstellten Session geladen:Invoke-Command {Import-Module ActiveDirectory}&nbsp; -Session $ADSessionImport-PSSessionBefehle aus einer Session k&ouml;nnen mit Import-PSSession in die aktuelle PowerShell Sitzung &uuml;bernommen werden, man kann entweder alle Verf&uuml;gbaren cmdlet&rsquo;s importieren oder nur einen Teil. In diesem Beispiel interessieren mich die cmdlets aus dem ActiveDirectory Modul, die entsprechenden Nouns beginnen mit AD, ich kann also auf *-AD* Filtern und so nur ActiveDirectory cmdlet&rsquo;s &uuml;bernehmen.Import-PSSession -Session $ADSession-CommandName *-AD*So kann ich in meiner aktuellen PS Sitzung die AD cmdlet&rsquo;s wie Get-ADUser verwenden. Schlie&szlig;e ich das aktuelle PS Fenster wars das mit den AD cmdlet&rsquo;s.Export-PSSessionDamit man sich diese Befehle nicht merken muss und die cmdlet&rsquo;s einfach wiederverwendet kann, erstellt Export-PSSession automatisch ein Modul mit den gew&uuml;nschten remote cmdlet&rsquo;s.Export-PSSession $ADSession -OutputModule AD -CommandName *-AD* &ndash;AllowClobberJetzt kann man das aktuelle PowerShell Fenster schlie&szlig;en, ein Modul wurde erstellt das wie gewohnt geladen werden kann.Import-Module ADDie Befehle aus dem Modul sind jetzt verf&uuml;gbar, allerdings gibt es noch keine PSSession. Diese muss jedoch nicht manuell erstellt werden, f&uuml;hrt man den ersten Befehl aus dem Modul aus (Get-ADUser username) wird automatisch eine PS Session mit dem remote Computer erstellt und das cmdlet ausgef&uuml;hrt.So kann man also auf jedem beliebigen Client (auf dem nur PowerShell v2 installiert ist) cmdlet&rsquo;s ausf&uuml;hren die auf dem Server laufen.Exchange und LyncExchange und Lync bieten einen eigenen Endpoint f&uuml;r PowerShell Verbindungen, man gibt diesen bei der Erstellung der PSSession als ConnectionURI an.$exSession = New-PSSession -ConnectionUri 'http://ex14.domain.local/powershell/&rsquo; -ConfigurationName Microsoft.Exchange -Authentication Kerberos&lt;/p&gt;$lyncSession = New-PSSession &ndash;ConnectionUri &lsquo;https://lync.domain.local/ocspowershell&rsquo;&lt;/code&gt;Hat man die gew&uuml;nschte Session erstellt kann man sie wie gehabt mit Import-PSSession gleich verwenden oder mit Export-PSSession ein Modul erstellen.PrefixDamit man die lokalen und remoten cmdlet&rsquo;s unterscheiden kann, gibt es den Parameter &ndash;Prefix f&uuml;r die cmdlet&rsquo;s Import-Module und Import-PSSession.Import-Module AD &ndash;Prefix &lsquo;r&rsquo;So wird jedem Noun ein &lsquo;r&rsquo; vorgestellt, ich verwende also z.B. Get-rMailbox, Get-rADUser usw.&nbsp;Ich denke diese wenig bekannte Funktionalit&auml;t zeigt wie genial das Konzept der PowerShell ist, mit Windows 8 sollen jede Menge weitere cmdlet&rsquo;s dazukommen. PowerShell wird das ultimative Admin Werkzeug werden.&nbsp;so long, happy hacking!tom\"\n},{\n  \"title\": \"Exchange 2010 SP2 Installation\",\n  \"url\": \"/post/exchange-2010-sp2-installation/\",\n  \"date\": \"February 24, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Service Pack 2 für Exchange 2010 ist seit über zwei Monaten verfügbar,langsam Zeit sich ernsthaft gedanken über ein Update zu machen. Dabei gibt es ein paar Dinge zu berücksichtigen, hier eine kurze Zusammenfassung.Active Directory SchemaEs gibt ein neues Active Directory Schema, ein paar Infos dazu hier: http://blogs.technet.com/b/exchange/archive/2012/01/17/custom-aka-extension-attributes-in-exchange-2010-sp2-and-their-use.aspxUm das AD Schema zu aktualisieren benötigt man “Schema Admin” Berechtigungen, installiert man Exchange 2010 SP2 mit einem Benutzer der diese Rechte hat wird das Schema automatisch erweitert. Alternativ kann man die Setup Files von SP2 auf den Schema-Master kopieren und mit setup.com /prepareAD das Update durchführen.Die aktuelle Schema Version findet man folgendermaßen:Active Directory Schema:Get-ADObject &quot;cn=schema,cn=configuration,dc=ath,dc=int&quot; -Properties ObjectVersionExchange Schema:Get-ADObject &quot;cn=ms-Exch-Schema-Version-Pt,cn=schema,cn=configuration,dc=domain,dc=local&quot; -Properties RangeUpperGenauere Infos und die genauen Schema Versionsnummern gibt es im TechNet Wiki.Client Access Sever PrerequisiteDie Systemvoraussetzungen für die Client Access Rolle wurden geändert, hinzugefügt wurde IIS 6 Wmi Compatibility oder “web-wmi”. Das Feature kann automatisch installiert werden wenn die entsprechende Option beim Setup aktiviert wird, alternativ kann man es im Servermanager oder per Powershell installieren.Import-Module Servermanager&lt;/p&gt;    Add-WindowsFeature Web-WMI&lt;/code&gt;  Execution Policy GPO  In vielen Umgebungen werden Einstellungen wie z.B. die PowerShell Execution Policy über Gruppenrichtlinien gesteuert. Diese Gruppenrichtlinie führt zu einem Problem bei der Installation des Service Packs das den Server in einem Status zurücklässt in dem Exchange nicht mehr läuft und die Installation nicht fortgesetzt werden kann. Der Fehler “AuthorizationManager check failed” wird angezeigt. Klingt nach Restore.  Um das zu verhindern muss man die Gruppenrichtlinie vor dem Update deaktivieren, überprüft werden kann das so:  Get-ExecutionPolicy –List    Wichtig ist hierbei dass MachinePolicy und UserPolicy auf “Undefined” stehen.  Genaueres gibt es in der Knowledge Base.  Release Notes  Wie vor jedem Update empfehle ich hier auf jeden Fall einen Blick auf die Release Notes zu werfen.  &#160;  so long,   tom\"\n},{\n  \"title\": \"Windows PowerShell v3.0 (CTP 2)\",\n  \"url\": \"/post/windows-powershell-v30/\",\n  \"date\": \"February 24, 2012\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Schon seit einiger Zeit ist das Community Technology Preview 2 vom Windows Management Framework 3.0 verfügbar, unter anderem enthält es die Windows PowerShell v3.Um in den Genuss der neue Features wie “automatic module loading” und “robust sessions” zu kommen benötigt man ein englisches Windows 7 und das .NET Framework 4. Ist das Betriebssystem in einer anderen Sprache installiert muss man vor der Installation des Management Frameworks das englische Sprachpaket installieren.DownloadAchtung: Es handelt sich um pre-release Code, sollte natürlich nur in Testumgebungen verwendet werden!.NET Framework 4 - http://go.microsoft.com/fwlink/?LinkID=212547Windows Management Framework 3.0 - Community Technology Preview (CTP) #2 - http://www.microsoft.com/download/en/details.aspx?id=27548InstallationDie Installation ist denkbar einfach, zuerst wird das .NET Framework installiert, anschließend je nach Platform WINDOWS6.1-KB2506143-x64.msu oder WINDOWS6.1-KB2506143-x86.msu. Nach einem neustart ist die neue PS verfügbar.Einige FeaturesWie bereits erwähnt enthält die neue PowerShell eineige neue Features sowie jede Menge neue cmdlets. Besonders gut gefallen mir die “Robusten Sessions”, verliert man die Netzwerkverbindung ist eine PowerShell Session mit einem remoten Host für gewöhnlich weg. Mit PS v3 wird die Session automatisch wieder hergestellt.Außerdem angenehm ist das autmatische Laden von Modulen, wer z.B. diverse Admin-Tools (Active Directory, Exchange) installiert hat muss in einer neuen PowerShell Session immer Module nachladen (oder ein entsprechendes Profil erstellen). Mit v3 wird ein Modul automatisch geladen wenn ein cmdlet aus dem Modul verwendet wird.PowerShell v2Man kann natürlich auch mit installierter PS v3 die Version 2 verwenden, da es sich um pre-release Code handelt kann es durchaus zu Problemen kommen. Um v2 zu starten wird die powershel.exe mit dem Parameter “-version 2” gestartet.Weitere InformationenEin guter Start ist das TechNet Wiki: http://social.technet.microsoft.com/wiki/contents/articles/4741.powershell-v3-featured-articles-en-us.aspx&#160;tom\"\n},{\n  \"title\": \"Exchange 2010–Restore Mailbox Content\",\n  \"url\": \"/post/exchange-2010-recovery/\",\n  \"date\": \"November 20, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber ein anderes mal mehr.Restore FilesDie Datenbank wird von der Sicherung zurück geholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Wiederherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die .edb Datei (Datenbank) und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Recovery DatabaseIst die Wiederherstellung abgeschlossen wird mit der Exchange Management Shell eine Recovery Database erstellt, diese verwendet die wiederhergestellte .edb Date sowie die wiederhergestellten Log Files. Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server MBX01, X:\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner wiederhergestellt wurden.New-MailboxDatabase RDB01 –Recovery –Server MBX01 –EdbFilePath x:\\\\restore\\\\db.edb –LogFolderPath x:\\\\restore Die Datenbank wurde also erstellt, allerdings wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.EseutilUm die Datenbank in einen sauberen Status zu bringen wird eseutil.exe verwendet. Dabei ist es wichtig die richtigen Parameter zu verwenden.Als erstes kann man überprüfen in welchen Zustand sich die Datenbank befindet:Eseutil /mh x:\\\\restore\\\\db.edbDie Datenbank ist also im “Dirty Shutdown” State und kann so nicht gemounted werden, mit “eseutil /r” wird die DB ohne Datenverlust in einen “Clean Shutdown” State gebracht. Mit dem Parameter /r wird der Präfix der Logs angegeben, also am besten zuerst den Dateinamen den Logs überprüfen. Die Parameter /l und /d geben den Pfad zu den Logs&#160; bzw. zur Datenbank an.Eseutil /r “E01” /l x:\\\\restore\\\\ /d x:\\\\resotreAchtung: Sollte das nicht funktionieren kann mit eseutil /p ein Hard Repair durchgeführt werden, dabei wird die Datenbank ohne Rücksicht auf Verluste in den “Clean Shutdown” State gebracht. Datenverlust ist möglich!Nachdem Eseutil durchgelaufen ist und sich die Datenbank im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick auf die RDB oder mit der Management Shell und folgendem Befehl:Mount-Database RDB01Mailbox Restore RequestWenn die Recovery Database online ist kann man beginnen Mailbox Inhalte wiederherzustellen, dazu verwendet man das cmdlet New-MailboxResotreRequest. Folgendes Beispiel stellt den Inhalt der Mailbox “Test User” in den Ordner Restore derselben Mailbox wieder her.New-MailboxRestoreRequest –SourceDatabase ‘RDB01’ –SourceStoreMailbox ‘test user’ –TargetMailbox ‘test.user@ntsystems.it’ –TargetRootFolder ‘Restore’Folgendes Beispiel stellt den Inhalt aller Mailboxen der Datenbank DB01 wieder her. Es wird für jede Mailbox ein Restore Request erstellt, auch hier wird der Inhalt in den Ordner Restore der jeweiligen Mailbox wiederhergestellt.Get-Mailbox –Database ‘DB01’ |foreach { New-MailboxRestoreRequest -SourceStoreMailbox $_.Guid –SourceDatabase ‘RDB01’ -TargetMailbox $_.Guid –TargetRootFolder ‘Restore’}Bei diesem cmdlet ist zu beachten dass die Parameter –SourceStoreMailbox und -TargetMailbox verschiedene Eingaben unterstützen, am Besten die Mailbox GUID verwenden, diese wird von beiden unterstützt.Weitere Infos zu New-MailboxRestoreRequest gibt es im TechNet: http://technet.microsoft.com/en-us/library/ff829875.aspx&#160;CleanupWenn der Restore Vorgang abgeschlossen ist kann man die Recovery Database wieder entfernen, dazu muss sie zuerst mit folgendem Befehl dismounted werden:Dismount-Database RDB01Anschließend kann man die RDB löschen, dazu verwendet man folgenden Befehl:Remove-MailboxDatabase RDB01Die Datenbank ist jetzt aus der Konfiguration entfernt, die Files sind jedoch nach wie vor auf dem Server. Diese müssen manuell gelöscht werden.&#160;so long,   tom\"\n},{\n  \"title\": \"Exchange 2010 Unified Messaging–Cisco Call Manager 8.6\",\n  \"url\": \"/post/exchange-2010-unified-messaging-cisco-call-manager-86/\",\n  \"date\": \"November 20, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Unified Messaging in Exchange 2010 verbindet E-Mail mit Voice Messaging in einer Messaging Infrastruktur. E-Mail und Voice Mail Nachrichten werden in einer “unified” Mailbox verwaltet und der Benutzer erhält neben Outlook und OWA auch über das Telefon (OVA – Outlook Voice Access) Zugriff auf seine Mailbox.Um die Unified Messaging Rolle mit der “traditionellen” Telefonwelt zu verbinden braucht man ein IP Gateway oder eine IP Telefonzentrale wie den Cisco Call Manager.Exchange Unified MessagingDie Unified Messaging Server Rolle kann auf einem bestehenden Exchange Server hinzugefügt werden, alternativ kann man einen separaten UM Server installieren.PrerequisitesDie notwendigen Voraussetzungen müssen auf einem Windows Server installiert werden, dazu verwendet man am besten die Powershell. Folgendes Beispiel installiert die Voraussetzungen für einen Server der nur die UM Rolle betreibt.Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Desktop-Experience –RestartAchtung: Neustart erfolgt automatisch, sollte das nicht gewünscht sein den Parameter –Restart entfernen.UM Rolle InstallierenUm die Exchange UM Rolle zu installieren wird Setup.exe von einer aktuellen Version der Installationsmedien ausgeführt. Auf einem neuen Server wird dann nur die Unified Messaging Rolle installiert, ein bestehender Server wird über den “Maintenance Mode” um diese Rolle erweitert.Wie nach jeder Installation sollte man auch hier Windows Update ausführen und evtl. Updates installieren.UM KonfigurationNach der Installation der Rolle muss diese konfiguriert werden.Organization ConfigurationEin UM Dial Plan muss erstellt werden, dazu unter Organization Configuration auf Unified Messaging klicken und “New UM Dial Plan” wählen, hier wird der URI Type “Telephone Extension” ausgewählt sowie die länge der internen Telefonnummern (Extension) angegeben.Der UM Dial Plan ist die zentrale Komponente der UM Konfiguration und entspricht der Telefonzentrale bzw. Gruppen von Benutzern mit gleichen Telefonnummern (4 stellig) und dem selben URI Type (Telephone Extension).Der Dial Plan wird im Active Directory unter “CN=My 4 Digit DP, CN=UM DialPlan Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” gespeichert.Gleichzeitig mit dem Dial Plan wird eine UM Mailbox Policy erstellt, auch diese wird im AD unter “CN=My 4 Digit DP Default Policy, CN=UM Mailbox Policies, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain,DC=Local” gespeichert.Über die UM Mailbox Policy werden Einstellungen für UM aktivierte Postfächer konfiguriert.&#160;Als nächstes wird ein UM IP Gateway angelegt, das Gateway ist die SIP Gegenstelle. In diesem Fall gebe ich den Cisco Call Manager an. Um ein UM IP Gateway anzulegen klickt man unter Organization Configuration, Unified Messaging auf “New UM IP Gateway”.Für jedes IP Gateway wird im AD unter “CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” ein neuer Container angelegt.Eine Hunt Group verbindet das IP Gateway mit dem Dial Plan, wird beim erstellen des UM IP Gateways ein Dial Plan angegeben wird automatisch die “Default Hunt Group” erstellt. Dieser Default Hunt Group wird kein Pilot Identifier zugewiesen, d.h. alle eingehenden Calls (SIP Invites) werden angenommen.Wird die Hunt Group manuell erstellt kann ein Pilot Identifier angegeben werden, dadurch antwortet Exchange UM nur mehr auf Calls die eine konfigurierte Nummer anrufen. Ich verwende hier 9999 als Pilot Identifier, d.h. der Call Manager muss Anrufe an 9999 über den SIP Trunk routen.Um eine neue Hunt Group zu erstellen wählt man unter Organization Configuration, Unified Messaging das IP Gateway aus und klickt dann auf “New UM Hunt Group”.Die Hunt Group wird im Container des entsprechenden IP Gateways gespeichert, in diesem Fall unter: “CN=MY_CUCM_HuntGroup, CN=CUCM1, CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local”Die Verbindung zum Dial Plan wird im Attribut msExchUMHuntGroupDialPlanLink gespeichert.Die Exchange Unified Messaging Organisationskonfiguration ist somit abgeschlossen.Server ConfigurationIn der Server Configuration wird der Dial Plan mit einem oder mehreren Exchange UM Servern verbunden. Dazu unter Server Configuration auf Unified Messaging klicken und den entsprechenden Server auswählen. In den Eigenschaften “UM Settings” wählen und den Dial Plan hinzufügen.Die Exchange Unified Messaging Serverkonfiguration ist damit abgeschlossen und die Exchange Umgebung ist bereit für die erste “unified” Mailbox.Recipient ConfigurationUm eine Mailbox für UM zu aktivieren wählt man die Mailbox unter Recipient Configuration, Mailboxes aus und klickt auf Enable Unified Messaging.Jedem Benutzer muss eine UM Mailbox Policy zugewiesen werden, außerdem muss er eine eindeutige “Extension” erhalten. Die Extension ist die Telefonnummer unter der die Voice Mailbox antwortet, also die Interne Telefonnummer des Benutzers.Der Benutzer erhält ein Willkommens-E-mail von Unified Messaging in dem sein PIN und seine Extension mitgeteilt werden.Die Extension wird dem Benutzer als “E-Mail Adresse” vom Typ EUM zugewiesen:ProxyAddressString: EUM:1000;phone-context=CUCM1.domain.localSoll ein Benutzer mehrere Extension erhalten kann man diese einfach als zusätzliche “E-Mail Adressen” hinzufügen.&#160;Cisco Call ManagerDamit der Call Manager mit dem Exchange Server verbunden werden kann wird ein SIP Trunk benötigt. Außerdem muss eine Route erstellt werden über die der Call Manager weiß welche Nummern hinter dem SIP Trunk zu finden sind.SIP TrunkDer SIP Trunk wird unter Device, Trunk “Add New” erstellt.Man muss dem Trunk einen Namen geben, den Device Pool auswählen, die IP Adresse des Exchange UM Servers als Destination angeben und ein SIP Profile sowie das SIP Trunk Security Profile auswählen. Sind mehrere Exchange UM Server vorhanden muss ein Trunk pro Server angelegt werden.Wichtig: Für Outbound Calls muss “Redirecting Diversion Header Delivery – Outbound” aktiviert werden, durch die Informationen im Diversion Header kann der Exchange Server das Postfach aufgrund der Extension zuweisen.Für alle anderen Einstellungen sind die Defaults des Call Managers ok. Je nach Umgebung kann es sein dass man “Media Termination Point Required” aktivieren muss.Route PatternDamit der Call Manager Anrufe an 9999 routen kann muss man eine Route Pattern erstellen, dazu unter Call Routing, Route/Hunt auf Route Pattern klicken. Mit Add New kann eine neue Pattern hinzugefügt werden. Auch hier muss ein Device Pool sowie der SIP Trunk als Gateway angegeben werden. In Umgebungen mit mehrere Exchange UM Servern empfiehlt es sich eine Route List für die SIP Trunks anzulegen und die Pattern auf die Route List zu binden.Die minimale Konfiguration ist dadurch abgeschlossen, wenn der UM aktivierte Benutzer mit der Nummer 1000 jetzt die Nummer 9999 anruft erhält er Zugriff auf sein Postfach über OVA. Wenn derselbe Benutzer eine Umleitung auf 9999 einrichtet werden alle eingehenden Calls auf sein Voicemail Postfach umgeleitet.MWI - Message Waiting IndicatorWenn jemand eine Nachricht hinterlässt wird diese in der Inbox angezeigt, zusätzlich kann am Phone ein MWI Status angezeigt werden (rotes LED). Der Benutzer sieht so sofort dass er eine neue Voicemail hat. Um dieses Feature zu aktivieren muss das “SIP Trunk Security Profile” geändert werden. Dazu unter System, Security auf SIP Trunk Security Profile klicken und das Profil auswählen das dem Trunk zugewiesen wurde. Bei diesem Profil muss die Option “Accept Unsolicited Notification” aktiviert werden.Voice Mail ProfileUm den Voice Mail Button am Phone zu konfigurieren muss ein Voice Mail Pilot sowie ein Voice Mail Profile konfiguriert werden.Dazu unter Advanced Features, Voice Mail auf Voice Mail Pilot klicken und mit Add New einen neuen Voice Mail Pilot erstellen.Unter Advanced Features, Voice Mail, Voice Mail Profile kann ein neues Profil angelegt werden.Achtung: Wird “Make this the default…” ausgewählt wird das Profil automatisch auf allen Phones konfiguriert die keine diesbezügliche Konfiguration haben.Nun kann man unter Device, Phone in der entsprechenden Direct Number Configuration ein Voice Mail Profile konfigurieren.&#160;special thanks to pk :)&#160;tom\"\n},{\n  \"title\": \"Citrix, Sprache des ICA Client ändern\",\n  \"url\": \"/post/citrix-sprache-des-ica-client-andern/\",\n  \"date\": \"September 25, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Citrix\"],\n  \"author\": \"dni\",\n  \"content\": \"Kleiner Tipp: Das Citrix Online Plug-In (ICA Client) wird standardgemäß in der Betriebssystemsprache ausgeführt. Will man die Sprache manuell ändern, lässt sich das über folgenden Befehl unter C:\\\\Program Files (x86)\\\\Citrix\\\\ICA Client realisieren: WFICA32.EXE /UserUILocale&#160;&#160;Grüße   dn\"\n},{\n  \"title\": \"Windows 8 - Installation in VHD\",\n  \"url\": \"/post/windows-8-installation-in-vhd/\",\n  \"date\": \"September 16, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"In diesem Post (Windows 7 - Nativer VHD Support) habe ich vor einiger Zeit beschrieben wie man Windows 7 in eine VHD installieren kann.Nun, das funktioniert genau gleich f&uuml;r das&nbsp;Windows 8 Developer Preview! Hier nochmal eine kuze Zusammenfassung:VHD erstellen: Diskpart; create vdisk file=\\\"E:\\\\VHD\\\\win8-1.vhd\\\" type=fixed maximum=20480 erstellt eine 20GB VHD vom Typ \\\"Fixed\\\", die Datei belegt also den vollen Speicher auf der FestplatteVon Windows 8 Installationsmedium bootenmit \\\"Shift\\\"+\\\"F10\\\" eine Eingabeaufforderung &ouml;ffnenVHD ausw&auml;hlen: Diskpart; select vdisk file=\\\"E:\\\\VHD\\\\win8-1.vhd\\\"attach vhdDiskpart und Eingabeaufforderung schlie&szlig;en, Windows 8 installieren.Der neue Bootmanager ist &uuml;brigens auch im Metrostyle ;)Wie Windows 7 kann man auch Windows 8 vom USB Stick installieren, auch diese Anleitung funtioniert weiterhin!enjoy!!\"\n},{\n  \"title\": \"Windows 8–Developer Preview\",\n  \"url\": \"/post/windows-8-developer-preview/\",\n  \"date\": \"September 14, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"In Anaheim, Ca findet zurzeit die BUILD Konferenz statt. Diese mehrtätige Veranstaltung richtet sich vor allem an Entwickler und stellt das neue Betriebssystem Windows 8 vor.Seit dem frühen Morgen kann man sich ein “Developer Preview” Build von Windows 8 herunterladen. Verfügbar sind 32 und 64 Bit Images mit oder ohne Entwicklungstools. Hier der Link zur Seite: http://dev.windows.comEinige Neuerungen im ÜberblickDas neue Startmenü im Metro StyleWindows Explorer mit Ribbon, und den neuen Copy/Cut/Paste DialogenAußerdem kann man jetzt ISO und VHD Files direkt im Windows Explorer mounten/öffnen.Auch der Task Manager wurde erneuertHyper-V Support, der Hammer! Hyper-V für den Client mit 64 Bit Guest Support. Außerdem Support für Standby Mode und WLANPowerShell 3&#160;Das ist nur ein schneller Überblick, in den nächsten Tagen gibt es Details. Sehr Empfehlenswert sind folgenden Links:http://www.buildwindows.comhttp://blogs.msdn.com/b/b8enjoy!   tom\"\n},{\n  \"title\": \"Outlook 2003 / Exchange 2010 Probleme beim Öffnen freigegebener Kalender\",\n  \"url\": \"/post/outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender/\",\n  \"date\": \"September 13, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"In einer Umgebung mit Exchange 2010 und Outlook 2003 als Mail Client kann es beim &Ouml;ffnen freigegebener Kalender zu Problemen kommen. Dabei erscheint folgende Fehlermeldung:&nbsp;Anders als &lt; Office 2007 &ouml;ffnet Outlook 2003 die Verbindung direkt zu den Mailboxserver und nicht &uuml;ber den Address-Book Service. Um dieses Problem zu beheben, muss das Verbindungslimit, welches standardgem&auml;&szlig; 20 betr&auml;gt, angehoben werden. Hierzu erstellen wir eine neue ThrottlingPolicy und weisen diese dem Benutzer zu:&nbsp;New-ThrottlingPolicy &ndash;name Outlook2003CalendarSet-ThrottlingPolicy &ndash;identity Outlook2003Calendar &ndash;RCAMaxConcurrency 100Set-Mailbox &ndash;Identity &ldquo;MAILBOX-USER&rdquo; &ndash;ThrottlingPolicy Outlook2003Calendar&nbsp;Gr&uuml;&szlig;e   dn\"\n},{\n  \"title\": \"PowerShell–Rekursiv nach Änderungsdatum sortieren\",\n  \"url\": \"/post/powershell-rekursiv-nach-anderungsdatum-sortieren/\",\n  \"date\": \"September 8, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Ganze Ordnerstrukturen oder Laufwerke nach Dateien zu durchsuchen die zuletzt ge&auml;ndert worden sind kann ganz sch&ouml;n m&uuml;hsam sein. Mit der PowerShell geht das in einem Oneliner.PS X:\\\\&gt; Get-ChildItem C:\\\\Windows\\\\Logs -Recurse | Sort-Object -Property LastWriteTime &ndash;Descending | Where-Object {$_.Mode -notlike \\\"d*\\\"} | Select-Object -First 10 | Format-Table -Property LastWriteTime,FullName &ndash;AutoSizeDieses Beispiel durchsucht C:\\\\Windows\\\\Logs rekursiv und sortiert Absteigend nach &ldquo;LastWriteTime&rdquo;. Ordner werden standardm&auml;&szlig;ig auch zur&uuml;ckgegeben, diese werden mit &ldquo;Where-Object&rdquo; gefiltert. Da mich nur die 10 Dateien interessieren die zuletzt ge&auml;ndert wurden verwende ich &ldquo;Select-Object&rdquo;. Anschlie&szlig;end wird die Ausgabe noch Formatiert. Das Ganze sieht dann so aus:M&ouml;chte man das Ergebnis in eine Datei schreiben, bietet sich das cmdlet &ldquo;Export-CSV&rdquo; an, daf&uuml;r &auml;ndert man die &ldquo;Select-Object&rdquo; Abfrage z.B. folgenderma&szlig;en:PS X:\\\\&gt; Get-ChildItem C:\\\\Windows\\\\Logs -Recurse | Sort-Object -Property LastWriteTime -Descending | Where-Object {$_.Mode -notlike \\\"d*\\\"} | Select-Object &ndash;Property FullName,CreationTime,LastWriteTime,LastAccessTime,Length,Attributes | Export-Csv Report.csvDas Ergebnis sieht dann so aus:Durch &Auml;nderungen der Where, Select, Format cmdlets bzw. Parameter l&auml;sst sich eine Vielzahl von Ausgaben erzeugen, f&uuml;r weitere Informationen und Hilfe zu den einzelnen cmdlets:Get-Help cmdlet &ndash;OnlineAchtung: Der Parameter &ldquo;Recurse&rdquo; geht durch alle untergeordneten Verzeichnisse, das kann je nach Struktur ziemlich lange dauern. Au&szlig;erdem gelten Berechtigungen nat&uuml;rlich auch f&uuml;r die PowerShell, man kann also nicht Ordner durchsuchen auf die man keine Rechte hat, das sieht dann so aus:have fun!    tom\"\n},{\n  \"title\": \"DigiNotar–nur ein Zufall!?\",\n  \"url\": \"/post/diginotar-nur-ein-zufall!/\",\n  \"date\": \"September 6, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Client\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Vor einigen Tagen wurde bekannt das bereits Anfang Juni(!!) bei einem Hack der niederl&auml;ndischen Zertifizierungsstelle &ldquo;DigiNotar&rdquo; mehr als 500 &ldquo;gef&auml;lschte&rdquo; Zertifikate ausgestellt wurden.Unter den Zertifikaten befinden sich folgende Wildcard Zertifikate:*.*.com *.*.org *.10million.org *.android.com *.aol.com *.azadegi.com *.balatarin.com *.comodo.com *.digicert.com *.globalsign.com *.google.com *.JanamFadayeRahbar.com *.logmein.com *.microsoft.com *.mossad.gov.il *.mozilla.org *.RamzShekaneBozorg.com *.SahebeDonyayeDigital.com *.skype.com *.startssl.com *.thawte.com *.torproject.org *.walla.co.il *.windowsupdate.comEine vollst&auml;ndige Liste der Zertifikate gibt es hier.&nbsp;Der Angriff wurde entdeckt weil in Googles Chrome Browser die g&uuml;ltigen Zertifikate fix hinterlegt sind, der Browser also beim Anzeigen vermeintlich authentischer Google Inhalte gemeckert hat. Wenn die &ldquo;T&auml;ter&rdquo; den &ldquo;User Agent String&rdquo; von Chrome gefiltert h&auml;tten, wer wei&szlig; wann (und ob) dieser Hack &ouml;ffentlich geworden w&auml;re&hellip;Vermutungen wie viele derartige Angriffe bisher unerkannt geblieben sind und wer dahinter steckt &uuml;berlasse ich anderen. Ich hoffe allerdings dass die Debatte um Sicherheit und das &ldquo;Web of Trust&rdquo; weitergef&uuml;hrt wird und durch solche krassen Vorf&auml;lle mehr Aufmerksamkeit bekommt.&nbsp;&nbsp;Betroffene CAsFolgende Zertifizierungsstellen m&uuml;ssen aus allen Browsern, Applikationen und Betriebssystemen verschwinden, sie gelten als NICHT mehr Vertrauensw&uuml;rdig:CertificateIssued byThumbprintDigiNotar Root CADigiNotar Root CAc0 60 ed 44 cb d8 81 bd 0e f8 6c 0b a2 87 dd cf 81 67 47 8cRoot CA G2DigiNotar Root CA G243 d9 bc b5 68 e0 39 d0 73 a7 4a 71 d8 51 1f 74 76 08 9c c3PKIoverheid CA OverheidStaat der Nederlanden Overheid CAb5 33 34 5d 06 f6 45 16 40 3c 00 da 03 18 7d 3b fe f5 91 56PKIoverheid CA Organisatie - G2Staat der Nederlanden Organisatie CA - G25d e8 3e e8 2a c5 09 0a ea 9d 6a c4 e7 a6 e2 13 f9 46 e1 79PKIoverheid CA Overheid en BedrijvenStaat der Nederlanden Overheid CA40 aa 38 73 1b d1 89 f9 cd b5 b9 dc 35 e2 13 6f 38 77 7a f4Windows UpdateMicrosoft hat inzwischen reagiert und ein Windows Update zur Verf&uuml;gung gestellt, genauere Informationen findet man im Microsoft Security Advisory (2607712).Wie an vielen Stellen zu lesen ist soll es mit diesen Zertifikaten m&ouml;glich sein gef&auml;lschte Windows Updates zu verteilen, das ist laut Microsoft NICHT der Fall. Der Windows Update Client installiert ausschlie&szlig;lich Pakete die mit dem &ldquo;Microsoft Root Certificate&rdquo; signiert sind.&nbsp;FirefoxF&uuml;r Mozilla Firefox wir ein Update in k&uuml;rze erwartet, hier empfiehlt es sich die genannten CAs manuell zu entfernen!Unter Einstellungen, Erweitert, Verschl&uuml;sselung klickt man auf &ldquo;Zertifikate anzeigen&rdquo;. Jetzt bekommt man eine Liste der Zertifizierungsstellen und kann das Vertrauen entziehen.Weitere Infos im Mozilla Security Blog.&nbsp;&nbsp;AppleApple hat wohl zur Zeit andere Priorit&auml;ten, MAC Benutzer sollten auf jeden Fall manuell die oben genannten Zertifikate entfernen. Chester Wisniewski von Sophos beschreibt das Ganze so:What about Apple users? Well, apparently they are too busy playing Angry Birds and making pictures in Photoshop to worry about pesky certificate issues.&lt;/p&gt;My advice if you run a Mac? Use BootCamp and Windows 7 until Apple decides to provide a patch. Or I guess you could use Firefox (not Chome, it also uses Apple's KeyChain)...&lt;/code&gt;Ein erster Bericht der Security Consultants Fox-IT zum Thema ist verf&uuml;gbar:http://www.rijksoverheid.nl/ministeries/bzk/documenten-en-publicaties/rapporten/2011/09/05/diginotar-public-report-version-1.htmlstay secure  tom\"\n},{\n  \"title\": \"ESXi–Persistent Scratch Location\",\n  \"url\": \"/post/esxi-persistent-scratch-location/\",\n  \"date\": \"July 30, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"VMware\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"In diesem Artikel habe ich beschrieben wie man den ESXi Hypervisor auf einem USB Stick installieren kann. Ein Nachteil dieser Installation ist das Fehlen der Scratch Partition, sie wird nicht automatisch erstellt da Flash Medien eine beschränkte Anzahl von schreib/lese Zyklen haben und sich so nicht besonders als Speicherort für Logfiles eignen.&#160;ESXi Scratch PartitionDie Scratch Partition ist optional und wird standardmäßig während der Installation von ESXi auf lokalem Storage angelegt. Wenn lokaler Storage verfügbar ist wird die Scratch Partition mit 4GB angelegt, sie wird verwendet um den Output von “vm-support” zu speichern, gibt es keine Scratch Partition wird dieser wird dieser Output in den RAM geschrieben.Wird die Scratch Partition automatisch erstellt ist es nicht empfohlen die bestehende Konfiguration zu ändern, wird die Scratch Partition nicht automatisch angelegt (z.B. bei Installation auf USB) ist es empfohlen manuell einen Speicherort für “Scratch” zu konfigurieren.Configure Scratch Location – vSphere ClientUm die Scratch Location manuell zu konfigurieren muss man zuerst einen Ordner auf einem Datastore anlegen, der ESXi Host muss natürlich Zugriff auf diesen Datastore haben. Dazu wechselt man im vSphere Client auf “Configuration” und wählt unter “Storage” einen Datastore aus, mit rechtsklick “Browse Datastore” öffnet man den Datastore Browser und legt einen Ordner an. Achtung: Es muss einen eindeutigen Ordner pro ESXi Host geben, man kann nicht einen Scratch Ordner für mehrere Hosts verwenden!Die Scratch Location wird in den “Advanced Settings” unter “Configuration”, “Software” konfiguriert. Dort gibt es einen Abschnitt “ScratchConfig” welcher ein Textfeld für die Einstellung “ScratchConfig.ConfiguredScratchLocation” anzeigt. In dieses Textfeld muss der vollständige Pfad zum Order eingegeben werden, also z.B: /vmfs/volumes/&lt;myDatastore&gt;/.scratch-esx1Achtung: diese Einstellung wird erst nach einem Neustart des ESXi Hosts wirksam.vSphere Client Login– A general system error occuredWird eine Active Directory Domain zur Authentifizierung angegeben und es ist keine Scratch Partition Konfiguriert kann man sich am vSphere Client nicht anmelden und bekommt eine (sehr vielsagende) Fehlermeldung, entweder: “A general system error occured” oder “gss_acquire_cred failed”Der Grund für den Fehler ist offensichtlich dass ESXi versucht Informationen über die Anmeldung in ein Logfile unter /scratch/var/tmp zu schreiben.Genauere Infos zum Thema gibts hier:http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=1033696http://blogs.vmware.com/esxi/2011/04/scratch-partition-best-practices-for-usbsd-booted-esxi.htmlhttp://blogs.vmware.com/esxi/2011/03/ops-changes-part-5-scratch-partition.htmlso long,   tom\"\n},{\n  \"title\": \"Citrix IMA Dienst startet nicht mehr\",\n  \"url\": \"/post/citrix-ima-dienst-startet-nicht-mehr/\",\n  \"date\": \"July 18, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Citrix\"],\n  \"author\": \"dni\",\n  \"content\": \"Lässt sich der Citrix IMA Dienst nicht mehr starten, können keine eingehende Verbindung zum Citrix Server mehr initiiert werden. Versucht man den IMA Dienst zu starten und erhält folgende Fehlermeldung: Windows could not start Citrix Independent Management Architecture on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code –2147483647&#160;&#160;Opening the Event Viewer of the affected server shows this event on the System Log:&lt;/p&gt;    “Failed to load plugin C:\\\\Prgoram Files (x86)\\\\Citrix\\\\System32\\\\Citrix\\\\IMA\\\\Subsystems\\\\RADESessionsSs.dll with error IMA_RESULT_FAILURE”&lt;/code&gt;  &#160;    &#160;  In den meisten Fällen ist die lokale Streaming Offline Datenbank korrupt. Dies lässt sich meist durch den Befehl dsmaint recreaterade beheben.   Lässt sich der IMA Dienst immer noch nicht starten, sind wahrscheinlich die Verbindungseinstellungen im File C:\\\\Program Files (x86)\\\\Citrix\\\\Independent Management Architecture\\\\RadeOffline.dsn korrupt:  Fehlerhafte Konfiguration:    Diese muss durch eine gültige Konfiguration ersetzt werden:    Nun ist es noch notwendig die Streaming Offline Datenbank neu zu erstellen:  dsmaint recreaterade   Der Citrix IMA Dienst sollte sich jetzt normal starten lassen.  &#160;  Grüße   dn\"\n},{\n  \"title\": \"Citrix XenApp6 Fehler beim starten des Webservice\",\n  \"url\": \"/post/citrix-xenapp6-fehler-beim-starten-des-webservice/\",\n  \"date\": \"July 18, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Citrix\"],\n  \"author\": \"dni\",\n  \"content\": \"Letztens bin ich auf ein seltsamen Problem in XenApp6 gestoßen:Sobald man den Webservice startet und einen Verbindungsversuch unternimmt, beendet sich der ApplicationPool und Verbindungen werden terminiert.Im EventLog wird folgender Fehler protokolliert:&#160;Log Name: Application&lt;/p&gt;    Source: Microsoft-Windows-IIS-W3SVC-WP    Date: 17/06/2011 09:37:36    Event ID: 2307    Task Category: None    Level: Error    Keywords: Classic    User: N/A    Computer: ts1.ntsystems.it    Description:    The worker process for application pool 'CitrixWebInterface5.3.0AppPool' encountered an error 'Failed to decrypt attribute 'password'    ' trying to read configuration data from file '\\\\\\\\?\\\\C:\\\\inetpub\\\\temp\\\\apppools\\\\CitrixWebInterface5.3.0AppPool.config', line number '150'. The data field contains the error code.&lt;/code&gt;  &#160;  Lösung  Um den Fehler zu beheben und das Webinterface richtig starten zu können, müssen in der Datei C:\\\\Windows\\\\System32\\\\inetsrv\\\\config\\\\applicationHost.config die Zeilen zwischen  &lt;configProtectedData&gt; gelöscht werden. Wichtig ist dabei, dass IIS vorher beendet wurde. Danach muss der Service wieder gestartet, der ApplicationPool lässt sich nun auch normal starten. Eingehende Verbindungen zum Webinterface werden nun auch richtig verarbeitet.  &#160;  Grüße   dn\"\n},{\n  \"title\": \"EX2k10 PST in Archive importieren\",\n  \"url\": \"/post/ex2k10-pst-in-archive-importieren/\",\n  \"date\": \"July 18, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Um PST Files in ein Exchange 2010 SP1 Archive-Mailbox zu verschieben muss zunächst sichergestellt werden, dass der Microsoft Exchange Mailbox Replication Dienst gestartet ist. Zudem muss der Gruppe “Exchange Trusted Subsystem Security Group” NTFS und Freigabeberechtigungen für das PST File gegeben werden.&#160;Um den Import durchzuführen muss jetzt das entsprechende Benutzerkonto der neuen Gruppe “Mailbox Import Export Group” hinzugefügt werden:New-RoleGroup &quot;Mailbox Import Export Group&quot; -Roles &quot;Mailbox Import Export&quot;Add-RoleGroupMember &quot;Mailbox Import Export Group&quot; -Member &quot;Administrator&quot;&#160;Nun kann das PST File über den Befehl New-MailboxImportRequest in das Archiv importiert werden. Anbei ein Script, wo man im File Users.csv PST Files den jeweiligen Benutzern zuweisen und den Import Request generieren kann:import-csv &quot;Users.csv&quot;|ForEach{&lt;/p&gt;    New-MailboxImportRequest -Mailbox $_.user -FilePath $_.Path -BadItemLimit 50 -IsArchive    }&lt;/code&gt;  Bsp für Users.csv:  User,Path   daniel.nitz,\\\\\\\\share\\\\daniel-PST.PST  &#160;  Grüße   dn&lt;/td&gt;&lt;/tr&gt;\"\n},{\n  \"title\": \"Lync Integration in Outlook Web App 2010\",\n  \"url\": \"/post/lync-integration-in-outlook-web-app-2010/\",\n  \"date\": \"July 16, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit einiger Zeit ist der Nachfolger des Office Communication Servers verf&uuml;gbar, Lync 2010 vereint Enterprise Voice, Instant Messaging, Presence sowie Live Meeting, weitere Details gibts hier: http://lync.microsoft.com/en-us/Pages/default.aspxAuch Outlook Web App kann als Lync Client konfiguriert werden, folgende Features werden direkt von OWA unterst&uuml;tzt, es wird daf&uuml;r kein Client auf dem PC ben&ouml;tigt:Presence, der Status anderer wird angezeigt, au&szlig;erdem kann man seinen Status &auml;ndern bzw. sich an- und abmelden Die Lync Kontaktliste wird angezeigt Instant Messaging mit einem Web Client PrerequisitesAuf dem Client Access Server m&uuml;ssen die Komponenten f&uuml;r Microsoft Office Communications Server 2007 R2 Web Service Provider installiert werden. Der Common Name im Zertifikat des Client Access Servers muss der FQDN des Client Access Servers sein. Wenn es sich um ein CAS Array handelt muss der Common Name dem FQDN des CAS Array entsprechen. Instant Messaging muss auf dem Client Access Server aktiviert werden In der Lync Umgebung muss ein Trusted Application Pool und eine Trusted Application erstellt und aktiviert werden. Exchange Client Access Server/Array KonfigurationFolgende Pakete herunterladen:Office Communication Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=2310 Hotfix f&uuml;r den OC Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=797 Hotfix f&uuml;r Unified Communication API:      http://www.microsoft.com/download/en/details.aspx?id=7557 Als erstes wird jetzt CWAOWASSPMain.msi installiert, dieses Paket erstellt einen Ordner (Standard: C:\\\\Web Service Provider Installer Package\\\\) und kopiert die ben&ouml;tigten Installationsdateien f&uuml;r den OC Web Service Provider in diesen Ordner. Jetzt in diesen Ordner wechseln und die Pakete in folgender Reihenfolge installierenvcredist_x64.exe UcmaRedist.msi CWAOWASSP.msi Jetzt fehlen noch die Hotfixes aus den Downloads 2 und 3, auch diese Pakete installierenUcmaRedist.msp CWAOWASSP.msp Die ben&ouml;tigte Software ist somit installiert, jetzt muss Instant Messaging noch aktiviert werden. Die Konfiguration daf&uuml;r wird am OWA Virtual Directory gemacht. Der InstantMessagingType wird auf OCS ge&auml;ndert, als InstantMessagingServerName wird der Lync Server angegeben. Au&szlig;erdem muss der Thumbprint des Zertifikates das f&uuml;r TLS verwendet werden soll angegeben werden und InstantMessaging aktiviert werden. Folgende PowerShell Befehl erledigt dieses Schritte:$iiscert = (Get-ExchangeCertificate | Where {$_.Services -like \\\"*IIS*\\\"}).ThumbprintGet-OWAVirtualDirectory -Server ex14.ntsystems.local | Set-OWAVirtualDirectory -InstantMessagingType OCS -InstantMessagingEnabled:$true -InstantMessagingCertificateThumbprint $iiscert -InstantMessagingServerName lync.ntsystems.localAchtung: Wenn bei Get-OWAVirtualDirectory der Parameter Server weggelassen wird werden alle Virtual Directories der Exchange Umgebung konfiguriert. Bei InstantMessagingServerName muss der FQDN des Lync Servers angegeben werden.In einem CAS Array m&uuml;ssen diese Schritte auf allen Servern wiederholt werden.Lync Server KonfigurationMit dem Lync Server Topology Builder wird jetzt unter &ldquo;Trusted Application Servers&rdquo; ein neuer Application Pool angelegt. Dieser Pool wird als Single Computer Pool angelegt, der FQDN muss dabei entweder dem Namen des Client Access Server oder dem Namen des CAS Arrays entsprechen.Jetzt wird der Lync Server Frontend Pool ausgew&auml;hlt, welcher f&uuml;r diese Applikation verwendet werden soll.Der Server ist jetzt erstellt, Standardm&auml;&szlig;ig ist &ldquo;Enable replication of configuration data to this pool&rdquo; aktiviert, das wird nicht ben&ouml;tigt und kann in den Eigenschaften des soeben erstellten Objektes deaktiviert werden.Jetzt kann die &Auml;nderung der Topologie ver&ouml;ffentlicht werden, dazu klickt auf Action, Topology und Publish.Es fehlt noch die CSTrustedApplication, diese wird &uuml;ber die Lync Server Management Shell angelegt. Auch dabei muss wieder der FQDN des Client Access Servers oder des CAS Arrays angegeben werden, au&szlig;erdem wird ein Port f&uuml;r die Applikation angegeben, nat&uuml;rlich muss ein Port verwendet werden der frei ist. (netstat &ndash;an zeigt verwendete Ports an). Mit folgendem PowerShell Befehl wird die Applikation erstellt:New-CsTrustedApplication -ApplicationID OWA -TrustedApplicationPoolFqdn ex14.ntsystems.local -Port 4999Diese Konfiguration muss noch aktiviert werden, das wird mit folgendem PowerShell cmdlet gemacht:Enable-CsTopologyEnjoyDie Konfiguration ist jetzt abgeschlossen, ab jetzt sind die neuen Features in Outlook Web App aktiv&hellip;TroubleshootingFQDN &ndash; Der CN im Zertifikat des Client Access Servers (oder Arrays) muss passen. Mit Get-CsTrustedApplication bzw. Get-CsTrustedApplicationComputer kann man die Lync Konfiguration nochmal &uuml;berpr&uuml;fen Lync Server Logging Tool &ndash; bei vielen Problemen hilft das Log des SIPStack &nbsp;viel Spa&szlig;    tom\"\n},{\n  \"title\": \"Cisco AAA\",\n  \"url\": \"/post/cisco-aaa/\",\n  \"date\": \"July 3, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Network\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Nachdem der RADIUS Server konfiguriert ist geht es an die Konfiguration des Clients.Bei Cisco muss dazu das “neue” AAA Model aktiviert werden. Das geht einfach mit folgendem Befehl:aaa new-model      Lokale AuthentifizierungAchtung: nach absetzen dieses Befehls ist das neue Model aktiv, d.h. man kann sich nur mehr mit Benutzername und Passwort anmelden. Man sollte jetzt einen lokalen Benutzer angelegen, dieser kann auch im Fallback Fall, also wenn der RADIUS Server nicht erreichbar ist, verwendet werden. Mit folgendem Befehl legt man einen lokalen User cisco mit Passwort cisco an:username cisco secret cisco Radius ServerBevor man RADIUS als Authentifizierung verwenden kann muss ein RADIUS Server konfiguriert werden. Mit folgenden Befehlen konfiguriert man den RADIUS Server 10.1.1.100 und den entsprechendem Pre-Shared Key. RADIUS verwendet standardmäßig die UDP Ports 1812 und 1813 für Authentifizierung und Accounting, Cisco Geräte verwenden die Ports 1645 und 1646, das kann man evtl. mit “auth-port 1812 acct-port 1813” ändern. Der NPS RADIUS Server antwortet auf beide Varianten, man muss das also nicht definieren.radius-server host 10.1.1.100 key PRE_SHARED_KEYMit “radius-server retransmit x” kann man angeben wie oft eine Anfrage gesendet wird wenn innerhalb des Timeouts keine Antwort kommt. Das Zeitfenster für das Timeout kann mit “radius-server timeout x” auf x Sekunden erhöht werden. Das Interface über welches der Cisco Switch die RADIUS Anfrage schickt kann mit “ip radius source-interface x” angegeben werden.AAA ListenDas AAA Authentication Model arbeitet mit Listen, man definiert eine Liste und weißt diese Liste einem Interface zu. Die Liste “default” gilt für alle Interfaces auf denen keine andere Liste gebunden ist. Folgender Befehl setzt die Standardauthentifizierung auf RADIUS, Fallback (RADIUS nicht erreichbar) ist local:aaa authentication login default group radius local      Ab diesem Zeitpunkt muss man sich an allen Interfaces mit Benutzername und Passwort vom RADIUS Server anmelden.Wenn die Netzwerkgeräte in sicheren Serverräumen untergebracht sind kann man sich überlegen die Authentifizierung für den Console Port zu deaktivieren, damit man im Desaster Fall noch eine letzte Hoffnung auf Zugriff hat. Dazu legt man eine Liste an und setzt die Authentifizierung auf “none”, danach bindet man die Liste auf “line con 0”:aaa authentication login liste1 none&lt;/p&gt;    line con 0      &#160; login authentication liste1&lt;/code&gt;  Authorization  Am RADIUS Server habe ich in den Settings das Attribut Service-Type auf “Administrative” gesetzt. Dadurch müsste ich eigentlich im “enable” Mode landen. Das funktionier jedoch erst nachdem auch die Authorization auf RADIUS gesetzt wurde. Folder Befehl legt fest dass RADIUS für alle Interfaces verwendet wird, die Console ist dabei ausgeschlossen:  aaa authorization exec default group radius local  Um Authorization auf der Console über RADIUS zu aktivieren wird folgender Befehl verwendet:  aaa authorization console  Wenn ich mich erneut anmelden lande ich direkt im “Enable” Mode des Switches.  Logging  Am NPS wird im Event Log Security ein Event 6272 aufgezeichnet, außerdem wird im Logfile (D:\\\\NPS\\\\LogFiles) ein Eintrag hinzugefügt.  Sniffing  Mit Wireshark o.ä. sieht man ein RADIUS Access-Request Paket vom Switch zum NPS Server und ein RADIUS Access-Accept Paket vom NPS Server zum Switch.  Das Access-Request Paket enthält unter anderem folgende Informationen:  User-Name: Der Benutzer der sich am RADIUS Client anmeldet  Calling-Station-Id: IP Adresse des Clients (der z.B. die Telnet Session öffnet)  NAS-IP-Address: IP Adresse des RADIUS Clients  Das Access-Accept Paket enthält die AV-Pair Informationen:  AVP: Attribute Value Pair das am NPS konfiguriert wurde (Service-Type: Administrative)    &#160;  tom\"\n},{\n  \"title\": \"Cisco AAA–NPS RADIUS Server\",\n  \"url\": \"/post/cisco-aaa-nps-radius-server/\",\n  \"date\": \"July 3, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Network\"],\n  \"author\": \"tto\",\n  \"content\": \"In größeren Netzwerken kann es aufgrund der Firmenrichtlinie oder der Gesetzgebung notwendig sein sich an den Netzwerkgeräten mit persönlichen User Accounts anmelden zu müssen. Man kann dafür natürlich für jeden Netzwerkadministrator ein persönliches Account auf allen Geräten anlegen, oder man authentifiziert gegen einen RADIUS Server. Dieser RADIUS Server kann z.B. ein Network Policy Server sein, der seit Windows Server 2008 den IAS abgelöst hat. Der Vorteil so einer Implementierung liegt auf der Hand, die Authentifizierung wird über das Zentrale Active Directory gesteuert und Benutzerkonten müssen nur an einem Ort gepflegt werden.NPSDie NPS Serverrolle muss auf einem Server hinzugefügt werden, ob das ein dedizierter Server ist oder ob man die Rolle auf einem andern mitlaufen lässt hängt von der Größe der Umgebung ab. Die Rolle kann wie jede andere über den Servermanager oder das PowerShell cmdlet Add-WindosFeature hinzugefügt werden. Damit das cmdlet verfügbar ist muss das Modul ServerManager geladen werden.Für RADIUS reicht der NPAS-Policy-Server. Wen die Rolle hinzugefügt wurde kann NPS konfiguriert werden, der erste Schritt ist es den NPS Server im Active Directory zu registrieren. Rechtsklick auf NPS (local) und “Register Server in Active Directory” wählen&quot;Der zweite Schritt ist die Konfiguration des Accounting, bzw. Logging, dafür gibt es in der NPS Konsole unter dem Punkt “Accounting” drei Einstellungsmöglichkeiten.Der “Configure Accounting Wizard” erleichtert einem Konfiguration:Ich entscheide mich für das Logging in ein Textdokument, je nach Umgebung kann man auch einen zentralen SQL Server angeben.Den Ordner für die Log Files lege ich auf eine zweite Partition. Der NPS Server ist nun konfiguriert, es fehlen noch die RADIUS Clients sowie das Regelwerk das definiert wer sich anmelden darf.Radius ClientsJedes Netzwerkgerät das über NPS authentifizieren will muss dort als RADIUS Client angelegt werden, in diesem Schritt werden der Name, die IP Adresse und der Pre-Shared Key für jeden Client festgelegt. Der Pre-Shared Key wird verwendet um den RADIUS Client zu authentifizieren, der Benutzer meldet sich mit seinem Benutzernamen und Passwort an.Um einen RADIUS Client anzulegen erweitert man den Ordner “RADIUS Clients and Servers” in der NPS Konsole, Rechtslick auf “RADIUS Clients” und “New” öffnet den Dialog “New RADIUS Client”.Unter dem Reiter “Settings” wird der Friendly name konfiguriert, dieser ist später wichtig für die Konfiguration der Regeln. Außerdem gibt man hier die IP Adresse des Clients an, der Pre-Shared Key kann manuell eingegeben werden, ich empfehle jedoch ihn automatisch zu generieren. (Achtung: einige alte Geräte unterstützen nur Keys bis zu einer bestimmten Länge)Unter Advanced könnte man noch ein bestimmtes RADIUS Feature Set auswählen, normalerweise reicht aber der Standard aus. Connection Request PolicyÜber die Connection Request Policy wird definiert welcher RADIUS Client wie authentifiziert wird. NPS kann auch als RADIUS Proxy arbeiten und könnte daher anfragen eines Clients selbst authentifizieren und die eines andern an einen Remote RADIUS Server weiterleiten, dieser Server muss zuerst unter “RADIUS Clients and Servers” angelegt werden.Die Standardregel ist so konfiguriert dass alle anfragen Lokal, also gegenüber Active Directory, authentifiziert werden.Network PolicyDie Network Policy definiert wer sich unter welchen Umständen authentifizieren darf. Da beide Standardregeln keinen Zugriff zulassen müssen wir eine neue Network Policy anlegen, Rechtsklick auf “Network Policy” und “New” öffnet den Dialog “New Network Policy”.Auf der ersten Seite wird eine Name für die neue Richtlinie konfiguriert, der Rest bleibt Standard.Auf dieser Seite werden die Konditionen definiert unter welchen die Authentifizierung erfolgreich ist. Man kann z.B. den RADIUS Client und eine bestimmt AD Gruppe hinzufügen, die beiden Kriterien sind “AND” verknüpft, müssen also beide zutreffen. Der Benutzer der sich am Client “cisco_1” anmeldet muss also Mitglied der Gruppe NetworkAdmins sein damit er sich authentifizieren darf.Im nächsten Schritt wird festgelegt ob diese Regel den Zugriff erlaubt oder verweigert.PAP muss als Authentifizierungsmethode hinzugefügt werden, man wird darauf hingewiesen dass diese Methode nicht sicher ist da das Passwort in Clear-Text über die Leitung geht, das muss man wohl oder übel in kauf nehmen.Hier könnte man weitere verbindungsspezifische Einstellungen machen, für die Authentifizierung an Netzwerkgeräte wird das allerdings nicht benötigt.&#160;Im letzten Schritt werden die Einstellungen konfiguriert die der RADIUS Server in der Antwort mitschickt, hier kann man sogenannte Attribute-Value (AV)-Pairs konfigurieren. Diese AV-Pairs sind Herstellerabhängig, bei Cisco z.B. kann man mit Attribut 6 den Service-Type definieren, gibt man “Administrative” an landet ein authentifiziert User direkt im “enable” Mode. Framed-Protcol PPP kann gelöscht werden, Service-Type ändere ich auf “Administrative”&#160;Somit ist der NPS Server fertig konfiguriert und bereit Anfragen von einem RADIUS Client mit der IP 10.1.1.254 und dem richtigen Pre-Shared Key zu beantworten. Nur Benutzer die Mitglied der Gruppe NetworkAdmins sind dürfen sich am RADIUS Client anmelden, ist die Authentifizierung erfolgreich sollte der Benutzer gleich im “enable” Mode sein.&#160;Im nächsten Artikel konfiguriere ich einen Cisco Switch für RADIUS Authentifizierung.tom\"\n},{\n  \"title\": \"One Note–Kleiner Tipp\",\n  \"url\": \"/post/one-note-kleiner-tipp/\",\n  \"date\": \"June 12, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Ich werde von Tag zu Tag ein gr&ouml;&szlig;erer Fan von Microsoft OneNote. Dokumentationen und Notizen lassen sich perfekt mit diesen starken Tool verwalten und pflegen. (Ich liebe die eingebaute Funktion &ldquo;Bildschirmausschnitt&rdquo;)Vor ein paar Tagen ist mir aufgefallen, dass die Suche in OneNote ein tolles Feature beinhaltet: Es kann Screenshots nach Text durchsuchen!!Testet es einfach aus, erstellt einen Screenshot und sucht im Suchfeld nach Text, welcher sich im Screenshot befindet. Ihr werdet &uuml;berrascht sein &nbsp;&nbsp;Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"Subdomain Certificate Enrollment\",\n  \"url\": \"/post/subdomain-certificate-enrollment/\",\n  \"date\": \"June 12, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Client\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn man f&uuml;r einen Server aus einer Subdomain ein Zertifikat aus der Zertifizierungsstelle in der Root-Domain ausstellen m&ouml;chte, wird das aufgrund fehlender Berechtigungen nicht funktionieren. Um das Zertifikat erfolgreich ausstellen zu k&ouml;nnen muss der Computer bzw. die Dom&auml;nencomputer Mitglieder der Gruppe CERTSVC_DCOM_ACCESS der Root-Domain sein:Danach ist es notwendig den Server neu zu starten, welcher das Zertifikat erhalten soll.Nun kann das Zertifikat ausgestellt werden.Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"Installing vSphere PowerCLI\",\n  \"url\": \"/post/installing-vsphere-powercli/\",\n  \"date\": \"June 11, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"VMware\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit vSphere PowerCLI bietet VMware ein PowerShell Snapin das mit &uuml;ber 250 cmdlets die Verwaltung der vSphere Umgebung vereinfacht bzw. Automatisierung&nbsp; erm&ouml;glicht.Die aktuelle Version kann unter http://vmware.com/go/powercli heruntergeladen werden.&nbsp;Die Installationsroutine installiert au&szlig;er den PowerShell Snapins die VMware VIX API, die das Management von virtuellen Maschinen erm&ouml;glicht. Diese API erlaubt es Programme direkt im Gastsystem der VM ausf&uuml;hren bzw. Dateien zu manipulieren.Nachdem das License Agreement akzeptiert wurde, kann man den Pfad f&uuml;r die Installation festlegen, jetzt noch auf installieren klicken und das wars.Auf dem Desktop wurde eine Verkn&uuml;pfung zu PowerCLI angelegt, sonst findet man sie unter Start, Programme, VMware, VMware vSphere PowerCLI.Wenn man die PowerCLI startet wird das PSSnapin &ldquo;VMware.VimAutomation.Core&rdquo; geladen, dieses kann nat&uuml;rlich auch in einer &ldquo;normalen&rdquo; PowerShell Session mit Add-PSSnapin hinzugef&uuml;gt werden.Wie in der Titelleist zu erkennen ist, ist die PowerCLI standardm&auml;&szlig;ig &ldquo;not connected&rdquo;, um auf die Virtuelle Umgebung zugreifen zu k&ouml;nnen muss man eine Verbindung mit dem vCenter Server herstellen. Dazu verwendet man das Connect-VIServer cmdlet, z.B.:Connect-VIServer vcenter.ntsystems.local &ndash;credential (Get-Credential)Mit diesem Befehl verbindet man die PowerCLI mit dem vCenter Server und kann alternative Anmeldeinformationen mitgeben, wenn der Benutzer mit dem die PowerCLI gestartet wurde ausreichende Rechte im vCenter hat kann man &ndash;credential nat&uuml;rlich weglassen.Wenn die Verbindung hergestellt wurde kann man mit PowerCLI arbeiten und sich z.B. eine Liste der VMs ausgeben lassen die nicht eingeschaltet sind:Get-VM | ?{$_.PowerState -notlike \\\"*On*\\\"}Alternativ kann man PowerCLI auch direkt mit einem ESX/ESXi Host verbinden, das ist z.B n&ouml;tig um mit Get-ESXTop Performance Informationen &uuml;ber einen Host zu sammeln.&nbsp;Die Hilfe zur PowerCLI kann einfach mit dem cmdlet Get-PowerCLIHelp aufgerufen werden, empfehlenswert ist auch Get-PowerCLICommunity.&nbsp;Hier noch ein kleiner Tipp: Wer die PowerShell ISE verwendet kann eigene Add-Ons hinzuf&uuml;gen. Ich habe ein einfaches Add-On gebastelt um das PowerCLI Snapin in die ISE Session zu laden. Dazu einfach folgendes Script in das ISE Profil kopieren. Um die ISE Profil Datei zu &ouml;ffnen &ldquo;notepad $profile.CurrentUserCurrentHost&rdquo; in der ISE ausf&uuml;hren.&nbsp;$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add(     &nbsp; \\\"Connect to vCenter\\\",      &nbsp;&nbsp;&nbsp; {      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add-PSSnapin VMware.VimAutomation.Core      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $VIServer = Read-Host -Prompt \\\"ESX/ESXi Host or vCenter Server FQDN\\\"      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Test-Connection $VIServer -Quiet) {Connect-VIServer $VIServer}      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {Write-Output \\\"Server not reachable\\\"}      &nbsp;&nbsp;&nbsp; },      &nbsp; \\\"Control+Alt+V\\\"      )Die Profildatei sollte signiert sein, wie man das macht habe ich hier beschrieben.&nbsp;so long   tom\"\n},{\n  \"title\": \"Upgrade Windows Server 2008R2 Sp1 - BlackBerry Monitoring Service startet nicht\",\n  \"url\": \"/post/upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht/\",\n  \"date\": \"May 10, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Nach dem Update auf Windows Server 2008R2 Sp1 starten die Monitoring Services des BlackBerry Enterprise Servers nicht mehr. Betroffen sind folgende Dienste:BBMonitoringService_APP - BlackBerry Monitoring Service - Application Core&lt;/p&gt;    BBMonitoringService_DCS - BlackBerry Monitoring Service - Data Collection Subsystem    BBMonitoringService_ENG - BlackBerry Monitoring Service - Polling Engine&lt;/code&gt;  Im Eventlog (Application) werden folgende Fehler protokolliert:  Source: BBMonitoringService_ENG Event ID: 3&lt;/p&gt;    Source: BBMonitoringService_DCS Event ID: 3    Source: BBMonitoringService_APP Event ID: 3&lt;/code&gt;  Die Lösung: Im %temp% Verzeichnis gibt es einen Ordner “gen_py”, die Inhalte dieses Ordners müssen gelöscht werden, dann starten die Dienste wieder.  Achtung: Der Ordner “gen_py” muss in allen Temp Verzeichnissen gelöscht werden, also C:\\\\Windows\\\\Temp und im User Verzeichnis des BesAdmin Accounts.  Hier ein Link zum Artikel in der RIM KB.  tom\"\n},{\n  \"title\": \"Forefront TMG Console – Script Error\",\n  \"url\": \"/post/forefront-tmg-console-error/\",\n  \"date\": \"May 4, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"de\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit der Installation von Internet Explorer 9 bekomme ich auf meinem Windows 7 Client folgende Fehlermeldungen beim &Ouml;ffnen der Forefront TMG Management Console:Script Error: An Error has occurred in the script on this page.Forefront TMG Error: Refresh failed Error 0x80020003: Member not foundDieses Problem kann man einfach l&ouml;sen, man schnappt sich ein Notepad (Achtung: mit administrativen Rechten) und &ouml;ffnet die Datei &ldquo;TabsHandler.htc&rdquo;. Diese befindet sich standardm&auml;&szlig;ig unter folgendem Pfad: &ldquo;C:\\\\Program Files\\\\Microsoft Forefront Threat Management Gateway\\\\UI_HTMLs\\\\TabsHandler&rdquo;In dieser Datei gibt es drei Zeilen die mit &ldquo;m_aPages [niPage].m_tdMain.style.paddingTop&rdquo; beginnen. Diese drei Zeilen m&uuml;ssen mit &ldquo;//&rdquo; auskommentiert werden und schon l&auml;uft die Konsole wieder normal. Hier noch ein Beispiel:// m_aPages [niPage].m_tdMain.style.paddingTop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((m_nBoostUp &lt; 0) ? -m_nBoostUp : 0) ;&nbsp;so long, tom\"\n},{\n  \"title\": \"RemoteFX\",\n  \"url\": \"/post/remotefx/\",\n  \"date\": \"April 24, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Hyper-V\"],\n  \"author\": \"dni\",\n  \"content\": \"Windows Server 2008 R2 bringt mit dem SP1 ein neues Feature für Remote Desktop mit: RemoteFX. RemoteFX verwendet die Hardware des Servers um die Grafikverarbeitung zu beschleunigen.Für RemoteFX gibt es 2 Verwendungsbereiche:&#160;1) RemoteDesktop Virtualization HostAuf dem Host ist dafür folgendes notwendig:   SLAT-enabled CPU     Zertifizierte Grafikkarte      RemoteFX encoder      Hyper-V INFO: Wenn Live-Migration verwendet wird, müssen alle Server dieselbe Grafikkarte haben.RemoteFX benötigt für die Grafikkarte einen WDDM Treiber, ist dieser nicht verfügbar (z.B. ILO), muss entweder die Grafikkarte im BIOS deaktiviert, oder der RemoteFX CAP-Treiber installiert werden. Bevor aber der RemoteFX CAP Treiber installiert wird, sollte der WDDM Treiber installiert und RemoteFX aktiviert sein. Danach kann der CAP Treiber über folgenden Befehl installiert werden:dism /online /enable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageUm den CAP Treiber zu deinstallieren reicht folgender Befehl: dism /online /disable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageVerwendet der Client mehrere Monitore, so muss folgende Tabelle bezüglich der RAM Benutzung auf der Grafikkarte beachtet werden:&#160;            Maximun resolution        1 monitor        2 monitor        3 monitor        4 monitor                  1024 x 768        75 MB        105 MB        135 MB        165 MB                  1280 x 1024        125 MB        175 MB        225 MB        275 MB                  1600 x 1200        184 MB        257 MB        330 MB        N/A                  1920 x 1200        220 MB        308 MB        N/A        N/A                  &nbsp;        &nbsp;        &nbsp;        &nbsp;        &nbsp;        &#160;2) Remote Desktop Session HostDamit RemoteFX für Remote Desktop Session läuft, muss der Prozessor zwingend das Feature SSE2 unterstützen. Zusätzlich kann noch ein sog. „Remote FX Hardware Decoder“ eingebaut werden um die Leistung zu erhöhen.&#160;Grüße   dn\"\n},{\n  \"title\": \"SoftAP - Windows 7 Wireless Access Point\",\n  \"url\": \"/post/softap-windows-7-wireless-access-point/\",\n  \"date\": \"April 12, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"de\"],\n  \"author\": \"tto\",\n  \"content\": \"Hinter dem Namen SoftAp oder Virtual WIFI verbirgt sich ein tolles Feature von Windows 7, es erm&ouml;glicht durch das Erstellen eines virtuellen Netzwerkadapters das Betreiben eines Access Point mit Windows 7. Damit man einen virtuellen Wlan Adapter erstellen kann muss nat&uuml;rlich ein Wlan Adapter installiert und aktiviert sein.Man erstellt den Virtual WIFI Adapter mit Hilfe des Command-Line Tools \\\"netsh\\\", dazu ben&ouml;tigt man eine Administrative Eingabeaufforderung in die man dann folgenden Befehl eintippt:netsh wlan set hostednetwork mode=allow ssid=* key=* keyUsage=persistentAn der Stelle der \\\"*\\\" kommt die SSID (ohne Leerzeichen) und der WPA2 Key, wurde dieser Befehl abgesetzt wird der virtuelle Adapter erstellt.&nbsp;Jetzt muss das Hostednetwork gestartet werden, damit sich Clients verbinden k&ouml;nnen:netsh wlan start hostednetworkInternet Connection SharingWenn man auf dem Windows 7 Rechner eine Internetverbindung hat kann man diese dem Hostednetwork zur Verf&uuml;gung stellen. Dazu &ouml;ffnet man die Eigenschaften des Adapters der die Internetverbindung herstellt und w&auml;hlt \\\"Freigabe\\\". Hier muss man die Checkbox bei \\\"Anderen Benutzern im Netzwerk gestatten....\\\" setzen und darunter den Virtual WIFI Adapter ausw&auml;hlen.Bei einem Neustart des Rechners startet das Wlan nicht automatisch mit. Ohne neustart kann das Hostednetwork mit folgendem Befehl gestoppt werden:netsh wlan stop hostednetworkUm den Status des Hostednetwork zu sehen verwendet man folgenden Befehl:netsh wlan show hostednetworkDaniel Melanchthon beschreibt in diesem Artikel weitere Details zu Virtual WIFI.&nbsp;UpdateDas Ganze funktioniert nat&uuml;rlich auch unter Windows 8 :)Gut zu wissen: Das \\\"hostednetwork\\\" unterst&uuml;tzt leider&nbsp;nur das v&ouml;llig &uuml;berf&uuml;llte 2,4 GHz Band: \\\"Radio types supported (Direct Sequence Spread Spectrum [DSSS], 802.11g, 802.11b)\\\"Hier der Link zur entsprechenden TechNet Seite: http://technet.microsoft.com/en-us/library/cc755301(v=WS.10).aspx&nbsp;Tom\"\n},{\n  \"title\": \"AppV Streaming Server\",\n  \"url\": \"/post/appv-streaming-server/\",\n  \"date\": \"March 23, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"AppV\",\"Client\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Verwendet man AppV für Applikationsvirtualisierung mit Clients in Standorten mit langsamer Anbindung (WAN) kann ein Updates eines Paketes ziemlich lange dauern, außerdem wird es von jedem Client einzeln heruntergeladen.Der AppV Streaming Server könnte die Lösung für dieses Problem sein. Mit dem Desktop Optimization Pack kommen neben den Installationsdateien für den AppV Management (Full) Server auch die Dateien für den Streaming Server. Die Installation gestaltet sich einfach, man wählt das Streaming Protokoll, sollte natürlich jenes sein das der Management Server verwendet. Außerdem muss man den Pfad für den “Content” Ordner angeben, diesen muss man manuell anlegen und freigeben (\\\\\\\\servername\\\\Content, Leseberechtigungen für Benutzer reichen aus).Die Installation ist abgeschlossen und der Dienst “Application Virtualization Streaming Server” (AppVirtServer) sollte gestartet sein.Im Application Event Log wird bei jedem Start des AppVirtServer Dienstes folgender Fehler Protokolliert:Error:&lt;/p&gt;    Source: Application Virtualization Server    Event ID: 44937    Empty package map for package content root: [D:\\\\Content\\\\].&lt;/code&gt;  Dieser Fehler wird für jedes Packet das auf dem AppV Management Server verfügbar ist einmal Protokolliert, und zwar so lange bis man die Daten aus dem Content Share des AppV Management Servers auf den Streaming Server kopiert. Es reicht aus die .sft Files zu kopieren, wichtig ist dabei dass eventuelle Unterordner auch angelegt werden.  Sind die Daten kopiert (d.h. beide Content Shares gleich) kann ist der Streaming Server bereit.  &#160;  Die Clients im Remote Netzwerk wissen allerdings nichts von diesem Server, d.h. Updates werden immer noch vom Management Server heruntergeladen. Über folgenden Registry Key gibt man den Clients die Information, in diesem Fall verwendet der Streaming Server RTSP:  HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\SoftGrid\\\\4.5\\\\Client\\\\Configuration&lt;/p&gt;    REG_SZ ApplicationSourceRoot    rtsp://servername:554/&lt;/code&gt;  Ab jetzt ist es nur mehr Wichtig bei Paket Updates daran zu denken alle Content Shares zu aktualisieren.   &#160;  tomt\"\n},{\n  \"title\": \"Create VMWare ESXi Flash Drive\",\n  \"url\": \"/post/create-vmware-esxi-flash-drive/\",\n  \"date\": \"March 11, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"VMware\"],\n  \"author\": \"tto\",\n  \"content\": \"Der Hypervisor von VMWare kann auf einem USB Stick installiert werden, so kann man die vorhandenen Festplatten des Servers als Datastore f&uuml;r Virtuelle Maschinen verwenden oder Server ohne interne Festplatten als ESXi Hosts verwenden.Dazu braucht man:einen USB Stick (min. 2GB)VMWare Workstation (oder Player)VMWare ESXi Installationsimage (VMWare ESXi)Dann kanns losgehen, mit VMWare Workstation (oder Player) wird eine neue Virtuelle Maschine erstellt.Als Pfad f&uuml;r das Installationsimage wird das Image von ESXi 4.1 angegeben.Als Gastbetriebssystem wird VMware ESX ausgew&auml;hlt.Ein Ordner f&uuml;r die Konfigurationsdateien und die virtuelle Festplatte muss angegeben werden, hier kann einfach ein Ordner auf der Lokalen Festplatte verwende werden.Die Gr&ouml;&szlig;e der virtuellen Festplatte kann man so akzeptieren, diese wird nicht verwendet.Die virtuelle Maschine ist eigentlich erstellt, allerdings muss noch ein USB Controller hinzugef&uuml;gt werden, dazu auf &ldquo;Customize Hardware&rdquo; klickenund den USB Controller hinzuf&uuml;gen.Jetzt kann man die virtuelle Maschine starten, und auch gleich &uuml;ber &ldquo;VM&rdquo; und &ldquo;Removable Devices&rdquo; den USB Stick verbinden (muss nat&uuml;rlich am PC angeschlossen sein&hellip;)Bei der Installation des ESXi Servers wird der USB Stick als Ziel angegeben, ACHTUNG: Alle Daten auf dem USB Stick werden gel&ouml;scht, der Stick wird neu formatiert.Sobald die Installation abgeschlossen ist, kann man die VM herunterfahren, auf dem USB Stick ist jetzt VMWare ESXi installiert. Von diesem Stick kann man jeden (unterst&uuml;tzten) Server booten und als ESXi Host verwenden.&nbsp;Achtung: bei der Installation auf USB wird keine Scratch Partition erstellt, Infos dazu hier: /post/ESXi&ndash;Persistent-Scratch-Location.aspx&nbsp;so long,   tom\"\n},{\n  \"title\": \"SharePoint–Dienstkonto wechseln, Probleme mit Kerberos\",\n  \"url\": \"/post/sharepoint-dienstkonto-wechseln/\",\n  \"date\": \"March 6, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Wird das Dienstkonto f&uuml;r die SharePoint-Webseite vom Netzwerk-Konto auf ein Dom&auml;nen-Konto ge&auml;ndert, und Kerberos in Kombination mit Windows-Authentifizierung verwendet wird, k&ouml;nnen sich die Clients nicht mehr an der Webseite authentifizieren.Der Dialog zum Eingeben der Credentials wird immer wieder angezeigt, die Authentifizierung kann jedoch nicht richtig verarbeitet werden.Um das Problem zu beheben, muss im IIS die Kernelmodus-Authentifizierung aktiviert werden, die standardm&auml;&szlig;ig nach der Installation von SharePoint deaktiviert ist:Nun k&ouml;nnen sich die Clients wieder ganz normal an der SharePoint-Webseite authentifizieren.&nbsp;Gr&uuml;&szlig;e   dn\"\n},{\n  \"title\": \"Outlook–gesendete Objekte–Shared Mailbox\",\n  \"url\": \"/post/outlook-gesendete-objekte-shared-mailbox/\",\n  \"date\": \"February 13, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Wie in diesem Post beschrieben kann man mit Exchange 2010 einfach Shared Mailboxen verbinden. Wenn ein User Send-As Berechtigungen auf eine solche Mailbox hat und ein Mail schickt, wird das Mail im Ordner “Sent Items” des jeweiligen Users gespeichert. Damit die gesendete Nachricht in den Sent Items der shared Mailbox gespeichert wird muss man folgenden Eintrag in der Registry erstellen (auf den Clients).Unter dem Schlüssel: “HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Office\\\\14.0\\\\Outlook\\\\Preferences” wird ein REG_DWORD mit dem Namen “DelegateSentItemsStyle” und dem Wert “1” erstellt.In einer Active Directory Umgebung bieten sich natürlich die Group Policy Preferences dafür an.\"\n},{\n  \"title\": \"TMG–Fehler beim Ausführen von Abfragen im Log\",\n  \"url\": \"/post/tmge28093fehler-beim-ausfuhren-von-abfragen-im-log/\",\n  \"date\": \"February 3, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Security\",\"SQL\"],\n  \"author\": \"dni\",\n  \"content\": \"Letztens hatte ich ein seltsames Problem auf meinen TMG 2010 Server. Ich logge auf die lokale SQL Express Datenbank und konnte keine Abfragen im Log aus der TMG Konsole mehr machen. Nach dem Start einer Abfrage erscheint der folgende Fehler:&nbsp;Daraufhin habe ich den SQL Server &uuml;berpr&uuml;ft, konnte aber keine Probleme feststellen. Im Management Studio lie&szlig;en sich die Logs durch SELECT Anweisung abfragen.Das Problem liegt an der Formatierung des Datums und taucht durch das Service Pack 1 (KB2288910) auf TMG&rsquo;s in deutscher Sprache auf.Das Problem l&auml;sst sich aber relativ einfach beheben: Man verbindet sich mit dem Management Studio auf die SQL Instanz und &auml;ndert die Standard-Sprache des Benutzerkontos &ldquo;NT Authority\\\\NetworkService&rdquo; auf Schwedisch um. Nachdem man nun die SQL Dienste neu startet kann man problemlos wieder das Abfragen im LOG starten.Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"Zertifizierungsstelle verschieben–neuer Servername\",\n  \"url\": \"/post/zertifizierungsstelle-verschiebene28093neuer-servername/\",\n  \"date\": \"January 21, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"In diesem Beitrag habe ich beschrieben wie man eine Zertifizierungstele sichert, den alten Server abbaut und die CA auf einem neuen Server mit dem selben Namen wiederherstellt. Will man allerdings die CA umziehen und den aktuellen Server nicht abbauen sind ein paar zusätzliche Schritte nötig. Wichtig ist hier zu sagen dass man zwar den Servernamen ändern kann, allerdings nicht den Namen der Zertifizierungsstelle!Tipp: Auch wenn die Microsoft Dokumentation das nicht wirklich bestätigt funktioniert eine Migration von 32Bit auf 64Bit. Also Backup auf x86 Restore auf x64 ist Möglich.Backup   Auf jeden Fall eine komplette Sicherung des Servers erstellen!     CA Datenbank und Key sichern     CA Konfiguration (Registry) sichern             Mit dem Registrierungseditor zu folgendem Schlüssel navigieren, rechtsklick und “Export”         HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration         reg export HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration RegBackup.reg             CA Templates notieren oder mit certutil.exe –catemplates &gt; templates.txt exportieren     CA Deinstallieren             Im Server Manager mit Remove Role die Active Directory Certificate Services deinstallieren         Achtung: wie bereits im alten Beitrag erwähnt bleiben gewisse Daten auf dem Server          Restore   alle Dateien (und Ordner) die von der Sicherung erstellt wurden auf den neuen Server kopieren             Achtung: caname.p12 enthält den private Key der CA!             Private Key importieren             certutil –importpfx caname.p12             CA Dienste installieren             Server Manager                     Im Servermanager mit Add Roles die Active Directory Certificate Services hinzufügen             Bei der Installation den richtigen CA Typ auswählen und das Richtige Zertifikat mit vorhandenem private Key wählen                         setupca.vbs                     auf einem Core Server wird die CA am besten mit diesem Script installiert             Bei der Installation muss der Wert im “Key Container” des installierten private Key angegeben werden, diesen kann man so herausfinden: certutil.exe -store my | find &quot;Key Container&quot;             setupca.vbs hat verschiedene Parameter um den entsprechenden CA Typ auszuwählen, folgendes Beispiel installiert eine Subordinate Enterprise CA: cscript setupca.vbs /IF /RC /SN WertKeyContainer             hier die Wichtigsten Parameter              /IE – Enterprise Root CA Service               /IS – Standalone Root CA Service               /IF – Enterprise Subordinate CA Service               /IT – Standalone Subordinate CA Service               /RC – Reuse Certificate and Key               /SN – CA Name                             CA Datenbank wiederherstellen             dazu muss der Dienst certsvc gestoppt werden, net stop certsvc         Im Server Manager mit rechtsklick, Restore CA kann die Datenbank wiederhergestellt werden         mit certutil –f –restoreDB PfadZumDataBaseOrdner kann man dasselbe erreichen             Konfiguration wiederherstellen: die Sicherung der Registry muss wieder importiert werden, dabei gilt es allerdings einiges zu beachten:             Backup der Registry auf dem neuen Server vor dem Import!         CAServerName anpassen, muss den neuen Servernamen enthalten         Die Pfade für folgende Werte kontrollieren, wenn sie auf dem alten Server nicht geändert wurden sollten kein Anpassungen nötig sein:                     DBDirectory, DBLogDirectory, DBSystemDirectory, DBTempDirectory                         Den Inhalt für folgende Werte zu kontrollieren um sicherzustellen dass CDP und AIA Informationen richtig veröffentlicht werden                     CACertPublicationURLs. CRLPublicationURLs                         Den Wert von CACertHash kontrollieren, wenn das CA Zertifikat erneuert wurde beinhaltet dieser Wert mehrere Thumbprints der CA Zertifikate. Wenn ein Thumbprint importiert wird und das zugehörige Zertifikat nicht installiert ist startet der Zertifikatsdienst (certsvc) nicht und protokollieret folgenden Fehler im Application Log:                     Active Directory Certificate Services did not start: Could not load or verify the current CA certificate.&#160; CAName The system cannot find the file specified. 0x80070002 (WIN32: 2).                             Berechtigungen auf CDP und AIA Container             Das Computerkonto des neuen Servers muss FullControl für die AIA und CDP Objekte des alten Server haben um CRLs und neue Root Zertifikate veröffentlichen zu können.         Berechtigungen werden mit ADSI Edit gesetzt, die Objekte finden sich unter CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local          CheckUm zu überprüfen ob alles läuft kann man ein Zertifikat anfordern. Funktioniert das ausstellen der Zertifikate sollte man noch überprüfen ob der Zugriff auf die Sperrlisten funktioniert. Dazu Exportiert man das Zertifikat (in eine .cer Datei) und führt “certutil –url datei.cer” aus.&#160;tom\"\n},{\n  \"title\": \"Signing PowerShell Scripts\",\n  \"url\": \"/post/signing-powershell-scripts/\",\n  \"date\": \"January 21, 2011\",\n  \"category\": \"Archive\",\n  \"tags\": [\"PowerShell\"],\n  \"author\": \"tto\",\n  \"content\": \"Damit ein PowerShell Script signiert werden kann muss man im besitz eines Zertifikates mit dem “Intended Purpose” Code Signing sein. So ein Zertifikat kann man sich selbst ausstellen, oder von einer Enterprise CA anfordern. Natürlich kann man es auch kaufen…Wie man ein SelfSigned Zertifikat erstellt ist ausführlich in der Hilfe beschrieben, einfach “Get-Help about_signing” ausführen.Um ein Code Signing Zertifikat von Enterprise Zertifizierungsstelle anzufordern muss man “Enroll” Berechtigungen auf die Zertifikatsvorlage haben, oder man kopiert die Vorlage und erstellt eine eigene, z.B. mit längerer Gültigkeit.Hat man also ein Zertifikat erhalten findet man es mit folgendem cmdlet:Get-ChildItem cert:\\\\CurrentUser\\\\My –codesigningMit Set-AuthenticodeSignature wird ein Script signiert, dieses cmdlet benötigt zwei Parameter, das zu Signierende Script und das Zertifikat.Im Folgenden Beispiel signiere ich die Datei C:\\\\scripts\\\\my-test.ps1 mit dem einzigen Zertifikat das in meinem Zertifikatsstore ist.$cert = Get-ChildItem cert:\\\\CurrentUser\\\\My –codesigning&lt;/p&gt;    Set-AuthenticodeSignature C:\\\\scripts\\\\my-test.ps1 $cert&lt;/code&gt;  Erscheint folgender Fehler, hat man das Script mit PowerShell ISE erstellt. Diese verwendet eine Codierung mit der Set-AuthenticodeSignature nicht zurechtkommt. Man erhält den vielsagenden Fehler: UnknonError.    Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab.    Und schon ist das Script signiert.  Wenn man das Script jetzt auf einem Host ausführt auf dem die ExecutionPolicy auf AllSigned gesetzt ist wird man informiert dass der Herausgeber unbekannt ist. Das Zertifikat welches zum Signieren verwendet wurde muss im TrustedPublisher Zertifikatstore sein.    Um das Zertifikat zu exportieren kann man die MMC Certficates verwenden, das Code Signing Zertifikat auswählen und auf Export klicken. Den Privat Key kann man nicht exportieren, dieser wird auch nicht benötigt um die Signatur zu bestätigen.  Die .cer Datei die man nach dem Export erhält kann man mit Gruppenrichtlinien auf alle Clients/Server verteilen oder manuell in den Store für Vertrauenswürdige Herausgeber importieren.  Gruppenrichtlinie:    Nach dem nächsten GP Refresh läuft das Script ohne Fehlermeldung.      Wird ein Script verändert nachdem es signiert wurde, wird die Ausführung verhindert. Folgende Fehlermeldung erscheint.    &#160;  tom\"\n},{\n  \"title\": \"PowerShell Scripts\",\n  \"url\": \"/post/powershell-scripts/\",\n  \"date\": \"December 7, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Achtung: Diese Scripts sind Beispiele, sie sind nicht f&uuml;r die Verwendung in Produktivsystemen gedacht! Die Autoren von ntSystems.it k&ouml;nnen keine Haftung f&uuml;r eventuelle Sch&auml;den durch diese Scripts &uuml;bernehmen.&nbsp;Exchange: Set SimpleDisplayName on all Mailboxes where this Attribute is empty; change characters like &ouml; to oe; send E-Mail if script fails   1: Import-Module 'C:\\\\Users\\\\daniel nitz\\\\AppData\\\\Roaming\\\\Microsoft\\\\Exchange\\\\RemotePowerShell\\\\ex2k10.domain.local\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.SimpleDisplayName -eq \\\"\\\"}   4: if($Mailboxes -ne $null)   5: {   6:     try {   7:         ForEach ($Mailbox in $Mailboxes)   8:         {   9:             $NameString = $Mailbox.Name  10:             if($NameString -match \\\"&uuml;\\\")  11:                 {  12:                 $NameString = ($NameString -replace \\\"&uuml;\\\",\\\"ue\\\")  13:                 }  14:             if($NameString -match \\\"&auml;\\\")  15:                 {  16:                 $NameString = ($NameString -replace \\\"&auml;\\\",\\\"ae\\\")  17:                 }  18:             if($NameString -match \\\"&ouml;\\\")  19:                 {  20:                 $NameString = ($NameString -replace \\\"&ouml;\\\",\\\"oe\\\")  21:                 }  22:             Set-Mailbox -Identity $Mailbox.Name -SimpleDisplayName ($NameString + \\\" - COMPANY\\\")  23:         }  24:     } Catch {  25:         Send-MailMessage -to daniel.nitz@domain.local -Subject \\\"Exchange Shell Script Error\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  26:     }                 27: }  28:     &nbsp;Exchange: Set Out of Office Assistent on Mailboxes where the &ldquo;Office&rdquo; property isn&acute;t empty   1: Import-Module 'C:\\\\Users\\\\daniel nitz\\\\AppData\\\\Roaming\\\\Microsoft\\\\Exchange\\\\RemotePowerShell\\\\ex2k10.domain.local\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.Office -ne \\\"\\\"}   4: try {   5:     $OOFTextExternal = ${E:\\\\OOF-Text\\\\External-Text.txt}   6:     $OOFTextInternal = ${E:\\\\OOF-Text\\\\Internal-Text.txt}   7:        8:     ForEach ($Mailbox in $Mailboxes)   9:     {  10:         Set-MailboxAutoReplyConfiguration -Identity $Mailbox.Name -AutoReplyState scheduled -StartTime \\\"2011.01.21T07:00\\\" -EndTime \\\"2011.01.21T19:00\\\" -ExternalAudience All -ExternalMessage $OOFTextExternal -InternalMessage $OOFTextInternal     11:     }  12: } Catch { Send-MailMessage -to daniel.nitz@domain.local -Subject \\\"Exchange Shell Script Error\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  13: }\"\n},{\n  \"title\": \"TMG 2010 unable to authenticate users after reboot\",\n  \"url\": \"/post/tmg-2010-unable-to-authenticate-users/\",\n  \"date\": \"November 22, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"author\": \"dni\",\n  \"content\": \"Nach dem Upgrade von ISA Server 2006 auf TMG 2010 musste ich eine Reihe von Probleme bez&uuml;glich der Authentifizierung feststellen. Nach jedem Neustart des Servers dauerte es zwischen einer halben und 2 Stunden bis der TMG Clients gegen AD erfolgreich authentifizierte. In der Zwischenzeit wurden die Verbindung aufgrund fehlender Authentifizierung abgelehnt.Auch das EventLog protokollierte folgende Fehler:Im ADAM Log wurde folgender Fehler protokolliert:&nbsp;Mein Problem habe ich dadurch gel&ouml;st, indem ich ein Computer-Zertifikat f&uuml;r den FQDN des TMG von meiner Zertifizierungsstelle angefragt und installiert habe. Anschlie&szlig;end habe ich den Netzwerkdienst Lesen-Berechtigungen f&uuml;r das Verzeichnis C:\\\\ProgramData\\\\Microsoft\\\\Crypto\\\\RSA\\\\MachineKeys gegeben (hier werden die Computerzertifikate gespeichert).INFO: Wenn der Request f&uuml;r das Zertifikat fehschl&auml;gt, muss in den Systemregeln der strikte RPC Filter deaktiviert werden:&nbsp;Nachdem diese Schritte abgeschlossen wurden, konnte ich im EventLog sehen wie die SSL-Verbindungen erfolgreich hergestellt wurden:&nbsp;Nach einem Neustart werden Verbindungen nun sofort authentifiziert.Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"Exchange 2010, change Display Name for outgoing Mails\",\n  \"url\": \"/post/exchange-2010-change-display-name-for-outgoing-mails/\",\n  \"date\": \"November 22, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Mit Exchange Server 2010 ist es sehr einfach den Display Name für ausgehende Mails zu ändern.Zunächst muss das Feature für die Remote-Domänen aktiviert werden. Mit den folgenden Befehl wird das Feature für alle Remote-Domänen aktiviert:Get-RemoteDomain | Set-RemoteDomain –UseSimpleDisplayName $trueIn den Einstellungen der Mailbox&#160; befindet sich die Eigenschaft Simple display name. Hier lässt sich der angepasste Display Name einfügen. ACHTUNG: Befindet sich kein Wert im Feld Simple Display Name nachdem das Feature aktiviert wurde, sendet Exchange die Mail-Adresse.&#160;Alle Mails, die nun die Organisation verlassen, werden mit den angepassten Display Name versendet:&#160;Anbei noch ein Shell-Beispiel um schnell für eine Liste (CSV-Import Datei) von Benutzern den Simple Display Name mit&#160; Name + Firma GmbH zu setzen.Import-CVS &quot;C:\\\\Import-File.csv&quot; | Foreach {Set-Mailbox -Identity $_.Name -SimpleDisplayName ($_.Name + &quot; - Firma GmbH/Srl&quot;)}           Beispiel für CSV-Import DateiName     Daniel Nitz      Max MustermannGrüße   dn\"\n},{\n  \"title\": \"Zertifizierung\",\n  \"url\": \"/post/zertifizierung/\",\n  \"date\": \"November 3, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Heute ist ein guter Tag f&uuml;r beide Autoren von ntSystems.it.Nachdem wir &uuml;ber eine halbe Stunde vor dem Prometric Test Centre warten mussten weil es dort Probleme mit den PCs gab konnten wir unsere Examen in Angriff nehmen.Daniel hat erfolgreich das &ldquo;70-432 TS: Microsoft SQL Server 2008, Implementation and Maintenance&rdquo; Examen absolviert und erweitert so seinen MCITP: Enterprise Administrator mit dem&nbsp; MCTS: SQL Server 2008, Implementation and Maintenance.Ich habe mit dem &ldquo;70-663 Pro: Designing and Deploying Messaging Solutions with Microsoft Exchange Server 2010&rdquo; nun den Status MCITP: Enterprise Messaging Administrator 2010 erreicht.In diesem Sinne,    tom\"\n},{\n  \"title\": \"Mail Sensitivity Header Exchange 2010 SP1\",\n  \"url\": \"/post/mail-sensitivity-header-exchange-2010-sp1/\",\n  \"date\": \"November 2, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Wer Shared Mailboxes mit Exchange 2010 verwendet kann folgendes Verhalten beobachten:· wird eine Mailbox über das AD Attribut msExchDelegateListLink verbunden sehen Benutzer keine als „Privat“ markierten Mails· verbindet ein User die Mailbox über Datei -&gt; Konto hinzufügen sind alle Objekte sichtbar, auch die als „Privat“ markiertenDie Vertraulichkeit einer Nachricht wird mit dem Sensitivity Header geregelt, dieser wird in dem Fall auf “private” gesetzt. Mit Transportregeln in Exchange kann man Message Header löschen oder bearbeiten. In diesem Fall reicht das Löschen des Headers nicht aus, man muss ihn auf “Normal” ändern. Man erstellt also eine neue Transportregel für alle eingehenden Nachrichten welche an die Shared Mailbox gesendet werden. Diese Regel soll der Wert des Headers “Sensitivity” von “private” auf “normal” ändern.Transportregeln kann man an drei verschiedenen Orten pflegen, EMS, EMC und ECP. Natürlich muss man die entsprechenden Berechtigungen besitzen. Exchange Control PanelDas Exchange Control Panel ist über https://meinexchange/ecp erreichbar, dort muss unter Options “My Organization” ausgewählt werden. Dann kann man unter “Mail Control” Regeln mit Hilfe eines Wizards erstellen.Exchange Management ConsoleIn der Management Console sind die Regeln unter “Organization Configuration” – “Hub Transport” und “Transport Rules” zu finden, auch hier kann man Regeln einfach über einen Wizard erstellen.Exchange Management ShellNatürlich kann man Transportregeln auch mit der Managment Shell erstellen. Dazu am Besten im TechNet vorbeischauen.Hier ein Beispiel:New-TransportRule -Name 'Remove Header' -Comments '' -Priority '0' -Enabled $true -SentTo 'shared.mailbox@domain.com' -HeaderMatchesMessageHeader 'Sensitivity' -HeaderMatchesPatterns 'private' -SetHeaderName 'Sensitivity' -SetHeaderValue 'normal'&#160;so long,    tom\"\n},{\n  \"title\": \"Sharepoint 2010, external List, BCS, SQL\",\n  \"url\": \"/post/sharepoint-2010-external-list-bcs-sql/\",\n  \"date\": \"October 21, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\",\"SQL\"],\n  \"author\": \"dni\",\n  \"content\": \"In diesem Post werde ich die einzelnen Schritte erklären um in Sharepoint eine SQL Tabelle einzubinden. Dazu erforderlich ist:   Sharepoint 2010 Foundation / Server     SQL Server     Sharepoint Designer 2010  Externen Inhaltstyp definierenIn diesem Schritt definieren wir den Inhaltstyp und somit die Verbindung zu SQL Server. Dies kann alles mit dem Sharepoint Designer erledigt werden. Unter Externe Inhaltstypen definieren wir die Verbindung.Nun kann ein Name und die Verbindung zu SQL Server angegeben werden, indem wir auf “Klicken Sie hier, um externe Datenquellen zu ermitteln und Vorgänge zu definieren” klickenWir erstellen eine neue Verbindung vom Typ SQL Server und geben die Datenbankinformationen anNun können wir die Tabellen auswählen, die für diesen Inhaltstyp zur Verfügung stehen. Dabei klicken wir auf die Tabelle und können verschiedene Vorgänge definieren:   Element lesen     Liste lesen     Erstellen     Aktualisieren     Löschen  Nun ist der Inhaltstyp definiert und steht in Sharepoint zur Verfügung.&#160;BCS Berechtigungen definierenStandardmäßig haben wir keine Berechtigung um auf den Inhaltstyp zuzugreifen. Dies müssen wir erst in den BCS Einstellungen definieren. Am schnellsten kann dies über die Zentraladministration erledigt werden.Zentraladministration / Anwendungsverwaltung / Dienstanwendungen verwaltenNun wählen wir den Business Data Connectivity-Dienst und definieren die Berechtigungen für den Inhaltstyp.Info: Mindestens 1 Account muss das Buntzerrecht “Berechtigungen festlegen” haben.Jetzt können wir die externe Liste erstellen und hätten theoretisch Zugriff darauf, wäre da nicht das Double-Hop Problem. Beim Zugriff erhalten wir folgende Fehlermeldung:&#160;Double-Hop Problem behebenUm das Double-Hop Problem zu lösen gehen wir folgendermaßen vor:1. Zunächst erstellen wir einen neuen SPN (Service Principal Name) für unseren SQL Server:setspn –A MSSQLsvc/NETBIOSNAME.DOMAIN:1433 DOMAIN\\\\SQL-Service-AccountDer SQL Service Account kann am schnellsten unter den Diensten ermittelt werden.2. Danach müssen wir in ActiveDirectory die Delegierungen für folgende Objekte aktivieren   Sharepoint Computer-Objekt     SQL-Service Account  Ich empfehle den Sharepoint sowie den SQL Server neu zu starten um sicherzugehen, dass die Konfiguration aktiv ist.Jetzt haben wir Zugriff auf die SQL Tabelle über Sharepoint.&#160;Nähere Informationen zur Double-Hop Problematik unter folgenden Link&#160;Grüße    dn\"\n},{\n  \"title\": \"Sharepoint Foundation 2010, insufficient SQL permissions\",\n  \"url\": \"/post/sharepoint-foundation-2010-insufficient-sql-permissions/\",\n  \"date\": \"September 27, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\",\"SQL\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn man Sharepoint Foundation 2010 mit den integrierten SQL Server 2008 Express installiert, hat man recht wenig Möglichkeiten Eigenschaften für den SQL Server zu definieren (Benutzerkonten, Logs, Backup).Wenn man nun über das Management Studio eine Verbindung mit SQL Server herstellen möchte, kann es vorkommen, dass man selbst mit dem Farm-Administratorkonto keine Änderungen an den entsprechenden Datenbanken vornehmen kann. Ein Blick auf die verbunden Gruppen des Farm-Administratorkontos verrät, dass sich das Benutzerkonto nur in der Gruppe public befindet und somit keine Einstellungen ändern darf.Zudem ist kein Benutzerkonto ersichtlich mit dem man sich anmelden könnte um das Farm-Administratorkonto den entsprechen Gruppen zuzuweisen. Mit dem Benutzer SA kann man sich ebenfalls nicht anmelden, da der “SQL Server- und Windows-Authentifizerungsmodus” nicht aktiviert ist.Der Grund dafür liegt hier: Wenn man Sharepoint Foundation 2010 über den Rechtsklick auf das Setup-File und “Als Administrator ausführen” installiert, wird das Produkt über das lokale Administratorkonto mit logischerweise den entsprechenden Administratorrechten installiert. Das wäre eigentlich auch kein Problem, wäre nicht die folgende Änderung ab SQL Server 2008 fest implementiert:In den Versionen vor SQL 2008 wurde der Gruppe lokale Administratoren (die enthält wiederum den Domain-Admin und geg. andere Benutzer) das SQL Benutzerrecht sysadmin zugewiesen. Folglich konnte jeder Admin,die Datenbanken verwalten. Ab SQL Server 2008 erhält diese Gruppe nicht mehr das sysadmin-Recht. Bei der manuellen Installation von SQL wird man danach gefragt welche Benutzer das sysadmin-Recht erhalten sollen. Als die Installation mit der Option “Als Administrator ausführen” durchgeführt wurde, hat der lokale Administrator die sysadmin-Rechte erhalten.Lösung: Wir erhalten mit dem Farm-Administrator Konto keine Ändern-Rechte in SQL, bis wir uns mit dem lokalen Administrator anmelden, Management Studio öffnen und den Benutzerkonten die entsprechenden Rechte zuweisen.PS: Wenn die Datenbank in den Sinlge User Mode geschalten wird, erhält die Gruppe lokale Administratoren (folglich auch Domain-Admins) die sysadmin-Rechte.Grüße    dn\"\n},{\n  \"title\": \"Migration ISA Server 2k4, 2k6 zu TMG, WPAD\",\n  \"url\": \"/post/migration-isa-server-2k4-2k6-zu-tmg-wpad/\",\n  \"date\": \"September 25, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"de\",\"Server\",\"Security\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn der ISA Server zu TMG oder einem anderen physischen Server migriert wird und sich dadurch der Servername &auml;ndert, funktioniert unter Umst&auml;nden die automatische Browserkonfiguration &uuml;ber WPAD bei DHCP Clients nicht mehr.WPADDas Web Proxy Autodiscovery Protocol (WPAD) ist ein Protokoll, mit dem Web-Clients automatisiert zu verwendende Web-Proxies innerhalb eines Computernetzwerkes finden k&ouml;nnen, indem eine Proxy autoconfiguration (PAC)-Datei unter einer erratbaren URL gespeichert wird, beispielsweise http://wpad.example.com/wpad.datWPAD wird in den DHCP Einstellungen sowie in DNS konfiguriert um DHCP Clients und jene Ger&auml;te mit den automatischen Einstellungen zu versorgen, die eine statische IP Adresse besitzen.Das Problem nach Migrationen / Serverumzug des ISA / TMG Servers bei DHCP Clients erkl&auml;rt sich so:Am DHCP Server wird eine neue Option (252) konfiguriert, die den Pfad zur WPAD.dat Datei bereitstellt. Sobald ein neuer DHCP Client sich vom DHCP Server eine IP Adresse holt, bekommt er auch eine Lease-Zeit zugewiesen, wie lange er die Adresse verwenden darf. Die Lease wird standardm&auml;&szlig;ig nach der H&auml;lfte der Lease-Zeit verl&auml;ngert. Solange sich der Client in dieser Lease befindet und die IP Adresse dem DHCP Server anbietet, wird die WPAD Datei nicht aktualisiert.&Auml;ndert sich jetzt der Servername des ISA / TMG Servers und ist in der Option 252 vom DHCP Server der jeweilige Servername eingetragen, so erhalten die DHCP Clients nicht die neue Konfiguration. Man m&uuml;sste bei jedem Client, der sich in einer Lease befindet die Befehle ipconfig /release und ipconfig /renew ausf&uuml;hren um einen manuellen Refresh durchzuf&uuml;hren.Es gibt mehrere Methoden das Problem zu umgehen:Methode 1 &ndash; Option 252 von Anfang an mit dem CNAME WPAD konfigurierenWenn man in den DHCP Einstellungen nicht den FQDN des Servers verwendet, sondern den CNAME WPAD (so wie man es f&uuml;r DNS konfigurieren muss), so wird der CNAME WPAD immer auf den jeweiligen aktuellen Server zeigen. ACHTUNG: Dies muss nat&uuml;rlich von Anfang an so erfolgen!!Methode 2 &ndash; Clients daran hindern die WPAD Option von DHCP zu zeihen.Durch hinzuf&uuml;gen des Registry Keys: AutoProxyDetectType mit dem Wert 2 unter HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settingswerden die Clients angewiesen das WPAD File &uuml;ber DNS anzufragen.Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"Exchange 2010 Pfad einer Mailboxdatenbank ändern\",\n  \"url\": \"/post/exchange-2010-pfad-einer-mailboxdatenbank-andern/\",\n  \"date\": \"September 18, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Der Pfad zu einer Exchange 2010 Mailboxdatenbank kann geändert werden, die Datenbank muss dazu allerding “dismounted” also offline sein. Das heißt die Benutzer deren Mailbox sich in der betreffenden Datenbank befinden habe für die Zeit der Änderung keinen Zugriff auf ihre Mailbox.Ich werde im Beispiel zwischen einer einzelnen Datenbank und einer Datenbank in einer DAG mit mehreren Kopien unterscheiden. Einzelne DatenbankDer Datenbankpfad kann mit der EMC sowie mit der EMS verschoben werden.Exchange Management Console   Rechtsklick auf Datenbank, Dismount     Wenn die Datenbank offline ist, wieder Rechtsklick und Move Databse Path auswählen.     Exchange Management Shell   Datenbank offline nehmen mit      Dismount-Database DB01     Pfad ändern      Move-DatabaseFilePath DB01 –EdbFilePath M:\\\\db01\\\\db01.edb –LogFolderPath L:\\\\     Datenbank wieder online nehmen      Mount-Database DB01  Datenbank in DAGAchtung:       Wenn Circular Logging für die Datenbank aktiviert ist muss das vor der Änderung deaktiviert werden!      Einstellungen wie ReplayLagTime und TruncationLagTime notieren, durch das entfernen und wieder erstellen der Datenbankkopien gehen diese Einstellungen verloren!   Alle Datenbankkopien entfernen, d.h. Datenbank wird nur auf einem Server belassen, auf diesem wird der Pfad geändert      Remove-MailboxDatabaseCopy     Datenbank offline nehmen (einzige verbleibende Kopie)      Dismount-Database     Datenbankpfad verschieben      Move-DatabasePath –EdbFilePath –LogFolderPath     Auf allen Servern die eine Kopie der Datenbank enthalten sollen muss der neue Pfad existieren, durch kopieren der alten Files an den neuen Pfad kann man zeit und Replikationstraffic sparen, die Datenbank muss so nicht neu geseedet werden     Datenbank wieder online nehmen      Mount-Database     Datenbankkopien wieder erstellen      Add-MailboxDatabaseCopy     Index und Search Dienste neu starten      net stop msftesql-Exchange        net start MSExchangeSearch     Replikation überprüfen      Test-ReplicationHealth        Get-MailboxDatabaseCopyStatus  &#160;Fehler beim entfernen/hinzufügen von KopienBeim entfernen einer Mailboxdatenbankkopie kann es zu einem Fehler mit folgender Meldung kommen: Error:      Registry key has subkeys and recursive removes are not supported by this method.&lt;/p&gt;    Warning:      An unexpected error has occurred and a Watson dump is being generated: Registry key has subkeys and recursive removes are not supported by this method.&lt;/code&gt;  Obwohl der Fehler auftritt wird die Datenbankkopie gelöscht. Allerdings bekommt man beim wiedererstellen der Datenbankkopie den selben Fehler und die Kopie wird nicht erstellt. Es hilft folgender Workaround.     GUID der betreffenden Datenbank herausfinden     Get-MailboxDatabase db01 | fl name,guid     Auf dem Server, auf dem die Datenbankkopie erstellt werden soll muss folgender Registry Key gelöscht werden     HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\ExchangeServer\\\\v14\\\\Replay\\\\State\\\\{GUID}\\\\DumpsterInfo    Jetzt wird das Add-MailboxDatabaseCopy cmdlet erneut ausgeführt und die Kopie wird erstellt.  &#160;  tom\"\n},{\n  \"title\": \"Exchange 2010 SP1 Online Archive in eigene Datenbank verschieben\",\n  \"url\": \"/post/exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben/\",\n  \"date\": \"September 18, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit Exchange 2010 wurden Online Archive eingeführt, mit SP1 hat man die Möglichkeit Archive in einer eigenen Datenbank zu verwalten. Die Vorteile liegen auf der Hand, man kann Archivdaten so auf billigeren, langsamen Storge legen, kann verschiedene Backup/Restore SLAs für Produktiv- und Archivdaten anbieten usw…Wer Online Archive bereits mit Exchange 2010 RTM verwendet hat und diese jetzt auf eine andere Datenbank schieben muss kann wie folgt vorgehen.EMCIn der EMC wurden mit SP1 die Wizards für einen neuen Move Request angepasst, dort kann man das Archiv auswählen und nur dieses verschieben.EMSIn der EMS gibt es neue Parameter für das cmdlet New-MoveRequest, hier ein Beispiel in dem das Archiv des Benutzers test.user in die Datenbank adb01 verschoben wird.new-MoveRequest test.user –ArchiveOnly –ArchiveTargetDatabase adb01tom\"\n},{\n  \"title\": \"Exchange 2010 Zertifikat anfordern\",\n  \"url\": \"/post/exchange-2010-zertifikat-anfordern/\",\n  \"date\": \"September 3, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Um OWA, Active Sync usw. betreiben zu können benötigt Exchange ein entsprechendes Zertifikat. Seit Exchange 2010 hat Microsoft hierfür einen komfortablen Wizard zur Verfügung gestellt.Der Wizard befindet sich unter der Serverkonfiguration und wird über den Menüpunkt “New Exchange Certificate” aufgerufen.Sobald der Wizard startet, muss zunächst ein Namen vergeben werden. Auf der nächsten Seite kann das Zertifikat noch für alle Subdomains freigegeben werden.Nun können die Einstellungen gesetzt werden, wie der Certificate-Request erstellt werden soll. Als Beispiel habe ich hier einige Parameter aufgelistet:OWAActiveSyncOutlook Anywhere und AutodiscoverAls Ergebnis werden dann die Domains angezeigt, die im Zertifikat registriert werdenNachdem die Informationen zu Organisation und Standort ausgefüllt wurde, kann der Certficate-Request abgespeichert und bei der CA eingereicht werden. Bevor die CA das Zertifikat ausstellen kann, muss die CA noch für die Registrierung mehrere Subject Names aktiviert werden.Nachdem die CA das Zertifikat ausgestellt hat, muss der Request noch abgeschlossen werden. Hier klickt man rechts auf das Zertifikat in der EMC und wählt die Option “Complete Pending Request”.Sobald das Zertifikat installiert ist, muss es noch mit den jeweiligen Diensten verbunden werden. Hier ist uns wieder ein Wizard behilflich. Rechtslick auf das Zertifikat und “Assign Services to Certificate”Nun kann man sämtliche Services auswählen, für die das Zertifikat zuständig ist.Mit Assign wird das Zertifikat dann hinzugefügt.Grüße   dnlive vom ntSystems techDAY :)\"\n},{\n  \"title\": \"Exchange 2010 SAN Zertifikat–Server 2008 PKI\",\n  \"url\": \"/post/exchange-2010-san-zertifikate28093server-2008-pki/\",\n  \"date\": \"September 3, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Zertifikate f&uuml;r den Exchange 2010 Client Zugriff beinhalteten mehrere Subject Names. Standardm&auml;&szlig;ig werden sogenannte SAN Zertifikate von Server 2008 Certificate Authorities nicht unterst&uuml;tzt.Damit die CA ein SAN Zertifikat ausstellen kann muss folgender Befehl von einer Eingabeaufforderung mit administrativen Rechten ausgef&uuml;hrt werden:certutil &ndash;setreg policy\\\\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2Anschlie&szlig;end m&uuml;ssen die CA Dienste neu gestartet werden. Am besten mit \\\"net stop certsvc &amp;&amp; net start certsvc&rdquo;.Will man jetzt einen Certificate Request &uuml;ber die MMC einreichen erscheint folgender Fehler:&ldquo;The request contains no Certificate template information. 0x80094801 (-2146875391) Denied by Policy Module 0x80094801, the request does not contain a Certificate template extension or the Certificate Template request attribute.&rdquo;Man muss den Request &uuml;ber die Certificate Web Services einreichen, standardm&auml;&szlig;ig l&auml;uft die auf der CA unter /certsrv, in unserem Fall also: http://dc01.ntsystems.local/certsrv. Dort w&auml;hlt man Request a Certificate, advanced certificate request und submit a certificate using a (&hellip;) file. In das Textfeld wird der gesamte Inhalt der .req Datei kopiert, bei Certificate Template wird Web Server ausgew&auml;hlt. Wenn der Request erfolgreich war, kann man die .cer Datei herunterladen und in Exchange den Request fertigstellen (Complete Pending Request).Alternativ kann der Request mit &ldquo;certutil&rdquo; eingereicht werden, wobei mit dem Parameter &ldquo;/attrib&rdquo; das Template gew&auml;hlt wird.Beispiel: certreq.exe -submit -attrib \\\"CertificateTemplate:WebServer\\\" c:\\\\certreq.req&nbsp;tomlive vom ntSystems techDAY :)\"\n},{\n  \"title\": \"WebDav, IIS7 publishing over ISA Server Part 2\",\n  \"url\": \"/post/webdav-iis7-publishing-ober-isa-server-part-2/\",\n  \"date\": \"September 2, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Wie versprochen hier der 2. Teil meiner WebDav Reihe. In diesem Post geht es darum das WebDav Verzeichnis mit dem ISA Server zu veröffentlichen.Als erstes erstellen wir eine neue Webveröffentlichungsregel:Wir geben an, dass wir eine einzelne Webseite veröffentlichen und wählen bei Sicherheit SSL ausNun müssen wir den Sitenamen inkl. IP Adresse (sofern dieser nicht aufgelöst werden kann) vergebenDanach geben wir den Pfad an, für welchen die Veröffentlichungsregel wirken soll, bzw. auf welchen Ordner der externe Zugriff beschränkt werden soll.Nun tragen wir noch den externen Namen einINFO: Sollte euer Pfad Leerzeichen haben, ist das für den ISA Server kein Problem. Man muss die Leerzeichen nicht durch %20 ersetzen, sondern kann die URL ganz normal eingeben.Als nächstes erstellen wir einen neuen Listener und weisen ihn an, dass eine SSL Verbindung erforderlich istJetzt wählen wir IP Adresse und das entsprechende Zertifikat aus. Sofern dies noch nicht auf dem ISA Server installiert wurde, muss es jetzt nachinstalliert werden.Als Authentifizierung wählen wir die HTTP Authentifizierung – StandardAls Authentifizierungsdelegierung nehmen wir NTLMZum Schluss kann man noch eine Gruppe angeben, auf welche die Veröffentlichungsregel beschränkt ist.&#160;Das Standardverhalten des Client ist es, den veröffentlichen Ordner selbst durch die HTTP Methode OPTIONS abzufragen. Damit die Verbindung nicht fehlschlägt, müssen wir dies zulassen und dürfen es nicht wie durch die bereits erstellte Regel mit den zugelassenen Pfaden blockieren. Wir kopieren die neu erstelle Regel und platzieren sie unter der ersten Regel. Danach werden die die HTTP Methode auf OPTIONS beschränken.Nun geben wir der kopierten Regel einen neuen Namen (Bsp: WebDav – OPTIONS) um sie von der ersten Regel zu unterscheiden. Wir löschen zudem unter dem Reiter Pfade die Ordnerbeschränkung.Als nächstes wird die HTTP Methode auf OPTIONS beschränkt. Wir öffnen die HTTP Richtlinie und tragen die Methode ein:&#160;ACHTUNG: Ordner mit UmlauteWenn ihr Ordner mit Umlaute verwendet, wird die Verbindung beim versuch die Ordner zu öffnen, immer zusammenbrechen. Der Grund hierfür liegt darin, dass das High Bit-Zeichen standardmäßig deaktiviert ist. Dieses High Bit-Zeichen lässt Umlaute in der URL zu. Ich empfehle auf beiden Veröffentlichungen WebDav und WebDav Options das High Bit-Zeichen zu erlauben.     Dies kann ebenfalls in der jeweiligen HTTP Richtlinie vorgenommen werden:Nun kann der Client den Ordner via HTTPS von Extern mappen.Grüße   dn\"\n},{\n  \"title\": \"WebDav, IIS7 publishing over ISA Server Part 1\",\n  \"url\": \"/post/webdav-iis7-publishing-over-isa-server-part-1/\",\n  \"date\": \"September 1, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Dies ist der erste aus 2 Teilen zum Thema WebDav. WebDav (Web-based Distributed Authoring and Versioning) ist ein offizieller Standard, Dateien im Internet bereitzustellen.&lt;/p&gt;Der Vorteil von WebDav ist, dass es nicht wie FTP oder SSH spezielle Ports verwendet, sondern &uuml;ber HTTP und HTTPS &uuml;bertragen wird und somit durch jede Firewall kommt, welche Port 80 und 443 ge&ouml;ffnet hat.Im ersten Teil werde ich zeigen wie ein Verzeichnis unter IIS7 erstellt und &uuml;ber WebDav freigegeben wird. Im 2. Teil werde ich beschreiben wie man das Ganze &uuml;ber den ISA Server ver&ouml;ffentlicht.&nbsp;ServerSofern IIS nicht installiert ist, besteht der erste Schritt darin den Webserver zu installierenZus&auml;tzlich zum Webserver muss das Feature WebDav hinzugef&uuml;gt werden.Der n&auml;chste Schritt besteht darin, eine neue Webseite in IIS zu erstellen. Als physikalischen Pfad geben wir das Verzeichnis ein, welches &uuml;ber WebDav freigegeben werden soll.Zus&auml;tzlich binden wir die Webseite auf Port 443 HTTPS und w&auml;hlen das jeweilige Zertifikat aus.Als n&auml;chstes m&uuml;ssen unter Authentifizierung die Anonyme Authentifizierung deaktivieren und Windows- und Standardauthentifizierung aktivieren.Bei den Webseiteneinstellung befindet sich das Feature WebDav-Erstellungsregeln.In den Einstellungen muss zun&auml;chst WebDav aktiviert werden und danach eine neue Erstellungsregel erstellt werden. Die Erstellungsregel definiert die jeweiligen Zugriffsrechte.Die Konfiguration ist nun abgeschlossen. Ich empfehle jedoch um Probleme mit&nbsp;Zielpfade auf &nbsp;entfernten Servern zu vermeiden, zus&auml;tzlich unter den Verbindungseinstellungen der Webseite, einen Benutzer anzugeben, der Zugriffsrechte auf die Webseite hat.&nbsp;ClientUm das WebDav-Verzeichnis zu mappen, muss der Client ein neues Netzlaufwerk verbinden und die Option &ldquo;Verbindung mit einer Webseite herstellen, auf der Sie Dokumente und Bilder speichern k&ouml;nnen&rdquo; ausw&auml;hlen.Als Adresse geben wir https://Servername einJetzt k&ouml;nnen wir auf das Verzeichnis &uuml;ber HTTPS zugreifen.Gr&uuml;&szlig;e dn&lt;/code&gt;\"\n},{\n  \"title\": \"Exchange 2010–Role Based Access Control\",\n  \"url\": \"/post/rbac/\",\n  \"date\": \"September 1, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"In Exchange 2010 wurde ein neues Berechtigungsmodell eingef&uuml;hrt, Role Based Access Control. Es basiert auf sogenannten Rollen anstelle von ACLs, diese Rollen (eigentlich die Role Entries) steuern den Zugriff auf cmdlets. Um dieses neue Modell zu verstehen muss man die Grundbausteine verstehen aus denen es besteht. Vereinfacht gesagt wird festgelegt wer was wo machen darf.&nbsp;Scope (wo)Definiert die Objekte im Active Direcotry auf welchen die Rolle Berechtigungen hat. New-ManagementScope Role/Role Entry (was)Eine Rolle ist eine Sammlung von Role Entries, sie definiert welche cmdlets und welche Parameter ausgef&uuml;hrt werden d&uuml;rfen. New-ManagementRole Add-ManagementRoleEntry, Remove-ManagementRoleEntry RoleGroup (wer)Universelle Sicherheitsgruppe deren Mitglieder die Rechte bekommen die in der Role definiert sind. Verkn&uuml;pft Rolle und Scope. New-RoleGroup &ndash;Roles &ldquo;&rdquo; &ndash;CustomRecipientWriteScope &ldquo;&rdquo; Role AssignmentVerbindet die oben genannten Elemente, legt fest wer was wo machen darf. Das cmlet New-RoleGroup erzeugt den ManagementRoleAssignmenteintrag Get-ManagementRoleAssignment Es gibt in Exchange 2010 65 vordefinierte Rollen die man sich mit Get-ManagementRole anzeigen lassen kann.Will man die Role Entries zu einer Rolle sehen f&uuml;hrt man folgendes cmdlet aus: Get-ManagementRoleEntry Rolle\\\\*Beispiel: Get-ManagementRoleEntry \\\"Move Mailboxes\\\\*\\\"&nbsp;Benutzerdefinierte Rolle erstellenSoll eine Benutzerdefinierte Rolle bzw. ein Scope erstellt werde, dann in dieser Reihenfolge:New-ManagementScope \\\"Gruppe1Scope\\\" -RecipientRestrictionFilter {memberofgroup -eq \\\"CN=Gruppe1,OU=users,DC=domain,DC=local} Diese Rolle darf nur Mitglieder der Gruppe1 bearbeiten. New-ManagementRole \\\"Create Move Request Gruppe1\\\" &ndash;Parent &ldquo;Move Mailboxes&rdquo; Eine neue Rolle wird erstellt New-RoleGroup \\\"Gruppe1 Movers\\\" -roles \\\"Create Move Request Gruppe1\\\" -CustomRecipientWriteScope \\\"Gruppe1Scope\\\" Eine neue Gruppe wird erstellt (Universelle Sicherheitsgruppe im AD), die Rolle sowie der Scope werden dieser Gruppe zugewiesen Add-RoleGroupMember \\\"Gruppe1 Movers\\\" -members \\\"username\\\" Benutzer werden der Gruppe hinzugef&uuml;gt, kann auch im AD gemacht werden So sieht die soeben erstellte Rolle aus:Get-ManagementRoleEntry \\\"Create Move Request Gruppe1\\\\*\\\"&nbsp;Benutzerdefinierte Rolle anpassenMeine soeben erstellte Rolle soll nur Berechtigungen haben einen Move Request zu erstellen. Mitglieder sollen den Move Request nicht l&ouml;schen, anhalten oder weiterf&uuml;hren k&ouml;nnen. Also passe ich die RoleEntries entsprechend an.Nicht gew&uuml;nschte cmdlets entfernen mit remove-ManagementRoleEntry remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Remove-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Suspend-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Resume-MoveRequest&rdquo; Mit add-ManagmentRoleEntry &ldquo;Create Move Request Gruppe1\\\\RoleEntry&rdquo; kann man weitere Eintr&auml;ge erstellen und die Rolle weiter personalisieren. Nachdem die nicht erw&uuml;nschten cmdlets entfernt wurden sieht das Ganze so aus:Get-ManagementRoleEntry \\\"Create Move Request Gruppe1\\\\*\\\"&nbsp;Wichtig: RBAC Rollen sind nicht gleichzusetzen mit ACLs (Sicherheitsberechtigungen), das hei&szlig;t es wird nicht die restriktivste Rolle angewandt. Benutzer erhalten durch alle Rollen die ihnen zugewiesen sind Zugriff auf ein bestimmtes &ldquo;Set&rdquo; an Funktionen. Mehr Rollen = Mehr Funktionen.Wenn man das Prinzip einmal verstanden hat, wird einem schnell bewusst wie m&auml;chtig dieses neue Berechtigungsmodell ist. Da die Exchange Management Konsole auch nichts anderes macht also PowerShell Befehle abzusetzen kann man so wirklich alles genau an seine Bed&uuml;rfnisse anpassen.tom\"\n},{\n  \"title\": \"Shared Mailboxes und Auto Mapping E14 Sp1\",\n  \"url\": \"/post/shared-mailboxes-und-auto-mapping-e14-sp1/\",\n  \"date\": \"August 31, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Shared und Ressourcen Postf&auml;cher gibt es schon l&auml;nger. Mit Exchange 2010 SP1 kommt aber ein neues Feature das den Admins das leben um einiges erleichtert. Wie das Kind hei&szlig;t ist noch nicht zu erfahren, es wird in div. Blogs und Foren &ldquo;Auto Mapping&rdquo; genannt.Um dieses neue Feature zu verwenden muss man nur auf einem Exchange 2010 SP1 Server Berechtigungen auf eine Shared Mailbox setzen, existieren die Berechtigungen bereits m&uuml;ssen sie entfern und nochmal gesetzt werden.&nbsp; Beim setzen der Berechtigungen werden n&auml;mlich die Benutzer, die von der Berechtigung profitieren, in das ActiveDirectory Attribut msExchDelegatedListLink aufgenommen.Outlook sucht beim starten nach Mailboxen mit dem DN des Benutzers und verbindet diese automatisch. Ein weiterer Vorteil ist dass die Mailbox vom Benutzer nicht geschlossen oder entfernt werden kann, so werden die Helpdesk Calls weiter reduziert ;)Das Ganze funktioniert &uuml;brigens auch f&uuml;r Ressourcen (Room/Equipment) Mailboxen.tomspecial thanks to: Steve Goodman\"\n},{\n  \"title\": \"E14 SP1 Import/Export Update\",\n  \"url\": \"/post/e14-sp1-importexport-update/\",\n  \"date\": \"August 28, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Vor kurzem habe ich in diesem Post &uuml;ber die Import/Export-Mailbox cmdlets geschrieben.Mit Exchange 2010 SP1 wurde die Import/Export Funktionalit&auml;t ge&auml;ndert und die cmdlets werden durch MailboxImportRequest und MailboxExportRequest ersetzt. Die Vorteile die daraus Resultieren sind folgende:Import/Export von Online ArchivenVerwendet Exchange MAPI Provider, Outlook muss nicht mehr auf dem Server installiert werdencmdlets verwenden UNC Pfade (PST Files m&uuml;ssen nicht mehr auf den Server kopiert werden)Beispiel:New-MailboxImportRequest-Mailbox&nbsp;test -IsArchive&nbsp;-FilePath \\\\\\\\server\\\\test.pstDieser Befehl Importiert den Inhalt der Datei test.pst in das Online Archiv der Mailbox \\\"test\\\".\"\n},{\n  \"title\": \"Sharepoint 2010, Fehler in der SQL Datenbank beheben\",\n  \"url\": \"/post/sharepoint-2010-fehler-in-der-sql-datenbank-beheben/\",\n  \"date\": \"August 23, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Letztens wollte ich einen Test-Restore meiner Sharepoint Datenbank durchführen. Normalerweise hat das immer problemlos funktioniert, jedoch beim letzten Backup gab es große Probleme mit dem Sharepoint-Inhalt. Der Restore-Vorgang wurde erfolgreich beendet, jedoch war lediglich die halbe Sharepoint Struktur und keine Daten enthalten.Nachdem ich das Eventlog des Quellservers durchforstet habe, bin ich auf folgende Fehler im Anwendungs-Log gestoßen:Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 18053    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Fehler: 7884, Schweregrad: 20, Status: 1. (Parameter: ). Der Fehler wird aufgrund eines Formatierungsfehlers im nicht ausführlichen Modus gedruckt. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden ausgelassen.    Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 7105    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Die Datenbank-ID '6', Seite '(0:0)', Slot '0' für den LOB-Datentypknoten ist nicht vorhanden. Dies ist gewöhnlich auf Transaktionen zurückzuführen, die Daten, für die kein Commit ausgeführt wurde, auf einer Datenseite lesen können. Führen Sie DBCC CHECKTABLE aus.    Um den Fehler zu analysieren muss man zunächst das SQL Server 2008 Management Studio Express installieren. Über das Management Studio erhält man Zugriff auf dem SQL Server und kann mit dem Troubleshooting beginnen.    Zunächst meldet man sich am SQL Server an. Als Servername verwenden wir SERVER\\\\SharepointNun ist die Verbindung zum Server hergestellt. Jetzt muss die Datenbank mit der ID ‘6’ (wie in der Fehlermeldung 2) gefunden werden. Als erstes öffnen wir ein Abfragefenster und gehen jede Datenbank mit use NAME-DER-DATENBANK     select db_id()durch, bis uns die entsprechende ID im Fenster “Meldungen” ausgegeben wird. In meinen Fall war das die Datenbank WSS_CONTENT.Nun führen wir den Befehl DBCC CHECKDB (WSS_CONTENT) WITH NO_INFOMSGS, ALL_ERRORMSGS aus und bekommen eine Liste mit den entsprechenden FehlernIn meinem Fall:Meldung 8965, Ebene 16, Status 1, Zeile 1     Tabellenfehler: Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594043760640 (LOB data-Typ). Auf den Datenknoten außerhalb von Zeilen auf Seite (0:0), Slot 0, Text-ID 1759772672 wird von Seite (1:4986), Slot 6 verwiesen, er wurde jedoch im Scan nicht betrachtet.     Meldung 8929, Ebene 16, Status 1, Zeile 1     Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594123255808 (In-row data-Typ): Es wurden Fehler in Daten außerhalb von Zeilen gefunden mit der ID 1759772672, im Besitz von data, Datensatz identifiziert durch RID = (1:4986:6).     Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'AllDocs'-Tabelle (Objekt-ID 69575286) gefunden.    Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'WSS_Content'-Datenbank gefunden.    repair_allow_data_loss ist die minimale Reparaturstufe für die Fehler, die mit DBCC CHECKDB (WSS_Content) gefunden wurden.&#160;Die Meldungen weisen darauf hin, dass eine Inkonsistenz in der Datenbank vorliegt. Höchstwahrscheinlich handelt es sich dabei um eine Datei, die auf dem Sharepoint Server upgeloaded wurde. Um die Inkonsistenz zu beheben muss DBCC CHECKDB mit dem Parameter repair_allow_data_loss ausgeführt werden. Dafür müssen zunächst alle Sharepoint Dienste und der IIS Dienst beendet werden.   Danach müssen die folgenden Kommandos ausgeführt werden:Mit dem Befehl ALTER DATABASE WSS_Content SET SINGLE_USER, wird die Datenbank in den Sinlge_Mode gesetzt, der Befehl DBCC CHECKDB (WSS_Content, REPAIR_ALLOW_DATA_LOSS) startet die Reparatur.Nachdem die Reparatur abgeschlossen wurde und DBCC CHECKDB keine Fehler mehr protokolliert, kann der Modus wieder zu MULTI_USER geändert werden.Jetzt können alle Dienste wieder gestartet werden. Die Datenbank sollte jetzt konsistent sein und die Sicherung vollständig durchlaufen.Grüße   dn\"\n},{\n  \"title\": \"AppV 4.6–SCCM 2007R2 Streaming Applications\",\n  \"url\": \"/post/appv-46e28093sccm-2007r2-streaming-applications/\",\n  \"date\": \"August 12, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"AppV\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Seit System Center Configuration Manager 2007 R2 kann man Virtuelle Applikationen verteilen. Daf&uuml;r m&uuml;ssen ein paar Einstellungen im SCCM gemacht werden, der SCCM Advanced Client sowie der AppV Client m&uuml;ssen auf den Clients installiert werden.Einstellungen SCCM 2007R2Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Client Agents, Advertised Programs Client Agent&rdquo; &ouml;ffnen unter General muss &ldquo;Allow virtual application package advertisemet&rdquo; muss werden  Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Site Systems, Servername, ConfigMgr distribution point&rdquo; &ouml;ffnen unter General muss &ldquo;Allow Clients to transfer content from this distribution Point using BITS, HTTP, and HTTPS&rdquo; aktiviert werden unter Virtual Application muss &ldquo;Enable virtual application streaming&rdquo; aktiviert werden &nbsp; AppV Client deploymentUnter &ldquo;%ProgramFiles%\\\\Microsoft Configuration Manager\\\\Tools\\\\VirtualApp&rdquo; die Datei &ldquo;AppVirtMgmtClient.sms&rdquo; anpassen. Version=4.6 (wenn AppV Client 4.6 verwendet wird) Commandline=setup.exe /s /v\\\"/quiet /norestart /qn\\\"0\\\\\\\"\\\\\\\" (Application Virtualization Client Installer Command-Line Parameters) Ein neues Paket aus einer Definition erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Package From Definition&rdquo; w&auml;hlen. Mit &ldquo;Browse&rdquo; die Datei AppVirtMgmtClient.sms ausw&auml;hlen  Im n&auml;chten Fenster &ldquo;Always obtain files from a source directory&rdquo; w&auml;hlen  Als Pfad wird ein Netzwerkfreigabe gew&auml;hlt auf welcher der AppV Client entpackt wurde, folgende Dateien und Ordner sollten vorhanden sein: setup.exe setup.msi Support\\\\Watson\\\\dw20shared.msi Auf Finish klicken und das Paket wurde erstellt Jetzt muss noch ein Advertisement f&uuml;r das Paket erstellt werden.Rechtsklick auf &ldquo;Site Database, Computer Management, Software Distribution, Advertisements&rdquo; und New Advertisement w&auml;hlen. Einen Namen eingeben, das Paket ausw&auml;hlen welches im vorigen Schritt erstellt wurde und eine Collection ausw&auml;hlen welche den Client erhalten soll.  Mandatory Assignment hinzuf&uuml;gen  Art der Verteilung w&auml;hlen, in dem Fall &ldquo;Download from distribution point and run locally&rdquo;  An dieser Stelle kann auf Finish geklickt werden, f&uuml;r die &uuml;brigen Einstellungen akzeptiere ich die Standards. Jetzt wurde das Paket und die Zuweisung erstellt, die Clients die in der Collection sind erhalten die Software.Virtuelle Applikation importierenNachdem die Virtuelle Applikation im Sequencer erstellt wurde (wie z.B. hier erkl&auml;rt) muss sie im System Center Configuration Manager importiert werden.Ein neues virtuelles Paket erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Virtual Application Package&rdquo; w&auml;hlen. Im ersten Fenster muss die XML Datei des Pakets angegeben werden.  Das Fenster &ldquo;General&rdquo; ist eigentlich selbsterkl&auml;rend, Name, Hersteller usw. k&ouml;nnen eingegeben werden. Im Fenster &ldquo;Data Source&rdquo; wird eine Netzwerkfreigabe angegeben auf der das Paket erstellt wird, von dieser Freigabe wird das Paket dann auf die Distribution Points verteilt (Achtung: der Angegebene Order muss existieren und vorhandene Daten werden &uuml;berschrieben!)  Jetzt kann wieder auf Finish geklickt werden, die Standards der restlichen Einstellungen sind ok. Das Virtuelle Paket wurde nun also auch erstellt. Jetzt fehlt noch ein Advertisement f&uuml;r dieses.Das Advertisement wird genau gleich erstellt wie jenes f&uuml;r den AppV Client, der einzige unterschied liegt in der Auswahl der Verteilungsmethode hier w&auml;hlt man &ldquo;Stream virtual applications from distribution point&rdquo; &nbsp; Nach kurzer Zeit werden die Clients auch dieses Advertisement erhalten. Sind Desktopverkn&uuml;pfungen oder Dateizuordnungen konfiguriert werden diese auf dem Client bereits angewandt. Das hei&szlig;t ein .pdf File bekommt in diesem Beispiel bereits den virtuellen Adobe Reader zugewiesen. Beim ersten Starten des Programmes wird der Inhalt des Paketes heruntergeladen, d.h. der erste Start dauert ein bisschen, alle weiteren Starts verlaufen wesentlich schneller, dabei wird nur auf Updates &uuml;berpr&uuml;ft, alle anderen Files sind bereits lokal vorhanden.tom\"\n},{\n  \"title\": \"Sharepoint Web Apps lassen sich nicht installieren\",\n  \"url\": \"/post/sharepoint-web-apps-lassen-sich-nicht-installieren/\",\n  \"date\": \"August 11, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn man die Sharepoint Webseite nicht über den default Port 80 betreibt, bricht die Installation der Sharepoint Webservices bei der Erstellung der Beispieldaten ab. &#160;Um das Problem zu umgehen empfiehlt es sich die Sharepoint Webseite während der Installation auf Port 80 zu binden. Dazu sind folgende 2 Schritte notwendig:   In der Sharepoint Zentraladministration muss der alternative Zugriff auf Port 80 gebunden werden    Im IIS Manger muss ebenfalls die Bindung neu festgelegt werden Danach läuft die Installation vollständig durch und die Webseite kann wieder auf den ursprünglichen Port gebunden werden.Grüße   dn\"\n},{\n  \"title\": \"AppV 4.6–SCCM 2007R2–Streaming Issue\",\n  \"url\": \"/post/appv-46e28093sccm-2007r2e28093streaming-issue/\",\n  \"date\": \"August 11, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\",\"AppV\"],\n  \"author\": \"tto\",\n  \"content\": \"Hi, tom here again. Talking about AppV and System Center Configuration Manager 2007R2 today.I was stumbling upon this error while I was trying to stream virtual Applications with SCCM. If I set the advertisement to &ldquo;Stream virtual applications from distribution point&rdquo; the following error occurred, though if I set the advertisement to &ldquo;Download content from distribution point and run locally&rdquo; everything worked without any problem.The problem was caused by the malware inspection feature of my ForeFront TMG Web Proxy Server.If you see &ldquo;an unexpected error&rdquo; with the Error Code like: 0A-400000C8 try to disable the Proxy on the Clients for further research.If you are using Forefront TMG be sure to add the SCCM (streaming enabled) Distribution Point to the Malware Destination Exceptions.You wont see this error with Application Virtualization Management Server when using RTSP or RTSPS as streaming protocol. You wont see it even with SCCM&nbsp;if &ldquo;Download content from distribution point and run locally&rdquo; is selected because this uses BITS to transfer the whole package to the client and run it locally. Since SCCM uses HTTP/HTTPS for streaming the connection will go to the proxy server and will be killed by Malware Inspection.tomps. special thanks go to J.C. Hornbeck (http://blogs.technet.com/b/appvcallback/)\"\n},{\n  \"title\": \"Sharepoint Foundation Serach, 14\",\n  \"url\": \"/post/sharepoint-foundation-serach-14/\",\n  \"date\": \"August 9, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn ihr auf folgende Fehlermeldung auf eurem Sharepoint 2010 Server stoßt:&#160;Protokollname: Application     Quelle: Microsoft-SharePoint Products-SharePoint Foundation Search      Datum: 09.08.2010 16:51:10      Ereignis-ID: 14      Aufgabenkategorie:Gatherer      Ebene: Warnung      Schlüsselwörter:      Benutzer: LOKALER DIENST      Computer: Miami.domain.local      Beschreibung:      Die Startadresse 'sts4://jobportal:8015/contentdbid={4cee0e9c-fee5-498f-86b7-9855d89539ff}' kann nicht durchforstet werden.Kontext: Anwendung 'Suchabfragen_über_Hilfethemen_bedienen', Katalog 'Search'Details:Zugriff verweigert. Vergewissern Sie sich, dass das Standardkonto für den Inhaltszugriff Zugriff auf dieses Repository hat, oder fügen Sie eine Durchforstungsregel zum Durchforsten dieses Repositorys hinzu. Wenn es sich bei dem zu durchforstenden Repository um ein SharePoint-Repository handelt, vergewissern Sie sich, dass das verwendete Konto über die Berechtigung &quot;Alles lesen&quot; für die durchforstete SharePoint-Webanwendung verfügt. (0x80041205)   bedeutet das, dass ihr eine Webanwendung unter einer URL betreibt, die nicht dem Computername des Server entspricht. Dafür verantwortlich ist das sog. Loopback check security feature, welches ab Windows Server 2003 SP1 implementiert ist. Es lehnt die Authentifizierung ab, wenn die URL nicht mit dem Computernamen übereinstimmt und verhindert somit, dass die Sharepoint Suche die Webseite indiziert.Hier ein Workaround um das Problem zu beheben:In der Registry des Sharepoint Servers muss unter HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Lsader Schlüssel (DWORD) “DisableLoopbackCheck” mit Wert 1 erstellt werden. Nach einem Neustart ist das Security Feature deaktiviert und es werden keine Warnungen mehr ins EventLog geschrieben.Grüße   dn\"\n},{\n  \"title\": \"Exchange 2010–Database Restore\",\n  \"url\": \"/post/exchange-2010e28093database-restore/\",\n  \"date\": \"August 8, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber mehr in einem anderen Beitrag.Die Datenbank wird also von der Sicherung zurückgeholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Widerherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die *.edb Datei der Datenbank und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Wurden die Files zurückgeholt, kann man die Recovery Database erstellen. Dazu brauchen wir mal wieder die dunkle Seite der Macht, also öffne ich die Exchange Management Shell. Dort wird mit dem cmdlet new-MailboxDatabase eine Recovery Database aus der widerhergestellten *.edb Datei erstellt.Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server mbx01, X:\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner Widerhergestellt wurden.   New-MailboxDatabase –Recovery Rdb01 –Server mbx01 –EdbFilePath x:\\\\restore\\\\db.edb –LogFolderPath x:\\\\restore  Die Datenbank wurde erstellt, jedoch wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.Um die Recovery Datenbank in einen “Clean Shutdown State” zu bringen wird das Tool eseutil.exe verwendet. Dafür öffnet man eine Eingabeaufforderung (oder EMS) und lässt eseutil –p auf die edb Datei los. Der Parameter –p steht hier für Repair. In meinem Beispiel lautet der Befehl:    eseutil.exe –p x:\\\\restore\\\\db.edb  Nachdem Eseutil durchgelaufen ist, die Datenbank sich also im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick oder in der Shell mit Mount-Database RDB01.Die Datenbank wurde erfolgreich gemounted und ich habe jetzt Zugriff auf die Daten.Mit dem cmdlet Export-Mailbox können jetzt einzelne Mails oder ganze Mailboxen widerhergestellt werden, mehr zum cmdlet Export-Mailbox gibt es hier.&#160;tom\"\n},{\n  \"title\": \"Import/Export Mailbox\",\n  \"url\": \"/post/importexport-mailbox/\",\n  \"date\": \"August 8, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit den cmdlets import-Mailbox und export-Mailbox kann Inhalt von einer Mailbox exportiert oder in eine Mailbox importiert werden. Soviel sagt eigentlich der Name auch ;)Diese cmdlets sind standardm&auml;&szlig;ig aber nicht verf&uuml;gbar, bzw. hat ein &bdquo;normaler&ldquo; Exchange Organization Administrator keine Berechtigungen sie zu verwenden. Bevor diese Berechtigungen gesetzt werden sollte man RBAC (Role Based Access Control) verstehen.Man erstellt eine neue Universelle Gruppe im Active Directory, ich gebe ihr einen beschreibenden Namen &bdquo;Enterprise Import Export Users&ldquo;. Jetzt wei&szlig;e ich dieser Gruppe die Management Rolle &bdquo;Mailbox Import Export&ldquo; zu, dazu verwende ich folgendes cmdlet in der Exchange Management Shell:New-ManagementRoleAssignment -Name \\\"Import Export Role\\\" -SecurityGroup \\\"Enterprise Import Export Users\\\" -Role \\\"Mailbox Import Export\\\"Mitglieder dieser Gruppe haben jetzt die notwendigen Berechtigungen um die Import/Export cmdlets zu verwenden, die Exchange Management Shell bzw. Management Konsole m&uuml;ssen neu gestartet werden.Import-MailboxWird verwendet um PST Daten in Mailboxen zu importieren. Wenn die PST Dateien im Format &lt;Exchange Alias&gt;.pst vorhanden sind kann man auch mehrere Imports gleichzeitig machen.Mit diesem Befehlt werden alle Elemente aus c:\\\\pst\\\\test.pst in die Mailbox &ldquo;test&rdquo; importiert.Import-Mailbox &ndash;identity test &ndash;PstFolderPath c:\\\\pst\\\\test.pstMit diesem Befehl werden alle Dateien im Ordner c:\\\\pst in die entsprechenden Mailboxen importiert, wichtig ist dabei der Name der PST Files.Dir c:\\\\pst |Import-MailboxExport-MailboxWird verwendet um Objekte von Mailboxen zu exportieren, als Ziel kann eine andere Mailbox oder eine PST Datei anagegeben werden. H&auml;ufig wird dieses cmdlet verwendet um Objekte aus einer Recovery Datenbank wieder in der urspr&uuml;nglichen Mailbox herzustellen.Mit diesem Befehl werden alle Elemente aus der Mailbox &ldquo;test&rdquo; in den Ordner &ldquo;testdata&rdquo; der Mailbox &ldquo;export&rdquo; kopiert.Export-Mailbox -Identity test -TargetMailbox export -TargetFolder testdataMit diesem Befehl werden alle Element aus der Mailbox \\\"test\\\" in die PST Datei auf C:\\\\pst exportiert. Achtung: F&uuml;r diesen Befehl wird Outlook (x64)&nbsp;auf dem Exchange Server ben&ouml;tigt der den Export durchf&uuml;hren soll. Nach Best Practice sollte das ein separater Server sein der sonst keine Mailboxen h&auml;lt.Export-Mailbox -Identity test -PstFolderPath c:\\\\pst\\\\test.pstGenauere Informationen gibts im Technet: Export-Mailbox, Import-Mailboxtom\"\n},{\n  \"title\": \"AppV–Adobe Reader Sequencing Receipe\",\n  \"url\": \"/post/appve28093adobe-reader-sequencing-receipe/\",\n  \"date\": \"August 2, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Anhand des Adobe Readers möchte ich hier zeigen wie man eine virtuelle Applikation erstellt.Wie der&#160; Sequencer vorbereitet wird habe ich hier beschrieben.&#160;Der Sequencer wird gestartet und die AppV Sequencer Console wird geöffnet. Man wählt “Paket erstellen” um ein neues Paket zu erstellen.Im nächsten Dialog wird der Name und eventuell eine Beschreibung vergeben.Nachdem man auf “Weiter” geklickt hat kann man mit dem Sequencing beginnen. Durch klicken auf “Überwachung starten” wird man aufgefordert einen Ordner auszuwählen den der Sequencer überwachen soll.Es wird ein Ordner auf dem Q-Drive erstellt, dieser sollte einen Namen im 8.3 Format haben, also maximal acht Zeichen vor dem Punkt und maximal drei danach.Jetzt wird das Setup von Adobe Reader gestartet (nicht der Web Installer, sondern das offline Installationspaket). Wichtig ist dabei das man den eben erstellten Ordner auf dem Q-Drive als Zielordner angibt.Wenn die Installation erfolgreich abgeschlossen ist kann man die Überwachung beenden.Im nächsten Schritt werden Dateizuordnungen und Verknüpfungen konfiguriert, man kann z.B. wählen ob eine Verknüpfung auf dem Desktop der Clients erstellt werden soll oder nicht.Jetzt kann die Applikation personalisiert werden, durch klicken auf “Starten” wird Adobe Reader gestartet und man kann die EULA akzeptieren, dann muss das nicht der Benutzer machen. Außerdem empfiehlt es sich die Automatischen Updates des Readers zu deaktivieren. Wenn man alle Einstellungen gemacht hat wird die Applikation wieder beendet.Noch einmal auf “Weiter” klicken und das Paket ist vorerst fertig.In den folgenden Fenstern können noch diverse Einstellungen getroffen werden, wichtig ist im Reiter “Bereitstellung” das richtige Protokoll zu wählen, für Testumgebungen wird das RTSP sein. Außerdem kann man hier die unterstützten Betriebssysteme und die “Ausgabeoptionen” wählen. Wird das Paket per Streaming verteilt sollte man die Komprimierung aktivieren. Wenn man die Applikation an “Standalone” Clients verteilt dann muss man auch ein MSI File generieren.Eine weitere wichtigie Einstellung ist der Hostname des Servers, standardmäßig wird die Variable %SFT_SOFTGRIDSERVER% verwendet, diese muss auf den Clients als Umgebungsvariable mit dem Hostnamen des Servers konfiguriert werden.Man kann noch mehr personalisieren und sogar die virtuelle Registry bearbeiten, allerdings ist das für Adobe Reader nicht notwendig. Also kann das Paket gespeichert werden.Wurde das Paket gespeichert erhält man folgende Dateien. Diese können mit einem Application Virtualization Management Server, mit System Center Configuration Manager oder direkt per MSI an die Clients verteilt werden.Um die Applikation mit dem AppV Management Server zu verteilen wird in der Management Console mit rechts auf Applications gecklickt, dort kann man die *.sprj Datei auswählen und so die virtuelle Applikation erstellen. Die Dateien die mit dem Sequencer erstellt wurden müssen dazu in den “Content” Ordner des AppV Management Servers kopiert werden. &#160;tom\"\n},{\n  \"title\": \"AppV–Sequencer\",\n  \"url\": \"/post/appve28093sequencer/\",\n  \"date\": \"August 2, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Der Microsoft Application Virtualization Sequencer ist ein Client oder Server der verwendet wird um virtuelle Applikationen zu erstellen.Der Sequencer ist im Idealfall eine virtuelle Maschine, vor jedem „Sequencing“ sollte der Ausgangszustand des Sequencers der Selbe sein.Man erstellt also eine neue virtuelle Maschine und installiert ein Betriebssystem seiner Wahl. Es müssen zwei Partitionen vorhanden sein, eine für das System und eine für das sogenannte Q-Drive.Zu diesem Zeitpunkt sollte man so wenig Software wie möglich installieren, alles was auf dem Sequencer installiert wird muss auch auf den Clients installiert werden damit die virtuellen Applikationen laufen.Es wird also der AppV Sequencer installiert und die zweite Partition mit NTFS Formatiert, dieser Partition weist man den Laufwerksbuchstaben Q: zu. Der Client soll in der Domain hängen und folgende Dienste sollten gestoppt und deaktiviert werden:· Windows Update· Windows SearchJetzt wird die virtuelle Maschine heruntergefahren und das Feature UnDo Disk (VMWare: Nonpersistent Disk) wird aktiviert. Ab jetzt ist die Maschine bei jedem Start auf dem gleichen Stand und bereit ein Paket zu erstellen.Wie ein Paket erstellt wird erkläre ich in diesem Post.tom\"\n},{\n  \"title\": \"Keine Mailzustellung auf Öffentliche Ordner nach Exchange 2010 Upgrade (von Exchange 2k3)\",\n  \"url\": \"/post/keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)/\",\n  \"date\": \"July 28, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Nachdem der letzte Exchange 2003 Server aus der Struktur entfernt wird, bleiben dennoch die Administrative Gruppe und verschiedene Ordner-Strukturen in der AD Konfiguration zurück.Dies kann unter Umständen den Mailfluss zu den Öffentlichen Ordnern stören. Man erhält dann folgende&#160; Unzustellbarkeitsberichte vom Exchange Server: Um das Problem zu beheben muss zunächst der ADSI Editor geöffnet werden. In der Unterstruktur&#160;Configuration / CN=Configuration,DC=YOURDOMAIN / CN= Services / CN= YOUR ORGANISATION / CN= Administrative Groups / CN= First administrative Group /&#160;der Ordner CN=Servers gelöscht werden (sofern dieser auch leer ist)&#160;Nun werden Mails den Öffentlichen Ordnern wieder zugestelltGrüße   dn\"\n},{\n  \"title\": \"AppV 4.6–Fehler beim Starten\",\n  \"url\": \"/post/appv-46e28093fehler-beim-starten/\",\n  \"date\": \"July 27, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Heute mal ein neues Thema auf ntSystems, Applikations Virtualisierung. Viele Hersteller setzen auf diese Technologie, unter anderem Microsoft mit SoftGrid bzw. AppV.Erscheint beim Starten der Applikation der Fehler: &ldquo;Auf die Angegebene Instanz von Application Virtualization Server konnte nicht zugegriffen werden&rdquo; mit einem Fehlercode wie &ldquo;xxxxxxx-xxxxxx0A-10000002&rdquo; dann wurde die Umgebungsvariable SFT_SOFTGRIDSERVER am AppV Client nicht gesetzt.Beim Erstellen der virtuellen Applikation (sequencing) wird standardm&auml;&szlig;ig diese Variable verwendet, der Client kann damit allerdings nicht viel anfangen. Also einfach auf den AppV Clients die Variable setzen und als Wert den FQDN des AppV Management Servers eintragen.Tipp: Daf&uuml;r bieten sich nat&uuml;rlich Group Policy Preferences an.Erscheint der Fehler: &ldquo;Die angegeben Anwendung ist nicht vorhanden&rdquo; mit einem Fehlercode wie dem &ldquo;xxxxxxx-xxxxxxxx-00000A09&rdquo; deutet das auf einen falschen Namen hin. Der Fehler kann auch auftreten w&auml;hrend ein Programm l&auml;uft, z.B. wenn es sich bei der Anwendung um einen Proxy des Office Deplyment Kit for AppV handelt. Beim Ausf&uuml;hren von \\\"msiexec /i offvirt.msi\\\" muss auf die richtigen Namen geachtet werden. Mehr dazu in einem separaten Post.&nbsp;Ein weiterer Fehler ist folgender:Am AppV Sequenzer wird standardm&auml;&szlig;ig das RTSPS (322) Protokoll verwendet, das muss allerdings erstmal konfiguriert werden (Zertifikat usw.). Zum Testen eignet sich auch RTSP das Port 554 verwendet. Das kann direkt beim Erstellen des Paketes ausgew&auml;hlt werden, alternativ kann man auch die .osd Datei bearbeiten und den Link anpassen.Anstelle von \\\"RTSPS://%SFT_SOFTGRIDSERVER%:322/DefaultApp.sft\\\" wird also \\\"RTSP://%SFT_SOFTGRIDSERVER%:554/DefaultApp.sft\\\" gesetzt.&nbsp;Soviel zum Thema Applikations Virtualisierung. Ich arbeite an weiteren Posts die den Vorgang des Sequencen und Verteilen von Applikationen beschreiben.stay tuned, tom\"\n},{\n  \"title\": \"Exchange 2010, w3wp.exe belegt sehr viel RAM\",\n  \"url\": \"/post/exchange-2010-w3wpexe-belegt-sehr-viel-ram/\",\n  \"date\": \"July 26, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Heute musste ich auf meinen Exchange Server 2010 feststellen, dass eine Instanz vom w3wp.exe Dienst läuft, die über 1 GB an RAM beansprucht.Um die RAM-Auslastung zu verringern müssen die Recycling Einstellungen für den entsprechenden Applikation Pool im IIS konfiguriert werden.Als erstes öffnet man den IIS Manager und wechselt zu den “Application Pools”&#160;    Um den verantwortlichen Application Pool zu finden kann jeder einzelne Pool durch Rechtsklick / Recycling zum Aufräumen gezwungen werden. Ist der verantwortliche Pool gefunden kann man die Recycling Vorgänge in den Eigenschaften automatisieren. Bsp: Alle 12 Stunden den Recycling-Vorgang starten.&#160; &#160;Grüße   dn\"\n},{\n  \"title\": \"Exchange 2010–GAL Fotos\",\n  \"url\": \"/post/exchange-2010e28093gal-fotos/\",\n  \"date\": \"July 23, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Schon in fr&uuml;heren Exchange Versionen wurden Drittherstellertools eingesetzt um ein Foto in der Globalen Adressliste zu ver&ouml;ffentlichen und in diversen Clients anzuzeigen.Exchange 2010 und Outlook 2010 k&ouml;nnen das mit Bordmitteln, das Bild wird dabei in der Active Directory gespeichert.&nbsp;&nbsp; Foto in Active Directory ladenDas Foto wird &uuml;ber die Exchange Management Shell importiert und zwar mit folgendem cmdlet.Import-RecipientDataProperty -Identity user.name -Picture -FileData ([Byte[]]$(Get-Content -Path \\\"C:\\\\path\\\\to\\\\picture.jpg\\\" -Encoding Byte -ReadCount 0))Dieses cmdlet enkodiert das Bild und speichert die Daten im Active Directory Attribute &ldquo;thumbnailPhoto&rdquo;. Wenn man sich dieses Attribut jetzt ansieht (AC Users and Computers, ADSI Edit) dann sieht man die &ldquo;Rohdaten&rdquo;.Achtung: Das Attribut &ldquo;thumbnailPhoto&rdquo; kann eine maximale Gr&ouml;&szlig;e von 10k haben, das Bild sollte 96x96 Pixel messen um in Outlook optimal dargestellt zu werden.Durch die Gr&ouml;&szlig;enbeschr&auml;nkung von 10k wird ein &ldquo;&uuml;berf&uuml;llen&rdquo; der Active Direcotry verhindert, man sollte allerdings die Zunahme des Replikationstraffic bedenken wenn man GAL Fotos einf&uuml;hrt, diese Zunahme ist tempor&auml;r schlie&szlig;lich &auml;ndert man das Foto nicht t&auml;glich.Damit ist das Foto zwar im Active Directory hinterlegt, allerdings ist in Outlook noch nichts davon zu sehen.Schema &Auml;nderungDaf&uuml;r muss man eine kleine Schema&auml;nderung durchf&uuml;hren, und zwar muss das Attribut &ldquo;thumbnailPhoto&rdquo; an den Globalen Catalog Server repliziert werden.Daf&uuml;r &ouml;ffnet man das Active Directory Schema Snap-In in einer MMC und navigiert zum Attribut, in den Eigenschaften wird die Checkbox bei &ldquo;Replicate this Attribute to the Global Catalog&rdquo; gesetzt.Die schmmgmt.dll muss Registriert werden damit das Schema Snap-In zur Verf&uuml;gung steht In einer Administrativen CMD: &ldquo;regsvr32 schmmgmt.dll&rdquo; MMC &ouml;ffnen (Start, Ausf&uuml;hren, mmc) File, Add/Remove Snap-in&hellip;, Active Directory Schema Unter &ldquo;Attributes&rdquo; rechtsklick auf &ldquo;thumbnailPhoto&rdquo; und die oben genannte Checkbox setzenOffline Address Book aktualisierenJetzt muss nur noch das Offline Adressbuch aktualisiert werden um das Ergebnis gleich zu sehen, alternativ kann man auch warten bis das automatisch geschieht (default: 5 Uhr). Das OAB kann einfach &uuml;ber folgendes cmdlet aktualisiert werden:&nbsp;Get-OfflineAddressBook | Update-OfflineAddressBookOutlook l&auml;dt aktualisiert das Offlineadressbuch nur einmal in 24h also muss auch dort noch ein Download durchgef&uuml;hrt werden, dann ist das Foto schlie&szlig;lich sichtbar.Hinweis: Das Offline Adressbuch wird durch die Fotos nicht gr&ouml;&szlig;er, es wird nur ein Pointer auf das Foto im OAB gespeichert, nicht das Foto selbst. Das hei&szlig;t allerdings auch dass ein Offline Client das Foto nicht sieht.tom\"\n},{\n  \"title\": \"Sharepoint Foundation 2010, Fehler Web.config, requestFiltering\",\n  \"url\": \"/post/sharepoint-foundation-2010/\",\n  \"date\": \"July 20, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Wer im Eventlog des Sharepoint-Foundation-Servers auf folgende Fehlermeldung st&ouml;&szlig;t:TEXT:Protokollname: Application Quelle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft-SharePoint Products-SharePoint Foundation Datum:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20.07.2010 00:00:01 Ereignis-ID:&nbsp;&nbsp; 2137 Aufgabenkategorie:Integrit&auml;t Ebene:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fehler Schl&uuml;sselw&ouml;rter: Benutzer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NETZWERKDIENST Computer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miami.**** Beschreibung: SharePoint-Integrit&auml;tsanalyse: Fehler. Die Datei 'Web.config' weist falsche Einstellungen f&uuml;r das Element 'requestFiltering' auf. F&uuml;r das requestFiltering-Element in der Datei 'web.config' muss das Attribut 'allowDoubleEncoding ' auf 'true' festgelegt sein, damit Dateinamen, die das Zeichen + enthalten, unterst&uuml;tzt werden. Au&szlig;erdem muss es &uuml;ber ein untergeordnetes Element 'requestLimits' verf&uuml;gen, dessen Attribute 'maxAllowedContentLength' auf '2147483647' festgelegt ist, um Konflikte mit Dateiuploads zu vermeiden. Stellen Sie sicher, dass das Element 'requestFiltering' in der Datei 'web.config' vorhanden ist, dass das Attribut 'allowDoubleEncoding' auf 'true' festgelegt ist, dass ein untergeordnetes Element 'requestLimits' vorhanden ist und dass der Wert 'maxAllowedContentLength' auf '2147483647' festgelegt ist. Weitere Informationen zu dieser Regel finden Sie unter http://go.microsoft.com/fwlink/?LinkID=163442.dem wird dieser Fix helfen:IIS Manager &ouml;ffnen Zur Sharepoint webseite wechseln Den Konfigurationseditor &ouml;ffnen Abschnitt &ldquo;requestFiltering&rdquo; w&auml;hlen Zu &ldquo;requestLimits&rdquo; wechseln und den Wert maxAllowedContentLenght in 2147483647 &auml;ndern, danach Konfiguration &uuml;bernehmen Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"Upgrade Exchange 2k3 - 2010\",\n  \"url\": \"/post/upgrade-exchange-2k3-2010/\",\n  \"date\": \"July 19, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"&#160;In diesem Post werde ich das Upgrade von Exchange 2k3 zu 2010 beschreiben und einige bekannte Fehler und deren Lösung aufzeigen.&#160;Upgrade&#160;Um einen groben Überblick zu bekommen ob die Infrastruktur Exchange 2010 tauglich ist, empfehle ich den “Microsoft Exchange Pre-Deployment Ananlyzer” auszuführen. Dieses Tool führt einige Checks an der Struktur aus.&#160;   Exchange Organisation in native mode setzen &#160;Sofern das nicht schon passiert ist, muss die Organisation im nativen Modus geschalten werden.&#160; &#160;   Active Directory Schema upgrade &#160;Jetzt muss das Schema geupdatet werden. Dazu startet man vom Schema Master folgende Setup Kommandos von der Exchange CD aus:&#160;Setup /PrepareLegacyExchangePermissionsSetup /PrepareSchemaSetup /PrepareAD [/OrganizationName:YOUR_DOMAIN]Setup /PrepareDomain&#160;   Link state suppression deaktivieren &#160;In Exchange Server 2003 wurde für einen Server, der keine Connectoren besitzt ein anderer Pfad für den Versand gesucht. Diese Option wird ab Exchange 2007 nicht mehr unterstützt. Um die Koexistenz zu gewährleisten muss dieses Feature auf allen Exchange 2003 Server deaktiviert werden&#160;   Open Registry Editor.    Locate HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Services\\\\RESvc\\\\Parameters.    Right-click Parameters and select New | DWORD value. Name the new DWORD value SuppressStateChanges.    Double-click SuppressStateChanges.    In the Value data field, enter 1.    Close Registry Editor, and then restart the SMTP service, the Microsoft Exchange Routing Engine service, and the Microsoft Exchange MTA Stacks services for the change to take effect. &#160;   Exchange 2010 System Requirements &#160;Mit folgendem Kommando werden die nötigen Requirements auf dem Exchange Server installiert&#160;Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy –Restart&#160;Zudem beim Dienst NetTCPPortSharing den Starttyp auf Automatisch setzen:&#160;Set-Service NetTcpPortSharing -StartupType Automatic&#160;&#160;Installation Client Access Rolle&#160;Als erstes wird die Rolle “Client Access” installiert&#160; &#160; &#160;Wenn der Server z.B. über OWA erreicht werden soll muss noch die externe Adresse angegeben werden (Bsp: mail.contoso.com)&#160; &#160;Zertifikate installieren&#160;Der nächste Schritt besteht darin die Zertifikate einzufügen und zu registrieren. Über den Exchange Zertifikatwizzard kann ein neues Exchange Zertifikat erstellt werden:&#160; &#160;Jetzt müssen noch alle erforderlichen Optionen angegeben werden bevor die Anforderung erstellt werden kann:&#160; &#160;Die Anforderung kann jetzt gespeichert werden. Diese muss dann über die Zertifizierungsstelle eingereicht werden und man erhält sein Zertifikat. Nachdem das Zertifikat ausgestellt wurde kann es über die Console der Anfrage hinzugefügt werden. Jetzt muss man dem Zertifikat noch die entsprechenden Dienste zuweisen:&#160; &#160;Installation Hub Transport Rolle&#160;Jetzt wird die Rolle “Hub Transport” installiert.&#160; &#160;Das Setup Programm weist darauf hin, dass es einen Connector benötigt um Mails von / zu den Exchange 2003 Servers zu senden. Es muss der Server ausgewählt werden, der zur gleichen Routinggruppe wie der Exchange Server 2010 zählt sofern mehrere 2003 Server in unterschiedlichen Standorten vorhanden sind.&#160;Wenn das Microsoft Filter Pack nicht installiert wurde wird man darauf hingewiesen es nach zu installieren:&#160; &#160;Damit Active Sync in einer Exchange 2003 / 2010 Umgebung weiterhin funktioniert, muss die Authentifizierung für die Virtual Directory auf integrierte Windows Authentifizierung geändert werden.Zuerst muss der Hotfix KB937031 auf den Exchange 2003 Servern installiert werden um die entsprechende Einstellung setzen zu können.Nachdem der Hotfix auf dem Exchange Server 2003 installiert wurde, lassen sich die Einstellungen für das ActiveSync virtuelle Verzeichnis ändern. Die Authentifizierung kann jetzt auf &quot;Integrierte Windows-Authentifizierung&quot; geändert werden&#160; &#160;Installation Mailbox Rolle&#160;Jetzt wird die Mailbox Rolle installiert.&#160; &#160;Jetzt verfügt man über ein vollwertige Exchange 2010 Installation. Für den Betrieb des Servers müssen noch einige Einstellungen vorgenommen werden.&#160;Offline Adressbuch&#160;Das offline Adressbuch muss auf den Exchange 2010 verschoben werden. Dies kann über die Console unter den Organisationseinstellungen gemacht werden. Zudem muss die Einstellung für den Webverteilung aktiviert werden. (Ab Outlook 2007 wird das Adressbuch über die Webservices geladen)&#160; &#160;Send Connector erstellen&#160;Es wird ein neuer Send Connector erstellt, der für Exchange 2010 fungiert. Danach wird der alte Exchange 2003 Connector gelöscht.&#160; &#160;Receive Connector konfigurieren&#160;Damit der Exchange Server Mails annimmt, muss ein neuer Connector erstellt werden, der für den anonymen Zugriff freigeschalten wird.&#160; &#160;Kompatibilität Outlook 2003&#160;Outlook 2010, 2007 verwenden Standardmäßig die PRC Verschlüsselung, 2003 nicht. Bei Exchange Server 2010 werden per default nur verschlüsselte RPC Verbindungen angenommen. Dies kann jedoch mit folgendem Befehl über die Shell abgeschaltet werden:&#160;Set-RPCClientAccess – Server –YOURSERVER –EncryptionRequired $false&#160;&#160; Öffentliche Ordner, Free / Busy Informationen synchronisieren&#160;Um die Öffentlichen Ordner auf Exchange 2010 zu verschieben müssen diese repliziert werden. Diese Einstellungen werden auf dem Exchange 2003 vorgenommen. Hierzu wird der Exchange Server 2010 als Replikationspartner den Ordnern “Offline Address Book” und “Schedule + Free Busy” hinzugefügt.&#160; &#160;Nachdem die Informationen repliziert wurden kann das Replikat von den Exchange 2003 Servern entfernt werden.&#160;Adresslisten konvertieren&#160;Um die Exchange 2003 Adresslisten in Exchange 2010 bearbeiten zu können müssen diese erst konvertiert werden (Exchange 2003 benutzte LDAP Filter). Dies wird über die Shell gemacht. &#160;Die Adresslisten können mit den folgenden Kommandos geupdatet werden:&#160;Bsp: Adressliste Verwaltung die auf die Abteilung gefiltert wird&#160;Set-AddressList &quot;Verwaltung&quot; -IncludedRecpients MailboxUsersSet-AddressList &quot;Verwaltung&quot; -ConditionalDepartment Verwaltung&#160;Addresspolicy updaten&#160;Auch die Addresspolicy muss geupdatet werden, sonst erhält man folgende Meldung:&#160; &#160;Das Update kann über folgenden Befehl gemacht werden:&#160;Set-EmailAddressPolicy “Default Policy” –IncludedRecipients AllRecipients&#160;&#160;Die Exchange Installation ist nun komplett und man kann beginnen die Mailboxen zu verschieben.     Wichtig: Nach der Installation sollte der Exchange BPA ausgeführt werden um sämtliche Einstellungen und Funktionen zu verifizieren.&#160;Fehler&#160;Während dem Upgrade bin ich auf mehrere Fehler gestoßen die ich hier kurz samt Lösung erläutere:&#160;Fehler 1&#160;Log Name: ApplicationSource: MSExchange MailTipsDate: 12.07.2010 15:40:53Event ID: 14003Task Category: MailTipsLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Unable to create Group Metrics distribution share.Share: GroupMetricsDirectory: C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\GroupMetricsMessage: 00000842&#160;Um diese Fehlermeldung zu beheben habe ich den Starttyp des Dienstes “Microsoft Echange Service Host” auf Automatic (Delayed Start) gesetzt&#160;Fehler 2&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:07:45Event ID: 9323Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Entry 'Benutzer1' has invalid or expired e-mail certificates. These certificates will not be included in the offline address list for '\\\\oGAL'. - \\\\Offline-EX2k10 &#160;Das bedeutet, dass Benutzer1 Fehlerhafte Zertifikate in AD besitzt. Diese müssen gelöscht werden (vorher in AD die erweiterten Eigenschaften einblenden).&#160; &#160;Fehler 3&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:14:01Event ID: 9359Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:OALGen truncated or dropped properties for entry 'Discovery Search Mailbox' in address list '\\\\oGAL’ because they exceeded the configured size limits for the version 4 offline address list. The affected MAPI ids are: 8cd8. - \\\\Offline-EX2k10 &#160;Dieser Fehler kann ignoriert werden, er ist ab Design so.&#160;Fehler 4&#160;Log Name: ApplicationSource: MSExchange ActiveSyncDate: 15.07.2010 09:50:07Event ID: 1053Task Category: ConfigurationLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Exchange ActiveSync doesn't have sufficient permissions to create the &quot;CN=Daniel Nitz,OU=***,OU=****,DC=***,DC=local&quot; container under Active Directory user &quot;Active Directory operation failed on **********. This error is not retriable. Additional information: Access is denied.Active directory response: 00000005: SecErr: DSID-03151E04, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0&quot;.Make sure the user has inherited permission granted to domain\\\\Exchange Servers to allow List, Create child, Delete child of object type &quot;msExchangeActiveSyncDevices&quot; and doesn't have any deny permissions that block such operations.&#160;&#160;Hier gibt es ein Rechte-Problem. Bei den User wurde wahrscheinlich in AD die Vererbung deaktiviert.&#160;Fehler 5&#160;Fehler beim Download des Offline Adressbuches:&#160; &#160;Dieser Fehler kann behoben werden, indem im IIS des Exchange Servers im virtual Directory “OAB” die Einstellung gesetzt wird, dass nicht mehr SSL erzwunden werden muss.&#160; &#160;Viel Spaß bei der Migration zu Exchange Server 2010!&#160;Grüße   dn\"\n},{\n  \"title\": \"Forefront TMG 2010–RSA Authentication Manager 7.1\",\n  \"url\": \"/post/forefront-tmg-2010e28093rsa-authentication-manager-71/\",\n  \"date\": \"July 13, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"&nbsp;Wer das Vergn&uuml;gen hat die beiden genannten Systeme zum kommunizieren zu bewegen wird sich &uuml;ber die &uuml;ppige Dokumentation freuen die es zu den Vorg&auml;ngerprodukten gibt&hellip; die&nbsp;hilft so gut wie gar nicht weiter.&nbsp;Ich gehe davon aus das RSA Authentication Manager 7.1 Sp3 bereits installiert wurde, ein Realm bzw. Security Domain eingerichtet wurde. Man meldet sich also an der RSA Security Console an und erstellt einen neuen &ldquo;Authentication Agent&rdquo;. Dazu klickt man auf Access, Authentication Agents, Add New.&nbsp;&nbsp;Jetzt m&uuml;ssen die Felder ausgef&uuml;llt werden, also der Hostname des TMG Servers (Array), die IP Adressen die dazu geh&ouml;ren (nat&uuml;rlich nur die vom betreffenden Netzwerk). Bei Agent Type habe ich Standard Agent verwendet und das funktioniert, habe leider keine Dokumentation gefunden aus der hervorgeht welchen Typ man verwenden sollte. Bei &ldquo;Agent may be Accessed by&rdquo; kann konfiguriert werden ob sich alle (aktiven) Benutzer &uuml;ber den Authentication Agent anmeldn k&ouml;nnen oder nur Mitglieder bestimmter Gruppen.Anschli&szlig;end muss man nur noch auf Save klicken und der Authentication Agent ist erstellt.&nbsp;Jetzt braucht man eine Konfigurationsdatei f&uuml;r TMG Server. Also wieder auf Access, Authentication Agents klicken und dieses mal &ldquo;Genereate Configuration File&rdquo; w&auml;hlen.&nbsp;&nbsp;Wenn man dann auf &ldquo;Generate Config File&rdquo; klickt, erh&auml;lt man eine Zip Datei die eine Datei sdconf.rec beinhaltet. Diese Datei muss auf allen TMG Array Mitgliedern in folgende Pfade kopiert werden.%windir%\\\\system32%programfiles%\\\\Microsoft Forefront Threat Management Gateway\\\\sdconfig&nbsp;Achtung: Die Datei muss unbedingt an beiden Orten vorhanden sein, sonst kommt es zu Fehlern wie: &ldquo;106: The Web Server is busy. Try again later.&rdquo;&nbsp;Die RSA betreffende Konfiguration ist damit eigentlich schon abgeschlossen. Also sehen wir uns die Ver&ouml;ffentlichung am TMG an.&nbsp;Es wird einfach eine normale Web Ver&ouml;ffentlichung konfiguriert, beim erstellen des Web Listeners ist auf folgendes Acht zu geben:&nbsp;&nbsp;Die Authentifizierung erfolgt &uuml;ber ein HTML Formular, wenn hier noch &ldquo;Collect addinoal delegation in the form&rdquo; ausgew&auml;hlt wird kann der Benutzer zus&auml;tzlich zum Username und RSA Passcode noch sein Active Directory Kennwort eingeben und TMG leitet es an den Web Server weiter. Daf&uuml;r muss dann bei der Ver&ouml;ffentlichungsregel die Authentication Delegation auf Basic gesetzt werden und der Web Server dahinter muss nat&uuml;rlich Basic Authentication akzeptieren.&nbsp;&nbsp;Das Integrierte HTML Formular von TMG sieht dann je nach Einstellung so aus. Will man OWA ver&ouml;ffentlichen kann man verwendet man nat&uuml;rlich besser den Assistant &ldquo;Publish Exchange Web Client Access&rdquo;. Achtung: Auf den Client Access Servern muss Basic Authentication aktiviert werden (Server Configuration, Client Access, owa).&nbsp;&nbsp;Achtung: Mutlihomed TMGForefront TMG wird in den allermeisten Konfigurationen mit mehreren Netzwerkkarten installiert, ist ja schlie&szlig;lich eine Firewall. Dadurch wei&szlig; TMG (genauer gesagt ACEClient) nicht &uuml;ber welche Netzwerkkarte er den RSA Server erreichen kann, man sieht im Event Log die Warnung: &ldquo;Multihomed host detected; Primary IP assumed is : x.x.x.x&rdquo;. Die Event ID ist 1012 die Source ACECLIENT.Das kann man beheben indem man zu Schl&uuml;ssel HKLM\\\\Software\\\\SDTI einen Schl&uuml;ssel ACIClient hinzuf&uuml;gt. Dieser bekommt dann einen String Value mit dem Namen &ldquo;PrimaryInterfaceIP&rdquo;. Der Wert entspricht der IP Adresse, des TMG, &uuml;ber die der RSA Server erreicht werden kann.&nbsp;&nbsp;Viele Gr&uuml;&szlig;etom\"\n},{\n  \"title\": \"Apple IPad\",\n  \"url\": \"/post/apple-ipad/\",\n  \"date\": \"June 30, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Gerade eben hatte ich zum ersten Mal das Vergn&uuml;gen ein IPad zu testen. Es waren zwar nur wenige Minuten aber einen ersten Eindruck habe ich von dem Ding:Die Verarbeitung scheint sehr gut, das Ger&auml;t f&uuml;hlt sich hochwertig an. Mit 730 Gramm ist das 3G Modell allerdings ziemlich schwer.Das Display ist sehr scharf, wie es in der Sonne ist kann ich nicht sagen, im Raum ist es jedoch ausreichend hell und klar. Wird das IPad auf die Seite gedreht, dreht sich das Bild mit, sowas kennt man ja schon.Die Bedienung finde ich innovativ, ist ja auch von Apple ;) Der EBook Reader ist einfach zu bedienen, sonstige Features wie IPod und Web Browser sind nat&uuml;rlich super und bereiten dem Benutzer viel spa&szlig;. Sogar Filme kann man mit dem Ding anschauen.F&uuml;r mich w&auml;re das Ger&auml;t dennoch nichts, ich habe keinen wirklichen Verwendungszweck und nur zum Rumspielen ist Preis (in dem Fall 702&euro;) einfach zu hoch.Das Beste zum Schluss: als ich den Browser &ouml;ffnete kam als Startseite&hellip; na was schon&hellip; Bing zum Vorschein! Da konnte ich mir ein Grinsen nicht verkneifen.so long, tom\"\n},{\n  \"title\": \"Exchange 2010 Entourage Web Services Edition- EWS Attachement Size\",\n  \"url\": \"/post/exchange-2010-entourage-web-services-edition-ews-attachement-size/\",\n  \"date\": \"June 30, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"&nbsp;Auch MAC Clients k&ouml;nnen mit Exchange 2010 arbeiten. Daf&uuml;r gibt es entweder den Microsoft Entourage Client oder den integrierten MAC Mail Client. Entourage muss in der Web Services Edition verwendet werden, da Exchange 2010 kein WebDAV mehr unterst&uuml;tzt, die aktuelle Version von MAC Mail (Snow Leopard) macht das von Haus aus.&nbsp;Will man allerdings einen Anhang gr&ouml;&szlig;er als ca. 12MB verschicken meckert sowohl Entourage als auch MAC Mail. Entourage bringt folgende Fehlermeldung: &ldquo;HTTP-Fehler: Die Anforderung kann vom Server nicht verarbeitet werden&rdquo;.&nbsp;&nbsp;Man kontrolliert also erstmal die Gr&ouml;&szlig;enbeschr&auml;nkungen der betreffenden Mailbox, die der Send und Receive Connectoren und in der Transport Konfiguration, am schnellsten geht das wohl in der Management Shell mit folgenden cmdlets:get-TransportConfig | fl maxSendSize get-SendConnector | fl name, maxMessageSize get-ReceiveConnector | fl name, maxMessageSize get-Mailbox name | fl maxSendSize&nbsp;Sind die Werte an diesen Stellen ok, dann kann der User mit dem Microsoft Office Outlook Client den Anhang ohne Probleme senden, nur mit Entourage bzw. Mac Mail tritt das Problem auf.&nbsp;Das Problem liegt am Exchange Web Service, das ist eine ASP.NET Applikation und verwendet daher Konfigurationsdateien aus der IIS Konfiguration. Diese k&ouml;nnen in weder in der EMS noch in EMC gesehen bzw. ge&auml;ndert werden.&nbsp;Nun gibt es leider keine ausreichende Dokumentation von Microsoft, also versuche ich hier alles, was in den tiefen des Internet herumschwirrt, zusammenzufassen.&nbsp;BackupAchtung: Vor der Bearbeitung von Konfigurationsdateien unbedingt ein Backup der Datei erstellen!!&nbsp;EWS Treten die Probleme nur im Zusammenhang mit EWS auf reicht folgende &Auml;nderung der Konfiguration am Client Access Server (bzw. an alles CAS wenn mehrere im Einsatz sind):&nbsp;In der Datei %windir%\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\ClientAccess\\\\exchweb\\\\ews\\\\web.config muss der Wert von &ldquo;maxReceivedMessageSize&rdquo; unter &lt;EWSMessageEncoderSoap11Element /&gt; ge&auml;ndert werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;EWSMessageEncoderSoap11Element /&gt; &lt;httpsTransport maxReceivedMessageSize=\\\"52428800\\\" &hellip;.&gt; &nbsp;Mit appcmd.exe muss noch der Wert von maxAllowedContentLength angepasst werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt appcmd set config \\\"Default Web Site/ews\\\" -section:requestFiltering /requestLimits.maxAllowedContentLength:52428800 &nbsp;In manchen Foren bzw. anderen Blogs findet man immer wieder den Parameter &ldquo;maxRequestLength&rdquo; der auch in der web.config Datei vom EWS angepasst werden soll. Allerdings hat dieser Parameter per Default schon den gr&ouml;&szlig;tm&ouml;glichen Wert eingestellt, ich rate also davon ab diesen Parameter zu ver&auml;ndern.&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;OWADieses Problem gibt es auch in Outlook Web App, man kann standardm&auml;&szlig;ig keine Anh&auml;nge &uuml;ber 30MB hochladen. Auch hier ist wieder eine Einstellung in der web.config schuld. OWA ist eine ASP.NET Anwendung und die maximale Gr&ouml;&szlig;e der zu &uuml;bertragenden Daten wird mit dem Parameter maxRequestLength konfiguriert.Hier wird also diese Einstellung interessant, in der web.config von OWA ist diese n&auml;mlich per Default auf 30000 gesetzt.&nbsp;In der Datei %windir%\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\ClientAccess\\\\Owa\\\\web.config muss der Wert von maxRequestLength ge&auml;ndert werden, ACHTUNG: Angabe in KiloByte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;httpRuntime maxRequestLength=\\\"51200\\\" /&gt;&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;F&uuml;r dieses Problem gibt es sogar einen Artikel im TechNet: Configure Maximum Message Size in Outlook Web App&nbsp;&nbsp;Tipp: Man kann mit der PowerShell ganz einfach Werte in Byte und wieder Retour konvertieren. Einfach mal 50mb eintippen und versuchen.&nbsp;&nbsp;Naja, ich hoffe ich kann damit einigen weiterhelfen.&nbsp;Gr&uuml;&szlig;etom\"\n},{\n  \"title\": \"Exchange 2010 – Backup\",\n  \"url\": \"/post/exchange-2010-e28093-backup/\",\n  \"date\": \"June 25, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Dies ist der erste Teil einer Exchange Backup und Restore Serie.    Der zweite Teil folgt in kürze.Datensicherung ist in Exchange 2010 ein umfangreiches Thema. Für die Widerherstellung von einzelnen Elementen (Mails, Kontakte…) bietet sich z.B. der Dumpster an, dazu aber ein anderes Mal mehr. In diesem Beitrag möchte ich Datensicherung im klassischen Sinn behandeln, also Backup von Servern und Datenbanken.Backup SoftwareExchange 2010 verwendet den Windows eigenen VSS Dienst, kann also nur mit einer Backup Applikation gesichert werden die diesen Service unterstützt. Für Tests eignet sich natürlich Windows Backup von Server 2008R2, will man das Ganze in einer größeren Umgebung betreiben empfiehlt sich der Data Protection Manager.System State BackupJeder Server sollte regelmäßig gesichert werden, dazu gehört ein Backup des System Volumes und des System State. System State Backups enthalten die Registry sowie die Boot Dateien und COM+ Class Registration Datenbank. Je nach installierter Serverrolle (ADDS, IIS…) werden weitere Informationen gesichert.Mit einem System State Backup kann der Zustand des Servers (und der installierten Rollen/Applikationen) zum Zeitpunkt des Backups widerhergestellt werden.Single Server BackupWenn alle Rollen auf einem Server installiert sind müssen der System State sowie die Volumes mit den Datenbanken und Logdateien gesichert werden.Backup von Client Access ServernAuf CA Servern befinden sich keine Daten die speziell gesichert werden müssen, diese Serverrolle sollte ohnehin ausfallsicher designed werden, da der Clientzugriff im Fehlerfall sonst nicht mehr möglich ist. Die Konfiguration kann aus dem System State Backup widerhergestellt werden.Allerdings sollte man nicht vergessen das IIS Log Verzeichnis (C:\\\\inetpub\\\\logs\\\\LogFiles\\\\W3SVC1) zu überwachen bzw. alte Logs kontinuierlich zu löschen.Backup von Hub Transport ServernEs sind keine Daten auf Hub Transport Servern vorhanden ohne die eine Exchange Umgebung nicht widerhergestellt werden könnte, allerdings ist es für spätere Analyse Sinnvoll die Message Tracking Logs sowie die Protocol Logs zu sichern. Diese befinden sich im Exchange Installationsordner unter \\\\Transportroles\\\\Logs und können einfach auf File-Ebene gesichert werden.Die Konfiguration des Transport Servers wird im Active Directory gespeichert, auch diese Serverrolle sollte ausfallsicher designed werden.Backup von Edge Transport ServernEdge Transport Server speicher die Konfiguration im Active Directory, im Fehlerfall kann man einfach den Server neu aufsetzen und die EdgeSync neu einrichten. Alternativ kann man mit Cloned Configuration arbeiten, also die Konfiguration exportieren und auf dem neuen Server wieder importieren, dazu mehr in einem anderen Beitrag. Die Logs die auf Hub Transport Servern gesichert werden sollten befinden sich bei Edge Transport Servern an der selben Stelle und sollten aus dem selben Grund gesichert werden.Backup von Unified Messaging ServernDie für die Konfiguration relevanten Informationen werden in der Active Directory gespeichert, einzig die Audio Prompts können auf File- Ebene gesichert werden, diese befinden sich im Exchange Installationsordner unter \\\\UnifiedMessaging\\\\Prompts.Backup von Mailbox ServernAuf den Servern auf denen die Mailbox Rolle installiert ist befinden sich die Datenbank und Transaction Log Files, diese müssen auf jeden Fall gesichert werden. Wird eine Sicherung mit Windows Backup durchgeführt muss jeweils das gesamte Volume auf dem die Datenbank bzw. Log Files liegen ausgewählt werden. Von diesen Volumes muss ein “Full VSS&quot; Backup gemacht werden, nur so merkt Exchange dass die Daten gesichert wurden und löscht die entsprechenden Log Files.Backup der Active DirectoryExchange Server speichert viele Daten und Einstellungen in der Active Directory und ist extrem Abhängig von einer funktionstüchtigen Umgebung. Daher sollten natürlich auch Domain Controller regelmäßig gesichert werden. Hierfür reicht ein System State Backup aus, dieses enthält alle Daten/Einstellungen der AD.Backups und DAGSind die Exchange Server die gesichert werden sollen Mitglieder einer Database Availability Group (DAG) ändern sich die Gründe für eine Datensicherung. Da es bis zu 16 Kopien einer Mailbox innerhalb der DAG geben kann, ist das Backup nicht mehr der einzige Ausweg wenn die aktive Kopie der Datenbank offline geht. Fällt ein Mitglied einer DAG aus, werden die Datenbanken die auf diesem Server aktiv waren vom Server mit der nächst-höheren Priorität übernommen (natürlich muss es eine Kopie der Datenbank dort geben). So ist man bei einem Ausfall eines Mailboxservers gut gerüstet, allerdings kann es auch zu einem Datenbankfehler kommen, dafür gibt es aber folgende alternative zum Backup.Datenbank Kopien werden standardmäßig aktuell gehalten, d.h. eine Änderung wird sofort an alle Mitglieder der DAG repliziert. Man kann allerdings eine Verzögerung (ReplayLagTime) konfigurieren und so z.B. auf einem Server ältere Versionen der Datenbanken halten. Tritt nun ein Datenbankfehler auf, kann die ältere Datenbank verwendet werden ohne umständliches Restore von Tape oder woher auch immer.Ein weiterer Effekt des Backups ist das löschen der Log Files, sollte man also auf regelmäßige Backups verzichten muss man wohl oder übel Circular Logging für die Datenbanken aktivieren um ein überlaufen der Festplatten zu verhindern.Diese neue Möglichkeit der Hochverfügbarkeit bringt sicher viele Vorteile, jedoch sollte man meiner Meinung nach nicht auf ein Backup verzichten. Ich empfehle regelmäßige System State Backups von allen Servern. Die Datenbanken würde ich auf jeden Fall auch sichern und das Backup und Restore Szenario ausreichend testen und dokumentieren!Soweit mal zum Thema Backup, viele Grüße   tom\"\n},{\n  \"title\": \"Migration Sharepoint Services v3 zu Sharepoint Foundation 2010\",\n  \"url\": \"/post/migration-sharepoint-services-v3-zu-sharepoint-foundation-2010/\",\n  \"date\": \"June 15, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Heute habe ich die Migration von den Sharepoint Services 3 auf die Version 2010 Foundation abgeschlossen. Während der Umstellung bin ich auf mehrere Probleme gestoßen, die ich mit diesem Post im einzelnen aufzeigen werden. Vielleicht erspart das dem ein oder anderen von euch Zeit nach einer Lösung zu suchen.Problem 1 – Fehler 7043 (Sharepoint Foundation) im EventLog Anwendung Lösung: Im Ordner C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Web Server Extensions\\\\14\\\\TEMPLATE\\\\CONTROLTEMPLATES befindet sich die Datei SearchArea.ascx. Diese Datei wird in der Version 2010 nicht benötigt und kann umbenannt werden (Bsp: SearchArea.ascx.old)Problem 2 – Fehler 7009 und 7000 (Service Control Manager) im EventLog System  Lösung: Es kann passieren, dass der Dienst “Claim to Windows Token Service” beim Systemstart nicht starten kann. Sobald der Start-Typ von “Automatisch” auf “Automatisch (Verzögerter Start)” gesetzt wird, startet der Dienst normal, jedoch ein wenig später als die anderen Dienste.&#160;Problem 3 – Fehler 6398 und 5586 (Sharepoint Foundation) im EventLog Anwendung  Lösung: Sharepoint Zentraladministration öffnen und zum Punkt Sicherheit wechseln. Im Menüpunkt Dienstkonten konfigurieren den richtigen Webanwendungspool auswählen und das entsprechende Konto angeben. Mit OK bestätigen sodass das Konto nochmal registriert wird.&#160;Problem 4: Backup der Sharepoint FarmWenn ihr Versucht ein Backup der Sharepoint Farm zu erstellen, bekommt ihr den Hinweis, dass der Verwaltungsdienst angehalten wurde. ACHTUNG: Es geht auch noch schlimmer: Wenn ihr wie ich eure Sharepoint Farm über das Befehlszeilentool stsadm.exe sichert, sind die Menüelemente auf der Sharepoint Webseite während und nach der Sicherung gesperrt. Wenn ihr die Berechtigungen prüft werdet ihr sehen, dass ihr nicht mehr über ausreichend Berechtigungen verfügt um irgendwas an der Webseite zu ändern bzw. hochzuladen zu löschen usw. Auch könnt ihr die Eigenschaften der Webseite nicht mehr öffnen oder bearbeiten.Lösung: Das Problem lässt sich durch einen ganz einfachen Handgriff beheben. Nach der Installation ist der Dienst “Sharepoint 2010 Administration” auf Start-Typ Manuell gesetzt und somit nicht aktiv. Ändert das Startverhalten des Dienstes auf Automatisch und ihr könnt wieder normal Backups ziehen und die Steuerelemente aktivieren sich nach der Sicherung wieder.Viel Spaß beim Upgrade auf Foundation 2010, Grüße   dn\"\n},{\n  \"title\": \"Sharepoint Foundation 2010 Dateien lassen sich nicht öffnen\",\n  \"url\": \"/post/sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen/\",\n  \"date\": \"June 14, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Nach einer Standardinstallation von Sharepoint Foundation 2010 lassen sich gewisse Dateien (z.B. PDF) nur downloaden, nicht aber direkt aus der Bibliothek abrufen.&#160;Das ist ein neues Sicherheitsfeature, welches den Browser zwingt die Datei nur zum Download anzubieten. Das Sicherheitsfeature kann in der Sharepoint Zentraladministration deaktiviert werden.Anwendungsverwaltung / Webanwendungen verwalten die entsprechende Webanwendungs auswählen, unter Allgemeine Einstellungen kann nun die Option “Dateiverarbeitung durch den Browser” auf Berechtigt gesetzt werden.  Nun können die Dateien wieder direkt aus der Bibliothek geöffnet werden.Grüße   dn\"\n},{\n  \"title\": \"DistributedCOM Fehler 10016, fehlende Berechtigungen\",\n  \"url\": \"/post/distributedcom-fehler-10016-fehlende-berechtigungen/\",\n  \"date\": \"June 11, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2008-R2\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn auf euren Server DistributedCOM Fehler mit der ID 10016 vorkommen, so bedeutet das meist, dass erforderliche Berechtigungen fehlen.Beispiel: Der Benutzer NETZWERKDIENST hat keine Berechtigung die Komponente mit der ID 000C101C-0000-0000-C000-000000000046 zu aktivieren In diesem Fall muss dem Benutzer NETZWERKDIENST lediglich das Benutzerrecht gegeben werden um die jeweilige Komponente zu starten. Als erstes wird die Komponente über das Tool Komponentendienste gesucht. Wenn ihr die Einstellungen der Komponente nicht ändern könnt, habt ihr selbst nicht die notwendigen Berechtigungen.  Die könnt ihr euch aber selber zuweisen indem ihr in der Registry unter HKEY_CLASSES_ROOT\\\\AppID den Schlüssel mit der ID sucht und in den Berechtigungen der Gruppe Administratoren oder euch selbst den Besitz übertragt und das Recht Vollzugriff gebt. Danach lassen sich die Einstellungen der Komponente ändern und ihr könnt den jeweiligen Benutzer die erforderlichen Rechte geben.&#160;Grüße   dn\"\n},{\n  \"title\": \"Windows Virtual PC / interner DHCP Server\",\n  \"url\": \"/post/windows-virtual-pc-interner-dhcp-server/\",\n  \"date\": \"May 26, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn man mit Windows Virtual PC eine DHCP Infrastruktur virtualisiert, wird der Client keine IP-Adresse bekommen, sofern die Netzwerke auf “Internes Netzwerk” geschalten wurden.    Das Verhalten ist weniger ein Problem, sondern ein Feature, das sich leicht deaktivieren lässt.     Sobald man die Netzwerkeinstellungen des Clients auf “Internes Netzwerk” ändert, erhalt er eine Adresse aus dem Pool 196.254.0.16 – 196.254.10.254 (APIPA ist von 169.254.0.0-196.254.255.255)        Um diesen internen DHCP Server zu deaktivieren müssen zuerst alle VM’s heruntergefahren bzw. gespeichert werden. Dann muss folgende Datei geöffnet werden:%localappdata%\\\\microsoft\\\\Windows Virtual PC\\\\options.xml        In dieser Datei tauschen wir im Abschnitt dhcp enabled den Wert TRUE durch FALSE.         Nach dieser Änderung kann der Client IP Adressen vom aufgesetzten DHCP Server empfangen.Grüße   dn\"\n},{\n  \"title\": \"ntSystems - Update\",\n  \"url\": \"/post/ntsystems-update/\",\n  \"date\": \"May 15, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Heute habe ich die Blog Platform von ntSystems aktualisiert. Wir verwenden nun die aktuellste Version von BlogEngine.NET.Das neue Theme ist in Bearbeitung, wird in den n&auml;chsten Tagen Online sein.Bis dahin, stay tuned!twitter.com/torgglertwitter.com/nitz_d\"\n},{\n  \"title\": \"Exchange 2010 – SafeList Aggregation\",\n  \"url\": \"/post/exchange-2010-e28093-safelist-aggregation/\",\n  \"date\": \"May 14, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"In Exchange 2010 gibt es viele M&ouml;glichkeiten sich vor Spam zu sch&uuml;tzen, unter anderem kann jeder User seine pers&ouml;nliche Black- und White List in den Outlook Junk-E-Mail Optionen pflegen.Ist ein Edge Transport Server in der Exchange Organisation vorhanden, kann man diese pers&ouml;nlichen Listen direkt an der Edge, also an der ersten M&ouml;glichkeit anwenden und so die Effizienz steigern und false positives verringern. Ist die SafeList Aggregation aktiviert werden sichere Mails dem Empf&auml;nger direkt zugestellt, ohne von weitern Filter Agents gepr&uuml;ft zu werden. Au&szlig;erdem werden die blockierten Absender bei der ersten M&ouml;glichkeit blockiert.Sichere Absender sind alle (E-Mail Adressen oder Domains) die in der entsprechenden Liste eingetragen sind. Outlook Kontakte und E-Mail Adressen an die der Benutzer eine Nachricht sendet k&ouml;nnen optional ausgew&auml;hlt werden. Die Informationen die der Benutzer in Outlook konfiguriert werden als sogenannte SafeList Collection auf dem Mailbox Server des Benutzers gespeichert. Eine SafeList Collection kann bis zu 1024 Eintr&auml;ge beinhalten.Das Update-SafeList cmdlet aktualisiert diese Collection im ActiveDriectory, dort werden die Informationen (Hashes) in den Attributen msExchSafeSenderHash, msExchSafeRecipientHash, und msExchBlockedSendersHash gespeichert.&Uuml;ber den EdgeSync Service werden die Attribute dann mit der ADLDS Instanz am Edge Transport Server synchronisiert (one-way).Will man also die SafeList Collection eines einzelnen Users aktualisieren verwendet man &ldquo;update-safelist mail.box&rdquo;.Sollen die Collections aller Mailboxen aktualisiert werden dann kann man das z.B. so machen: Get-Mailbox | Update-SafeList. Um die Edge Synchronisierung anzusto&szlig;en (Testumgebung) kann man noch Start-EdgeSychronization verwenden.Wenn es sich um eine gr&ouml;&szlig;ere Organisation handelt werden mit Get-Mailbox wom&ouml;glich nicht alle Mailboxen zur&uuml;ckgegeben, daf&uuml;r eignet sich folgende Kommandos.Set-AdServerSettings -ViewEntireForest $true Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Update-SafelistWenn man diese beiden Kommandos in einer Datei speichert kann man einfach einen geplanten Task erstellen der die SafeList automatisch aktualisiert.Achtung: Damit die SafeList Aggregation funktioniert muss der Content Filtering Agent am Edge Transport Server laufen. Das kann mit &ldquo;Get-ContentFilterConfig&rdquo; einfach &uuml;berpr&uuml;ft werden.tomt\"\n},{\n  \"title\": \"TPM / BitLocker Schlüssel in AD DS speichern\",\n  \"url\": \"/post/tpm-bitlocker-schlussel-in-ad-ds-speichern/\",\n  \"date\": \"May 10, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"de\",\"Server\",\"Server-2008\",\"Server-2008-R2\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn BitLocker im Unternehmen aktiviert wird, empfiehlt es sich die Wiederherstellungsinformationen in Active Directory zu sichern. Diese Anleitung richtet sich an Windows Server 2008 / 2008 R2 und Windows 7 als Client-Betriebssystem. Die Anleitung beschreibt, welche Schritte erforderlich sind um TPM- und BitLocker Schl&uuml;ssel in AD DS zu speichern, als Beispiel wird jenes Volume verschl&uuml;sselt, welches das Betriebssystem enth&auml;lt.  Wir unterscheiden hier zwischen 2 diverse Schl&uuml;ssel:TPM: Hierbei wird der Besitzerschl&uuml;ssel des TPM Bausteins in AD DS gespeichert BitLocker: Hierbei handelt es sich um den Wiederherstellungsschl&uuml;ssel f&uuml;r die betreffende PartitionSchritt 1: AD DS zum speichern von TPM Besitzerschl&uuml;ssel vorbereitenAls erstes muss AD DS f&uuml;r das speichern des TPM Besitzerschl&uuml;ssels konfiguriert werden. Sofern Server 2003 als DC verwendet wird, muss vorher noch ein Schema-Update durchgef&uuml;hrt werden. F&uuml;r die Betriebssysteme Server 2008 und Server 2008 R2 ist dies nicht notwendig, da diese die Erweiterung bereits mitbringen.Damit der Client den TPM Besitzerschl&uuml;ssel in AD DS speichern kann, muss das Script Add-TPMSelfWriteACE.vbs auf dem DC ausgef&uuml;hrt werden. Dieses Script setzt die Berechtigungen des Attributs msTPM-OwnerInformation so, dass der Client seinen TPM Schl&uuml;ssel einf&uuml;gen kann.ACHTUNG: Sollte man nicht das Server-Betriebssystem in englischer Sprachversion verwenden, so muss das Script noch angepasst werden: Anstatt die Berechtigung &ldquo;SELF&rdquo; zu setzen, muss diese z.B. f&uuml;r Deutsch in &ldquo;SELBST&rdquo; ersetzt werden. Sonst l&auml;uft das Script nicht erfolgreich durch.Schritt 2: Setzen der GPO&rsquo;sDa nun Active Directory zum speichern von TPM Schl&uuml;sseln vorbereitet ist, setzten wir die Gruppenrichtlinien und weisen den Client an, die Wiederherstellungsschl&uuml;ssel in Active Directory zu speichern.BitLockerComputerkonfiguration / Administrative Vorlagen / Windows-Komponenten / BitLocker Laufwerksverschl&uuml;sselung / Betriebssystemlaufwerke&rdquo;Festlegen, wie BitLocker-gesch&uuml;tzte Betriebssystemlaufwerke wiederhergestellt werden k&ouml;nnen&rdquo;Anhand dieser Richtlinie wei&szlig;en wir den Client an die Wiederherstellungsinformationen in der Active Directory zu speichern. BitLocker kann erst aktiviert werden, sobald die Widerherstellungsinformationen in Active Directory hinterlegt sind.TPMComputerkonfiguration / Administrative Vorlagen / System / Trusted Platform Module-Dienste&ldquo;TPM-Sicherung in Active-Directory-Dom&auml;nendienste aktivieren&rdquo;Anhand dieser Richtlinie wird der Client angewiesen den TPM Besitzerschl&uuml;ssel in der Active Directory zu speichern.Schritt 3: TPM am Client initialisierenWenn der TPM am Client initialisiert wird, wird ein Besitzerschl&uuml;ssel generiert.In Active Directory werden die Informationen im Attribut msTPM-OwnerInformation mitgeschrieben.Schritt 4: Verwaltungsprogramm f&uuml;r BitLocker-Schl&uuml;ssel installierenServer 2008 liefert eine zus&auml;tzliche Registerkarte f&uuml;r Active Directory um BitLocker-Schl&uuml;ssel anzuzeigen. Vorher muss jedoch das Feature Verwaltungsdienstprogramm f&uuml;r BitLocker aktiviert werden.Nach der Aktivierung findet man eine neue Registerkarte in den Computerkonten.&nbsp;Schritt 5: BitLocker aktivieren und Wiederherstellungsschl&uuml;ssel einsehenNun k&ouml;nnen wir am Client BitLocker f&uuml;r das Volume aktivieren, welches das Betriebssystem enth&auml;lt.Nach der Aktivierung kann der Wiederherstellungsschl&uuml;ssel im jeweiligen Computerkonto in der Registerkarte &ldquo;BitLocker-Wiederherstellung&rdquo; eingesehen werden.Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"WSUS auf neuen Server verschieben\",\n  \"url\": \"/post/wsus-auf-neuen-server-verschieben/\",\n  \"date\": \"May 10, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Daniel hat in diesem Artikel bereits dar&uuml;ber geschrieben.Im Gro&szlig;en und Ganzen habe ich die Migration genau gleich gemacht. Also WSUS auf dem neuen Server installiert, WSUS Content kopiert und mit \\\"wsutil export datei.cab datei.log\\\" und \\\"wsutil import datei.cab datei.log\\\" die Updates importiert. Allerdings wollte ich die Einstellungen nicht manuell &uuml;bernehmen, daf&uuml;r gibt es WSUSMigrate.Man findet das Tool im WSUS TechCenter unter API Samples and Tools. Installiert man diese, erh&auml;lt man diverse zus&auml;tzliche Tools f&uuml;r WSUS, unter anderm WSUSMigrationImport und WSUSMigrationExport mitsamt kurzem HowTo.Also habe ich diese Tools auf dem alten sowie auf dem neuen Server installiert und mit \\\"WSUSMigrationExport datei.xml\\\" die Gruppen und Approvals exportiert. Auf dem neuen Server kann man dann mit Parametern entscheiden welche Einstellungen man importieren m&ouml;chte. Die verf&uuml;gbaren Parameter f&uuml;r WSUSMigrationImport sind:TargetGroups -&gt; Importiert nur GruppenApprovals -&gt; Importiert nur Update ApprovalsAll -&gt; Importiert Gruppen und ApprovalsMan kann auch entscheiden was mit den Gruppen passieren soll die es auf dem Zielserver eventuell schon gibt, daf&uuml;r gibt es diese Parameter:None -&gt; Beh&auml;lt die bestehenden GruppenDeleteUnmatchedGroups -&gt; L&ouml;scht Gruppen vom Zielserver die nicht in der XML Datei vorhanden sindNoch ein Beispiel f&uuml;r den Import Befehl:\\\"WSUSMigrationImport datei.xml All None\\\" -&gt; Importiert alle Gruppen und Approvals und ver&auml;ndert bestehende Gruppen auf dem Zielserver nicht.so long!tomt\"\n},{\n  \"title\": \"Buchen einer Ressource in Outlook 2010 mit Exchange 2k3\",\n  \"url\": \"/post/buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3/\",\n  \"date\": \"May 4, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn man mit Outlook 2010 &uuml;ber einen Exchange Server in der Version 2003 eine Ressource buchen m&ouml;chte (z.B. Konferenzraum f&uuml;r eine Besprechung) wird das unter Umst&auml;nden nicht funktionieren. Die Besprechungsanfrage wird zwar allen Teilnehmern gesendet und auch im eigenen Kalender eingetragen, die Ressource jedoch nicht gebucht, sprich im Ressourcenkalender nicht eingetragen.  Dieses Problem tretet nur in der Konstellation von Outlook 2010 auf einem Exchange Server 2003 SP* auf.L&ouml;sung: Damit die Ressource wieder gebucht werden kann, muss in der Registry des PC&rsquo;s wo Outlook 2010 installiert ist, folgender Schl&uuml;ssel angelegt werden:HKCU\\\\Software\\\\Microsoft\\\\Office\\\\14.0\\\\Outlook\\\\Options\\\\CalendarREG_DWORD EnableDirectBooking 1 (HEX)Gr&uuml;&szlig;e dn\"\n},{\n  \"title\": \"NLB – Unicast vs. Multicast, Konfiguration, Port Rules\",\n  \"url\": \"/post/nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules/\",\n  \"date\": \"May 1, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"UnicastIm Unicast Mode tauscht jeder NLB Knoten seine MAC Adresse mit der Cluster MAC Adresse aus, d.h. alle Knoten haben die gleiche “virtuelle” MAC Adresse.Dieses Konfiguration zwingt den Switch zu “suboptimalem” Verhalten, da die selbe MAC Adresse über mehrere Switchports erreichbar ist, kann der Switch die Adresse nicht “lernen” also sie nicht in seine MAC Address Table aufnehmen und an ein Switchport binden. Alle Pakete an diese MAC Adresse werden vom Switch über alle Ports geflutet. Das führt zu überflüssiger Last am Switch und im gesamten Netzwerk.Ein weiteres Problem ist dass die einzelnen NLB Knoten so nicht mehr miteinander kommunizieren können, dafür wird eine zusätzliche Netzwerkkarte benötigt. Aus diesem Grund wird Unicast Mode mit nur einer Netzwerkkarte nicht empfohlen.Das Fluten von Paketen kann durch erstellen eines eigenen VLAN für die NLB Knoten vermindert werden. So werden Pakete nur innerhalb dieses VLANs geflutet und nicht über den ganzen Switch. MulticastBeim Multicast Mode wird jedem Konten eine Multicast MAC Adresse hinzugefügt, so dass alle Knoten mit zwei Layer2 Adressen ausgestattet sind. Das ermöglicht dem Switch das “lernen” der echten MAC Adressen und den einzelnen Knoten eine Kommunikation untereinander.Damit ein Multicast Cluster auch erreichbar wird müssen statische ARP Einträge am Switch konfiguriert werden, denn Standardmäßig wird die Auflösung von Unicast IPs in Multicast MAC Adressen blockiert. So werden Pakete an die Multicast Adressen nur an die festgelegten Ports weitergeleitet.Cluster im Multicast Mode können auch mit nur einer Netzwerkkarte betrieben werden, aus Performancegründen und verbessertem Management empfehle ich aber die Verwendung zweier Netzwerkkarten.NLB KonfigurationWie bereits oben beschrieben muss im Unicast Mode jeder Knoten zwei Netzwerkkarten besitzen. Im Multicast Mode reicht eine Karte, allerdings ist es eine “Best Practice” zwei zu verwenden.Als erstes muss das Feature installiert werden, ich habe hier deutsch Server, also heißt das Ding: Netzwerklastenausgleich. Das geht entweder über die GUI, oder mit “servermanagercmd –i nlb”. Auch mit PowerShell kann man Features installieren, und zwar mit dem Add-WindowsFeature cmdlet. Dann werden die beiden Netzwerkkarten konfiguriert. Eine wird die Netzwerkkarte für das LAN, sie wird mit IP, Gateway und DNS Server konfiguriert. Ich habe sie in LAN umbenannt. Die zweite Netzwerkkarte wird der dedizierte Adapter für NLB. Diese wird nur mit einer IP Adresse konfiguriert.Ich verwende im LAB 192.168.1.10 als Cluster Adresse. 192.168.1.11 und 192.168.1.12 als Adressen für die Netzwerkkarten “LAN”. Für die NLB Adapter verwende ich 192.168.1.21 und 192.168.1.22.Wichtig ist dass man auf die Bindings achtet, d.h. der Adapter LAN muss der erste in der Auswahl sein. Die Bindings werden in den Erweiterten Netzwerkeinstellungen konfiguriert. Jetzt wird mit dem NLB-Manager der Cluster erstellt. Dazu wird auf Cluster und Neu geklickt, dann wird der erste Knoten hinzugefügt: Wichtig: Der dedizierte NLB Adapter wird verwendet!Als dedizierte Adresse wird als 192.168.1.21 angezeigt, auf dieser NIC wird NLB aktiviert und die Cluster Adresse gebunden. Im nächsten Fenster wird die Cluster Adresse festgelegt, ich verwende wie oben beschrieben 192.168.1.10/24.Der Modus, also Unicast oder Multicast wird im nächsten Fenster konfiguriert. Außerdem wird der FQDN für den Cluster hier gesetzt. Mein Testcluster heißt nlb.ntsystems.it und läuft im Multicast Mode.&#160;  Jetzt werden noch die Port Rules konfiguriert, ich akzeptiere vorläufig mal die Standardeinstellungen, dazu aber später mehr.So, jetzt habe ich NLB mal soweit eingerichtet. Natürlich muss noch der zweite Knoten hinzugefügt werden. Dazu einfach auf den Clusternamen klicken und Host hinzufügen wählen. Wichtig auch hier wieder dass die Netzwerkkarte NLB verwendet wird, also die dedizierte Adresse 192.168.1.22.Ist der zweite Knoten hinzugefügt und der Status im NLB Manager auf “Converged” oder “Zusammengeführt” ist der Cluster erstellt.Allerdings ist die Konfiguration damit noch nicht fertig. Die Cluster IP ist noch nicht erreichbar. Das hat zwei Gründe, erstens muss am Switch noch der statische ARP Eintrag erstellt werden (Cisco: arp 192.168.1.10 03bf.c08a.010a). Außerdem muss IP Forwarding noch konfiguriert werden, dazu brauchen wir folgenden netsh Befehl: “netsh int ipv4 set int “NLB” forwarding=enabled”NLB Port RulesAls letzter Schritt bei der Konfiguration des Clusters werden die Port Rules konfiguriert. Standardmäßig werden einfach alle Ports (0-65535) egal ob TCP oder UDP an alle Clusterknoten weitergeleitet. Nun um die Angriffsfläche oder( “Attack Surface”) zu verringern und die Konfiguration zu optimieren sollten nur diese Ports weitergeleitet werden die auch wirklich benötigt werden. Ein weiterer Vorteil von einer eigenen Regel für jedes Protokoll ist dass man die Affinität so für jedes Port einstellen kann.Mein NLB Cluster soll ein Webserver werden, also werde ich nur die Ports 80 und 443 weiterleiten, ich möchte die Affinität für beide Ports “Einfach” haben, es wird also die IP Adresse jedes Clients verwendet um die Affinität zu steuern. Ich lösche also die Default Port Rule und erstelle zwei neue. Die Port Rules werden entweder in den Clustereigenschaften konfiguriert, oder direkt beim erstellen des Clusters.Jetzt erkennen wir einen weiteren Vorteil der Konfiguration mit zwei Netzwerkkarten: Der NLB Manager kann weiterhin mit beiden Knoten kommunizieren, obwohl ich für die Protokolle die verwendet keine Port Rules erstellt habe. Der NLB Manager verwendet für die Konfiguration die dedizierten Adressen.ChecklistHier die einzelnen Schritte nochmal im Überblick.        Feature installieren       zusätzliche Netzwerkkarte installieren    Netzwerkkarten konfigurieren (IP, Bindings!)    Cluster erstellen (Unicast/Multicast)    Hosts hinzufügen    evtl. Statische ARP Einträge    IP Forwarding aktivieren (netsh int ipv4 set int “NLB” forwarding=enabled)    Port Rules erstellen &#160;so long!   tomt\"\n},{\n  \"title\": \"Installation der Sharepoint Services 3.0 auf Server 2008\",\n  \"url\": \"/post/installation-der-sharepoint-services-30-auf-server-2008/\",\n  \"date\": \"April 27, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2008-R2\",\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"Die Installation der Sharepoint Services kann sich unter Server 2008 / 2008 R2 als schwierig erweisen, wenn der Windows Installer während der Installationsphase einen falsch angegeben Parameter meldet: Das Problem hängt hierbei mit der “Windows Internal Database” zusammen.Lösung: Vor der Installation folgendes Kommando eingeben:    ocsetup.exe &quot;WSSEE&quot; /quiet /norestart /x:&quot; /lv* C:\\\\bak.logGrüße   dn\"\n},{\n  \"title\": \"Office 2010 fertig!!\",\n  \"url\": \"/post/office-2010-fertig!!/\",\n  \"date\": \"April 23, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Kurze Info: Office 2010 ist fertig!! Ab sofort ist es für TechNet und MSDN Abonnenten zum Download verfügbar!Lasst die Leitungen glühen!! :)\"\n},{\n  \"title\": \"Programme vom Server Core / Hyper-V Server deinstallieren\",\n  \"url\": \"/post/programme-vom-server-core-hyper-v-server-deinstallieren/\",\n  \"date\": \"April 22, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Hyper-V\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Der Server 2008 Core und der Hyper-V Server haben keine Oberfläche um Programme zu deinstallieren (Add/Remove programs).Um Programme deinstallieren zu können, öffnen wir die Registrierung. (Üblicherweise Remoteregistrierung von einem Client aus). Unter    HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall    werden die installierten Programme gelistet. Wenn man den Wert im Schlüssel “UninstallString” in der Kommandozeile des Servers eingibt, wird der Windows Installer gestartet und deinstalliert das Programm.Grüße   dn\"\n},{\n  \"title\": \"Exchange 2010 - Active Sync funktioniert nicht\",\n  \"url\": \"/post/exchange-2010-active-sync-funktioniert-nicht/\",\n  \"date\": \"April 18, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Events\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Ja es ist ruhig zur Zeit auf ntSystems&hellip; das liegt daran dass die beiden Autoren zur Zeit ihre MCSA/MCSE Zertifizierungen auf MCITP-EA aktualisieren. Wir sind auch ganz gut im Rennen, aber einige Pr&uuml;fungen fehlen noch. Naja, bald gibt&rsquo;s hoffentlich wieder mehr zum Lesen.Inzwischen die L&ouml;sung f&uuml;r folgendes Problem:ActiveSync funktioniert mit Exchange 2010 nicht, Event ID: 1053 Source: MSExchange ActiveSync wird Protokolliert. Aus der Beschreibung des Fehlers erkennt man auch schon das Problem, fehlende Berechtigungen.Exchange ActiveSync doesn't have sufficient permissions to create the container &ldquo;CN&rdquo; under Active Directory &hellip; &lt;/p&gt;Active directory response: 00000005: SecErr: DSID-03152492, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0 Make sure the user has inherited permission granted to domain\\\\Exchange Servers to allow List, Create child, Delete child of object type \\\"msExchangeActiveSyncDevices\\\" and doesn't have any deny permissions that block such operations.&lt;/code&gt;Also einfach die in der Fehlermeldung beschriebenen Berechtigungen setzen, oder die Vererbung auf dem Active Directory User Objekt wieder aktivieren.Um Berechtigungen im Active Directory zu setzen muss unter &ldquo;View&rdquo; die Option &ldquo;Advanced Features&rdquo; aktiviert werden. Dann&nbsp;wird unter den Eigenschaften des Benutzers der Reiter &ldquo;Security&rdquo; angezeigt.tt\"\n},{\n  \"title\": \"WDS Remoteinstallationsordner verschieben\",\n  \"url\": \"/post/wds-remoteinstallationsordner-verschieben/\",\n  \"date\": \"March 17, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Um in den Deployment Services den Installationsorder zu verschieben müssen folgende Befehle ausgeführt werden:wdsutil /uninitialize-serverDann den Ordner an seinen neuen Platz verschiebenwdsutil /initialize-server /reminst:Laufwerksbuchstabe\\\\OrdnerGrüße   dn\"\n},{\n  \"title\": \"WSUS content / database auf anderes Volume verschieben\",\n  \"url\": \"/post/wsus-content-auf-anderes-volume-verschieben/\",\n  \"date\": \"March 16, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"ContentUm den WSUS content auf einem anderen Volume zu verschieben, reicht es ein einfaches Command auszuführen:wsusutil.exe movecontent “neuer Pfad” “Pfad für das entstehende LogFile”Das Tool wsusutil befindet sich unter Program Files\\\\ Update Services \\\\ ToolsDatabaseUm die Datenbank zu verschieben gibt es 2 Möglichkeiten, einmal über das Management Studio oder über SQLCMD. In diesem Post gehe ich lediglich auf die Methode anhand des Management Studio ein1) Datenbank über folgenden Pfad öffnen\\\\\\\\.\\\\pipe\\\\MSSQL$MICROSOFT##SSEE\\\\sql\\\\query 2) Datenbank trennenBevor die Datenbank getrennt wird, sollte der Dienst “update services” beendet werden. Die Datenbank SUSDB trennen und bei den Optionen muss noch angegeben werden, dass die Verbindungen mit getrennt werden sollen. 3) Datenbank auf neuem Volume kopieren4) Datenbank wieder anfügen&#160; Danach kann der Dienst “update services” wieder gestartet werden.Grüße    dn\"\n},{\n  \"title\": \"Forefront 2010 – Dienste starten nicht automatisch\",\n  \"url\": \"/post/forefront-2010-e28093-dienste-starten-nicht-automatisch/\",\n  \"date\": \"February 17, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"Wer Forefront 2010 installiert und das Logging nicht separat konfiguriert wird sich wom&ouml;glich wundern warum bei einem Neustart folgende Dienste nicht starten:Microsoft Forefront TMG ControlMicrosoft Fronfront TMG FirewallMicrosoft Forefront TMG Job SchedulerMicrosoft Forefront TMG Managed ControlForefront beantwortet somit keine Anfragen und jeglicher Zugriff von allen au&szlig;er den Management Computern wird blockiert.Das liegt daran dass Standardm&auml;&szlig;ig eine Lokale SQL Instanz also Logging Ziel konfiguriert ist, der SQL Dienst aber erst nach den Forefront Diensten startet&hellip; Und wenn Forefront nicht Protokollieren kann dann wird der Dienst beendet. Im Eventlog steht:The Microsoft Forefront TMG Control service terminated with service-specific error %%278540.L&ouml;sen l&auml;sst sich das Problem ganz einfach, entweder man stellt auf Logging to File&nbsp;oder man Konfiguriert die vier oben genannten Dienste f&uuml;r verz&ouml;gerten Start.&nbsp;&Uuml;ber die Sinnhaftigkeit dieser Standardkonfiguration muss man wohl nichts mehr sagen&hellip;tom\"\n},{\n  \"title\": \"WDS TFTP TimeOut\",\n  \"url\": \"/post/wds-tftp-timeout/\",\n  \"date\": \"February 12, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2008-R2\",\"Server-2008\",\"Server-2003\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn die Windows Deployment Services auf derselben Maschine wie der DNS Server laufen, wird WDS nach der Installation des DNS-Patches KB953230 (wird auch über Windows Updare verteilt) möglicherweise nicht mehr funktionieren. Wenn der Client versucht über PXE zu booten erscheint folgende Meldung: PXE-E32: TFTP open timeoutUm dieses Problem zu beheben muss folgendes an den WDS Diensten verändert werden:Server 2003 – 2008In den Eigenschaften des WDS Servers muss der UDP Portbereich zu den Werten 50000 bis 65000 verändert werden.      Server 2008 R2Wenn als OS Server 2008 R2 verwendet wird, kann auch die Option aktiviert werden, dass WDS automatisch nach verfügbaren WinSock Ports abfragt und nicht den vorkonfigurierten UDP Portbereich verwendet. Dazu muss der Schlüssel UDPPortPolicy unter HKLM\\\\System\\\\CurrentControlSet\\\\Services\\\\WDSServer\\\\Parameters von 1 auf 0 gesetzt werden.Grüße   dn\"\n},{\n  \"title\": \"Terminal-Lizenzserver, 4105\",\n  \"url\": \"/post/terminal-lizenzserver-4105/\",\n  \"date\": \"February 9, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2003\"],\n  \"author\": \"dni\",\n  \"content\": \"Nach der Domänenmigration von 2003 zu 2008 kann es geg. zu Problemen am Terminal-Lizenzserver kommen, dass Lizenzattribute für Benutzer nicht aktualisiert werden können. Das Problem ist, dass nach der Migration der Domäne die Benutzer-Berechtigungen für die Gruppe “Terminalserver-Lizenzserver” nicht aktualisiert werden.Um die Benutzerberechtigungen für die bestehenden Benutzer manuell zu setzen müssen der Gruppe Terminalserver-Lizenzserver folgende Berechtigungen zugewiesen werden: “Terminalserver-Lizenzserver lesen” und ”Terminalserver-Lizenzserver schreiben”  Grüße   dn\"\n},{\n  \"title\": \"BOOTMGR is missing\",\n  \"url\": \"/post/bootmgr-is-missing/\",\n  \"date\": \"February 2, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Gestern habe ich meinen Windows Server 2008 R2 für den Cluster vorbereitet. Aus versehen habe ich eine Daten-Partition als aktiv markiert. Das habe ich natürlich sofort rückgängig gemacht.Heute habe ich meinen Server neu gestartet und musste feststellen, dass er nicht mehr bootet. Als Fehlermeldung wurde angezeigt, dass der Bootloader fehlt (BOOTMGR is missing). Nach ein wenig Recherche über Bing (ehemals Google :) ) bin ich auf 2 Methoden gestoßen um das Problem zu beheben:Methode 1: Den BCD Speicher neu erstellen   Server CD in einlegen und Server damit starten     Die Option “Computerreparatur” auswählen     CMD starten und den Befehl Bootrec /RebuildBcd eingeben. Nun sollte das Betriebssystem aufgelistet werden. Nun bestätigt man mit YES, dass der BCD Speicher neu geschrieben wird. Sollte das Betriebssystem nicht aufgelistet werden, so muss folgende durchgeführt werden: Export der Konfiguration: Bcedit /export C:\\\\BCD_Export Alte Konfiguration umbenennen: ren c:\\\\boot\\\\bcd bcd.old Und die Konfiguration nochmal erstellen lassen: Bootrec /RebuidlBcd     Server neu starten  Methode 2: Den BCD Speicher manuell neu erstellenDiese Methode habe ich noch nicht versucht, aber hier der KB-Artikel zum nachlesen.Nachdem Methode 1 bei mir nicht funktionierte und nach mehreren Anläufen über /fixboot usw. sich nichts getan hat, erinnerte ich mich, dass auf der Windows 7 DVD eine Reparaturoption für den Startvorgang enthalten ist. Nachdem ich den Server mit der Windows 7 DVD gestartet hatte, wählte ich die Option “Startup Repair” aus und lies die Diagnose durchlaufen. Nach 1 Minute und einem Neustart später startete der Server wieder ordnungsgemäß.ACHTUNG: Das funktioniert nicht für den Microsoft Hyper-V Server. Dieser hat eine andere Bootkonfiguration, die vor dem Start des Betriebssystems den Hypervisor startet.Grüße    dn\"\n},{\n  \"title\": \"Exchange 2010 – This Attachment was removed\",\n  \"url\": \"/post/exchange-2010-e28093-this-attachment-was-removed/\",\n  \"date\": \"January 30, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Ich betreibe seit einiger Zeit eine Exchange 2010 Umgebung bestehend aus einem Edge Transport Server und einem Multi-Role Exchange Server im Lan.Standardm&auml;&szlig;ig ist am Edge Transport Server der &ldquo;Attachment Filter Agent&rdquo; aktiv, dieser ist daf&uuml;r verantwortlich, potentiell gef&auml;hrliche Anh&auml;nge zu filtern. Will man also z.B. eine .exe Datei verschicken muss man diesen Agent deaktivieren. Das wird auf dem Edge Transport Server gemacht und zwar per PowerShell.Disable-TransportAgent -Identity \\\"Attachment Filter agent\\\"Ich schlage allerdings vor dieses Sicherheitsfeature nicht auszuschalten. Man kann diverse Einstellungen vornehmen, so kann z.B. festgelegt werden dass ein unsicherer Anhang nicht entfernt wird sondern das Mail direkt &ldquo;rejected&rdquo; wird.Man kann die Attachment Filter Eintr&auml;ge &uuml;ber folgendes cmdlets selbst bearbeiten.Add-AttachmentFilterEntry -Name &lt;FileName&gt; -Type FileNameAdd-AttachmentFilterEntry -Name &lt;MIMEContentType&gt; -Type ContentTypeAu&szlig;erdem kann man das Verhalten des Attachment Filter Agent festlegen und zwar &uuml;ber das set-AttachmentFilterListConfig cmdletSet-AttachmentFilterListConfig -Action -Reject -RejectResponse \\\"Versenden von Mails mit unsicheren Anh&auml;ngen nicht erlaubt!\\\"Genauere Syntax und Infos zu den Parametern findet man im TechNet:Set-AttachmentFilterListConfig Add-AttachmentFilterEntry&nbsp;na dann, sch&ouml;nes Wochenende! tom\"\n},{\n  \"title\": \"NVSPBIND für Hyper-V\",\n  \"url\": \"/post/nvspbind-fur-hyper-v/\",\n  \"date\": \"January 26, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Hyper-V\"],\n  \"author\": \"dni\",\n  \"content\": \"In einem meiner letzten Posts (Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben) habe ich erklärt, wie man über die Registry die Bindungen an den Netzwerkschnittstellen verändern kann.     Die Microsoft Entwickler haben dazu jetzt ein Tool veröffentlich, mit dem das Ganze etwas komfortabler gemanagt werden kann: NVSPBIND.Grüße   dn\"\n},{\n  \"title\": \"WSUS auf anderen Server verschieben\",\n  \"url\": \"/post/wsus-verschieben/\",\n  \"date\": \"January 12, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Um den WSUS Server auf einer anderen physischen Maschine zu verschieben müssen folgende Schritte unternommen werden:1) WSUS auf dem Zielserver installieren2) Einstellungen manuell vom Quellserver zum Zielserver übernehmen3) Mit NTBackup das Verzeichnis WSUSContent vom Quellserver sichern (Kopieren ist auch möglich) 4) Daten mit NTBackup auf dem Zielserver in den entsprechenden Ordner wiederherstellen5) Metadaten vom Quellserver exportieren   CMD öffnen und zum Ordner Tools unter C:\\\\Programme\\\\Update Services\\\\ wechseln    Folgenden Befehl eintippen um die Metadaten zu exportieren: wsusutil.exe export export.cab export.log    2 Files wurden erstellt (Export.cab und Export.log)  6) Metadaten zum Zielserver importieren   Mit dem Befhl wsusutil.exe import export.cab import.log werden die zuvor exportierten Metadaten am Zielserver importiert             Info: Es kann einige Zeit vergehen, bis der Import Vorgang vollständig abgeschlossen wurde. 7) GPO abändern und auf den neuen WSUS Server verweisen    Grüße     dn \"\n},{\n  \"title\": \"WPAD und Server 2008\",\n  \"url\": \"/post/wpad-und-server-2008/\",\n  \"date\": \"January 12, 2010\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2008\",\"Server-2008-R2\",\"Server\",\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Heute habe ich meinen Windows Server 2008 R2 Server zum Domänencontroller promoted. D.h. Domänendienste, GC und DNS wurden installiert. Zudem habe ich als primären DNS Server die lokale Maschine angegeben.Nach einiger Zeit wunderte ich mich, dass das Internet nicht mehr funktioniert. Als Gateway betreibe ich eine ISA Server 2006, der Proxy wird über WPAD automatisch konfiguriert.Windows Server 2008 besitzt für DNS ein neues Sicherheitsfeature, welches WPAD nicht zulässt (DNS Global Query Blocklist).dnscmd /info /enableglobalqueryblocklist –&gt; zeigt ob das Sicherheitsfeature aktiv ist. 1 = True, 0 Falsednscmd /config /enableglobalqueryblocklist 0 –&gt; schaltet das Sicherheitsfeature ausWenn das Sicherheitsfeature abgeschaltet wird, muss der DNS Server noch neu gestartet werden.Grüße   dn\"\n},{\n  \"title\": \"Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben\",\n  \"url\": \"/post/hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben/\",\n  \"date\": \"December 28, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Hyper-V\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn man den Hyper-V Server bzw. den Server Core verwendet und an den Netzwerkschnittstellen die Bindungen verändern möchte, kommt man um das Editieren der Registry nicht herum.   In meinen Fall möchte ich die “Datei und Druckerfreigabe” von den iSCSI Adaptern loslösen.Als erstes muss die ID der Netzwerkadapter ermittelt werdenwmic nicconfig get Description,SettingIDDanach erhält man eine Liste mit den Adaptern und deren ID Nun beginnt die Arbeit in der Registry: Zunächst muss der Schlüssel Bind unter HKEY_LOCAL_MACHINE\\\\system\\\\currentcontrolset\\\\services\\\\lanmanserver\\\\     linkagegeöffnet werden. Hier erhält man eine Liste mit den Netzwerkadaptern und ihren Bindungen zum Protokoll der “Datei und Druckerfreigabe”. Der nächste Schritt besteht darin, die Bindungen aufzuheben, indem man alle Zeilen wo die entsprechende Adapter-ID vorkommt löscht.   Änderungen werden nach einem Reboot aktiv.Anbei noch eine Liste mit den Protokollen und ihren Schlüsseln:File and Printer Sharing: LanmanServer     Client for MS Networks: LanmanWorkstation      Link-Layer Discovery Mapper I/O Driver: lltdio      Link-Layer Topology Discovery Responder: rspndr      TCP/IP v4: tcpip      TCP/IP v6: tcpip6Grüße   dn    \"\n},{\n  \"title\": \"BlueScreen “Stop 0x0000007E” beim aktivieren der Virtualisierungs-Technologie\",\n  \"url\": \"/post/bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung/\",\n  \"date\": \"December 28, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Hyper-V\",\"Server-2008-R2\"],\n  \"author\": \"dni\",\n  \"content\": \"Nachdem im BIOS die Virtualisierungs-Technologie aktiviert wird, kann es zu einem BlueScreen bei starten des Servers kommen. Im BlueScreen wird folgender Fehlercode mitgeteilt: 0x0000007E.Betroffen sind folgende Produkte: Windows Server 2008 R2 Standard  Windows Server 2008 R2 Enterprise  Windows Server 2008 R2 Datacenter Hyper-V Server 2008 R2&#160;Microsoft hat dazu den KB-Artikel 974598 und einen Hotfix veröffentlicht. Um den Server wieder flott zu bekommen, muss die Virtualisierungs-Technologie deaktiviert werden. Danach muss der Server gestartet und der Hitfix installiert werden.   Nachdem der Hotfix installiert wurde, kann die Virtualisierungs-Technologie wieder aktiviert und das System gestartet startet.Grüße   dn\"\n},{\n  \"title\": \"Server 2008 Core / Hyper-V Netzwerkschnittstelle umbenennen\",\n  \"url\": \"/post/server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen/\",\n  \"date\": \"December 28, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Hyper-V\"],\n  \"author\": \"dni\",\n  \"content\": \"Um auf einem Server Core oder auch Hyper-V Server die Netzwerkschnittstelle umzubenennen, wird das Tool netsh verwendet.Um z.B. “LAN-Verbindung 5” in “iSCSI 10” umzubenennen, muss folgender Befehl ausgeführt werden:netsh interface set interface name=”LAN-Verbindung 5” newname=”iSCSI 10”Grüße   dn\"\n},{\n  \"title\": \"disclaimer\",\n  \"url\": \"/post/disclaimer/\",\n  \"date\": \"December 24, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"  &lt;p&gt;1. Inhalt des Onlineangebotes &lt;/p&gt;  &lt;p&gt;Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. &lt;/p&gt;  &lt;p&gt;Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen. &lt;/p&gt;  &lt;p&gt;2. Verweise und Links &lt;/p&gt;  &lt;p&gt;Bei direkten oder indirekten Verweisen auf fremde Webseiten (&quot;Hyperlinks&quot;), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. &lt;/p&gt;  &lt;p&gt;Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist. &lt;/p&gt;  &lt;p&gt;3. Urheber- und Kennzeichenrecht &lt;/p&gt;  &lt;p&gt;Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen. &lt;/p&gt;  &lt;p&gt;Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! &lt;/p&gt;  &lt;p&gt;Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet. &lt;/p&gt;  &lt;p&gt;4. Datenschutz &lt;/p&gt;  &lt;p&gt;Sofern innerhalb des Internetangebotes die Möglichkeit zur Eingabe persönlicher oder geschäftlicher Daten (Emailadressen, Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme und Bezahlung aller angebotenen Dienste ist - soweit technisch möglich und zumutbar - auch ohne Angabe solcher Daten bzw. unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet. Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie Emailadressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstössen gegen dieses Verbot sind ausdrücklich vorbehalten. &lt;/p&gt;  &lt;p&gt;5. Rechtswirksamkeit dieses Haftungsausschlusses &lt;/p&gt;  &lt;p&gt;Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt. &lt;/p&gt;  &lt;p&gt;1. Content&lt;/p&gt;  &lt;p&gt;The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect,will therefore be rejected. &lt;/p&gt;  &lt;p&gt;All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the author without separate announcement. &lt;/p&gt;  &lt;p&gt;2. Referrals and links&lt;/p&gt;  &lt;p&gt;The author is not responsible for any contents linked or referred to from his pages - unless he has full knowledge of illegal contents and would be able to prevent the visitors of his site fromviewing those pages. If any damage occurs by the use of information presented there, only the author of the respective pages might be liable, not the one who has linked to these pages. Furthermore the author is not liable for any postings or messages published by users of discussion boards, guestbooks or mailinglists provided on his page. &lt;/p&gt;  &lt;p&gt;3. Copyright&lt;/p&gt;  &lt;p&gt;The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. &lt;/p&gt;  &lt;p&gt;The copyright for any material created by the author is reserved. Any duplication or use of objects such as images, diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's agreement. &lt;/p&gt;  &lt;p&gt;4. Privacy policy&lt;/p&gt;  &lt;p&gt;If the opportunity for the input of personal or business data (email addresses, name, addresses) is given, the input of these data takes place voluntarily. The use and payment of all offered services are permitted - if and so far technically possible and reasonable - without specification of any personal data or under specification of anonymized data or an alias. The use of published postal addresses, telephone or fax numbers and email addresses for marketing purposes is prohibited, offenders sending unwanted spam messages will be punished. &lt;/p&gt;  &lt;p&gt;5. Legal validity of this disclaimer&lt;/p&gt;  &lt;p&gt;This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual terms of this statement are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. &lt;/p&gt;\"\n},{\n  \"title\": \"Zertifizierungsstelle verschieben (Backup/Restore)\",\n  \"url\": \"/post/zertifizierungsstelle-verschieben-(backuprestore)/\",\n  \"date\": \"December 24, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Eine Zertifizierungsstelle geh&ouml;rt zu den Serverrollen die &uuml;ber viele Jahre gleich bleiben und einige Hardware- bzw. Betriebsystem- Lifecycles &uuml;berdauern. Aus diesem Grund kann es vorkommen dass man eine CA von einem Server auf einen anderen migrieren muss.Wichtig dabei ist dass der Name des Servers sich nicht &auml;ndern sollte, kann man eine &Auml;nderung nicht verhindern gibt es hier einen KB Artikel der die Vorgehensweise beschreibt. Aber wie gesagt, besser/einfacher ist es den Namen nicht zu &auml;ndern.Nun denn, zuerst gilt es eine Strategie zu w&auml;hlen, ich habe es so gemacht dass ich die CA gesichert habe, CA deinstalliert, DC heruntergestuft, Server aus der Domain genommen. Neuen Server mit gleichem Namen installiert, zum DC hochgestuft, CA installiert, CA widerhergestellt und l&auml;uft.Also zum ersten Schritt, Sichern einer Zertifizierungsstelle:Im CA SnapIn auf den CA Namen klicken und All Tasks &ndash;&gt; Backup CA w&auml;hlenBeide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenEinen Ordner angeben wohin das Ganze gesichert wird (sollte leer sein)Ein Kennwort f&uuml;r den Private Key angeben (sollte man sich nat&uuml;rlich merken)regedit &ouml;ffnen und zum Schl&uuml;ssel HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration wechseln, Rechtsklick auf den Schl&uuml;ssel und Export w&auml;hlen. Wieder einen Ordner w&auml;hlen um den Registry Key abzulegen.Deinstallieren einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Remove Roles w&auml;hlenActive Directory Certificate Services entfernenNeu Starten und fertigfolgende Daten bleiben auf dem Server (Achtung bei Entsorgung!!)CA database, CA public and private keys, CA's certificates in the Personal storeCA chain's root certificate in the Trusted Root Certification Authorities storeCA chain's intermediate certificates in the Intermediate Certification Authorities storeThe CA's CRLWiederherstellen einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Add Roles w&auml;hlenActive Directory Certificate Services hinzuf&uuml;genBei &ldquo;Specify Type&rdquo; den entsprechenden Typ ausw&auml;hlen, Standalone oder EnterpriseBei &ldquo;Set up Private Key&rdquo; muss man &ldquo;Use existing private Key&rdquo; w&auml;hlen, darunter &ldquo;Select a certificate and use its associated private key&rdquo;Jetzt wird das vorher gesicherte Zertifikat (*.p12 Datei) ausgew&auml;hlt und das entsprechende Passwort eingegebenBei &ldquo;Configure Database&rdquo; ist noch darauf zu achten dass der CertLog Ordner im gleichen Pfad liegt wie auf dem alten Server (Standard %systemroot%\\\\system32\\\\CertLog)Jetzt wird die CA installiert Ist die Installation abgeschlossen, die Dienstkonsole &ouml;ffnen (services.msc) und den Dienst &ldquo;Active Directory Certificate Services&rdquo; beendenJetzt das vorher exportierte Registry File doppelklicken und die Einstellungen importierenCA SnapIn &ouml;ffnen und auf den CA Namen klicken, All Tasks &ndash;&gt; Restore CA w&auml;hlenWieder beide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenJetzt kann der Dienst &ldquo;Active Directory Certificate Services&rdquo; wieder gestartet werden und die CA l&auml;uft wiederWeihnachtliche Gr&uuml;&szlig;e tom&nbsp;\"\n},{\n  \"title\": \"Domain Controller umbenennen\",\n  \"url\": \"/post/domain-controller-umbenennen/\",\n  \"date\": \"December 24, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2008-R2\",\"Server-2008\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Es kann vorkommen dass man bei der Wahl der Servernamen mal danebengreift oder einfach im Nachhinein einen anderen Namen braucht. Wenn z.B. eine Zertifizierungsstelle wiederhergestellt werden soll dann ist der Computername wichtig.Um also einen Domain Controller (2008, 2008R2) umzubenennen geht man am besten so vor (Achtung: Ein Neustart ist nötig).Zuerst wird ein zusätzlicher DNS-Hostname hinzugefügt.netdom computername altername.domain.local /add:neuername.domain.localWichtig ist nun die Replikation mit allen anderen DCs abzuwarten oder manuell anzustoßen (repadmin, AD Sites and Services). Alle DCs müssen die Änderung im Computerkonto mitbekommen, in allen DNS Servern muss der zusätzliche Namen als Ressource Record aufscheinen. Erst nachdem die Replikation abgeschlossen ist darf man zum nächsten Schritt gehen. Man kann das Ergebnis der Replikation sehen indem man mit ADSI Edit die Eigenschaften des entsprechenden Computerkontos anzeigt, dort muss das Attribut &quot;msDS-AdditionalDnsHostName” den Wert neuername.domain.local haben. Alternativ zu ADSI Edit kann man auch das SnapIn Active Directory Users and Computers verwenden, allerdings muss man dazu unter “View” die “Advanced Features” aktivieren damit man die Attribute sieht.Ist die Replikatoin erfolgt wird der neue Computername als Primärer gesetzt.netdom computername altername.domain.local /makeprimary:neuername.domain.localNach diesem Schritt ist wiederum die Replikation abzuwarten/anzustoßen. Es ändert sich der Name des Computerobjektes und das Attribut “msDS-AdditionalDnsHostName” bekommt den Wert “altername.domain.local”.Jetzt muss der Server neu gestartet werden.Zum Schluss wird der alte Namen noch entfernt.netdom computername neuername.domain.local /remove:altername.domain.localMan kommt nicht um den Neustart herum, so funktioniert aber alles reibungslos.Grüße.   tt\"\n},{\n  \"title\": \"Forefront Threat Management Gateway 2010\",\n  \"url\": \"/post/forefront-thread-management-gateway-2010/\",\n  \"date\": \"December 23, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"de\",\"Security\"],\n  \"author\": \"tto\",\n  \"content\": \"Der Nachfolger des beliebten MS Internet Security and Acceleration Servers (ISA) ist seit Mitte November verf&uuml;gbar. Nat&uuml;rlich wurde der Name ge&auml;ndert&nbsp;sowas ist&nbsp;nach einigen Versionen&nbsp;immer n&ouml;tig ;) Das Ding wurde in die Forefront Produktlinie aufgenommen und hei&szlig;t jetzt Forefront Threat Management Gateway 2010. TMG gibt es wie ISA als Standard und Enterprise Edition, die Unterschiede findet man hier.Wichtig zu erw&auml;hnen ist dass Forefront TMG nur mehr als 64 Bit Version verf&uuml;gbar ist, es gibt eine Testversion f&uuml;r 32 Bit Systeme, ist Produktiv allerdings nicht unterst&uuml;tzt. Die Genauen Systemvoraussetzungen gibt es hier.Die wichtigsten neuen Features kurz im &Uuml;berblick:Web Protection Subscription ServiceBietet HTTP/HTTPS Traffic InspectionURL Filterung in Zusammenarbeit mit MRS (Microsoft&nbsp;Reputation Services) mehr dazu z.B. bei Technet EdgeE-Mail Supportarbeitet mit Exchange Edge Transport zusammenNIS Network Inspection SystemIntrusion PreventionEnhanced NATendlich eine 1-to-1 NAT Funktion, d.h. man kann selbst entscheiden welche interne Adresse auf welche externe &uuml;bersetzt wirdVoIP Support64 Bit SupportStartet man das Setup bekommt man mal etwas wirklich cooles, das Preparation Tool.&nbsp;Dieses Tool installiert alle&nbsp;ben&ouml;tigten Serverrollen und Features. Diese sind je nach Installation unterschiedlich:Forefront TMG servicesWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellWindows Web Services API (WWSAPI)Network Policy Server (NPAS-Policy-Server)NPAS Routing and Remote Access Services (NPAS-RRAS-Services)Active Directory Lightweight Directory Services (ADLDS)Network Load Balancing (NLB)Forefront TMG management onlyWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellForefront TMG EMS (nur Enterprise Version)Windows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellActive Directory Lightweight Directory Services (ADLDS)Ist der Preparation Wizard abgeschlossen, kann mit der Installation des TMG begonnen werden.Die Installation dauert einige Zeit, wenn sie abgeschlossen ist kann man die Management Konsole &ouml;ffnen und mit der Konfiguration beginnen. Zuerst sind noch mit einfachen Wizards die Netzwerkeinstellungen, Updates und URL Filtering bzw. Web Protection Subscription zu konfigurieren.Wenn jetzt noch der Web Access Wizard ausgef&uuml;hrt wird kann man gleich noch eine erste Regel erstellen. Man kann ausw&auml;hlen welche URL Kategorien man sperren m&ouml;chte, ob man Web und HTTPS inspection aktivieren m&ouml;chte und wenn ja mit welchem Zertifikat. Au&szlig;erdem kann hier gleich das Caching aktiviert werden.Alles in allem scheint TMG wirklich ein sehr interessantes Produkt zu werden, das deutlich mehr kann als nur den ISA Server zu ersetzen. In n&auml;chster Zeit werde ich sicher noch einiges dar&uuml;ber berichten.viele Gr&uuml;&szlig;e.tom\"\n},{\n  \"title\": \"Exchange 2010 – Anonymous Relay\",\n  \"url\": \"/post/exchange-2010-e28093-anonymous-relay/\",\n  \"date\": \"December 21, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Immer wieder gibt es Gründe (z.B. SharePoint) um bestimmten Hosts anonymes Relaying über Exchange zu erlauben. Man muss sich so eine Konfiguration natürlich gut überlegen und die entsprechenden Hosts müssen vertrauenswürdig bzw. sicher sein.Man erstellt also einen neuen “Custom” Receive Conenctor, dem man erst mal einen Namen geben muss (Server Configuration, Hub Transport). Unter “Local Network Settings” kann man die IP Adresse angeben über welche der Exchange Server am besten mit dem Host reden kann. Wenn man nur eine Netzwerkkarte im Hub Transport Server hat kann man sich diese Einstellung schenken und einfach alle verfügbaren IPv4 Adressen verwenden. Außerdem kann man noch den FQDN eingeben mit dem sich der Exchange Server melden soll. Unter “Remote Network Settings” wird jetzt der Host (bzw. die Hosts) hinzugefügt der anonym über den Exchange Relayen darf. Wichtig: der Host muss wirklich vertrauenswürdig sein und AntiVirus bzw. Firewall sollen laufen, damit man nicht selbst zur Spamschleuder wird. Man kann einzelne Hosts, IP Bereiche oder ganze Subnets angeben. Durch klicken auf weiter und wird der Connector erstellt. Jetzt muss man noch die benötigten Berechtigungen setzen. Dazu Rechtsklick auf den Connector und die Eigenschaften öffnen. Unter “Authentication” werden alle Felder deaktiviert, unter “Permission Groups” wird die Gruppe Anonymous Users hinzugefügt.   Das Ganze kann man natürlich auch wieder mit der PowerShell machen, dazu einfach das New-ReceiveConnector cmdlet verwenden. Hier ein Beispiel:New-ReceiveConnector -Name &quot;SharePoint Relay&quot; -Usage Custom -PermissionGroups AnonymousUsers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.1.10,192.168.1.15-192.168.1.18Jetzt gibt es also den Connector und die angegeben Hosts verwenden diesen, das Relaying funktioniert allerdings noch nicht.    Dazu muss man dem User “NT AUTHORITY\\\\ANONYMOUS LOGON” die Berechtigung “Ms-Exch-SMTP-Accept-Any-Recipient” geben. Diese Aktion kann man nur in der EMS (Exchange Management Shell) durchführen.Get-ReceiveConnector &quot;SharePoint Relay&quot; | Add-ADPermission -User &quot;NT AUTHORITY\\\\ANONYMOUS LOGON&quot; -ExtendedRights &quot;Ms-Exch-SMTP-Accept-Any-Recipient&quot;Hat man auch das gemacht funktioniert das Realying.tt\"\n},{\n  \"title\": \"Ersten WS08R2 DC im vorhandenen Forest installieren\",\n  \"url\": \"/post/ersten-ws08r2-dc-im-vorhandenen-forest-installieren/\",\n  \"date\": \"December 17, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Server-2008-R2\"],\n  \"author\": \"tto\",\n  \"content\": \"Neue Features wie das AD Administrative Center (hat Daniel hier&nbsp;schon&nbsp;vorgestellt)&nbsp;oder der AD Recycle Bin erfordern Windows Server 2008 R2 Domain Controller. Das Administrative Center braucht nur einen neuen DC, f&uuml;r den Recycle Bin muss das Forest Functional Level auf WS08R2 gestuft werden, mehr dazu in einem n&auml;chsten Beitrag.Um die Domain auf den ersten 2008 R2 DC vorzubereiten muss wie auch schon bei fr&uuml;heren Updates zuerst das AD Schema aktualisiert werden (auf Version 47). Dazu wird auf einem bestehenden DC die Windows Server 2008 R2 CD eingelegt, man muss nat&uuml;rlich mit einem Benutzer mit Schema Admin Rechten anmelden. Im Ordner Support\\\\adprep befinden sich die Dateien adprep.exe und adprep32.exe. Wie der Dateiname schon sagt wird mit adprep.exe die Schemaerweiterung bei x64 Systemen durchgef&uuml;hrt, mit adprep32.exe wird das Schema auf x86 DCs erweitert.Folgende Parameter werden ben&ouml;tigt:adprep[32].exe /forestprep Bereitet den gesamten Forest auf WS08R2 voradprep[32].exe /domainprep /gpprep Muss auf dem Infrastruktur Master ausgef&uuml;hrt werdenBereitet die Domain vor und setzt Berechtigungen auf Sysvol Share f&uuml;r RSoP Planning Modeadprep[32].exe /rodcprep Muss nur ausgef&uuml;hrt werden wenn ein RODC vorhanden ist, bzw. installiert werden sollJetzt sind Domain und Forest bereit f&uuml;r den neuen DC und der Windows Server 2008R2 kann mit dcpromo hochgestuft werden.viele Gr&uuml;&szlig;e tt\"\n},{\n  \"title\": \"Exchange 2010 – Edge Subscription\",\n  \"url\": \"/post/exchange-2010-e28093-edge-subscription/\",\n  \"date\": \"December 17, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Exchange 2010 bringt wie sein Vorg&auml;nger die Edge Transport Rolle mit. In Exchange 2007 wurde bei jeder Synchronisation die gesamte Konfiguration repliziert, dieser Prozess wurde mit Exchange 2010 verbessert, jetzt ist die erste Replikation vollst&auml;ndig, bei allen weiteren werden nur noch die &Auml;nderungen repliziert (incremental updates).Diese Serverrolle kann als einzige nicht mit anderen Rollen auf einem Server installiert werden, der Grund daf&uuml;r ist auch einfach erkl&auml;rt: der Edge Transport Server wird als Mail Relay in der DMZ eingesetzt und ist kein Dom&auml;nenmitglied bzw. hat nur sehr eingeschr&auml;nkten Zugriff auf das LAN.Vor der Installation des Edge Transport Servers muss die interne Hub Transport Rolle konfiguriert werden. Das hei&szlig;t Accepted Domains und die Connectoren m&uuml;ssen konfiguriert werden. Hier ein Link zur entsprechenden Technet Seite.Die Installation des Edge Transport Servers gestaltet sich sehr einfach. Man braucht einen x64 Server 2008 (am besten R2) in der Standard Edition. Dort wird das .net Framework installiert. Au&szlig;erdem wird ein Verzeichnisdienst ben&ouml;tigt, der Edge Transport Server muss ja wissen welche Empf&auml;nger es im Active Directory gibt. Active Direcotry Lightweight Directory Services (ADLDS), der Nachfolger des ADAM, und die entsprechende Verwaltungskonsole werden also auch installiert.Am schnellsten geht das wohl &uuml;ber die PowerShell:Import-Module ServerManagerAdd-WindowsFeature NET-Framework,RSAT-ADDS,ADLDS &ndash;RestartNach dem Neustart muss noch der Starttyp eines Dienstes ge&auml;ndert werden, auch wieder in der PowerShell:Set-Service NetTcpPortSharing -StartupType AutomaticDer Server ist jetzt soweit vorbereitet, man muss (wenn nicht schon passiert) noch den DNS Suffix der internen Domain (z.B: domain.local) eintragen.Da der Server in der DMZ stehen soll, muss auf der Firewall folgendes konfiguriert werden:DNS: Port 53 (tcp/udp) Richtung interne DNS ServerSMTP:&nbsp;Port 25 (tcp)&nbsp;Richtung interner Hub Transport ServerEdgeSync:&nbsp;Port 50636 (tcp)&nbsp;Richtung interner Hub Transport Server (Replikationspartner)Jetzt kann das Exchange 2010 Setup ausgef&uuml;hrt werden, bei dem die &ldquo;Custom Installation&rdquo; gew&auml;hlt wird und dort nur die Edge Transport Rolle und die Management Tools installiert werden. Die Installation ist schnell abgeschlossen, was jetzt noch ben&ouml;tigt wird ist die Synchronisation zwischen Edge Transport und internem Exchange (HUB) Server. Wichtig: Auf dem Edge Transport Server ist keine Konfiguration (Accepted Domains usw.) n&ouml;tig, diese Einstellungen werden mit der Edge Synchronisierung &uuml;bernommen.Auf dem Edge Transport Server ein neues Subscription File erstellt. Es wird einfach New-EdgeSubscription -FileName \\\"C:\\\\filename.xml\\\" in der EMS eingegeben. Die eben erstellte Datei wird auf den Hub Transport Server &uuml;bertragen, dort wird&nbsp;mit dem selben cmdlet die EdgeSync erstellt. New-EdgeSubscription -FileName \\\"C:\\\\EdgeSubscriptionInfo.xml\\\" -Site \\\"Name-der-AD-Site\\\". Nat&uuml;rlich kann man die EdgeSync auch in der EMC erstellen, dazu in der Organization Configuration die Hub Transport Rolle ausw&auml;hlen, dort auf den Edge Subscription Tab wechseln und New Edge Subscription w&auml;hlen. Jetzt muss noch der Active Directory Standort gew&auml;hlt werden und das xml File angegben werden. Auch hier k&ouml;nnen die Connectoren auf Wunsch automatisch erstellt werden.Wichtig: Der interne Hub Transport Server muss den Edge Transport Server per DNS Name aufl&ouml;sen k&ouml;nnen!Durch die EdgeSync werden die ben&ouml;tigten Connectoren erstellt und die relevanten Einstellungen &uuml;bernommen. So wird z.B. die Konfiguration des Default Recipient Connector sowie die Accepted Domains vom internen Server &uuml;bernommen.Weiterf&uuml;hrend kann ich das Exchange 2010 TechCenter empfehlen.Sehr lesenswert ist auch der Exchange Team Blog, zu finden in der Blogroll.viele Gr&uuml;&szlig;ett\"\n},{\n  \"title\": \"Exchange 2010 – Get-OwaVirtualDirectory Access Denied\",\n  \"url\": \"/post/exchange-2010-e28093-get-owavirtualdirectory-access-denied/\",\n  \"date\": \"December 16, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Exchange\"],\n  \"author\": \"tto\",\n  \"content\": \"Wird Exchange 2010 Server in einer Exchange 2007 Umgebung installiert erscheint folgender Fehler wenn man in der Exchange Management Console unter “Server Configuration” die Client Access Rolle verwalten möchte. “An IIS directory entry couldn't be created. The error message is Access is denied. HResult = -2147024891. It was running the command 'Get-OwaVirtualdirectory'”Den selben Fehler erhält man wenn man in der Exchange Management Shell den Befehl “Get-OwaVirtualDirectory” ausführt, macht die EMC eigentlich auch, nur mit Bild drum herum :).Der Grund dafür ist wohl dass Exchange 2010 keine Berechtigungen auf der entsprechenden Website im IIS auf dem 2007 Client Access Server erhält.Die Lösung: Alle Exchange 2010 Server sollen Mitglied der lokalen Administratoren auf allen Exchange 2007 Servern sein. Also am besten die Gruppe “Exchange Trusted Subsystems” zu den Lokalen Admins auf den Exchange 2007 Server hinzufügen.Alternativ kann man der Gruppe “Exchange Trusted Subsystems” auch Berechtigungen (Full Control) auf der entsprechenden Website (Default Website) im direkt im IIS geben.viele Grüße   tt\"\n},{\n  \"title\": \"DHCP Fehler 1003\",\n  \"url\": \"/post/dhcp-fehler-1003/\",\n  \"date\": \"November 26, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Letztens konnte ich auf mehreren meiner Client-PC’s Fehlermeldungen im Eventlog bezüglich fehlerhafter Anmeldungen feststellen:Ereignistyp:&#160;&#160;&#160; Warnung   Ereignisquelle:&#160;&#160;&#160; Dhcp    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 1003    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:25    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****    Beschreibung:    Der Computer konnte die Netzwerkadresse, die durch den DHCP-Server für die Netzwerkkarte mit der Netzwerkadresse ******A98F0 zugeteilt wurde, nicht erneuern. Der folgende Fehler ist aufgetreten:     Das Zeitlimit für die Semaphore wurde erreicht. . Es wird weiterhin im Hintergrund versucht, eine Adresse vom Netzwerkadressserver (DHCP) zu erhalten. Ereignistyp:&#160;&#160;&#160; Fehler   Ereignisquelle:&#160;&#160;&#160; NETLOGON    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 5719    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:33    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****Beschreibung:   Es steht kein Domänencontroller für die Domäne ***** aus folgendem Grund zur Verfügung:     Es sind momentan keine Anmeldeserver zum Verarbeiten der Anmeldeanforderung verfügbar.    Stellen Sie sicher, dass der Computer mit dem Netzwerk verbunden ist, und versuchen Sie es erneut. Wenden Sie sich an den Domänenadministrator, wenn das Problem weiterhin besteht. Als erstes habe ich die DNS Struktur gecheckt. Danach mit den beiden Tools dcdiag und netdiag mehrfach Diagnosen gestartet und ausgewertet. Laut den Diagnosetools war alles OK.    Nach ein wenig Recherche habe ich das Problem entdeckt: Es war der Switch.     Auf den Switch ist das STP Protokoll aktiv. Dieses braucht üblicherweise 30-60 Sekunden um den Switchport von Listening und Learning Status auf Forwarding zu bringen. Da die PC’s schneller starten als der Switchport aktiv ist, kann der PC seine IP nicht erneuern bzw. anfordern.Das Problem kann man umgehen indem man die Client-Switchports auf “PortFast” stellt und somit der Switchport sofort in den Forwarding-Status geht.Grüße, dn\"\n},{\n  \"title\": \"Windows 7 USB/DVD Download Tool\",\n  \"url\": \"/post/windows-7-usbdvd-download-tool/\",\n  \"date\": \"October 26, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Microsoft hat nun ein kostenloses Tool zur Verfügung gestellt um einen USB Stick Bootfähig zu machen, die Windows 7 Installationsdateien darauf zu kopieren und damit die Windows 7 Installation durchzuführen.Windows 7 USB/DVD Download ToolDer USB Stick muss mindestens 4 GB groß sein. Wie ein USB Stick manuell für die Installation präpariert werden kann, hat Thomas in einen vorhergehenden Post erklärt.Viel Spaß beim installieren!!    Grüße, dn\"\n},{\n  \"title\": \"Microsoft TechDay Dezember 2009\",\n  \"url\": \"/post/microsoft-techday-dezember-2009/\",\n  \"date\": \"October 21, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Events\"],\n  \"author\": \"dni\",\n  \"content\": \"Die jährlichen Microsoft Techdays stehen wieder vor der Tür. Vorgestellt werden folgende Produkte: Office, Sharepoint und Exchange in der Version 2010.   Steffen Krause und Daniel Melanchton präsentieren alle wesentlichen Neuerungen anhand von vielen Demos.Termine:     08.12.2009: Stuttgart    09.12.2009: München    15.12.2009: Düsseldorf    16.12.2009: BerlinZur Anmeldung und Agenda über den LinkGrüße, dn\"\n},{\n  \"title\": \"Microsoft Hyper-V Server 2008 V1 vs. V2\",\n  \"url\": \"/post/microsoft-hyper-v-server-2008-v1-vs-v2/\",\n  \"date\": \"October 21, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Hyper-V\"],\n  \"author\": \"dni\",\n  \"content\": \"Der neue Microsoft Hyper-V Server 2008 R2 steht ja nun seit einigen Wochen auf TechNet zum downloaden bereit. Hier erkläre ich nochmal kurz alle Neuerungen.In der folgenden Tabelle werden die Features von Hyper-V V1 und V2 gegenübergestellt. Neu in V2 ist außerdem:   Hochverfügbarkeit und Live-Migration (nettes Feature)    Bis zu 384 virtuelle Maschinen und 512 virtuelle Prozessoren werden unterstützt    Virtuelle Festplatten können ab jetzt im laufenden Betrieb hinzugefügt bzw. entfernt werden. Ein Neustart ist nicht mehr nötig    Für die Netzwerkunterstützung: VMQ, TOE, Jumbo Frames    Möglichkeit von einem Flash-Speicher zu booten Grüße, dn\"\n},{\n  \"title\": \"Netlogon Fehler 5719 auf Server (nicht DC)\",\n  \"url\": \"/post/netlogon-fehler-5719-auf-server-(nicht-dc)/\",\n  \"date\": \"October 21, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Wenn der Fehler NETLOGON 5719 direkt nach dem starten des Servers (nicht DC) protokolliert wird, bedeutet das folgendes: Die Netlogon-Prozess hat stattgefunden bevor das Netzwerk bereit war und somit standen beim Anmeldeprozess keine Domänencontroller für die Authentifizierung zur Verfügung.Es gibt 2 Möglichkeiten das Problem zu beheben:1) Update des NetzwerkkartentreibersAls allererstes sollte der Netzwerkkartentreiber geupdated werden. In den meisten Fällen erledigt sich das Problem damit. Ich empfehle den Treiber immer von der Support-Webseite des Servers herunterzuladen, nicht vom NIC-Hersteller direkt (Bsp: Server von HP und Netzwerkkarte von Intel). Diese Treiber auf der Support-Webseite des Servers sind getestet und für das System freigegeben.2) Den Netlogon Service zwingen auf das Netzwerk zu wartenWenn der aktuelle Netzwerkkartentreiber nichts bringt, kann man den Netlogon-Prozess so zum warten zwingen:In der Registry muss der Eintrag “TermService” dem Schlüssel “DependOnService” hinzugefügt werden.    HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\NetlogonNachdem der Server neu gestartet wurde, sollte das Problem behoben sein.Grüße, dn\"\n},{\n  \"title\": \"Windows 7 – Update von RC (7100) auf RTM (7600)\",\n  \"url\": \"/post/windows-7-e28093-update-von-rc-auf-rtm/\",\n  \"date\": \"October 13, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Es ist zwar nicht wirklich empfohlen, gewünscht oder supported aber es geht. Windows 7 RTM Installationsdateien auf einen (vorbereiteten) USB Stick kopieren. In der Datei \\\\Sources\\\\cversion.ini muss der Wert MinClient auf 7100.0 (die entsprechende Build Nr. von der man updaten will) gesetzt werden. Man sollte für so ein Update einige Zeit einplanen, bei mir dauerte es ca. zwei Stunden. Das gilt übrigens auch für unterstützte Updates. Eine normale Windows 7 Installation ist bekanntlich in 20 Minuten abgeschlossen.Ein Update von x86 auf x64 oder umgekehrt lässt sich so natürlich auch nicht machen, dafür ist immer eine neuinstallation nötig. In diesem Post erklärt Daniel nochmal genau welche Updates unterstützt werden.Nochmal: ich empfehle dieses Workaround nicht für produktive Systeme, ich habe mein Notebook so aktualisiert und alles läuft wunderbar, aber es ist wie gesagt kein produktiv genutzter PC.Gruß    tt\"\n},{\n  \"title\": \"Windows 7 Bootloader, OS hinzufügen\",\n  \"url\": \"/post/windows-7-bootloader-os-hinzufugen/\",\n  \"date\": \"October 8, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Der Windows Vista / 7 Bootloader hat sich ja im vergleich zu Windows XP geändert. In den früheren Windows Version konnte man die Datei Boot.ini bearbeiten um den Bootloader zu sagen was er tun soll. Ab der Version Vista nutzt man das Commandline-Tool bcdedit.exe.     Auf meinen Computer habe ich 2 Windows 7 Installationen. Auf C:\\\\befindet sich die erste, die zweite auf der Partition D:\\\\     Da ich das zweite Windows 7 durch den Restore eines Images aufgespielt habe, erscheint dies natürlich nicht automatisch in der Betriebssystemauswahl. Um das zweite Betriebssystem dem Bootloader hinzuzufügen, müssen folgende Schritte durchgeführt werden:1) Commandline mit Administratorrechte öffnen2) Einen neuen Eintrag dem Bootloader hinzufügenbcdedit /create /d “Windows 7 zweite Installation” /application osloader            Nachdem dieser Befehl ausgeführt wurde, bekommen wir eine ID       Bsp: {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395}3) Nun müssen wir den Bootloader noch sagen wo sich das zweite Betriebssystem befindet (D:)bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} device partition=C:      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} osdevice partition=D:4) Nun fügen wir den Pfad für den Bootloader und dem System Root Verzeichnis hinzubcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} path \\\\Windows\\\\system32\\\\winload.exe      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} systemroot \\\\Windows5) Als letztes stellen wir noch die Reihenfolge der Auflistung der Betriebssysteme festbcdedit /displayorder {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} /addlastNoch zur Info: Den Namen, der bei der Betriebssystemauswahl angezeigt wird, könnt ihr mit diesen Command ändern:bcdedit /set {current} description &quot;Windows 7 erste Installation&quot;Grüße, dn\"\n},{\n  \"title\": \"Servergespeicherte TS-Profile, Fehler 1543\",\n  \"url\": \"/post/servergespeicherte-ts-profile-fehler-1543/\",\n  \"date\": \"September 29, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Client\",\"Server-2008\",\"Server-2003\"],\n  \"author\": \"dni\",\n  \"content\": \"Auf meinem Terminalserver-Cluster 2008 habe ich mehrere EventLog Warnungen mit der ID 1543 (User Profile Service) bemerkt. Die Einträge deuten darauf hin, dass das UserProfil nicht synchronisiert werden konnte. Die Einträge konnte man auf allen Servern im TS Cluster finden. Etwas zur Struktur: Als Server setze ich Windows Server 2008 ein, die Server sind auf Hyper-V Servern virtualisiert. Als Speicherort für die Profile benutze ich das DSF Feature von Server 2003 R2.Zuerst dache ich mir, dass es da Probleme mit dem Netzwerk gibt. Eines wollte ich aber noch versuchen bevor ich mit der Analyse des Netzwerkes starte: Windows-Defender.Nachdem ich den Windows-Defender auf allen Terminalservern deaktiviert hatte, konnte das Problem nicht mehr reproduziert werden. Anscheinend blockiert der Windows-Defender bei der Anmeldungen bestimmte Vorgänge, die der Server braucht um das User-Profil herunterzuladen. Grüße, dn\"\n},{\n  \"title\": \"Netzwerkprobleme lassen Dynamics abstürzen\",\n  \"url\": \"/post/netzwerkprobleme-lassen-dynamics-absturzen/\",\n  \"date\": \"September 29, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Wie ich in einem meiner letzten Posts versprochen hatte, hier der Post über die Dynamics Netzwerkprobleme.Mein Microsoft Dynamics Server arbeitete immer sehr zuverlässig, das EventLog war frei von den unbeliebten “roten Kreuzen”. Bis an den Tag x, an dem der Dynamics Service seinen Dienst verweigerte und im laufenden Betrieb stoppte. Im EventLog wurden folgende Fehlermeldungen protokolliert: Der Fehler “Error 1450 in module 1..\\\\server.cpp(498) weißt auf zu wenig Server-Ressourcen hin. Dieser Fehler konnte durch die Korrektur nicht optimaler Einstellungen an der Auslagerungsdatei behoben werden.Der Fehler “Error 3 in module 244..\\\\server.cpp(351) weißt auf einen TCP-Fehler hin. Durch die Installation der neuesten Soft- und Firmware der Netzwerkkarte konnte ich das Problem beheben.Nun ist das EventLog wieder sauber und der Server hat bisher seinen Betrieb nicht wieder unterbrochen.Grüße, dn\"\n},{\n  \"title\": \"Upgrade auf Windows 7\",\n  \"url\": \"/post/upgrade-auf-windows-7/\",\n  \"date\": \"September 28, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Die beiden Betriebssysteme Windows XP und Vista können durch eine Upgrade-Lizenz auf Windows 7 geupdated werden. Für alle anderen Betriebssysteme braucht es eine Vollversion.Beim Upgrade unterscheiden wir 2 Szenarien:    Custom Install: Das Betriebssystem muss komplett neu installiert werden.    In-Place Upgrade: Das bestehende Betriebssystem kann auf Windows 7 geupdatet werden und übernimmt somit alle vorhandenden Einstellungen bzw. Programme.Anhand dieser Matrix kann man feststellen in welchen Fällen ein In-Place Upgrade möglich ist.&#160; Quelle der Grafik: http://blogs.technet.com/dmelanchthon/Grüße, dn\"\n},{\n  \"title\": \"Sharepoint LogFiles verkleinern\",\n  \"url\": \"/post/sharepoint-logfiles-verkleinern/\",\n  \"date\": \"September 25, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Sharepoint\"],\n  \"author\": \"dni\",\n  \"content\": \"In letzter Zeit ist mir aufgefallen, dass der freie Speicherplatz auf meinem Sharepoint-Server immer kleiner wird. Nachdem ich mich ein bisschen auf der Partition umgesehen hatte fielen mir die großen LOG Files der Sharepoint Datenbank auf.    Wenn ihr wie ich Sharepoint in den Standardeinstellungen inkl. der Windows Internal Database installiert habt, so legt Sharepoint die Files unter C:\\\\WINDOWS\\\\SYSMSI\\\\SSEE\\\\MSSQL.2005\\\\MSSQL\\\\Data ab.         In meinem Fall hat das Content-Log 8 GB und das Config-Log 5 GB verbraten.         Um die LogFiles nun zu verkleinern muss zunächst SQL Server Management Express installiert werden.Danach muss die Datenbank mit den folgenden Parameter geöffnet werden: \\\\\\\\.\\\\pipe\\\\MSSQL$MICROSOFT##SSEE\\\\sql\\\\query Nachdem die Datenbank geöffnet wurde wählt man die Datenbank aus, deren LogFiles verkleinert werden sollen. Nach einem Rechtsklick auf die Datenbank wählt man Tasks / Verkleinern / DateienNun erscheint das Optionsfenster. Hier muss als Dateityp Protokoll ausgewählt werden. Als Information erhält man hier wie groß das aktuelle LogFile und zu wie viel es belegt ist. Im unteren Bereich kann der Speicherplatz neu organisiert werden. (In meinem Fall 2 GB) Nachdem die Eingaben bestätigt werden, schrumpft das LogFile auf die angegebene Größe zusammen.    Dieser Schritt kann für alle Datenbanken vorgenommen werden, dessen LogFile zu groß ist.Grüße, dn\"\n},{\n  \"title\": \"Exchange 2010 – Dynamic Signature\",\n  \"url\": \"/post/exchange-2010-e28093-dynamic-signature/\",\n  \"date\": \"September 22, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"tto\",\n  \"content\": \"Ein leidiges Thema mit den bisherigen Exchange und Outlook Versionen war die zentrale Verwaltung von Signaturen. Die meisten Administratoren verwendeten Skripts oder dritthersteller Tools um das Problem einigerma&szlig;en in den Griff zu bekommen.Mit Exchange 2010 stellt Microsoft (endlich) eine M&ouml;glichkeit vor um die Signaturen zentral zu verwalten und dynamisch zu erstellen. Verwendet wird dazu der seit Exchange 2007 bekannte Disclaimer, dieser wurde erweitert und kennt jetzt HTML Tags und Attribute aus dem Active Directory.Konfiguriert wird der Disclaimer in der Hub Transport Rolle auf Organisationsebene. Man erstellt eine neue Transport Rule indem man einfach mit rechts auf den Knoten Hub Transport klickt und &ldquo;New Transport Rule&rdquo; ausw&auml;hlt.Nachdem man Namen und Beschreibung vergeben hat, kann per Filter festgelegt werden f&uuml;r welche Mails diese Regel gelten soll. Mehr Details zu den Filterm&ouml;glichkeiten: Exchange 2010 Transport Rule Predicates.&nbsp;Als Action w&auml;hlt man &ldquo;Append disclaimer text and fallback to action if unable to apply&rdquo;. Dort kann ein beliebiger Text eingegeben werden den man mit HTML Tags formatieren und mit Platzhaltern wie %%DisplayName%% personalisieren kann. Neben dem Text kann man auch die Fallback Action festlegen, d.h. was Exchange mit der Nachricht machen soll wenn der Disclaimer nicht angewendet werden kann. Es gibt drei M&ouml;glichkeiten:wrap: die originale Nachricht wird in einen Anhang gepackt, und der Disclaimer wird in die neue Nachricht eingef&uuml;gt.reject: die Nachricht wird nicht &uuml;bermittelt, der Sender erh&auml;lt ein NDR in dem steht warum die Nachricht nicht &uuml;bermittelt werden konnte.ignore: die Nachricht wird unver&auml;ndert &uuml;bermittelt, es wird kein Disclaimer angeh&auml;ngt.Einige Details noch im Technet: Understanding DisclaimersZum Schluss kann man noch Au&szlig;nahmen definieren, f&uuml;r welche die Regel nicht zutreffen soll:Jetzt fehlt noch der klick auf New und die Regel wird erstellt. Es wird ab jetzt also jedem Mail das den Konditionen entspricht der Disclaimer Text angef&uuml;gt, egal ob es von OWA oder Outlook kommt.Eine endg&uuml;ltige L&ouml;sung stellt diese Funktion nicht dar, denn ein Nachteil des Disclaimers ist dass er am Ende der Nachricht eingef&uuml;gt wird. Antwortet man also auf ein Email so steht die Signatur (Disclaimer) ganz unten, unter dem zitiertem Mail. Alles in allem ist das meiner Meinung nach ein Schritt in die richtige Richtung, allerdings fehlt noch einiges bis zum Ziel.\"\n},{\n  \"title\": \"Fehler bei HP Netzwerkkarten Update\",\n  \"url\": \"/post/fehler-bei-hp-netzwerkkarten-update/\",\n  \"date\": \"September 21, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Zu Abwechslung mal ein Problem aus der HP Welt:Für heute habe ich das Firmware / Treiber Update meiner HP ML 350 G5 Server geplant. Zuerst habe ich mir die neueste Firmware-CD von HP gezogen und diese dann installieren lassen. Alles verlief ohne Probleme.    Danach wollte ich die Treiber updaten und habe bemerkt, dass jede Komponente geupdated wurde, nur der Treiber der Netzwerkkarte (v. 5.0.16.0) nicht.     Das war sehr ärgerlich, denn dieser Treiber war der Wichtigste, denn es gab Netzwerkprobleme mit Microsoft Dynamics. Folgender Fehler wurde ausgegeben: “HP Virtual Bus Device installation requires a newer version. Version 4.6.16.0 is required.”Um den Treiber dennoch installieren zu können, muss zuerst auf die Version 4.6.16.0 geupdated werden, dann kann man erst die neueste Version installieren: Link zum Treiber v4.6.16.0 Grüße, dnPS: Wenn die Netzwerkprobleme mit Dynamics behoben sind, werde ich dazu noch einen Post veröffentlichen. (kleiner Ausflug in die ERP-Software :) )\"\n},{\n  \"title\": \"“DATA ENCRYPTION” Fehler bei RDP Verbindung\",\n  \"url\": \"/post/e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung/\",\n  \"date\": \"September 8, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2003\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Kürzlich hatte ich ein seltsames Problem mit der RDP Verbindung auf einem meiner Server die im Ausland stehen und nur über RDP erreichbar sind.   Jedes Mal wenn ich eine RDP Verbindung starten wollte, erschien die Fehlermeldung, dass ein Netzwerkfehler vorliegt.Im Eventlog wurde ein Fehler protokolliert, dass die RDP-Protokollkomponente “DATA ENCRYPTION” ein Problem verursachte. Glücklicherweise funktionierte der Zugriff durch AdminMagic noch, sodass ich mit der Fehlerbehebung beginnen konnte.Um die RDP Verbindung wieder flott zu bekommen muss folgender Registry-Eintrag gelöscht werden:HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Services\\\\TermService\\\\     Parameters\\\\ CertificateNach einem Neustart des Servers konnte ich mich wieder via RDP auf dem Server verbinden.Grüße, dn\"\n},{\n  \"title\": \"Windows Server / Hyper-V Server 2008; storflt kann nicht geladen werden\",\n  \"url\": \"/post/windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden/\",\n  \"date\": \"September 7, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Nachdem ich alle meine Hyper-V Server 2008&#160; auf SP2 aktualisiert habe, erhalte ich beim Start der Maschinen einen Fehler im Ereignisprotokoll, dass storflt nicht geladen werden konnte. Dieser Fehler ergibt sich aus upgedateten Treibern für den Hypervisor durch SP2 und wird nur auf physischen Maschinen protokolliert. Der Eventlog-Eintrag kann einfach ignoriert werden.Mit dem Befehl sc delete storflt wird der Dienst storflt gelöscht und der Fehler nicht mehr protokolliert. Dies darf jedoch nur für den Windows Server 2008 gemacht werden, nicht für den Hyper-V Server, da dieser den Service für die virtuellen Maschinen braucht.Sollte der Service auf einem Hyper-V Server gelöscht werden, bleibt dieser beim Starten mit einem Bluescreen stehen. Durch die “Letzte bekannte Konfiguration” kann der Server aber wieder gestartet werden.Grüße, dn\"\n},{\n  \"title\": \"Active-Directory-Verwaltungscenter\",\n  \"url\": \"/post/active-directory-verwaltungscenter/\",\n  \"date\": \"September 2, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Mit dem Windows Server 2008 R2 ist ein neues Verwaltungs-Feature hinzugekommen: “Active-Directory-Verwaltungscenter”. Das neue Verwaltungscenter basiert auf der PowerShell v2 was bedeutet, dass jede Aktion im Hintergrund einen PowerShell Befehl startet.     Durch dieses neue Feature soll dem Administrator die tägliche AD-Objektverwaltung vereinfacht werden. Für folgende Aufgaben kann die neue Konsole verwendet werden (Auszug aus technet.microsoft.com)   Erstellen neuer Benutzerkonten oder Verwalten vorhandener Benutzerkonten     Erstellen neuer Gruppen oder Verwalten vorhandener Gruppen     Erstellen neuer Computerkonten oder Verwalten vorhandener Computerkonten     Erstellen neuer Organisationseinheiten und Container oder Verwalten vorhandener Organisationseinheiten     Herstellen von Verbindungen mit einer oder mit mehreren Domänen bzw. Domänencontrollern in derselben Active Directory-Verwaltungscenterinstanz und Anzeigen oder Verwalten der Verzeichnisinformationen für diese Domänen oder Domänencontroller     Filtern von Active Directory-Daten mithilfe der abfragegenerierenden Suche  Die Oberfläche Die Oberfläche wirkt strukturiert und Übersichtlich. Die Suche Häufig verwendete Kriterien lassen sich schnell der Suche hinzufügen. Neuen Benutzer anlegen Einfache Navigation durch die Container&#160;Auf mich wirkt die Oberfläche sehr übersichtlich und durchdacht. Alle Aufgaben lassen sich jedoch nicht abbilden, sodass man auf die Konsole “Active-Directory-Benutzer und Computer” nicht völlig verzichten kann.    Im täglichen AD-gebrauch spricht einer Verwendung der neuen Konsole jedoch nichts dagegen.Grüße, dn\"\n},{\n  \"title\": \"Language Pack für Windows 7\",\n  \"url\": \"/post/language-pack-fur-windows-7/\",\n  \"date\": \"August 30, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Für Windows 7 in der Enterprise und Ultimate Edition sind die Language Packs nun verfügbar.Im Windows Update Fenster lassen sich die Pakete herunterladen und installieren. Nachdem das Paket heruntergeladen und installiert wurde, kann es in der Systemsteuerung unter “Region und Sprache” bei “Anzeigesprache” aktiviert werden.Grüße, dn\"\n},{\n  \"title\": \"Hyper-V Server 2008 R2 Cluster\",\n  \"url\": \"/post/hyper-v-server-2008-r2-cluster/\",\n  \"date\": \"August 26, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Hyper-V\",\"Server\",\"Server-2008-R2\"],\n  \"author\": \"dni\",\n  \"content\": \"Da der Hyper-V Server 2008 R2 und der Windows Server 2008 R2 nun RTM sind, habe ich mir den Hyper-V Cluster näher angeschaut.        Für die Simulation habe ich 3 physische Computer verwendet:2 Hyper-V Server 2008 R2   1 Windows Server 2008 R2 (inkl. iSCSI Target)Das zentrale Storage wird über iSCSI angebunden. Dafür verwenden wir den Windows Server 2008 R2.Topologie&#160; Um den Cluster zu erstellen müssen 8 Schritte durchgeführt werden:Schritt 1 Hyper-V Server und Server 2008 R2 auf den 3 Computern installierenDie beiden Hyper-V Server werden mit der Standard-Installation installiert. Der Windows Server 2008 R2 wird zusätzlich zum DC heraufgestuft um die Domäne hyper.local bereit zu stellen.Schritt 2 Firewall deaktivierenFür den Test habe ich auf den 3 Servern die Firewall deaktiviert, um nicht die entsprechenden Ports öffnen zu müssen.Schritt 3 Hyper-V Server in Domäne aufnehmenAls nächstes werden die Hyper-V Server in die Domäne aufgenommen.Schritt 4 Verwaltungstools auf dem Windows Server installierenUm den Cluster später steuern zu können müssen wir 2 Konsolen installieren: Clusterverwaltung und die Hyper-V Tools. Die Konsolen können unter den Features aktiviert werden. Schritt 5 iSCSI Target installieren und konfigurierenAls iSCSI Target Software habe ich das Tool von StarWind verwendet. Nachdem das Programm installiert wurde, kann man sich unter den Benutzernamen “test”, Password “test” anmelden und das Target entsprechen konfigurieren.Am iSCSI Target erstellen wir zunächst 2 virtuelle Volumes. 1 Volume wird als Quorumdatenträger für den Cluster verwendet, das andere als Storage für die VHD’s. Wichtig ist dabei, dass die Option “Allow multiple concurrent iSCSI connections (clustering)” verwendet wird, somit können beide Hyper-V Knoten gleichzeitig auf die Volumes zugreifen.Schritt 6 Hyper-V Server mit den iSCSI Volumes verbindenJetzt muss noch die Verbindung zwischen den Hyper-V Server und dem iSCSI Target hergestellt werden. In der Version R2 des Hyper-V Servers wurde eine grafische Oberfläche für den iSCSI-Initiator hinzugefügt. Der Initiator wird mit den Command iscsicpl gestartet. Nachdem wir zugestimmt haben den iSCSI Dienst zu starten, erhalten wir die Oberfläche wo wir die IP Adresse des iSCSI Targets eintragen und uns zunächst nur mit dem Quorum Volume verbinden.Jetzt muss das Volume noch entsprechend Formatiert werden.Schritt 7 Cluster einrichtenNun können wir den Cluster erstellen. Wir verbinden uns auf die Hyper-V Server und aktivieren mit Option 11 die Failoverclusterfeatures.Nachdem die Features auf beiden Servern aktiviert sind, öffnen wir den Failovercluster-Manager auf dem Windows Server und starten die Clusterkonfiguration.Nachdem wir beide Hyper-V Server für den Cluster angegeben haben, startet die Konfigurationsüberprüfung. Sofern bis hierhin alle richtig Konfiguriert wurde, sollte der Check keine Fehler aufzeigen.&#160; Nachdem der Cluster vollständig erstellt wurde, werden beide Hyper-V Server im Manager angezeigt.Da wir den Quorumdatenträger bereits mit beiden Cluster-Knoten verbunden haben, wurde dieser erkannt und schon als Quorumdatenträger konfiguriert.Jetzt verbinden wir das Storage-Volume mit den beiden Cluster Knoten um auf die VHD’s zuzugreifen. Bevor das Volume benutzt werden kann, muss es noch formatiert werden.    Jetzt aktivieren wir im Failovercluster-Manager die “Cluster Shared Volumes” und erlauben somit gleichzeitigen Zugriff auf die VHD’s. Um nun das Storage-Volume einzubinden, müssen wir es zunächst dem “Speicher” und dann den “Freigegeben Clustervolumes” (Cluster Shared&#160; Volumes) hinzufügen.Sobald Cluster Shared Volumes verwendet werden, kann man auf diese unter C:\\\\ClusterStorage\\\\ zugreifen. Für jedes Volume wird ein eigener “Ordner” erstellt.Schritt 7 Virtuelle Maschine erstellenAls nächstes erstellen wir eine virtuelle Maschine (z.B. Windows XP) und ein virtuelles Netzwerk über die zuvor installierte Hyper-V Konsole auf einem der Hyper-V Server. Die VHD und entsprechende Konfigurationsdatei wird dabei auf dem Storage-Volume erstellt. Wichtig: Die virtuelle Maschine muss mit dem Netzwerkadapter verbunden werden bevor sie hochverfügbar gemacht wird, sonst kann die Maschine nicht auf den anderen Knoten verschoben werden.Schritt 8 Virtuelle Maschine hochverfügbar machenUm die virtuelle Maschine hochverfügbar zu machen, fügen wir einen neuen Dienst hinzu. Dabei muss geachtet werden, dass sich die Maschine im Status beendet oder gespeichert befindet. Ich empfehle die Maschine komplett herunterzufahren um Probleme zu vermeiden. Wir erhalten danach eine Liste mit den virtuellen Maschinen. Nachdem wir die Testmaschine ausgewählt haben, startet die Konfiguration um den Host hochverfügbar zu machen.Die Konfiguration ist soweit abgeschlossen.Test 1 Quick- und Live-MigrationQuick- und Live-Migration sind beides Verfahren um virtuelle Maschine auf einen anderen Knoten zu verschieben.&#160; Mehr Infos (Whitepapers) zu Live- und Quick-MigrationLive Migration    In meinen Test habe ich für die Live-Migration lediglich 1 Ping verloren.&#160;Quick-Migration     Für den Umzug auf den 2. Knoten durch Quick-Migration gingen 9 Pings an die virtuelle Maschine verloren.&#160; Test 2 Ausfall von einem Hyper-V Server simulierenAls 2. Test habe ich den Stromstecker des Hyper-V Servers gezogen, der aktuell die virtuelle Maschine hostet. Der Failovercluster hat nach wenigen Sekunden die virtuelle Maschine auf dem 2. Konten neu gestartet.   Grüße,dn\"\n},{\n  \"title\": \"AppLocker\",\n  \"url\": \"/post/applocker/\",\n  \"date\": \"August 17, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"In einem meiner letzten Beiträge habe ich kurz über ein paar Neuerungen von Windows 7 berichtet. Mittlerweile habe ich mir das Feature “AppLocker” näher angeschaut:Mit AppLocker kann man den Clientcomputer noch besser schützen, indem man nun sehr viel genauer vorgeben kann welche Anwendungen ein Benutzer ausführen bzw. installieren darf. AppLocker kann über ein Domänen- oder über die lokale-GPO konfiguriert werden.Wie man AppLocker verwendet zeige ich Anhand von folgendem Beispiel: Benutzern ist es nur erlaubt Applikationen auszuführen, die sich unter %Programfiles% und %Windir% befinden. Benutzer die der Gruppe “Not Restr Access” angehören ist es außerdem erlaubt das Testprogramm “Excel Viewer 2003” aus dem Verzeichnis “C:\\\\Program Files 2” zu starten. Als erstes öffnet man das GPO und wechselt zur Option “AppLocker”&#160;Für die Option Executable Rules lassen wir die Standardregeln generieren (“Create default Rules”). Nachdem diese konfiguriert sind, findet man 3 Regeln vor:        1. Admins dürfen alle Programme aufrufen    2. User dürfen Programme aus %Windir% starten    3. User dürfen Programme aus “%Programfiles% starten Jetzt müssen wir eine neue Regel erstellen, die der Benutzergruppe “Not Restr Access” erlaubt unsere Testapplikation zu starten. Über “Create New Rule” wird der entsprechende Wizard gestartet. Wir wählen die Option “Allow” und beziehen die Regel auf die Gruppe “Not Restr Access”. Jetzt haben wir 3 Möglichkeiten. Über die Option Publisher kann ein einzelnes signiertes Programm freigegeben oder gesperrt werden, über die Option Path ein ganzer Pfad und über die Option File Hash eine nicht-signierte Applikation. Im unseren Beispiel wählen wir die Option Publisher, da der Excel Viewer von Microsoft zertifiziert ist. Nachdem die Applikation ausgewählt wurde, kann über einen Schieberegler die Genauigkeit der Prüfung von AppLocker eingestellt werden. (Bsp. AppLocker soll nur den Dateinamen, nicht die Dateiversion prüfen) Wenn nötig können im nächsten Schritt noch Ausnahmen definiert werden. Somit haben wir unsere Regel definiert.Wichtig: AppLocker ist auf einen Dienst angewiesen der aus Sicherheitsgründen nicht automatisch startet. Damit die Einstellungen greifen, muss der Dienst “Application Identity” gestartet werden. Ich empfehle den Dienst solange im Startmodus “Manuell” zu belassen, bis alle Einstellungen passen. Wenn wir jetzt den Test machen, können Benutzer aus der Gruppe “Not Restr Access” problemlos den Excel Viewer starten. Benutzer, die nicht dieser Gruppe angehören, erhalten eine Fehlermeldung. Grüße, dn\"\n},{\n  \"title\": \"Windows 7, Server 2008 R2 und Hyper-V Server 2008 R2 in Deutsch auf TechNet/MSDN\",\n  \"url\": \"/post/windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn/\",\n  \"date\": \"August 16, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\",\"Server-2008-R2\",\"Hyper-V\"],\n  \"author\": \"dni\",\n  \"content\": \"Für TechNet bzw. MSDN Abonnenten stehen nun auch die deutschen ISO’s zu Windows 7 bereit. Zeitgleich wurde der Server 2008 R2 und der Hyper-V Server 2008 R2 zum downloaden bereit gestellt.TechNet    MSDNGrüße, dn\"\n},{\n  \"title\": \"Windows Virtual PC – UnDo und Differencing Disks\",\n  \"url\": \"/post/windows-virtual-pc-e28093-undo-und-differencing-disks/\",\n  \"date\": \"August 13, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"In meinem letzen Beitrag über den Windows Virtual PC habe ich die Undo und differenzierenden Festplatten erwähnt, hier die versprochenen Details.UnDo Disks – Snapshots für Virtual PC!?Bei den UnDo Disks handelt es sich um ein Feature das ich in bisherigen Virtual PC Versionen immer vermisste: Man kann den Status einer VM vor einer Änderung sichern und kann auf den Punkt der Sicherung zurückspringen wenn die Änderung nicht so funktioniert wie man sich das vorgestellt hat.UnDo Disks werden in den Einstellungen der VM aktiviert. Die Virtuelle Maschine muss ausgeschaltet (heruntergefahren) sein damit die Option zur Verfügung steht. Beim nächsten Start der VM wird eine .vud Datei erstellt, in dieser werden (wie bei einem Snapshot in der Enterprise Umgebung) ab jetzt&#160; alle Änderungen gespeichert. Die VHD bleibt unverändert. In der Zwischenzeit habe ich um eine Änderung zu simulieren einfach mal ein Programm installiert. Man sieht auch gleich dass die .vud Datei größer wird. Um die Änderungen in die VHD zu übernehmen bzw. diese zu verwerfen muss man die VM wieder schließen (herunterfahren/Ruhezustand) und in den Einstellungen den entsprechenden Punkt auswählen. Ich habe mich entschieden die Änderungen zu verwerfen also wird meine .vud Datei gelöscht. Nach dieser Aktion wird wieder von der VHD gestartet und alles ist so wie es vorher war.     Wenn man Änderungen übernimmt werden diese in die VHD geschrieben.Lässt man die Undo Disk aktiv und startet die Virtuelle Maschine wieder, wird erneut eine .vud Datei erstellt in der alle Änderungen bis zum Übernehmen oder Verwerfen separat gespeichert werden. Um die Undo Disk zu deaktivieren muss die virtuelle Maschine heruntergefahren werden, im Ruhezustand geht das nicht.Insgesamt also ein super Feature, spart einem sicher ‘ne Menge Arbeit.Differencing DisksIm zweiten Beispiel installiere ich mehrere neue VMs in differenzierenden Disks auf Basis einer bereits bestehenden Maschine.Wichtig: Differenzierende Virtuelle Maschinen basieren auf einer bereits installierten VM, wenn ich also für eine Testumgebung mehrere VMs brauche kann ich eine bestehende beliebig oft duplizieren und so Zeit sparen. Ich habe die Quell-VM mit sysprep vorbereitet um Probleme mit gleichen SID und Computernamen zu verhindern. Wichtig ist außerdem dass man die Quell-VHD herunterfährt und auf Schreibgeschützt setzt, denn wenn diese geändert wird sind alle erstellten Differenzierenden Disks ungültig.Update: Wenn man die VMs so dupliziert erhalten alle “Child” VMs die gleiche MAC Adresse. Die einzige Lösung die ich im Moment gefunden habe ist in der .vmc Datei die MAC Adresse zu löschen, dann wird einen neue generiert. Also kann man sagen um die Quell VM richtig vorzubereiten muss man 3 Punkte beachten:   Betriebssystem vorbereiten (sysprep)     Quell VM herunterfahren und VHD als Read-Only markieren     MAC Adresse aus der Konfigurationsdatei der Quell VM löschen     Man erstellt also eine neue VM über den Button “Create virtual machine” und gibt ihr einen Namen. Bei Add Disk wählt man “Create a Virtual Hard Disk using advanced options” und dann “Differencing Hard Disk”. Der neuen HD kann man einen Namen geben und dann muss man die Quell-VHD (parent) angeben. Wenige Sekunden später hat man eine neue VM bei der man nur noch die Windows Einstellungen anpassen muss. Der Vorteil ist dass nicht die ganze Quell-VM kopiert wird, sondern nur der Teil ab dem man die Differenzierende HD erstellt. So spart man neben viel Zeit auch noch einiges an Speicherplatz.viele Grüße!    tt\"\n},{\n  \"title\": \"Windows Virtual PC\",\n  \"url\": \"/post/windows-virtual-pc/\",\n  \"date\": \"August 13, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit Windows 7 wurde auch der Windows XP Mode vorgestellt. Dieser basiert auf der neuen Virtualisierungstechnologie Windows Virtual PC.Voraussetzung für die Verwendung des Windows VPC ist dass die CPU Virtualisierungstechnologien unterstützt. Mit diesen Tools kann man überprüfen ob Virtualisierung unterstützt wird: Intel, AMDDie Virtualisierungstechnologien müssen im BIOS noch aktiviert werden, also am besten im Handbuch des Mainboard Herstellers nachschlagen.    Tipp: Bei HP Computern ist die Einstellung unter “Sicherheit” versteckt, nicht unbedingt logisch aber bitte.Auf die Installation des XP-Mode möchte ich nicht weiter eingehen, den kann man sich selbst herunterladen und mit wenigen Klicks installieren.Ich habe die Virtuellen Maschinen selbst installiert und die Integration Features und Auto Publish aktiviert, so kann ich in Windows 7 Programme aus meinen virtuellen Vista und XP Maschinen verwenden. So präsentiert sich der neue Virtual PC, integriert in ein normales Explorer Fenster hat man die Möglichkeit Virtuelle Maschinen und Festplatten zu erstellen, zu bearbeiten oder zu löschen. Durch einen rechtsklick auf die VM kommt man zu den bekannten Einstellungen. Eine neue virtuelle Maschine wird einfach durch klicken auf “Create virtual machine” erstellt, in den folgenden Dialogen wird der Speicherort für VHD und Konfigurationsdateien festgelegt. Im nächsten Dialog kann der Arbeitsspeicher festgelegt werden und Networking für die VM aktiviert oder deaktiviert werden. Abschließend entscheidet man sich für einen VHD Typ (Fix, Dynamisch, Differenzierend) seiner Wahl und klickt auf Create. Ein genauerer Blick lohnt sich auf die Undo Disk Option, bei dieser werden die Änderungen die man in der VM macht in einem separatem File gespeichert. So kann man fehlgeschlagenen Änderungen immer wieder verwerfen. Dazu (und zum Thema Differenzierende Festplatte) gibts einen eigenen Artikel.&#160;Und schon haben wir eine VM erstellt. In den Einstellungen (rechtsklick auf die VM) kann man noch genauere Einstellungen definieren, für mich reicht es aber vorerst das CD Image für die Installation auszuwählen. Wenn man die VM startet wird von “CD” gestartet und die Windowsinstallation beginnt. Hat man das Betriebssystem installiert, sollte man die Integration Features aktivieren (Klick auf Tools, Enable Integration Features). Mit diesen Features kann man Sound, Zwischenablage, Drucker, Smart Cards und die Laufwerke des Lokalen Computers in der VM verwenden.Möchte man außerdem die Programme der VM auf dem physikalischen Computer verwenden muss man noch ein Update Installieren und “Auto publish” in den Einstellungen der VM aktivieren.Update for Windows XP SP3 to enable RemoteApp     Update for Windows Vista SP1 or above to enable RemoteApp Im Startmenü von Windows 7 werden nun die Programme angezeigt die in den Virtuellen Maschinen installiert sind.&#160; Wichtig: Es muss eine Verknüpfung mit dem Programm und All Users/Startmenü erstellt werden, nur dann werden die Programme korrekt angezeigt. Um ein Virtuelles Programm zu starten muss die Virtuelle Maschine geschlossen sein. Wenn sie sich im Ruhezustand befinden wird sie im Hintergrund automatisch gestartet.viele Grüße!   tt\"\n},{\n  \"title\": \"BitLocker To Go\",\n  \"url\": \"/post/bitlocker-to-go/\",\n  \"date\": \"August 12, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Mit BitLocker To Go lassen sich lokale / externe Datenträge sowie USB Sticks einfach verschlüsseln. Eine neue Funktion ist zudem, dass die Partition bzw. das Laufwerk nicht nur verschlüsselt, sondern auch mit Passwort geschützt wird. Die Verschlüsselungsstärke kann über eine GPO von 128 auf 256 Bit erhöht werden.Um den mit BitLocker verschlüsselten Datenträger auf Windows Vista bzw. XP verwenden zu können muss der Datenträger zwingend mit FAT formatiert sein. In diesem Legacy-Modus kann mit Vista und XP auf dem Datenträger nur gelesen, nicht geschrieben werden.Anleitung um BitLocker To Go zu aktivieren1) Datenträger mit FAT formatieren   2) BitLocker für den Datenträger aktivieren 3) Art des Schutzes wählen (Passwort oder Smart Card) 4) Nun muss gewählt werden, in welcher Form der Wiederherstellungsschlüssel&#160; gespeichert wird. Der Wiederherstellungsschlüssel dient dazu den Datenträger zu entschlüsseln, sollte man das Passwort vergessen haben. Man hat hier 2 Möglichkeiten: Den Key speichern oder drucken.5) Nun kann das Laufwerk verschlüsselt werden Windows 7    Steckt man den Datenträger nun in den Windows 7 Computer, so erscheint folgende Passwortabfrage bevor auf dem Datenträger lesen und schreiben werden kann. Windows Vista bzw. XP     Steckt man den Datenträger in einem Vista oder XP Rechner startet das “BitLocker To Go-LeseTool”. Nach Eingabe des Passwortes kann auf dem Datenträger gelesen werden.&#160;Grüße, dn\"\n},{\n  \"title\": \"Windows 7 - Sicherheitsproblem in UAC\",\n  \"url\": \"/post/windows-7-sicherheitsproblem-in-uac/\",\n  \"date\": \"August 10, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Auf diversen Blogs ist zu lesen dass es ein Problem mit der Benutzerkontensteuerung (UAC, User Account Control) in Windows 7 gibt. Das habe ich mir gestern kurz angesehen und hier ist das Ergebnis. (getestet mit Windows 7 RC, 7100)Es war möglich mit dem Tool von Leo Davidson ein beliebiges Programm mit administrativen Rechten zu starten ohne eine UAC abfrage hervorzurufen. Aber ich musste Mitglied einer Gruppe mit administrativen Rechten sein (z.B. Administratoren), als normaler User funktionierte es nicht. Wenn man also mit in der UAC nur noch “Ja ich will&quot; klicken müsste, dann kann man sie mit dem Code Injection Issue umgehen, wird ein Passwort abgefragt funktioniert das Ganze anscheinend nicht.Meiner Meinung nach handelt es sich hier also um ein Problem, jedoch ist es in meinen Augen nicht so dramatisch. Im Enterprise Umfeld sollte eh kein User Mitglied in administrativen Gruppen sein und zu Hause wird man wohl kaum (gewollt) seinen eigenen PC abschießen. Trotzdem sollte sich Microsoft das Problem zu Herzen nehmen, denn der Entwickler hat es genau Dokumentiert und laut eigenen Angaben MS schon seit längerem informiert.Links zu Artikeln Rund um dieses Thema:Long Zheng 1, 2, Video    Leo Davidsonviele Grüße   tt\"\n},{\n  \"title\": \"Windows 7 Neuerungen auf den ersten Blick\",\n  \"url\": \"/post/windows-7-neuerungen-auf-den-ersten-blick/\",\n  \"date\": \"August 8, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"dni\",\n  \"content\": \"Benutzeroberfl&auml;che Was einem sofort ins Auge sticht ist die v&ouml;llig &uuml;berarbeitete Oberfl&auml;che. Ge&ouml;ffnete Programme scheinen als Icons in der Taskleiste auf und genehmigen Einblicke auf die ge&ouml;ffneten Fenster.WLAN Auf der rechten Seite der Taskleiste findet sich eine &Uuml;bersicht der verf&uuml;gbaren Drahtlosnetzwerke. Die Verbindungen lassen sich mit einen klick auf Connect z&uuml;gig herstellen.BitLocker to Go Mit dieser Erweiterung von BitLocker lassen sich Wechseldatentr&auml;ger verschl&uuml;sseln. Somit sind auch Daten die unterwegs mitgenommen werden gesch&uuml;tzt. Einfach den USB Stick anschlie&szlig;en und im BitLocker Men&uuml; die Verschl&uuml;sselung aktivieren.&nbsp;Oberfl&auml;che Die Verwaltung zu Oberfl&auml;chenanpassung wurde sehr viel &Uuml;bersichtlicher gestaltet. Neue Styles lassen sich einfach ausw&auml;hlen und aktivieren.Media Center + Media Player 12 Das Media Center wurde &uuml;berarbeitet. Die Men&uuml;s sind klarer strukturiert und die Konfiguration l&auml;sst sich in wenigen Schritten beenden.Der Media Player hat auch ein neues Gesicht bekommen. Die Multimedia-Unterst&uuml;tzung wurde durch zus&auml;tzliche Codes f&uuml;r langsame Systeme optimiert.Die Installation vom USB Stick hat keine halbe Stunde gedauert und schon war Windows 7 betriebsbereit. Auf den ersten Blick macht Windows 7 RTM einen sehr guten Eindruck. Was das Betriebssystem in Sachen Performance und Alltagstauglichkeit leisten kann wird sich in den n&auml;chsten Wochen zeigen. Es wird sicher noch der ein oder andere Post von Thomas und mir diesbez&uuml;glich erscheinen.Gr&uuml;&szlig;e, dn\"\n},{\n  \"title\": \"RemoteApp mit Zertifikat\",\n  \"url\": \"/post/remoteapp-mit-zertifikat/\",\n  \"date\": \"August 6, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\",\"Server\",\"Server-2008\"],\n  \"author\": \"tto\",\n  \"content\": \"Die Sicherheit von RemoteApp Programmen kann erh&ouml;ht werden indem die Echtheit des Servers mit einem Zertifikat best&auml;tigt wird. Daf&uuml;r habe ich ein Computerzertifikat f&uuml;r den Terminal Server ausgestellt der die RemoteApp Programme hosted. Das ausgestellte Zertifikat muss nat&uuml;rlich g&uuml;ltig sein, d.h. Datum und Namen m&uuml;ssen stimmen und die ausstellende CA (Enterprise CA in meinem Fall) muss vertrauensw&uuml;rdig sein.&nbsp;Um RemoteApp Programme mit Zertifikaten zu signieren muss man nicht wie bei den Makros (wie Daniel schreibt) eine Richtlinie f&uuml;r Softwareeinschr&auml;nkung erstellen, sondern man erstellt ein GPO in dem man den Fingerabdruck des Zertifikates zu den Vertrauensw&uuml;rdigen RDP-Herausgebern hinzuf&uuml;gt. Die entsprechende Einstellung findet sich als Computer oder Benutzerkonfiguration unter:Administrative Vorlagen/Windows-Komponenten/Remote Desktop Services/Remotedesktopverbindungs-Client/SHA1-Fingerabdr&uuml;cke von Zertifikaten angeben, die vertrauensw&uuml;rdige RDP-Herausgeber darstellenSo wird die Identit&auml;t des Remotecomputers verifiziert und beim verbinden erh&auml;lt der Benutzer keine Abfrage ob er dem Herausgeber auch wirklich vertraut.\"\n},{\n  \"title\": \"Doch kein Windows 7 E\",\n  \"url\": \"/post/doch-kein-windows-7-e/\",\n  \"date\": \"August 3, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Nachdem man schon ein paar Tage etwas dar&uuml;ber lesen konnte scheint es nun fix zu sein: Windows 7 kommt mit Internet Explorer f&uuml;r alle, also kein \\\"E\\\" Version f&uuml;r den europ&auml;ischen Markt.Alle die&nbsp;Windows 7 E Vorbestellt haben werden eine Vollversion des jeweiligen Produktes erhalten.Als alternative wird vermutlich eine Browserauswahl beim Start von Windows 7 zur Verf&uuml;gung stehen, so kann der Benutzer sich f&uuml;r seinen bevorzugten Browser entscheiden.Der gr&ouml;&szlig;te Vorteil dieser Aktion ist wohl die Upgrade Funktion die nun auch f&uuml;r uns Europ&auml;er verf&uuml;gbar ist. So kann man von Windows Vista bequem updaten ohne seine Einstellungen zu verlieren. F&uuml;r Windows XP wird es keine Upgrade Funktion geben, man kann jedoch eine g&uuml;nstigere Upgrade Version kaufen und diese installieren.Hier&nbsp;gehts zum Artikel von Daniel Melanchthon wo man genaueres nachlesen kann.\"\n},{\n  \"title\": \"Microsoft Roadshow zu neue Produkte\",\n  \"url\": \"/post/windows-7-joint-launch-roadshow/\",\n  \"date\": \"July 31, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Events\"],\n  \"author\": \"dni\",\n  \"content\": \"Microsoft startet Roadshow zu Windows 7, Windows Server 2008 R2, Exchange Server 2010 in f&uuml;nf deutsche St&auml;dte.Steve Ballmer selbst wird in M&uuml;nchen die neuen Produkte vorstellen.Eventtermine07. Oktober 2009 ICM M&uuml;nchen 18. November 2009 Maritim Airport Hotel Hannover20. November 2009 Swiss&ocirc;tel D&uuml;sseldorf23. November 2009 Congress Center Frankfurt am Main25. November 2009 Stadthalle KarlsruheMehr zum Event Agenda Anmeldung Gr&uuml;&szlig;e, dnDanke an Daniel f&uuml;r die Info. \"\n},{\n  \"title\": \"Windows Home Server PP3 (Beta) – Windows 7\",\n  \"url\": \"/post/windows-home-server-pp3-(beta)-e28093-windows-7/\",\n  \"date\": \"July 30, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Home-Server\",\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Mit dem Power Pack 3 wird Windows 7 besser in den Home Server integriert und man hat folgende Vorteile:   Backup &amp; Restore von Clients mit Windows 7     bessere Integration in das Windows 7 Media Center     Integration in die Bibliotheken (Libraries) von Windows 7     Verbesserungen der Suche     Besserer Support von Netbooks  Um die Beta Version des neuen Power Packs herunterzuladen muss man sich auf der Microsoft Connect Seite Registrieren.Nach dem Download erhält man ein Verzeichnis dass drei Updates, die Release Dokumentation und jeweils eine Batch Datei für Installation und Deinstallation beinhaltet. Die Batch Datei macht nichts anderes als der Reihe nach folgende Updates zu installieren: (es empfiehlt sich die Verwendung der Batch Datei, so erspart man sich einige Reboots :)).   WindowsSearch-KB940157-Srv2K3-x86-enu.exe (Installiert Windows Search 4.0)     WindowsServer2003.WindowsXP-KB969949-x86-ENU.exe (Hotfix für Windows Search 4.0 und WHS)     WHS-KB968349-v1-x86-ENU.exe (WHS Power Pack 3)  Nach der Installation wird der WHS Connector auf den Clients automatisch aktualisiert. Die neuen Features sind nach dem Update verwendbar. Für die Integration in das Media Center muss man den Media Center Connector (Start Menü) ausführen. Nach einem Neustart sind die Bibliotheken des WHS im Media Center verfügbar. Wann die endgültige Version des Power Pack 3 verfügbar sein wird ist noch nicht bekannt, man spekuliert auf eine Veröffentlichung zeitgleich mit Windows 7, also vermutlich im Oktober.Viele Grüße!\"\n},{\n  \"title\": \"Server Logs in SQL Datenbank importieren\",\n  \"url\": \"/post/server-logs-in-sql-datenbank-importieren/\",\n  \"date\": \"July 29, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Security\",\"SQL\"],\n  \"author\": \"dni\",\n  \"content\": \"Als ich letztens die &Uuml;berwachungsrichtlinien der Dom&auml;ne &uuml;berarbeitet habe, sind mir mehrfach fehlgeschlagene &ldquo;Objektzugriffe&rdquo; von Clients aufgefallen, die versuchten in Bereiche einzudringen, f&uuml;r die sie keine Berechtigung haben. Da das EventLog am Server jedoch kein dauerhafter Speicher f&uuml;r Log Files und f&uuml;r Auswertungen relativ umst&auml;ndlich ist, schreibe ich die Logs in eine SQL Datenbank. Anschlie&szlig;end werden die Daten so bereinigt, dass nur noch Ereignisse des Typs &ldquo;Objektzugriff&rdquo; enthalten sind.Wie ich dabei vorgegangen bin erkl&auml;rt dieser BeitragSchritt 1 &ndash; SQL Server installieren Als erstes habe ich mir einen neuen Server auf meiner Hyper-V Umgebung bereitgestellt und auf diesen dann Microsoft SQL Server 2008 installiert.Schritt 2 &ndash; Tabellen erstellenUm meine EventLogs zu speichern habe ich 2 gleiche Tabelle erstellt. Eine f&uuml;r das tempor&auml;re Speichern der EventLogs (&ldquo;tblTMPLog&rdquo;) und eine f&uuml;r das dauerhafte Speichern (&ldquo;tblSecurityObject&rdquo;). Die tempor&auml;re Tabelle wird deshalb verwendet, da die Daten vor dem eigentlichen Speichern noch bereinigt werden.Schritt 3 &ndash; EventLogs exportierenUm die Event Logs vom Server zu exportieren hilft uns das Tool &ldquo;DUMPEVT&rdquo;. Es exportiert Logs vom Server und schreibt sie in ein File. Die Logs werden dabei vom Server nicht gel&ouml;scht. Auch merkt sich das Tool welche Logs vom Server schon exportiert wurden, sodass ein Mehrfach-Export nicht passieren kann.DUMPEVT habe ich heruntergeladen, und unter C:\\\\DUMPEVT entpackt.Nun kann man sich schon von der Befehlszeile Logs vom Server holen&ldquo;C:\\\\DUMPEVT\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\DUMPEVT\\\\evtlog.csv /computer=localhostDie Logs werden wie angegeben in die Datei evtlog.csv geschriebenEs ist auch m&ouml;glich DUMPEVT vom SQL Server aus zu steuern. Daf&uuml;r muss als erstes das Feature &ldquo;xp_cmdshell&rdquo; aktiviert werden (sofern nicht nicht geschehen).Mit den folgenden Code kann man sich dann die Logs holenmaster..xp_cmdshell 'C:\\\\DUMPEVT\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\DUMPEVT\\\\evtlog.csv /computer=localhost'Schritt 4 &ndash; Logs in die SQL Datenbank importierenUm die Logs in SQL zu importieren wird zun&auml;chst die tempor&auml;re Tabelle gel&ouml;scht und dann &uuml;ber den BULK INSERT Befehl eingelesen.DELETE FROM tblTMPLog BULK INSERT tblTMPLog FROM 'c:\\\\dumpevt\\\\evtlog.csv' WITH (FIELDTERMINATOR = ',')Schritt 5 &ndash; Tabelle bereinigenWenn ich jetzt ein SELECT * FROM tblTMPLog ausf&uuml;hre, erhalte ich folgende Ausgabe:Um die Daten zu bereinigen, entferne ich alle Ereignisse, die nicht die Kategorie &ldquo;Objektzugriff&rdquo;, ID &ldquo;560&rdquo; aufweisen. Im Field Data werden Sonderzeichen entfernt, die vom Export des Logs entstanden sind.DELETE FROM tblTMPLog WHERE NOT Category = 'Objektzugriff' DELETE FROM tblTMPLog WHERE NOT EventID = '560' Update tblTMPLog Set Data = Replace(Data, ' ', '') Update tblTMPLog Set Data = Replace(Data, '^', '') Update tblTMPLog Set Data = Replace(Data, '`', '')Schritt 6 &ndash; Tempor&auml;re Tabelle &uuml;bertragenNachdem die Daten bereinigt wurden, kann die tempor&auml;re Tabelle in die fixe Tabelle &uuml;bertragen werden. Wenn n&ouml;tig, kann man sich an dieser Stelle die Daten noch ein wenig zurechtr&uuml;cken.Bsp: Nur die Information &ldquo;Objektname&rdquo; wird f&uuml;r das Field Data &uuml;bertragen.&nbsp; &nbsp;&nbsp; UPDATE tblSecurityObject SET Data = SUBSTRING(Data,CHARINDEX('Objektname:', Data)+12,CHARINDEX('Handlekennung:', Data) - CHARINDEX('Objektname:', Data)-12) WHERE CHARINDEX('Objektname:', Data) &gt; 0Schritt 7 &ndash; AuswertungNachdem die Daten sich auf dem SQL Server befinden, kann man diese entsprechend sauber auswerten und speichern.Bsp: Programm in C# um die SQL Daten anzuzeigen&nbsp;Viel Spa&szlig; beim importieren und auswerten, dn- Vielen Dank an Robert van den Berg, der in seinem Blog das Thema bereits &auml;hnlich behandelt hat -\"\n},{\n  \"title\": \"Mehrere externe IP’s am ISA Server\",\n  \"url\": \"/post/mehrere-externe-ipe28099s-am-isa-server/\",\n  \"date\": \"July 27, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server\",\"Security\"],\n  \"author\": \"dni\",\n  \"content\": \"Stellt euch folgende Situation vor:Ihr habt einen ISA Server als Firewall und mehrere öffentliche IP Adressen zur Verfügung. Die Adressen werden dem externen Interface des ISA Servers zugewiesen.    Beispiel:200.200.200.1 –&gt; VPN   200.200.200.2 –&gt; OWA    200.200.200.3 –&gt; Veröffentlichte Webseite    200.200.200.4 –&gt; SonstigesDer MX-Reccord der Domäne leitet Mails der IP Adresse 200.200.200.2 weiter. Von der 200.200.200.2 werden die Mails dem internen Mailserver zugestellt. Der Zielverkehr für das externe Netzwerk wird über die erste IP Adresse am externen Interface geleitet. Folglich wird Internetverkehr, sowie Mails über die öffentliche IP 200.200.200.1 geleitet (nach Standardkonfiguration).Wenn eurer Mailserver selbst die DNS-Auflösung vornimmt und Mails dem Ziel zustellt, tut er das mit der 200.200.200.1Mailserver führen vermehrt ein Reverse-DNS-Lookup durch, um den Versender zu verifizieren. In dieser Konfiguration stellt das aber ein Problem dar, da die Mails über die 200.200.200.1 versendet werden, der MX aber auf die 200.200.200.2 zeigt. Folglich kann es passieren, dass Mails nicht angenommen werden oder man landet gleich direkt auf der Blacklist.Um dieses Problem zu beheben hat man 2 Möglichkeiten:   Mails über einen Smarthost senden    Die öffentliche IP Adresse des Mail Servers am externen Interface des ISA Servers als erste Adresse eintragen &#160;ISA Server unterstützt bis jetzt (aktuelle Version 2006) nicht die Anbindung mehrerer öffentlicher IP Adressen.Grüße, dn\"\n},{\n  \"title\": \"Ein paar Infos zu “DirectAccess”\",\n  \"url\": \"/post/ein-paar-infos-zu-e2809cdirectaccesse2809d/\",\n  \"date\": \"July 26, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Server-2008-R2\",\"Client\",\"Server\"],\n  \"author\": \"dni\",\n  \"content\": \"Mit Windows 7 und Windows Server 2008 R2 kommt ein neues Remote-Verbindungs-Feature: DirectAccess. DirectAccess ist der traditionellen VPN Verbindung sehr ähnlich, bietet jedoch entscheidende Vorteile: Clientcomputer initiieren automatisch eine gesicherte Verbindung zum Ziel. Somit bedarf es keinen Eingriff des Users, denn er ist sofort mit dem Zielnetzwerk verbunden. DirectAcces baut eine IPv6 Verbindung zum DirectAccess Server auf. Sollte die Firewall den IPv6 Verkehr blocken, so wird IP over HTTPS verwendet. Somit kann also jede Firewall mit geöffneten Web-Ports passiert werden.Man kann DirectAccess in 3 verschiedene Modi betreiben:   Full Intranet Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt     Selected Server Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt. Die Verbindung vom Clientcomputer zum internen Netzwerk ist authentifiziert     End-to-End Access: Die Verbindung vom Clientcomputer über das Internet zum internen Netzwerk ist verschlüsselt und authentifiziert   Ein weiterer Vorteil bezieht sich auf das Patch- und Richtlinienmanagement. Befindet sich der Client mehrere Wochen nicht im internen Netzwerk, könnte es unter Umständen sein, dass er in dieser Zeit keine Updates vom Server bezieht. Mit DirectAccess ist der Client ständig in Verbindung mit den internen Servern und kann Updates sowie die aktuellen GPO’s beziehen.Um DirectAccess benutzen zu können ist zwingend Windows 7, Windows Server 2008 R2 und eine PKI nötig. Der Client muss außerdem der Domäne angehören.Grüße, dn\"\n},{\n  \"title\": \"Windows 7 – Nativer VHD Support\",\n  \"url\": \"/post/windows-7-e28093-nativer-vhd-support/\",\n  \"date\": \"July 25, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Das neue Windows kann von Haus aus VHDs als Festplatten einbinden. So kann man sich z.B. ein Testsystem installieren ohne die Festplatt partitionieren zu m&uuml;ssen.Virtuelle Festplatten k&ouml;nnen direkt in der Datentr&auml;gerverwaltung erstellt werden (rechtsklick auf Datentr&auml;gerverwaltung, neue virtuelle Festplatte).Will man Windows 7 auf der zu erstellenden VHD installieren muss man die Festplatte mit fester Gr&ouml;&szlig;e erstellen.&nbsp;Windows 7 von einem beliebigem Installationsmedium (USB Stick, DVD) starten und mit Shift-F10 eine Eingabeaufforderung starten. Jetzt muss man die vorhin erstellte VHD mit diskpart einbinden. Dazu wird die VHD mit selet vdisk file=c:\\\\pfad\\\\zur\\\\datei.vhd ausgew&auml;lt und mit attach vdisk angebunden.Die Installation von Windows 7 kann jetzt normal fortgesetzt werden, die Warnung dass Windows auf einer virtuellen Festplatte nicht installiert werden kann, ignoriert man einfach.mfg tt\"\n},{\n  \"title\": \"Windows 7 – Installation mit USB Stick\",\n  \"url\": \"/post/windows-7-e28093-installation-mit-usb-stick/\",\n  \"date\": \"July 25, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [\"Client\"],\n  \"author\": \"tto\",\n  \"content\": \"Windows 7 kann von einem USB Wechseldatentr&auml;ger aus installiert werden. So kann es problemlos auf Netbooks und anderen Ger&auml;ten ohne ein optisches Laufwerk installiert werden. Ich verwende eigentlich immer diese Variante da USB Sticks in der Regel schneller sind als DVD Laufwerke.Um den USB Stick vorzubereiten verwendet man das Programm diskpart (standartm&auml;&szlig;ig installiert). Diskpart wird in einer Eingabeaufforderung mit administrativen Rechten gestartet.Wenn Diskpart gestartet wurde \\\"list disks\\\" ausf&uuml;hren, um die installierten Laufwerke anzuzeigen.Mit \\\"select disk\\\" wird der USB Stick ausgew&auml;hlt, dann wird er mit \\\"clean\\\" gel&ouml;scht (ACHTUNG: Alle Daten auf dem Stick gehen verloren)Jetzt wird mit \\\"create partition primary\\\" eine Prim&auml;re Partition erstellt die mit \\\"active\\\" als Aktiv gesetzt wird (damit das BIOS davon booten kann). Jetzt fehlt noch das Dateisystem das mit \\\"format fs=fat32 quick\\\" festgelegt wird. Mit \\\"assign\\\" wei&szlig;t man noch einen Laufwerksbuchstaben zu.Dieser Prozess kann auch &uuml;ber GUI ausgef&uuml;hrt werden, wichtig ist nur dass am Ende eine prim&auml;re, aktive Fat32 Partition auf dem USB Stick vorhanden ist.Zu Schluss kopiert man noch alle Daten von der Windows 7 DVD auf den USB Stick. So erstellt man einen Bootf&auml;higen Stick, man muss nur noch dem BIOS beibringen davon zu starten und schon kann Windows installiert werden.Genauere Details zu Diskpart gibts im entsprechenden KB Artikel.\"\n},{\n  \"title\": \"MSAT deckt Schwachstellen in der IT Umgebung auf\",\n  \"url\": \"/post/msat-deckt-schwachstellen-in-der-it-umgebung-auf/\",\n  \"date\": \"July 24, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"dni\",\n  \"content\": \"Microsoft bietet das kostenlose Tool MSAT (Microsoft Security Assessment Tool) Unternehmen an, ihre IT-Sicherheitsumgebung zu bewerten. Als erstes wird der aktuelle Stand der IT-Sicherheit ermittelt, das Tool gibt eine nach Priorität geordnete Liste mit Problemen und Verbesserungsmöglichkeiten aus.Folgende Features sind im Tool enthalten:   Einfach zu verwendende, umfassende und kontinuierliche Sicherheitsinformationen     Ein Defense-in-Depth-Framework mit branchenbezogener vergleichender Analyse     Detailliertes, kontinuierliches Reporting mit Vergleich von Ausgangsbasis und Fortschritt     Empfehlungen und nach Priorität geordnete Maßnahmen zur Verbesserung der Sicherheit     Strukturierte Anleitungen von Microsoft und anderen Branchenvertretern   Downloaden kann man das Tool hierGrüße, dn\"\n},{\n  \"title\": \"Windows 7 – RTM Verfügbarkeit\",\n  \"url\": \"/post/windows-7-e28093-rtm-verfugbarkeit/\",\n  \"date\": \"July 22, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Wie im Windows 7 Team Blog zu lesen ist steht nun das RTM Datum fest.Die wichtigsten Daten im Überblick:   MSDN &amp; Technet ab 6. August&#160;    Volume License mit SA ab 7. August    Volume License ohne SA ab 1. September    Microsoft Partner Network Portal ab 16. August    Microsoft Action Pack ab 23. August Bei diesen Daten handelt es sich um die englischen Versionen, andere Sprachen folgen am 1. Oktober und in den Regalen steht Windows 7 ab 22. Oktober.viele Grüße    tt\"\n},{\n  \"title\": \"Zertifikat für Makros der Domäne bereitstellen\",\n  \"url\": \"/post/zertifikat-fur-makros-der-domane-bereitstellen/\",\n  \"date\": \"July 22, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"dni\",\n  \"content\": \"Letzens habe ich mir vorgenommen alle von mir geschriebenen Makros digital zu signieren, sodass die User beim Öffnen der Dateien keine Abfragen bekommen ob sie den Code aktivieren möchten oder nicht. Um einen Makro digital zu signieren und das Zertifikat der Domäne zur Verfügung zu stellen bedarf es mehrerer Schritte:    Zertifikatdienste auf einem Server installieren     Zertifikat zur Codesignatur ausstellen     Makros digital signieren und die Office-Files ablegen  Nun muss nur mehr das Zertifikat den Usern bereit gestellt werden. Wenn man das mit einem GPO macht, muss darauf geachtet werden, dass man die Einstellungen für Computer vornimmt. Das Zertifikat muss als erstes unter die Vertrauenswürdigen Stammzertifizierungsstellen Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Vertrauenswürdige Stammzertifizierungsstellen  Bis hierher wird das Zertifikat in den lokalen Zertifikat-Speicher “Vertrauenswürdigen Stammzertifizierungsstellen” geschoben. Das Zertifikat muss aber noch in den Speicher für “Vertrauenswürdige Herausgeber”, sonst erscheinen weiterhin Abfragen. Um das Zertifikat da rein zubekommen muss im vorher konfigurierten GPO eine neue “Richtlinie zur Softwareeinschränkung” erstellt werden. Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Richtlinien für Softwareeinschränkung Danach muss unter “Zusätzliche Regeln” eine neue Zertifikatsregel mit den entsprechenden Zertifikat erstellt werden. Wichtig dabei ist, dass die Sicherheitsstufe “Nicht eingeschränkt” lautet. Nun wird das Zertifikat an alle Computer unter dem GPO verteilt. Alle digital signierten Makros werden ohne Abfrage ausgeführt.\"\n},{\n  \"title\": \"Delta CRL “Unable to Download” IIS 7\",\n  \"url\": \"/post/delta-crl-e2809cunable-to-downloade2809d-iis-7/\",\n  \"date\": \"July 21, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"tto\",\n  \"content\": \"Erstmal herzlich willkommen in unserem Blog ;)und zweitens ein Problemchen &uuml;ber das ich in dieser Woche gestolpert bin: IIS 7 blockiert aus Sicherheitsgr&uuml;nden sogenannte Double-Escape Sequenzen (\\\"+\\\" \\\"-\\\"). Da die Delta CRL jedoch standardm&auml;&szlig;ig ein \\\"+\\\" im Namen hat schl&auml;gt der Download fehl. M&ouml;chte man die CRL's bzw. Delta CRL's in seiner PKI &uuml;ber http ver&ouml;ffentlichen kann man sich durch abschalten dieser Sicherheitsfunktion f&uuml;r die betreffenden Virtual Directories helfen:%windir%\\\\system32\\\\inetsrv\\\\appcmd.exe set config \\\"Default Web Site/virtual Directory\\\" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true \\\"virtual Directory\\\" entspricht dem Virtuellen Verzeichnis in dem die Delta CRL ver&ouml;ffentlicht wird.hier der entsprechende KB Artikel: http://support.microsoft.com/kb/942076mfg tt\"\n},{\n  \"title\": \"Drucken mit Internet Explorer 8 nicht mehr möglich\",\n  \"url\": \"/post/drucken-mit-internet-explorer-8-nicht-mehr-moglich/\",\n  \"date\": \"July 20, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"dni\",\n  \"content\": \"Letztens hatte ich das Problem, dass mein Internet Explorer plötzlich das Drucken verweigerte. Auch ist mir aufgefallen, dass das „Info-Fenster“ nur mehr ein weißes Fenster zeigte. Es scheint Probleme zu geben, wenn zum Internet Explorer 8 der „Microsoft Software Inventory Analyzer“ installiert wird. Deinstallation des Analyzers hat das Problem behoben. \"\n},{\n  \"title\": \"Willkommen\",\n  \"url\": \"/post/willkommen/\",\n  \"date\": \"July 20, 2009\",\n  \"category\": \"Archive\",\n  \"tags\": [],\n  \"author\": \"dni\",\n  \"content\": \"Willkommen im Blog von ntSystems – info.tech\"\n}],\n\"docs\":[{\n  \"id\": \"powershell-start-lyncbackup\",\n  \"title\": \"New-SfBBackup\",\n  \"author\": \"tto\",\n  \"tags\": [\"OnlineHelp\",\"Lync\",\"PowerShell\"],\n  \"content\": \"This script exports Lync Core Data and Settings according to the documentation availabe on TechNetIt is intended to be run as scheduled task, the Retention parameter can be used to indicate how long to keep existing backup files in the target directory.InputsNone. This script does not take any pipeline input.OutputsNone. This script does not write any output to the pipeline.PermissionsThe Account used to run this script needs to be member of the RTCUniversalServerAdmins group.Example 1.\\\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\\\\\SERVER\\\\Share\\\\CSBackupThis example exports Lync config and saves it into a subfolder at \\\\\\\\SERVER\\\\Share\\\\CSBackupExample 2.\\\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\\\\\SERVER\\\\Share\\\\CSBackup -Retention 10This example exports Lync config and saves it into a subfolder at \\\\\\\\SERVER\\\\Share\\\\CSBackup. It deletes existing backups in the destination directory if they are older than 10 days.Download &amp; Source for New-SfBBackupThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name New-SfBBackup -Scope CurrentUserSave-Script -Name New-SfBBackup -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/start-lyncbackup/\"\n},{\n  \"id\": \"powershell-test-groupmembership\",\n  \"title\": \"Test-GroupMembership\",\n  \"author\": \"tto\",\n  \"tags\": [\"blog\",\"archives\",\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"This function uses [ADSI] to test group membership based on the constructed security token of the principal. You can pipe objects to this function. The function writes $true or $false for each tested object.This function makes use of Richard Muellers “PowerShell script to check group membership”. Check the related link.Inputs[Microsoft.ActiveDirectory.Management.ADAccount]You can pipe an ADAccount object, such as returned by Get-AdUser or Get-AdComputer, to Test-GroupMembership.Outputs[bool]Test-GroupMembership returns $true or $false for each tested account.Example 1Get-AdUser -Filter * | Test-GroupMemership -GroupName \\\"Domain Users\\\"This example gets users from Active Directory and tests wether or not they are member of the “Domain Users” security group.Example 2Get-AdComputer -Filter * | Test-GroupMemership -GroupName \\\"Domain Computers\\\"This example gets computers from Active Directory and tests wether or not they are member of the “Domain Computers” security group.Related LinksRichard Muellers Script in the TechNet ScriptCenter: http://gallery.technet.microsoft.com/scriptcenter/5adf9ad0-1abf-4557-85cd-657da1cc7df4Download &amp; Source for Test-GroupMembershipThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Test-GroupMembership -Scope CurrentUserSave-Script -Name Test-GroupMembership -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/test-groupmembership/\"\n},{\n  \"id\": \"powershell-invoke-sefautil\",\n  \"title\": \"Invoke-SEFAUtil\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\",\"Lync\"],\n  \"content\": \"This is a wrapper function for the SEFAUtil.exe tool from the Lync Resource Kit Tools. It’s intended purpose is to make dealing with the cmdline tool easier.SYNTAX.\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddTeamMember &lt;String&gt;] [-RemoveTeamMember &lt;String&gt;] [-DelayRingTeam &lt;Int32&gt;] [-DisableTeamCall] [-SimulRingTeam] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddDelegate &lt;String&gt;] [-RemoveDelegate &lt;String&gt;] [-DelayRingDelegates &lt;Int32&gt;] [-FwdToDelegates] [-SimulRingDelegates] [-DisableDelegation] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableSimulRing &lt;String&gt;] [-DisableSimulRing] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableFwdNoAnswer &lt;String&gt;] [-EnableFwdImmediate &lt;String&gt;] [-CallAnswerwaitTime &lt;Int32&gt;] [-DisableFwdImmediate] [-DisableFwdNoAnswer] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThe default Value for the Path parameter assumes Lync 2013 Resource Kit Tools are installed at C:\\\\Program Files\\\\Microsoft Lync Server 2013\\\\ResKit. This function requires version 3 of PowerShell as well as the Lync Module for user validation. Note: Check the related links for a really cool GUI wrapper by MVP Johan Veldhuis.RELATED LINKS  Invoke-SEFAUtil – a PowerShell wrapper function  Updated: Invoke-SEFAUtil  SefaUtil GUI  Skype for Business Server 2015 Resource Kit Tools DocumentationEXAMPLE 1.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\"OU=users,OU=tomt,DC=tomt,DC=local\\\" | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThis example uses Get-CsUser to get all Lync Users from within the specified Organizational Unit and adds thomas@tomt.it as delegate.Download &amp; Source for Invoke-SEFAUtilThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/invoke-sefautil/\"\n},{\n  \"id\": \"powershell-restore-vmpermission\",\n  \"title\": \"Restore-VMPermission\",\n  \"author\": \"tto\",\n  \"tags\": [\"OnlineHelp\",\"Hyper-V\",\"PowerShell\"],\n  \"content\": \"Adds permissions for the VMId to all assigned disks.SYNTAX.\\\\Restore-VMPermission.ps1 [-VM] &lt;String[]&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThis script uses the Hyper-V Module to update permissions for all assigned disks on one ore more VMs. This is useful if you move/replace VHDs and the read permission ACE for VMId is missing.PARAMETERS-VM &lt;String[]&gt;    VM, specify the VM that needs permissions fixed.    Required?                    true    Position?                    1    Default value    Accept pipeline input?       true (ByPropertyName)    Accept wildcard characters?  false-WhatIf [&lt;SwitchParameter&gt;]    Required?                    false    Position?                    named    Default value    Accept pipeline input?       false    Accept wildcard characters?  false-Confirm [&lt;SwitchParameter&gt;]    Required?                    false    Position?                    named    Default value    Accept pipeline input?       false    Accept wildcard characters?  false&lt;CommonParameters&gt;    This cmdlet supports the common parameters: Verbose, Debug,    ErrorAction, ErrorVariable, WarningAction, WarningVariable,    OutBuffer, PipelineVariable, and OutVariable. For more information, see    about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216).INPUTSYou can pipe objcets with a VMName property, such as returned by Get-VM, to this script.OUTPUTSNone. This script does not write any objects to the pipeline.EXAMPLE 1PS C:\\\\&gt;Restore-VMPermission.ps1 -VM dc01This example adds permission for dc01 VMId to the ACL of all assigned disks for dc01.EXAMPLE 2PS C:\\\\&gt;Get-VM | Restore-VMPermission.ps1This example uses Get-VM to get all VMs on the local machine. It gets all disks for all VMs and adds the required premissions for VMId to the ACL.Download &amp; Source for Restore-VMPermissionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Restore-VMPermission -Scope CurrentUserSave-Script -Name Restore-VMPermission -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/restore-vmpermission/\"\n},{\n  \"id\": \"powershell-create-ucszoninghints\",\n  \"title\": \"Create-UcsZoningHints\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cisco\",\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"This script uses the CiscoUcs PowerTool to get information about one or more service profiles and creates SIST zoning configuration for NX-OS. The Target’s device-alias as well as the name for the ZoneSet and the VSAN can be specified with parameters. Zone names will be automatically created.Syntax.\\\\Create-UcsZoningHints.ps1 -Name &lt;String&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;].\\\\Create-UcsZoningHints.ps1 -InputObject &lt;Object&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;].\\\\Create-UcsZoningHints.ps1 [-UcsCentral] -TemplateName &lt;String&gt; [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]Inputs  Cisco.Ucsm.LsServer  Cisco.UcsCentral.LsServerYou can pipe objects of the above types to this script.Outputs  System.Management.Automation.PSObject  System.StringDepending on the parameters used, this script writes a custom PSObject or a System.String to the pipeline. The default behavior is to output a custom PSObject. If the –OutFile parameter is used, a string will be output instead.Example 1PS Scripts:\\\\&gt; Connect-Ucs 192.168.1.100PS Scripts:\\\\&gt; Get-UcsServiceProfile -Name HVSV02 | .\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-aId CommandLine-- -----------0 ! Fabric A1 device-alias database2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:413 device-alias commit4 ! Zones5 zone name HVSV02-vHba-A_vnx-a vsan 16  member device-alias vnx-a7  member device-alias HVSV02-vHba-A8 ! Zoneset9 zoneset name myZoneSet vsan 110  member HVSV02-vHba-A_vnx-a11 ! zoneset activate name myZoneSet vsan 1In this example, we use Connect-Ucs to connect to an instance of UCS Manager. Using Get-UcsServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, creates the output shown above. The –TargetAlias parameter specifies the device-alias to use as zone target.Lines 1-3 create a device-alias for the vHBA of Fabric A in the NX-OS configuration.Lines 5-7 create a zone create a SIST zone and adds the vHBA’s and the target’s device-aliases as members.Lines 9 and 10 add the newly created zone to an existing zoneset configuration.Line 11 can be uncommented to activate the updated zoneset.Example 2PS Scripts:\\\\&gt; Connect-UcsCentral 192.168.1.102PS Scripts:\\\\&gt; Get-UcsCentralServiceProfile -Name HVSV02 | .\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-a -UcsCentralId CommandLine-- -----------0 ! Fabric A1 device-alias database2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:413 device-alias commit4 ! Zones5 zone name HVSV02-vHba-A_vnx-a vsan 16  member device-alias vnx-a7  member device-alias HVSV02-vHba-A8 ! Zoneset9 zoneset name myZoneSet vsan 110  member HVSV02-vHba-A_vnx-a11 ! zoneset activate name myZoneSet vsan 1In this example, we use Connect-UcsCentral to connect to an instance of UCS Central. Using Get-UcsCentralServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, using the Parameter –UcsCentral creates the output shown above.Example 3PS Scripts:\\\\&gt; Get-UcsServiceProfile -AssignState assigned | .\\\\Create-UcsZoningHints.ps1 –TargetAlias vnx-b -Fabric B -ZoneSet cfg-prodId CommandLine-- -----------0 ! Fabric B1 device-alias database2  device-alias name ESX01-vHba-B pwwn 20:01:00:25:B5:00:0B:013  device-alias name ESX02-vHba-B pwwn 20:01:00:25:B5:00:0B:024  device-alias name HVSV02-vHba-B pwwn 20:01:00:25:B5:00:0B:415 device-alias commit6 ! Zones7 zone name ESX01-vHba-B_vnx-b vsan 18  member device-alias vnx-b9  member device-alias ESX01-vHba-B10 zone name ESX02-vHba-B_vnx-b vsan 111  member device-alias vnx-b12  member device-alias ESX02-vHba-B13 zone name HVSV02-vHba-B_vnx-b vsan 114  member device-alias vnx-b15  member device-alias HVSV02-vHba-B16 ! Zoneset17 zoneset name cfg-prod vsan 118  member ESX01-vHba-B_vnx-b19  member ESX02-vHba-B_vnx-b20  member HVSV02-vHba-B_vnx-b21 ! zoneset activate name cfg-prod vsan 1This example uses the -AssignState parameter when getting Service Profiles from UCS Manager. This will retrieve all Service Profiles that are assigned to a physical server. Piping the retrieved Service Profile objects to this script, creates zones from each individual vHBA of each server to the device-alias specified using the –TargetAlias parameter.The -Fabric parameter specifies which Cisco UCS SwitchId is used to query vHBA information.The -ZoneSet parameter specifies the name of the zoneset to use in the configuration snippet.Example 4PS Scripts:\\\\&gt; Get-UcsServiceProfile | .\\\\Create-UcsZoningHints.ps1 -Fabric B -Vsan 200 -OutFile c:\\\\temp\\\\zoneset.txt! Fabric Adevice-alias databasedevice-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:41...This example creates zoning configuration for all configured Service Profiles. The -OutFile parameter specifies a filename where the output is written to. The output is also written to the pipeline.Note: Using the -OutFile parameter does not output an object but a simple string of commands to make copy/pasting easier. (alternatively use “| Select-Object -ExpandProperty CommandLine”)The -Vsan parameter specifies the Id of the vsan to use in the NX-OS configuration.Example 5PS Scripts:\\\\&gt; Get-UcsServiceProfile | .\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-1-a,vnx-2-aThis example creates zoning configuration for all configured Service Profiles to all specified Targets.Download &amp; Source for Create-UcsZoningHintsThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Create-UcsZoningHints -Scope CurrentUserSave-Script -Name Create-UcsZoningHints -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/create-ucszoninghints/\"\n},{\n  \"id\": \"powershell-start-testwebserver\",\n  \"title\": \"Start-TestWebServer\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"Start-TestWebServerSYNOPSISWebserver for load balancer testing.SYNTAXStart-TestWebServer.ps1 [[-Port] &lt;Int32&gt;] [-CreateFirewallRule]DESCRIPTIONStart a web listener that listens on a specified port and simply answers to any request, returning JSON object containing the request.Requires administrative rights to create the listener.EXAMPLES————————– EXAMPLE 1 ————————–.\\\\Start-TestWebServer -Port 8001Start the test WebServer on port 8001.————————– EXAMPLE 2 ————————–.\\\\Start-TestWebServer -Port 80 -CreateFirewallRuleInvoke-RestMethod -Uri http://localhost | Select-Object UserAgentStart the test WebServer on port 80 and create a Firewall Rule to allow traffic to the specified port.The Invoke-RestMethod cmdlet is used to send a request to the listener and parse the output.PARAMETERS-PortSpecify a TCP port number for the HTTP listener to use.Defaults to 8000.Type: Int32Parameter Sets: (All)Aliases: Required: FalsePosition: 1Default value: 8000Accept pipeline input: FalseAccept wildcard characters: False-CreateFirewallRuleUse this switch to automatically create a Windows Firewall rule to allow incoming connections on the specified port.Type: SwitchParameterParameter Sets: (All)Aliases: Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseINPUTSNone.OUTPUTSNone.NOTESRELATED LINKShttps://ntsystems.it/PowerShell/start-testwebserver/Download &amp; Source for Start-TestWebServerThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name Start-TestWebServer -Scope CurrentUserSave- -Name Start-TestWebServer -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/start-testwebserver/\"\n},{\n  \"id\": \"powershell-send-splunkevent\",\n  \"title\": \"Send-SplunkEvent\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"SYNOPSISSend events to Splunk’s HTTP Event Collector.SYNTAXSend-SplunkEvent.ps1 [-InputObject] &lt;Object&gt; [[-HostName] &lt;String&gt;] [[-DateTime] &lt;DateTime&gt;] [[-Uri] &lt;String&gt;] [[-Key] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to send structured data to Splunk HTTP Event Collector.Use the HostName and DateTime parameters to control Splunk’s ‘host’ and ‘time’ properties for the generated event.EXAMPLESEXAMPLE 1.\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\"Hello Splunk!\\\"} -Key &lt;token&gt;This example sends a simple event containing “message”: “Hello Splunk!” to the event collector running on the local system.EXAMPLE 2Import-Csv logs.csv | .\\\\Send-SplunkEvent -Key &lt;token&gt; -HostName SBC1 -Uri \\\"https://splunk01.example.com:8088/services/collector\\\"This example imports logs from a CSV file and sends each one of them to event collector running on splunk01.example.com.The HostName parameter specifies which host created the logs.PARAMETERS-InputObjectData object that will be sent to Splunk’s HTTP Event Collector.Type: ObjectParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-HostNameHostName to be used for Splunk’s ‘host’ property.Default’s to name of the local system.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: (hostname)Accept pipeline input: FalseAccept wildcard characters: False-DateTimeDate and Time of the event.Defaults to now() on the local system.Type: DateTimeParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: (Get-Date)Accept pipeline input: FalseAccept wildcard characters: False-UriURI of the Splunk HTTP Event Collector instance.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Http://localhost:8088/services/collectorAccept pipeline input: FalseAccept wildcard characters: False-KeyKey for the Splunk HTTP Event Collector instance.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).INPUTS[psobject]OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKShttps://ntsystems.it/PowerShell/Send-SplunkEvent/Download &amp; Source for Send-SplunkEventThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Send-SplunkEvent -Scope CurrentUserSave-Script -Name Send-SplunkEvent -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/send-splunkevent/\"\n},{\n  \"id\": \"powershell-remove-logfile\",\n  \"title\": \"Remove-LogFile\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"OnlineHelp\"],\n  \"content\": \"SYNOPSISDeletes log files.SYNTAXRemove-LogFile.ps1 -Path &lt;Object&gt; [-Age &lt;Int32&gt;] [-Filter &lt;String&gt;] [-LogFile &lt;FileInfo&gt;] [-Recurse] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONDeletes log files, parameters can be used to specify the root folder, whether or not to include subfolders, a file extension filter and the age. This is intended to be run as scheduled task to regularly clean-up log files.EXAMPLESExample 1.\\\\Remove-LogFile.ps1 -Path C:\\\\inetpub\\\\logs -Age 7 -RecurseThis example removes all *.log files older than 7 days from C:\\\\inetpub\\\\logs and any subfolders.PARAMETERS-AgeSpecify a number of days. Files with a LastWriteTime older than this will be deleted.Type: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-FilterSpecify file extension filter. Defaults to ‘*.log’.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-LogFileSpecify a path to a log file. The script will log information and erros to the file.Type: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathSpecify folder in which logs will be deleted.Type: ObjectParameter Sets: (All)Aliases:Required: TruePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-RecurseInclude subfolders.Type: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).INPUTSOUTPUTSNOTESRELATED LINKSDownload &amp; Source for Remove-LogFileThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Remove-LogFile -Scope CurrentUserSave-Script -Name Remove-LogFile -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \",\n  \"url\": \"https://onprem.wtf/powershell/remove-logfile/\"\n},{\n  \"id\": \"powershell-psspeech\",\n  \"title\": \"PSSpeech\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  PSSpeech is a collection of functions to work with Azure Cognitive Services, more specifically the Speech Service.The function  Get-SpeechToken can be used to get an OAuth token for authentication to the service. The function Get-SpeechVoicesList can be use to get a list of available voices and the function Covert-TextToSpeech can be used to convert a given string to speech.Get-SpeechToken -Key &lt;yourkey&gt; Convert-TextToSpeech -Text \\\"Hi there, how are you doing today?\\\" -Path hithere.mp3Functions                                Convert-TextToSpeech        Convert a string to audio using Azure Cognitive Services.                                                            Get-SpeechToken        Get OAuth token for authorization to Azure Cognitive Services.                    Get-SpeechTokenResult         Get-SpeechTokenResult                     Get-SpeechVoicesList        Get a list of available voices from the speech service.                                                                                            Download &amp; Source for PSSpeechThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name PSSpeech -Scope CurrentUserSave- -Name PSSpeech -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    \",\n  \"url\": \"https://onprem.wtf/powershell/psspeech/\"\n},{\n  \"id\": \"powershell-tak\",\n  \"title\": \"TAK\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  Tom’s Admin Kit, or TAK, is a PowerShell script module that contains useful tools which I collected or created over the years.The main goal of creating the module and writing the scripts it contains, was learning PowerShell and making my job a little bit easier. As I am currently looking into continuous integration, I used this module to build an example deployment pipeline. You can read more about that here.Functions                Add-EtcHostsEntry        Add an entry to local hosts file.                    Connect-Lync        Connect to Skype for Business Server or Online.                    Connect-SfB        Connect to Skype for Business Server or Online.                    Convert-SubnetMask        Convert a SubnetMask to PrefixLength or vice-versa.                        ConvertFrom-Base64        Convert Base64 to ClearText String                    ConvertFrom-SID        Get the account name for a SID.                    ConvertTo-Base64        Convert a String to Base64                    ConvertTo-SID        Get the SID for an account name                    Edit-EtcHosts        Edit etc hosts file with notepad.                    Get-DKIMRecord        Get DKIM Record for a domain.                    Get-DMARCRecord        Get DMARC Record for a domain.                    Get-MacAddressVendor        Mac Address vendor lookup.                    Get-MxRecord        Get MX Records for a domain.                    Get-SPFRecord        Get SPF Record for a domain. If the include tag is present, recursively get that SPF Record, too.                                Get-TakHash        Get hash for a string.                    Get-WlanProfile         Get-WlanProfile                     Import-Csr        Import certificate signing request from base64 text.                    Import-DhcpServerLog        Import DHCP Server Log files.                    Import-IISLog        Import IIS log files with default header.                    Invoke-WhoisRequest        Wohis request.                    New-FirewallRule        Create a new Windows Firewall Rule.                    New-RgsReport        Gather information about Skype for Business Response Groups, Queues, Agent Groups.                    New-SPFRecord        Create SPF record for a given mail domain.                    Remove-EtcHostsEntry        Remove an entry from local hosts file by it's IP address.                    Show-EtcHosts        Display /etc/hosts file content on Windows or Linux/macOS.                    Show-WlanProfile        Get wlan pre-shared key.                    Test-ExchangeAutodiscover        Test Exchange Autodiscover Web Service.                    Test-FederationService        Test the ADFS web service                    Test-LyncDNS        Test DNS entries for Skype for Business / Lync deployments.                    Test-LyncDiscover        Test the Lyncdiscover service for Skype for Business/Lync deployments                    Test-OOSFarm        Get internal and external URLs for PowerPoint sharing.                    Test-SfBDNS        Test DNS entries for Skype for Business / Lync deployments.                    Test-SfBDiscover        Test the Lyncdiscover service for Skype for Business/Lync deployments                    Test-TCPConnection        Test if a TCP Connection can be established.                    Test-TLSConnection        Test if a TLS Connection can be established.                    Update-FileWriteTime        Touch a file.    Download &amp; Source for TAKThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Module -Name TAK -Scope CurrentUserSave-Module -Name TAK -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/TAK    \",\n  \"url\": \"https://onprem.wtf/powershell/tak/\"\n},{\n  \"id\": \"powershell-ntsystemspsdrive\",\n  \"title\": \"ntSystemsPSDrive\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  ntSystemsPSDrive is a SHiPS provider for ntSystems.it.It uses the SHiPS module to create a PSProvider for our blog which exposes our json-api as PSDrive and enables the following:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\Posts by Category\\\\PowerShell\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\Posts by Category\\\\ntSystems\\\\Jekyll Fun: Consuming ntSystems with PowerShell' You can read more about it here.Functions                                                                                                                                                                Download &amp; Source for ntSystemsPSDriveThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Module -Name ntSystemsPSDrive -Scope CurrentUserSave-Module -Name ntSystemsPSDrive -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/ntSystemsPSDrive    \",\n  \"url\": \"https://onprem.wtf/powershell/ntsystemspsdrive/\"\n},{\n  \"id\": \"powershell-add-etchostsentry\",\n  \"title\": \"Add-EtcHostsEntry\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Add-EtcHostsEntrySYNOPSISAdd an entry to local hosts file.SYNTAXAdd-EtcHostsEntry [-IPAddress] &lt;String&gt; [-Fqdn] &lt;String&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONAdds a lines to the /etc/hosts file of the local computer.Requires write access to /etc/hosts - if running PowerShell Core on  Linux/macOS try “sudo powershell”EXAMPLESEXAMPLE 1Add-EtcHostsEntry -IPAddress 1.1.1.1 -Fqdn test.fqdnThis example adds following line to the hosts file1.1.1.1 test.testPARAMETERS-IPAddressIPAddress of the hosts entry to be addedType: StringParameter Sets: (All)Aliases: ipRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-FqdnFQDN of the hosts entry to be addedType: StringParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/add-etchostsentry/\"\n},{\n  \"id\": \"powershell-connect-lync\",\n  \"title\": \"Connect-Lync\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Connect-LyncSYNOPSISConnect to Skype for Business Server or Online.SYNTAXDESCRIPTIONThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Serversor Skype for Business Online.The resulting PS Session is then imported and makes cmdlets available in the current session.The Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.This function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6EXAMPLESEXAMPLE 1Connect-SfB -Online -AdminDomain uclabThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.comPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/connect-lync/\"\n},{\n  \"id\": \"powershell-connect-sfb\",\n  \"title\": \"Connect-SfB\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Connect-SfBSYNOPSISConnect to Skype for Business Server or Online.SYNTAXServerConnect-SfB -Server &lt;Object&gt; [-Credential &lt;PSCredential&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]OnlineConnect-SfB [-AdminDomain &lt;String&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Serversor Skype for Business Online.The resulting PS Session is then imported and makes cmdlets available in the current session.The Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.This function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6EXAMPLESEXAMPLE 1Connect-SfB -Online -AdminDomain uclabThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.comPARAMETERS-ServerSpecifies the ServerName that the session will be connected toType: ObjectParameter Sets: ServerAliases:Required: TruePosition: NamedDefault value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-AdminDomainSpecify the admin doamin to connect to (OverrideAdminDomain parameter)Type: StringParameter Sets: OnlineAliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-CredentialCredential used for connection; if not specified, the currently logged on user will be usedType: PSCredentialParameter Sets: ServerAliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-TimeoutSession idle timeout in secondsType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: 3600Accept pipeline input: FalseAccept wildcard characters: False-ProxyTypeProxyAccessType to use for the PsSessionType: ProxyAccessTypeParameter Sets: (All)Aliases:Accepted values: None, IEConfig, WinHttpConfig, AutoDetect, NoProxyServerRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/connect-sfb/\"\n},{\n  \"id\": \"powershell-convert-subnetmask\",\n  \"title\": \"Convert-SubnetMask\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Convert-SubnetMaskSYNOPSISConvert a SubnetMask to PrefixLength or vice-versa.SYNTAXConvert-SubnetMask [-SubnetMask] &lt;Object&gt; [&lt;CommonParameters&gt;]DESCRIPTIONLong descriptionEXAMPLESEXAMPLE 1Convert-SubnetMask 24255.255.255.0This example converts the PrefixLength 24 to a dotted SubnetMask.EXAMPLE 2Convert-SubnetMask 255.255.0.016This example counts the relevant network bits of the dotted SubnetMask 255.255.0.0.PARAMETERS-SubnetMaskSubnetMask to convertType: ObjectParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string]OUTPUTS[string]NOTESLogic from: https://d-fens.ch/2013/11/01/nobrainer-using-powershell-to-convert-an-ipv4-subnet-mask-length-into-a-subnet-mask-address/RELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convert-subnetmask/\"\n},{\n  \"id\": \"powershell-convert-texttospeech\",\n  \"title\": \"Convert-TextToSpeech\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Convert-TextToSpeechSYNOPSISConvert a string to audio using Azure Cognitive Services.SYNTAXConvert-TextToSpeech [-Text] &lt;String&gt; [-Path] &lt;FileInfo&gt; [[-Voice] &lt;String&gt;] [[-OutputFormat] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to call the Azure Cognitive Service Speech Service API, convert a string to speech, and save the resulting audio to a file.EXAMPLESEXAMPLE 1Convert-TextToSpeech -Text \\\"Hi, this is a test.\\\" -Path test.mp3This example converts the string “Hi, this is a test.” to speech and saves the audio to the test.mp3 file.PARAMETERS-TextType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathType: FileInfoParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-VoiceType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: En-GB-LibbyNeuralAccept pipeline input: FalseAccept wildcard characters: False-OutputFormatType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Audio-16khz-32kbitrate-mono-mp3Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convert-texttospeech/\"\n},{\n  \"id\": \"powershell-convertfrom-base64\",\n  \"title\": \"ConvertFrom-Base64\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertFrom-Base64SYNOPSISConvert Base64 to ClearText StringSYNTAXConvertFrom-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis Function uses [System.Convert] to convert Base64 encoded String to ClearText.The Encoding parameter can be used to specify which encoding to use.Believe it or not, works on Linux/macOS!EXAMPLESEXAMPLE 1ConvertFrom-Base64 'YXdlc29tZSwgaXNuJ3QgaXQ/'This example converts the given Base64 encoded string to clear text.PARAMETERS-StringOne or more Strings to be convertedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-EncodingThe Encoding to use.Type: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DefaultAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertfrom-base64/\"\n},{\n  \"id\": \"powershell-convertfrom-sid\",\n  \"title\": \"ConvertFrom-SID\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertFrom-SIDSYNOPSISGet the account name for a SID.SYNTAXConvertFrom-SID [-SID] &lt;SecurityIdentifier&gt; [&lt;CommonParameters&gt;]DESCRIPTIONUse [System.Security.Principal.SecurityIdentifier].Translate() to get the samAccountName for a SIDEXAMPLESEXAMPLE 1ConvertFrom-SID -Sid S-1-5-21-2330142668-2157844774-769409458EXAMPLE 2\\\"S-1-3-1\\\" | ConvertFrom-SIDPARAMETERS-SIDSID, specify the SID to translate.Type: SecurityIdentifierParameter Sets: (All)Aliases: ValueRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSYou can pipe input to this function.OUTPUTSReturns string values.NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertfrom-sid/\"\n},{\n  \"id\": \"powershell-convertto-base64\",\n  \"title\": \"ConvertTo-Base64\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertTo-Base64SYNOPSISConvert a String to Base64SYNTAXConvertTo-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis Function uses [System.Convert] to convert a ClearText String to Base64.The Encoding parameter can be used to specify which encoding to use.Believe it or not, works on Linux/macOS!EXAMPLESEXAMPLE 1ConvertTo-Base64 'my cleartext'This example converts ‘my cleartext’ to Base64 using ‘Default’ encoding.PARAMETERS-StringOne or more Strings to be convertedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-EncodingThe Encoding to use.Type: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DefaultAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertto-base64/\"\n},{\n  \"id\": \"powershell-convertto-sid\",\n  \"title\": \"ConvertTo-SID\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"ConvertTo-SIDSYNOPSISGet the SID for an account nameSYNTAXConvertTo-SID [-SamAccountName] &lt;NTAccount&gt; [&lt;CommonParameters&gt;]DESCRIPTIONUse [System.Security.Principal.SecurityIdentifier].Translate() to get the SID for a samAccountNameEXAMPLESEXAMPLE 1ConvertTo-SID -SamAccountName ttorgglerEXAMPLE 2\\\"ntsystems\\\\ttorggler\\\" | ConvertTo-SIDPARAMETERS-SamAccountNameSamAccountName, specify the account name to translate.Type: NTAccountParameter Sets: (All)Aliases: ValueRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSYou can pipe input to this function.OUTPUTSReturns string values.NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/convertto-sid/\"\n},{\n  \"id\": \"powershell-edit-etchosts\",\n  \"title\": \"Edit-EtcHosts\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Edit-EtcHostsSYNOPSISEdit etc hosts file with notepad.SYNTAXEdit-EtcHostsDESCRIPTIONThis funtion starts notepad.exe as administrator and opens the hosts file for editing.If this function is running on PowerShell Core, it runs “sudo vi /etc/hosts”run notepad as administrator and open the hosts file for editingEXAMPLESExample 1PS C:\\\\&gt; PARAMETERSINPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/edit-etchosts/\"\n},{\n  \"id\": \"powershell-get-dkimrecord\",\n  \"title\": \"Get-DKIMRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-DKIMRecordSYNOPSISGet DKIM Record for a domain.SYNTAXGet-DKIMRecord [-DomainName] &lt;String&gt; [[-Selector] &lt;String[]&gt;] [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to get the DKIM Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.The function defaults to “selector1” as thisis typically used with Exchange Online.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-DKIMRecordThis example gets DKIM records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name to use in the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-SelectorSpecify a selector name to use in the query.Type: String[]Parameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: @(\\\"selector1\\\",\\\"selector2\\\")Accept pipeline input: FalseAccept wildcard characters: False-ServerSpecify a DNS server to query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-dkimrecord/\"\n},{\n  \"id\": \"powershell-get-dmarcrecord\",\n  \"title\": \"Get-DMARCRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-DMARCRecordSYNOPSISGet DMARC Record for a domain.SYNTAXGet-DMARCRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to get the DMARC Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-DMARCRecordThis example gets DMARC records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name to use for the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-ServerSpecify a DNS server to query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-dmarcrecord/\"\n},{\n  \"id\": \"powershell-get-macaddressvendor\",\n  \"title\": \"Get-MacAddressVendor\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-MacAddressVendorSYNOPSISMac Address vendor lookup.SYNTAXGet-MacAddressVendor [-MacAddress] &lt;Object&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-WebRequest to look up the vendor of a Mac Address’ Organizationally Unique Identifier (OUI).Works on PowerShell Core for Linux/macOS.EXAMPLESEXAMPLE 1Get-MacAddressVendor -MacAddress '00-50-56-C0-00-01','00:0F:FE:E8:4F:27'This example looks up the vendor for the two specified Mac Addresses.EXAMPLE 2Get-NetAdapter | Get-MacAddressVendorThis example looks up the vendor of all network adapters returned by Get-NetAdapter.EXAMPLE 3Get-NetAdapterConfig -ComputerName Server01.domain.local | Get-MacAddressVendorThis example looks up the vendor of all network adapters returned by Get-NetAdapterConfig which supports remoting.EXAMPLE 4Get-DhcpServerv4Lease -ComputerName DhcpServer -ScopeId 192.168.1.0 | Get-MacAddressVendorThis example looks up the vendor of all currently assigned address leases on a DHCP Server.PARAMETERS-MacAddressSpecifiy a MAC Address to look upType: ObjectParameter Sets: (All)Aliases: ClientId, MARequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.Management.Automation.PSObjectNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-macaddressvendor/\"\n},{\n  \"id\": \"powershell-get-mxrecord\",\n  \"title\": \"Get-MxRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-MxRecordSYNOPSISGet MX Records for a domain.SYNTAXGet-MxRecord [-Domain] &lt;String&gt; [[-Server] &lt;IPAddress&gt;] [-ResolvePTR] [&lt;CommonParameters&gt;]DESCRIPTIONUses Resolve-DnsName to get MX Records, Priority and the IP Address of the records.EXAMPLESEXAMPLE 1Get-MxRecord ntsystems.itThis example gets the MX record for the domain ntsystems.it.PARAMETERS-DomainSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases: DomainNameRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-ServerSpecify the DNS server to query.Type: IPAddressParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ResolvePTRAlso resolve PTRType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string]OUTPUTS[Selected.Microsoft.DnsClient.Commands.DnsRecord_MX]NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-mxrecord/\"\n},{\n  \"id\": \"powershell-get-spfrecord\",\n  \"title\": \"Get-SPFRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SPFRecordSYNOPSISGet SPF Record for a domain.If the include tag is present, recursively get that SPF Record, too.SYNTAXGet-SPFRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [-Recurse] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to recursively get the SPF Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-SPFRecordThis example gets SPF records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-ServerSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-RecurseType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-spfrecord/\"\n},{\n  \"id\": \"powershell-get-speechtoken\",\n  \"title\": \"Get-SpeechToken\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SpeechTokenSYNOPSISGet OAuth token for authorization to Azure Cognitive Services.SYNTAXGet-SpeechToken [-Region] &lt;String&gt; [-Key] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get a bearer token that can be used in the Authorization header when calling Azure Cognitive Services.This requires access to an Azure subscription and API key for the speech service.EXAMPLESEXAMPLE 1Get-SpeechToken -Region &lt;region&gt; -Key &lt;apikey&gt;This example gets a token using the provided key and region.PARAMETERS-RegionType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-KeyType: StringParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESKey should probably be a secure string, update once secrets management module is released.The token is stored in $script:SpeechToken and can be retrieved with Get-SpeechTokenResultRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-speechtoken/\"\n},{\n  \"id\": \"powershell-get-speechtokenresult\",\n  \"title\": \"Get-SpeechTokenResult\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SpeechTokenResultSYNOPSISSYNTAXGet-SpeechTokenResultDESCRIPTIONEXAMPLESExample 1PS C:\\\\&gt; PARAMETERSINPUTSNoneOUTPUTSSystem.ObjectNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-speechtokenresult/\"\n},{\n  \"id\": \"powershell-get-speechvoiceslist\",\n  \"title\": \"Get-SpeechVoicesList\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-SpeechVoicesListSYNOPSISGet a list of available voices from the speech service.SYNTAXGet-SpeechVoicesList [[-token] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get a list of available voices from the Azure Cognitive Services Speech Service.Use the Token parameterto specify a token created with Get-SpeechToken and use the Region parameter to specify a region other than the default westeurope.If the Token parameter is not specified, the global variable created by Save-SpeechToken is used.EXAMPLESEXAMPLE 1Get-SpeechVoicesListThis example gets a list of available voices.PARAMETERS-tokenType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: $script:SpeechToken.TokenAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-speechvoiceslist/\"\n},{\n  \"id\": \"powershell-get-takhash\",\n  \"title\": \"Get-TakHash\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-TakHashSYNOPSISGet hash for a string.SYNTAXGet-TakHash [-String] &lt;String&gt; [[-Algorithm] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses various various crypto service providers to get the hash value for a given input string.EXAMPLESEXAMPLE 1Get-TakHash \\\"Hello World!\\\"This example returns the MD5 hash of “Hello World!”.EXAMPLE 2Get-TakHash \\\"Hello World!\\\" -Algorithm Sha256This example gets the SHA256 hash of “Hello World!”.PARAMETERS-StringType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-AlgorithmType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-takhash/\"\n},{\n  \"id\": \"powershell-get-wlanprofile\",\n  \"title\": \"Get-WlanProfile\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Get-WlanProfileSYNOPSISSYNTAXGet-WlanProfileDESCRIPTIONEXAMPLESExample 1PS C:\\\\&gt; PARAMETERSINPUTSNoneOUTPUTSSystem.ObjectNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/get-wlanprofile/\"\n},{\n  \"id\": \"powershell-import-csr\",\n  \"title\": \"Import-Csr\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Import-CsrSYNOPSISImport certificate signing request from base64 text.SYNTAXImport-Csr [[-Path] &lt;FileInfo&gt;] [-ShowText] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses the Windows Subsystem for Linux to invoke `openssl` to decode a certificate signing request.EXAMPLESEXAMPLE 1Import-Csr c:\\\\temp\\\\cert.reqThis example imports a CSR located at the given path and decodes it’s contents.PARAMETERS-PathType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ShowTextType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNoneOUTPUTS[psobject]NOTESAuthor: @torgglerDate: 2019-06-14RELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/import-csr/\"\n},{\n  \"id\": \"powershell-import-dhcpserverlog\",\n  \"title\": \"Import-DhcpServerLog\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Import-DhcpServerLogSYNOPSISImport DHCP Server Log files.SYNTAXImport-DhcpServerLog [[-Path] &lt;Object&gt;] [[-Filter] &lt;Object&gt;] [[-ComputerName] &lt;Object&gt;] [-Latest] [&lt;CommonParameters&gt;]DESCRIPTIONThis function imports DHCP Server Log files from CSV format.EXAMPLESEXAMPLE 1Import-DhcpServerLogImport all logs found in the default log folder.PARAMETERS-PathType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: C:\\\\Windows\\\\System32\\\\dhcpAccept pipeline input: FalseAccept wildcard characters: False-FilterType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DhcpSrvLog*.logAccept pipeline input: FalseAccept wildcard characters: False-ComputerNameType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-LatestType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/import-dhcpserverlog/\"\n},{\n  \"id\": \"powershell-import-iislog\",\n  \"title\": \"Import-IISLog\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Import-IISLogSYNOPSISImport IIS log files with default header.SYNTAXImport-IISLog [[-Path] &lt;String&gt;] [[-Filter] &lt;String&gt;] [[-Line] &lt;Object&gt;] [[-Tail] &lt;Int32&gt;] [[-Count] &lt;Int32&gt;] [-Wait] [&lt;CommonParameters&gt;]DESCRIPTIONThis function imports IIS log files from CSV format.EXAMPLESEXAMPLE 1Import-IISLogImport the latest log found in the default log folder.EXAMPLE 2Import-IISLog -Tail 10 -WaitImport the latest 10 lines of the latest log found in the default log folder and wait for new lines until stopped with ctrl-c.PARAMETERS-PathType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: C:\\\\inetpub\\\\logs\\\\LogFiles\\\\*Accept pipeline input: FalseAccept wildcard characters: False-FilterType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: *.logAccept pipeline input: FalseAccept wildcard characters: False-LineType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-TailType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: -1Accept pipeline input: FalseAccept wildcard characters: False-CountType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: 1Accept pipeline input: FalseAccept wildcard characters: False-WaitType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[IISLogEntry]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/import-iislog/\"\n},{\n  \"id\": \"powershell-invoke-whoisrequest\",\n  \"title\": \"Invoke-WhoisRequest\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Invoke-WhoisRequestSYNOPSISWohis request.SYNTAXInvoke-WhoisRequest [-DomainName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function creats a New-WebServiceProxy and then uses the GetWhoIs method to query whois information from www.webservicex.netEXAMPLESEXAMPLE 1Invoke-WhoisRequest -DomainName ntsystems.itThis example queries whois information for the domain ntsystems.itPARAMETERS-DomainNameType: StringParameter Sets: (All)Aliases: domainRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/invoke-whoisrequest/\"\n},{\n  \"id\": \"powershell-new-firewallrule\",\n  \"title\": \"New-FirewallRule\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"New-FirewallRuleSYNOPSISCreate a new Windows Firewall Rule.SYNTAXNew-FirewallRule [[-Port] &lt;Int32&gt;] [[-Protocol] &lt;String&gt;] [[-Store] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function is wrapper for New-NetFirewallRule with the goal of making it easier to create simple firewall rules and have consistent naming.EXAMPLESEXAMPLE 1New-FirewallRule -Port 6060This example creats a new firewall rule to allow connections on tcp/6060.PARAMETERS-PortType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: 0Accept pipeline input: FalseAccept wildcard characters: False-ProtocolType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: TCPAccept pipeline input: FalseAccept wildcard characters: False-StoreType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: PersistentStoreAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/new-firewallrule/\"\n},{\n  \"id\": \"powershell-new-rgsreport\",\n  \"title\": \"New-RgsReport\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"New-RgsReportSYNOPSISGather information about Skype for Business Response Groups, Queues, Agent Groups.SYNTAXNew-RgsReport [[-Filter] &lt;String&gt;] [-Path] &lt;FileInfo&gt; [-Html] [-PassThru] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses varios cmdlets of the Lync module (or an appropriate remote session) to gather information about Response Groups.EXAMPLESEXAMPLE 1Get-RgsReport -Filter Office -Path .\\\\Desktop\\\\report.csvThis example creates a CSV report for all RGS workflows matching Office.EXAMPLE 2Get-RgsReport -Filter Office -Path .\\\\Desktop\\\\report.html -HtmlThis example creates a HTML report for all RGS workflows matching Office.EXAMPLE 3Get-RgsReport -Filter Office -Path .\\\\Desktop\\\\report.html -Html -PassThru | Out-GridViewThis example creates a HTML report for all RGS workflows matching Office, because the PassThru switch is present,the collected data will also be written to the pipeline.From there we can use it and pipe it to Out-GridView or do whatever.PARAMETERS-FilterType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathType: FileInfoParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-HtmlType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-PassThruType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/new-rgsreport/\"\n},{\n  \"id\": \"powershell-new-spfrecord\",\n  \"title\": \"New-SPFRecord\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"New-SPFRecordSYNOPSISCreate SPF record for a given mail domain.SYNTAXNew-SPFRecord [[-DomainName] &lt;String&gt;] [-mx] [-a] [-ptr] [[-IncludeIP] &lt;IPAddress[]&gt;] [[-IncludeDomain] &lt;String&gt;] [[-IncludeHost] &lt;String&gt;] [[-Action] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function helps with creating SPF records for mail domains.The SPF record should look something like this:v=spf1 mx a ptr ip4:127.1.1.1/24 a:host.example.com include:example.com -allMore information: https://www.ietf.org/rfc/rfc4408.txtEXAMPLESEXAMPLE 1Get-AcceptedDomain | New-SPFRecord -mx -IncludeDomain spf.protection.outlook.com -IncludeIP 192.0.2.1,2001:DB8::1 -Action FailDomainName : uclab.euRecord     : “v=spf1 mx ip4:192.0.2.1 ip6:2001:DB8::1 include:spf.protection.outlook.com -all”The above example creates SPF records for all accepted domains in Exchange (Online).PARAMETERS-DomainNameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-mxType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-aType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-ptrType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-IncludeIPType: IPAddress[]Parameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-IncludeDomainType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-IncludeHostType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ActionType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: FailAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string][AcceptedDomain]This function accepts a string or objects with a DomainName property (such as returned by Get-AcceptedDomain) as input.OUTPUTS[psobject]This function writes a custom object to the pipeline.NOTESAuthor: @torgglerRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/new-spfrecord/\"\n},{\n  \"id\": \"powershell-remove-etchostsentry\",\n  \"title\": \"Remove-EtcHostsEntry\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Remove-EtcHostsEntrySYNOPSISRemove an entry from local hosts file by it’s IP address.SYNTAXRemove-EtcHostsEntry [[-IPAddress] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONFind an IP address and remove all lines where it appears from the \\\\etc\\\\hosts file of the local computer.EXAMPLESEXAMPLE 1Remove-EtcHostsEntry -IPAddress 1.1.1.1This example removes following lines from the hosts file1.1.1.1 test.test1.1.1.1 another.test.comPARAMETERS-IPAddressIPAddress of the hosts entry to be addedType: StringParameter Sets: (All)Aliases: ipRequired: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/remove-etchostsentry/\"\n},{\n  \"id\": \"powershell-show-etchosts\",\n  \"title\": \"Show-EtcHosts\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Show-EtcHostsSYNOPSISDisplay /etc/hosts file content on Windows or Linux/macOS.SYNTAXShow-EtcHosts [&lt;CommonParameters&gt;]DESCRIPTIONThis funtion gets the content of the hosts file, parses the lines and outputsa custom object with HostName and IPAddress properties.EXAMPLESExample 1PS C:\\\\&gt; PARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/show-etchosts/\"\n},{\n  \"id\": \"powershell-show-wlanprofile\",\n  \"title\": \"Show-WlanProfile\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Show-WlanProfileSYNOPSISGet wlan pre-shared key.SYNTAXShow-WlanProfile [[-Name] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function invokes the netsh tool to get the pre-shared key for a given wireless lan profile.EXAMPLESEXAMPLE 1Show-WlanProfile \\\"my_net\\\"This example shows the key for the wlan profile “my_net”EXAMPLE 2Get-WlanProfile | Show-WlanProfileThis example shows the keys for all known wlan profiles on the system.PARAMETERS-NameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/show-wlanprofile/\"\n},{\n  \"id\": \"powershell-test-exchangeautodiscover\",\n  \"title\": \"Test-ExchangeAutodiscover\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-ExchangeAutodiscoverSYNOPSISTest Exchange Autodiscover Web Service.SYNTAXTest-ExchangeAutodiscover [[-EmailAddress] &lt;String&gt;] [[-ComputerName] &lt;String&gt;] [[-Credential] &lt;PSCredential&gt;] [-ExcludeExplicitO365Endpoint] [[-Report] &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function tests the Exchange Autodiscover Web Serivce for a given Emailaddress.If ComputerName is not specified,the function tries to look up the Autodiscover service using the Outlook Clients logic.Locally cached and SCP dataare not evaluated.EXAMPLESEXAMPLE 1Test-ExchangeAutodiscover thomas@ntsystems.it -Credential (Get-Credential)This example tests the Autodiscover service for the given mailbox.It will query dns for autodiscover.ntsystems.it and _autodiscover._tcp.ntsystems.it. It will then try to retrieve an Autodiscover payload from https://ntsystems.it, https://autodiscover.ntsystems.it and the Office 365 endpoint.PARAMETERS-EmailAddressType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ComputerNameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-CredentialType: PSCredentialParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ExcludeExplicitO365EndpointType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-ReportType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-exchangeautodiscover/\"\n},{\n  \"id\": \"powershell-test-federationservice\",\n  \"title\": \"Test-FederationService\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-FederationServiceSYNOPSISTest the ADFS web serviceSYNTAXTest-FederationService [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to test if the federation service metadata can be retrieved from a given server.EXAMPLESEXAMPLE 1Test-FederationService -ComputerName fs.uclab.euThis example gets federation service xml information over the server fs.uclab.euPARAMETERS-ComputerNameSpecifies the name of the federation serverType: StringParameter Sets: (All)Aliases: ServerRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-federationservice/\"\n},{\n  \"id\": \"powershell-test-lyncdns\",\n  \"title\": \"Test-LyncDNS\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-LyncDNSSYNOPSISTest DNS entries for Skype for Business / Lync deployments.SYNTAXDESCRIPTIONThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.The NameSever parameter can be used to specify a nameserver.EXAMPLESEXAMPLE 1Test-LyncDNS -SipDomain uclab.euThis example queries DNS records for the domain uclab.euPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-lyncdns/\"\n},{\n  \"id\": \"powershell-test-lyncdiscover\",\n  \"title\": \"Test-LyncDiscover\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-LyncDiscoverSYNOPSISTest the Lyncdiscover service for Skype for Business/Lync deploymentsSYNTAXDESCRIPTIONThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.EXAMPLESEXAMPLE 1Test-LyncDiscover -SipDomain uclab.eu -HttpThis example gets Lyncdiscover information over http for the domain uclab.euPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-lyncdiscover/\"\n},{\n  \"id\": \"powershell-test-oosfarm\",\n  \"title\": \"Test-OOSFarm\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-OOSFarmSYNOPSISGet internal and external URLs for PowerPoint sharing.SYNTAXTest-OOSFarm [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get and parse hosting discovery information for Office Online Server farms.If successfull, it returns a custom object with the internal and external URL for PowerPoint sharing.EXAMPLESEXAMPLE 1Test-OOSFarm -Name oos.example.comThis example tries to retrieve information from https://oos.example.com/hosting/discoveryPARAMETERS-ComputerNameSpecifies the name of the OOS server/farmType: StringParameter Sets: (All)Aliases: Server, Farm, NameRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-oosfarm/\"\n},{\n  \"id\": \"powershell-test-sfbdns\",\n  \"title\": \"Test-SfBDNS\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-SfBDNSSYNOPSISTest DNS entries for Skype for Business / Lync deployments.SYNTAXTest-SfBDNS [-SipDomain] &lt;String&gt; [[-NameServer] &lt;IPAddress&gt;] [-OpenDNS] [-internal] [-testConnection] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.The NameSever parameter can be used to specify a nameserver.EXAMPLESEXAMPLE 1Test-LyncDNS -SipDomain uclab.euThis example queries DNS records for the domain uclab.euPARAMETERS-SipDomainSpecifies the DNS domain name to testType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-NameServerSpecifies the nameserver which is used by Resolve-DnsNameType: IPAddressParameter Sets: (All)Aliases: ServerRequired: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-OpenDNSA quick way to use OpenDns servers instead of using NameServerType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-internalDo also query for internal records, they should only resolve when testing from the internal networkType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-testConnectionDo also test a TLS connection to the servers received from the queryType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-sfbdns/\"\n},{\n  \"id\": \"powershell-test-sfbdiscover\",\n  \"title\": \"Test-SfBDiscover\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-SfBDiscoverSYNOPSISTest the Lyncdiscover service for Skype for Business/Lync deploymentsSYNTAXTest-SfBDiscover [-SipDomain] &lt;String&gt; [-Http] [-internal] [-Online] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.EXAMPLESEXAMPLE 1Test-LyncDiscover -SipDomain uclab.eu -HttpThis example gets Lyncdiscover information over http for the domain uclab.euPARAMETERS-SipDomainSpecifies a DNS domain name to testType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-HttpUse HTTP instead of HTTPSType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-internalUse internal name (lyncdiscoverinternl) instead of the external one (lyncdiscover)Type: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-OnlineTest against Office 365 endpointsType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-sfbdiscover/\"\n},{\n  \"id\": \"powershell-test-tcpconnection\",\n  \"title\": \"Test-TCPConnection\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-TCPConnectionSYNOPSISTest if a TCP Connection can be established.SYNTAXTest-TCPConnection [-ComputerName] &lt;Object&gt; [[-Port] &lt;Object&gt;] [-Count &lt;Int32&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses System.Net.Sockets.Tcpclient to test if a TCP connection can be established with aComputerName on a given port.Much like “telnet” which is not installed by default.EXAMPLESEXAMPLE 1Test-TcpConnection -ComputerName www.ntsystems.itThis example tests if port 80 can be reached on www.ntsystems.itEXAMPLE 2Test-TcpConnection -ComputerName www.ntsystems.it -Port 25 -Count 4This example tests for 4 times if port 25 can be reached on www.ntsystems.itPARAMETERS-ComputerNameSpecifies the DNS name of the computer to testType: ObjectParameter Sets: (All)Aliases: HostName, Server, RemoteHostRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-PortSpecifies the TCP port to test on the remote computer.Type: ObjectParameter Sets: (All)Aliases: RemotePortRequired: FalsePosition: 2Default value: 80Accept pipeline input: FalseAccept wildcard characters: False-CountSpecifies the number of tests to run, this can be useful when testing load-balanced services; default is 1Type: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: 1Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.BooleanNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-tcpconnection/\"\n},{\n  \"id\": \"powershell-test-tlsconnection\",\n  \"title\": \"Test-TLSConnection\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Test-TLSConnectionSYNOPSISTest if a TLS Connection can be established.SYNTAXComputerNameTest-TLSConnection [-ComputerName] &lt;Object&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]UriTest-TLSConnection -Uri &lt;Uri&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses System.Net.Sockets.Tcpclient and System.Net.Security.SslStream to connect to a ComputerName andauthenticate via TLS.This is useful to check if a TLS connection can be established and if the certificate used onthe remote computer is trusted on the local machine.If the connection can be established, the certificate’s properties will be output as custom object.Optionally the certificate can be downloaded using the -SaveCert switch.The Protocol parameter can be used to specifiy which SslProtocol is used to perform the test.The CheckCertRevocationStatus parametercan be used to disable revocation checks for the remote certificate.EXAMPLESEXAMPLE 1Test-TlsConnection -ComputerName www.ntsystems.itThis example connects to www.ntsystems.it on port 443 (default) and outputs the certificate’s properties.EXAMPLE 2Test-TlsConnection -ComputerName sipdir.online.lync.com -Port 5061 -Protocol Tls12 -SaveCertThis example connects to sipdir.online.lync.com on port 5061 using TLS 1.2 and saves the certificate to the temp folder.EXAMPLE 3Test-TlsConnection -IPAddress 1.1.1.1 -ComputerName whatever.cloudflare.comThis example connects to the IP 1.1.1.1 using a Hostname of whatever.cloudflare.com.This can be useful to test hosts that don’t have DNS records configured.EXAMPLE 4\\\"host1.example.com\\\",\\\"host2.example.com\\\" | Test-TLSConnection -Protocol Tls11 -QuietThis example tests connection to the hostnames passed by pipeline input.It uses the -Quiet parameter and therefore only returns true/flase.PARAMETERS-ComputerNameSpecifies the DNS name of the computer to testType: ObjectParameter Sets: ComputerNameAliases: Server, Name, HostNameRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-UriType: UriParameter Sets: UriAliases: ExternalUrlRequired: TruePosition: NamedDefault value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-IPAddressSpecifies the IP Address of the computer to test.Can be useful if no DNS record exists.Type: IPAddressParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PortSpecifies the TCP port on which the TLS service is running on the computer to testType: ObjectParameter Sets: (All)Aliases: RemotePortRequired: FalsePosition: 2Default value: 443Accept pipeline input: FalseAccept wildcard characters: False-ProtocolType: SslProtocols[]Parameter Sets: (All)Aliases:Accepted values: None, Ssl2, Ssl3, Tls, Default, Tls11, Tls12, Tls13Required: FalsePosition: 3Default value: Tls12Accept pipeline input: FalseAccept wildcard characters: False-FilePathSpecifies a path to a file (.cer) where the certificate should be saved if the SaveCert switch parameter is usedType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Temp.cerAccept pipeline input: FalseAccept wildcard characters: False-CheckCertRevocationStatusCheck revocation information for remote certificate.Default is true.Type: BooleanParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: TrueAccept pipeline input: FalseAccept wildcard characters: False-SaveCertSaves the remote certificate to a file, the path can be specified using the FilePath parameterType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-QuietOnly returns true or false, instead of a custom object with some information.Type: SwitchParameterParameter Sets: (All)Aliases: SilentRequired: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.Management.Automation.PSObjectSystem.BooleanNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/test-tlsconnection/\"\n},{\n  \"id\": \"powershell-update-filewritetime\",\n  \"title\": \"Update-FileWriteTime\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Update-FileWriteTimeSYNOPSISTouch a file.SYNTAXUpdate-FileWriteTime [-Name] &lt;String[]&gt; [-Date &lt;DateTime&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function checks whether a given file exists, and if so, updates the LastWriteTime property of the given file.Should the file not exist, a new, empty file is created.This function works on Linux/macOS.EXAMPLESEXAMPLE 1touch myfileThis example creates myfile if it does not exist in the current directory.If the file does exist, the LastWriteTime property will be updated.PARAMETERS-NameOne or more filenames to be touchedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-DateSpecify a specific date for LastWriteTimeType: DateTimeParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: (Get-Date)Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\",\n  \"url\": \"https://onprem.wtf/powershell/update-filewritetime/\"\n},{\n  \"id\": \"tags-adfs\",\n  \"title\": \"ADFS\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/adfs/\"\n},{\n  \"id\": \"tags-ai\",\n  \"title\": \"AI\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/ai/\"\n},{\n  \"id\": \"tags-asr\",\n  \"title\": \"ASR\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/asr/\"\n},{\n  \"id\": \"tags-appv\",\n  \"title\": \"AppV\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/appv/\"\n},{\n  \"id\": \"tags-audiocodes\",\n  \"title\": \"AudioCodes\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/audiocodes/\"\n},{\n  \"id\": \"tags-azure\",\n  \"title\": \"Azure\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/azure/\"\n},{\n  \"id\": \"tags-basics\",\n  \"title\": \"Basics\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/basics/\"\n},{\n  \"id\": \"tags-cisco\",\n  \"title\": \"Cisco\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/cisco/\"\n},{\n  \"id\": \"tags-citrix\",\n  \"title\": \"Citrix\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/citrix/\"\n},{\n  \"id\": \"tags-client\",\n  \"title\": \"Client\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/client/\"\n},{\n  \"id\": \"tags-cloud\",\n  \"title\": \"Cloud\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/cloud/\"\n},{\n  \"id\": \"tags-crypto\",\n  \"title\": \"Crypto\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/crypto/\"\n},{\n  \"id\": \"tags-events\",\n  \"title\": \"Events\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/events/\"\n},{\n  \"id\": \"tags-exchange\",\n  \"title\": \"Exchange\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/exchange/\"\n},{\n  \"id\": \"tags-firewall\",\n  \"title\": \"Firewall\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/firewall/\"\n},{\n  \"id\": \"tags-github\",\n  \"title\": \"GitHub\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/github/\"\n},{\n  \"id\": \"tags-go\",\n  \"title\": \"Go\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/go/\"\n},{\n  \"id\": \"tags-help\",\n  \"title\": \"Help\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/help/\"\n},{\n  \"id\": \"tags-home-server\",\n  \"title\": \"Home-Server\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/home-server/\"\n},{\n  \"id\": \"tags-hybrid\",\n  \"title\": \"Hybrid\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/hybrid/\"\n},{\n  \"id\": \"tags-hyper-v\",\n  \"title\": \"Hyper-V\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/hyper-v/\"\n},{\n  \"id\": \"tags-intune\",\n  \"title\": \"Intune\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/intune/\"\n},{\n  \"id\": \"tags-jekyll\",\n  \"title\": \"Jekyll\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/jekyll/\"\n},{\n  \"id\": \"tags-lync\",\n  \"title\": \"Lync\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/lync/\"\n},{\n  \"id\": \"tags-markdown\",\n  \"title\": \"MarkDown\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/markdown/\"\n},{\n  \"id\": \"tags-network\",\n  \"title\": \"Network\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/network/\"\n},{\n  \"id\": \"tags-office365\",\n  \"title\": \"Office365\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/office365/\"\n},{\n  \"id\": \"tags-onlinehelp\",\n  \"title\": \"OnlineHelp\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/onlinehelp/\"\n},{\n  \"id\": \"tags-powershell\",\n  \"title\": \"PowerShell\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/powershell/\"\n},{\n  \"id\": \"tags-rds\",\n  \"title\": \"RDS\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/rds/\"\n},{\n  \"id\": \"tags-rm\",\n  \"title\": \"RM\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/rm/\"\n},{\n  \"id\": \"tags-sql\",\n  \"title\": \"SQL\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/sql/\"\n},{\n  \"id\": \"tags-security\",\n  \"title\": \"Security\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/security/\"\n},{\n  \"id\": \"tags-server-2003\",\n  \"title\": \"Server-2003\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2003/\"\n},{\n  \"id\": \"tags-server-2008-r2\",\n  \"title\": \"Server-2008-R2\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2008-r2/\"\n},{\n  \"id\": \"tags-server-2008\",\n  \"title\": \"Server-2008\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2008/\"\n},{\n  \"id\": \"tags-server-2012-r2\",\n  \"title\": \"Server-2012-R2\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2012-r2/\"\n},{\n  \"id\": \"tags-server-2012\",\n  \"title\": \"Server-2012\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server-2012/\"\n},{\n  \"id\": \"tags-server\",\n  \"title\": \"Server\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/server/\"\n},{\n  \"id\": \"tags-sharepoint\",\n  \"title\": \"Sharepoint\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/sharepoint/\"\n},{\n  \"id\": \"tags-skype4b\",\n  \"title\": \"Skype4B\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/skype4b/\"\n},{\n  \"id\": \"tags-teams\",\n  \"title\": \"Teams\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/teams/\"\n},{\n  \"id\": \"tags-update\",\n  \"title\": \"Update\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/update/\"\n},{\n  \"id\": \"tags-vmware\",\n  \"title\": \"VMware\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/vmware/\"\n},{\n  \"id\": \"tags-veeam\",\n  \"title\": \"Veeam\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/veeam/\"\n},{\n  \"id\": \"tags-wsl\",\n  \"title\": \"WSL\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/wsl/\"\n},{\n  \"id\": \"tags-workplace\",\n  \"title\": \"Workplace\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/workplace/\"\n},{\n  \"id\": \"tags-zed\",\n  \"title\": \"Zed\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/zed/\"\n},{\n  \"id\": \"tags-de\",\n  \"title\": \"de\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/de/\"\n},{\n  \"id\": \"tags-en\",\n  \"title\": \"en\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/en/\"\n},{\n  \"id\": \"tags-macos\",\n  \"title\": \"macOS\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/macos/\"\n},{\n  \"id\": \"tags-ntsystems\",\n  \"title\": \"ntSystems\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/ntsystems/\"\n},{\n  \"id\": \"tags-technology\",\n  \"title\": \"technology\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/technology/\"\n},{\n  \"id\": \"tags-uag\",\n  \"title\": \"uag\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf/tags/uag/\"\n},{\n  \"id\": \"post-lost-found-ai-highlights\",\n  \"title\": \"lost & found: AI highlights of the week\",\n  \"author\": \"tto\",\n  \"tags\": [\"AI\"],\n  \"content\": \"I learned a lot attending AI Lowlands this week and wanted to share some links and highlights.gpt-realtime and vibevoiceOpenAI’s gpt-realtime is available on Microsoft Foundry very fast but quite expensive.Microsoft just launched VibeVoice-Realtime.llms.txt and NLwebllms.txt as a way to provide LLM-friendly content has been around for a little while.Microsoft proposes NLweb as a proof-of-concept for conversational interfaces and a semantic layer for the web.planetary defensehera.space is on a mission to study asteroid deflection. the website is also a super-cool multi-modal AI showcase.\",\n  \"url\": \"https://onprem.wtf/post/lost-found-ai-highlights/\"\n},{\n  \"id\": \"post-technology-transforms-everything\",\n  \"title\": \"The Ecological Nature of Technological Change\",\n  \"author\": \"tto\",\n  \"tags\": [\"technology\"],\n  \"content\": \"  Technological change is not additive; it is ecological. A new medium does not add something; it changes everything.I’ve been thinking about this quote from media theorist Neil Postman lately. Written in the 1990s about television’s impact on society, it feels more relevant than ever as we watch AI reshape our industry.From Smartphones to AI: Patterns of ChangeConsider the smartphone: it didn’t just add a portable phone to our lives - it transformed how we navigate spaces (goodbye paper maps), coordinate socially (from fixed meeting times to fluid arrangements), and process information. This wasn’t simply adding features; it was a fundamental reshaping of our behaviors and capabilities.The AI Transformation in ITToday, we’re witnessing a similar ecological transformation with AI in the IT industry. Like previous technological waves, the initial phase brings a surge of integration work - much as we saw with cloud adoption. But AI isn’t just another tool being added to our stack; it’s reshaping the entire landscape of how we work.The traditional cycle of coding, debugging, and deployment is evolving. But perhaps most intriguingly, while previous technological advances often reduced human interaction, AI might do the opposite. By handling routine tasks, it could create more space for meaningful human collaboration.Looking AheadHowever, this remains largely theoretical. While we’re seeing increased integration work now, the deeper transformation of workplace dynamics will take time. Technology capabilities may advance rapidly, but organizational and human adaptation follows its own pace.The challenge ahead isn’t just technical implementation - it’s about thoughtfully shaping AI’s role to enhance rather than diminish human connection in our work. As with any ecological change, the outcomes will depend not just on the technology itself, but on how we choose to integrate it into our (professional) lives.— TomThis post was generated from a conversation I had with Claude.\",\n  \"url\": \"https://onprem.wtf/post/technology-transforms-everything/\"\n},{\n  \"id\": \"post-zed-pwsh\",\n  \"title\": \"Zed and PowerShell on macOS\",\n  \"author\": \"tto\",\n  \"tags\": [\"Zed\",\"PowerShell\"],\n  \"content\": \"VSCode has been my daily driver pretty much since it launched. It’s got a great community and amazing extensions, but sometimes it’s slow, and it started draining my battery a lot. I began looking for alternatives, and it wasn’t long before I came across Zed. Zed is a relatively new, high-performance code editor. It’s so fast that typing literally feels easier :)Most of my (coding) work revolves around PowerShell, so the lack of support was a problem for me. I followed Zed Industries’ GitHub and noticed that some good soul closed this issue a few days ago. Did they just add support for PowerShell? The answer is yes, as it turns out!The ExtensionFirst of all, we need to install the PowerShell extension. Like in VSCode, press ⌘ ⇧ X (Command + Shift + X) to open the extensions tab. Type “PowerShell” and press install.PowerShell Editor ServicesThen we need a language server to provide common editor features for the PowerShell language. Think tab completion, IntelliSense, best practices, and so on. There’s a PowerShell module that provides just that:             PowerShell/PowerShellEditorServices    Download the latest release and unzip it to a folder on your local device; in my case, it is: /Users/tom/code/PowerShellEditorServices.Zed ConfigurationLastly, we need to tell Zed where to find the language server (LSP). Again, like in VSCode, press ⌘ , (Command + ,) to open settings and configure the LSP. You can also set pwsh as the default shell and much more.\\\"terminal\\\": {  \\\"shell\\\": {    \\\"program\\\": \\\"pwsh\\\"  }},\\\"lsp\\\": {  \\\"powershell-es\\\": {    \\\"command\\\": \\\"pwsh\\\",    \\\"args\\\": [      \\\"-NoProfile\\\",      \\\"-Command\\\",      \\\"/Users/tom/code/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1\\\"    ]  }}Have fun!\",\n  \"url\": \"https://onprem.wtf/post/zed-pwsh/\"\n},{\n  \"id\": \"post-setup-sign-in-with-apple-with-azure-swa\",\n  \"title\": \"Configure Sign in with Apple for Azure Static Web App\",\n  \"author\": \"tto\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"I’m working on a side project and decided to use Sign in with Apple as an additional authentication provider, next to AAD that I would normally use.As per Microsoft’s documentation, adding apple as custom authentication provider is simple enough, just add the following lines to your staticwebapp.config.json file:\\\"identityProviders\\\": {    \\\"apple\\\": {    \\\"registration\\\": {        \\\"clientIdSettingName\\\": \\\"APPLE_CLIENT_ID\\\",        \\\"clientSecretSettingName\\\": \\\"APPLE_CLIENT_SECRET\\\"    }  }}Then we add the two setting names to the Web App’s configuration and we’re done, right? Almost.First we have to take a deep-dive into JWT as the APPLE_CLIENT_SECRET must be a signed JWT. There is no documentation specifically for Static Web Apps but this one for App Service is close enough.I converted the sample C# code to powershell for easier use. The required package have a dependency loop and so, instead of easily installing them with Install-Package I had to use nuget. Follow the documentation above to obtain client id, team id, key id, and the key in pkcs8 format, then use the following snippet to generate the client secret:function Get-AppleClientSecret {    param (        [string]$TeamId,        [string]$ClientId,        [string]$KeyId,        [System.IO.FileInfo]$P8KeyFile    )    $p8Content = Get-Content -Path $p8keyfile    $p8key = $p8Content.where{$_ -notmatch \\\"^---\\\"} -join(\\\"\\\")    [string]$audience = \\\"https://appleid.apple.com\\\"    [string]$issuer = $teamId    [string]$subject = $clientId    [string]$kid = $keyId    $Claims = New-Object -TypeName System.Collections.Generic.List[System.Security.Claims.Claim]    $Claims.Add(        (New-Object -TypeName System.Security.Claims.Claim(\\\"sub\\\", $subject))    )        $cngKey = [System.Security.Cryptography.CngKey]::Import(        [Convert]::FromBase64String($p8key),         [System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob    )    $signingCred = New-Object Microsoft.IdentityModel.Tokens.SigningCredentials(        (New-Object Microsoft.IdentityModel.Tokens.ECDsaSecurityKey(            (New-Object System.Security.Cryptography.ECDsaCng($cngKey)        ))),        \\\"ES256\\\" # EcdsaSha256    )    $NotBefore = Get-Date    $Expires = (Get-Date).AddDays(180)    $token = New-Object -TypeName System.IdentityModel.Tokens.Jwt.JwtSecurityToken(        $Issuer,         $Audience,         $Claims,         $NotBefore,         $Expires,         $signingCred    )    $null = $token.Header.Add(\\\"kid\\\", $kid)    $null = $token.Header.Remove(\\\"typ\\\")    $tokenHandler = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler        return $tokenHandler.WriteToken($token)}# install &amp; import requirementsInvoke-WebRequest -Uri 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' -OutFile \\\"$env:USERPROFILE\\\\Downloads\\\\nuget.exe\\\"&amp; \\\"$env:USERPROFILE\\\\Downloads\\\\nuget.exe\\\" Install System.IdentityModel.Tokens.Jwt -Version 6.32.0 -OutputDirectory \\\"$env:USERPROFILE\\\\Downloads\\\\.nuget\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.Tokens\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Tokens.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\System.IdentityModel.Tokens.Jwt\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\System.IdentityModel.Tokens.Jwt.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.Logging\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Logging.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\Microsoft.IdentityModel.JsonWebTokens\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.JsonWebTokens.dll\\\"Add-Type -Path \\\"$env:USERPROFILE\\\\.nuget\\\\packages\\\\microsoft.identitymodel.abstractions\\\\6.32.0\\\\lib\\\\netstandard2.0\\\\Microsoft.IdentityModel.Abstractions.dll\\\"# set parameters and get secret$p = @{    TeamId = \\\"Q847A7FG64\\\"    ClientId = \\\"wtf.onprem.appleid\\\"    KeyId = \\\"8QKD4J6XDZ\\\"    P8KeyFile = \\\".\\\\AuthKey_8QKD4J6XDZ.p8\\\"}Get-AppleClientSecret @pOnce we have obtained the APPLE_CLIENT_SECRET, the sign in process with Apple should be successful. However, after signing in, we are redirected to the Static Web App and greeted with a 403: Forbidden:  We need an email address or a handle from your login service. To use this login, please update your account with the missing info.It turns out the identityProviders example given in Microsoft’s documentation is not quite complete. Sign in with Apple only inserts the user’s email address as claim in the authentication token if we specifically ask for it during the sing in process. To do that, we have to add the scopes property to the staticwebapp.config.json file:\\\"identityProviders\\\": {    \\\"apple\\\": {    \\\"registration\\\": {        \\\"clientIdSettingName\\\": \\\"APPLE_CLIENT_ID\\\",        \\\"clientSecretSettingName\\\": \\\"APPLE_CLIENT_SECRET\\\"    },    \\\"login\\\": {        \\\"scopes\\\": [\\\"email\\\"]    }  }}Adding the scope will allow new users to sign in successfully. Users that had already signed in must first remove the app from Sign in with Apple in their Apple account.So, after adding the scope and removing the app from Sign in with Apple, we can finally attempt to sign in again and we should see that the user has to consent sharing their email address in the sign in process:                \",\n  \"url\": \"https://onprem.wtf/post/setup-sign-in-with-apple-with-azure-swa/\"\n},{\n  \"id\": \"post-mastodon-and-webfinger\",\n  \"title\": \"Mastodon and WebFinger\",\n  \"author\": \"tto\",\n  \"tags\": [\"ntSystems\",\"PowerShell\"],\n  \"content\": \"With the uncertainty surrounding Twitter I have decided to set up an account on Mastodon. If you haven’t heard about it Mastodon is an de-centralized, open-source alternative to centralized social media. It is powered by open protocols such as ActivityPub and WebFinger which allow federation of individual servers (called instances).If a user on one server searches for a user on another server, they will enter the full name, i.e. @user@example.com, into the search field. The server will then look for information about the user at the path https://example.com/.well-known/webfinger. If found, the reply contains information about where the profile of the user can be found.We can use this protocol to be discoverable by servers on our own domain. We are using Bridgetown to build this site so placing a JSON file at this path src/.well-known/webfinger did the trick. So even though my profile is currently hosted at masto.ai you can still find me with @tom@onprem.wtf. And if you do find me, give me a follow :)I used this PowerShell function to test the WebFinger endpoint on our and other sites.function Invoke-WebFinger {    [CmdletBinding()]    param(        [Parameter(ValueFromPipeline)]        [ValidatePattern('^@?[\\\\d\\\\w]+@[\\\\d\\\\w]+\\\\.[\\\\d\\\\w]+')]        [string]$Uri,        [string]$Server,        [string]$Username    )    process {        if($Uri){            $Username, $server = $uri -replace '^@' -split '@'        }        $webFingerUri = \\\"https://$server/.well-known/webfinger?resource=acct:$Username@$Server\\\"        Write-Verbose \\\"GET $webFingerUri\\\"        $r = Invoke-RestMethod -Uri $webFingerUri        [PSCustomObject]@{            Uri = $Username,$Server -join '@'            Subject = $r.subject            Aliases = $r.Aliases            ProfilePage = $r.links.where{$_.rel -eq 'http://webfinger.net/rel/profile-page'}.href        }    }}# Examples'tto@masto.ai','@tom@onprem.wtf' | Invoke-WebFingerInvoke-WebFinger -Uri tom@onprem.wtfInvoke-WebFinger -Server onprem.wtf -Username tomOther people wrote about this:  Use your own user @ domain for Mastodon discoverability with the WebFinger Protocol without hosting a server  Mastodon on your own domain without hosting a server  Using Cloudflare to Customize Your Mastodon Username Domain\",\n  \"url\": \"https://onprem.wtf/post/mastodon-and-webfinger/\"\n},{\n  \"id\": \"post-how-to-connect-exchange-online-managed-identity\",\n  \"title\": \"How to connect to Exchange Online powershell with a managed identity\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Azure\",\"Exchange\"],\n  \"content\": \"The latest preview version of the ExchangeOnlineManagement powershell module includes the following new parameters: -ManagedIdentity and -ManagedIdentityAccountId.As their names imply, they can be used to connect to Exchange Online with a managed identity. According to the documentation this is currently only supported with Azure Virtual Machines and Virtual Machine Scale Sets, however I have used this successfully within Azure Automation runbooks.Create the automation accountIf you have an existing account skip this step. I will be reusing the variables from this first example, so fill in the name of your automation account and the resource group.$accountName = 'azautomation1'$rgName = 'onprem-core'$location = 'West Europe'Connect-AzAccountNew-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -Location $locationGet the moduleThe first step is to add the module to the Automation Account. Installing it through the Azure Portal did not work, as that way only seems to support the latest non-preview version. I used the following commands from the Az powershell module to install the preview version of the module in my automation account:$moduleName = 'ExchangeOnlineManagement'$moduleVersion = '2.0.6-Preview7'New-AzAutomationModule -AutomationAccountName $accountName -ResourceGroupName $rgName -Name $moduleName -ContentLinkUri \\\"https://www.powershellgallery.com/api/v2/package/$moduleName/$moduleVersion\\\"Managed IdentityNow it’s time to enable the system assigned managed identity for the automation account. We can do this through the Azure portal by navigating to the automation account and setting the Status to On under Identity. Alternatively, we can use the Az powershell module like this:Set-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -AssignSystemIdentityNext we will need the id of the managed identity. It will show up in the Azure portal once it has been enabled or it can be retrieved with Az powershell:Get-AzADServicePrincipal -DisplayName $accountNameIn my case the object id is b395da15-4904-490c-9109-2bc91a12a08d. With this id in hand, we use the Microsoft Graph powershell SDK to grant the necessary permissions to the managed identity.Connect-MgGraph$params = @{    ServicePrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    PrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    ResourceId = (Get-MgServicePrincipal -Filter \\\"AppId eq '00000002-0000-0ff1-ce00-000000000000'\\\").id # Exchange online    AppRoleId = \\\"dc50a0fb-09a3-484d-be87-e023b12c6440\\\" # Exchange.ManageAsApp}New-MgServicePrincipalAppRoleAssignedTo @paramsLastly we want to assign the role Exchange Administrator to the managed identity. Again, we can do this through the Azure portal or with the following command:$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter \\\"DisplayName eq 'Exchange Administrator'\\\").idNew-MgRoleManagementDirectoryRoleAssignment -PrincipalId b395da15-4904-490c-9109-2bc91a12a08d -RoleDefinitionId 29232cdf-9323-42fd-ade2-1d097af3e4de -DirectoryScopeId \\\"/\\\"Please assign the role with the least amount of privileges to complete the task you need.Connect to Exchange Online in the runbookAfter completing the steps above we are ready to connect to Exchange Online using the managed identity in the runbook. If you create a new runbook, please make sure to use runtime version 5.1 as the that’s where we have imported the module earlier.Connect-ExchangeOnline -ManagedIdentity -Organization 'onpremwtf.onmicrosoft.com'Get-AcceptedDomainTom\",\n  \"url\": \"https://onprem.wtf/post/how-to-connect-exchange-online-managed-identity/\"\n},{\n  \"id\": \"post-goodbye-jekyll\",\n  \"title\": \"Goodbye Jekyll, hello Bridgetown!\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\"],\n  \"content\": \"We have been using Jekyll for our little site since 2016. It was fast, simple, it did it’s job nicely. Bridgetown does all the same things, and much more. It’s Jekyll’s modern cousin.We have used GitHub pages to host our site as it integrates nicely with Jekyll. I have long wanted to play with Cloudflare pages, so I decided to upgrade the site and move it over to Cloudflare in the progress.How to run Bridgetown on Cloudflare pages?Well, it’s easy enough, we just have to things to consider:  Include a .node-version file because Cloudflare pages defaults to 12.18.0 and bridgetown requires a version newer than 14  Set the BRIDGETOWN_ENV environment variable to productionTo tell Cloudflare pages to use a newer version of node, I created the file .node-version with the content 16.16.0 in the root directory of my repository. Just like with Jekyll, the base is a GitHub repository. All that’s left to do is sign in to Cloudflare and create a new pages project. I sign in to my GitHub account from Cloudflare, select the repository and enter the following information:Build command: bin/bridgetown deployBuild output directory: outputEnvironment variable: BRIDGETOWN_ENV  productionDone.Cloudflare redirectsWe have used Jekyll’s jekyll-redirect-from plugin to create redirects for some URLs. It seems bridgetown does not yet have a plugin for that, so I used Cloudflare page’s _redirect file instead. I created a file with the name _redirect in the src folder of my bridgetown project. The content of the file is like this:/a/very/long/url/path /shorturl 301You can read more in the docsI used the following few lines of powershell code to find Jekyll’s redirect_from statements in my source folder, convert them into slugs, and add them to the _redirect file.Get-ChildItem ./src/ -Recurse -Filter *.md | Select-String -pattern \\\"redirect_from\\\" | ForEach-Object {    $p = $_.path    $n = $_.filename    $l = $_.line    # remove date and extension from filename as slug contains neither    if($n -match \\\"^\\\\d{4}-\\\"){        $n = $n -replace \\\"\\\\d{4}-\\\\d{2}-\\\\d{2}-\\\",\\\"\\\"     }    $n = $n -replace \\\".md\\\",\\\"\\\"    $name = $n.ToLower()    # find parent path and create slug    $p = Split-Path -Path $p -Parent | Split-Path -Leaf    switch($p){        \\\"_OnlineHelp\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"Archive\\\" { $slug = \\\"/post/$name\\\" }        \\\"_Modules\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"_Scripts\\\" { $slug = \\\"/powershell/$name\\\" }        \\\"_posts\\\" { $slug = \\\"/post/$name\\\" }    }    # write _redirects file    $l -replace \\\"redirect_from: \\\",\\\"\\\" | ConvertFrom-Json | ForEach-Object {        \\\"$_ $slug 301\\\"    } } | Set-Content ./src/_redirects\",\n  \"url\": \"https://onprem.wtf/post/goodbye-jekyll/\"\n},{\n  \"id\": \"post-sender-authentication-exo-2021\",\n  \"title\": \"How to configure sender authentication for Exchange Online in 2021\",\n  \"author\": \"tto\",\n  \"tags\": [\"Office365\",\"Exchange\",\"Security\"],\n  \"content\": \"The current state of emailThe year is 2021 and, despite many efforts to kill it off, email is still going strong. According to Microsoft’s latest digital defense report Exchange Online Protection processed 6 trillion messages last year, 13 billion of which malicious. 6 trillion, that’s a number with 12 zeros. And that’s just Exchange Online. Worldwide we are sending and receiving over 300 billion emails every day, according to this site. 300 billion. Every day.With these numbers there’s no wonder email is one of the main threat vectors.As many organizations are moving their mailboxes to Exchange Online, I thought I would share my basic setup for new tenants. This will help you getting started with a secure configuration in no time. I have two goals with this basic setup:  Protect your brand (domain) from being spoofed/abused  Protect your users from receiving malicious emailsSender AuthenticationSo you have just signed up for a new tenant with Microsoft 365 and you are adding your custom domains. The wizard will ask you, whether or not you are planning to use Exchange Online and, if you select yes, it will help you setup SPF.Sender policy frameworkEven though it has only been published as proposed standard by the IETF in 2014, SPF has been around since the early 2000’s. Despite it’s age it is still something we regularly find missing or misconfigured in customer environments. SPF gives an administrator of an email domain a way to specify which systems (IP addresses) are allowed to send emails using the domain. The admin publishes a TXT record in the DNS, listing all IP addresses that are allowed to send emails. This would typically be your onprem Exchange servers or email gateways.Receiving systems check the TXT record and see if the system that’s trying to deliver a message is allowed to do so.If you want to start sending emails from Exchange Online, you should add the following line to your existing SPF record.include: include:spf.protection.outlook.comIf you don’t have an SPF record in place, create a new TXT record at the root of your domain with this content:v=spf include:spf.protection.outlook.com -all  If you are not using a domain for outbound email, please publish the following SPF record to make it harder for criminals to abuse your domain:  TXT: v=spf -allThis is how far the wizard goes but we should really always configure the following records as well.DomainKeys Identified MailDKIM has been standardized in 2011 and, in parts thanks to Exchange Online, is being used widely. However, we find SPF is better known and understood by our customers. DKIM leverages digital signatures that let a receiving system cryptographically verify whether an email was sent by an authorized system or not. The signature includes a domain name (d=) that should match the domain in the mail from address. Like SPF, DKIM uses DNS records in the sender’s email domain. The administrator of the domain publishes a TXT record that contains a public key and then configures the email server to sign all outgoing messages with the corresponding private key.Receiving systems see the signature and a so called selector in the header of the email. The selector tells the receiving system where to find the public key to verify the signature. As always with certificates, keys have to be rotated periodically which means DKIM DNS records must be updated accordingly. Sounds like a lot of complicated work, right?With Exchange Online, Microsoft does that work for you. All outgoing emails from Exchange Online are signed with a key that Microsoft manages. The only thing we have to do, is point our DNS to that key and enable the configuration. There is a lengthy docs article about DKIM and how to build the DNS records you have to publish. I am using a few lines of PowerShell to make that process easier.Use the following PowerShell snippet to:  Create a new DKIM signing configuration for your custom domain  Publish DNS records pointing to Microsoft domains  Enable the DKIM signing configuration# Create DKIM signing config for all domains that do not have one$d = Get-DkimSigningConfig$domains = $d.domainGet-AcceptedDomain | % {​​​​​​     if ($_.DomainName -in $domains) {​​​​​​}​​​​​​     else {​​​​​​ New-DkimSigningConfig -KeySize 2048 -DomainName $_.DomainName -Enabled $false}​​​​​​ }​​​​​# Create DNS RecordsGet-DkimSigningConfig | Where-Object Name -NotMatch onmicrosoft | Select-Object Name,*cname*,@{    n=\\\"Selector1\\\";    e={($_.Selector1CNAME -split \\\"-\\\" | Select-Object -First 1),$_.name -join \\\"._domainkey.\\\"}},@{      n=\\\"Selector2\\\";    e={($_.Selector2CNAME -split \\\"-\\\" | Select-Object -First 1),$_.name -join \\\"._domainkey.\\\"}} Once the DNS records are in place, we can go ahead and enable the DKIM configuration:Get-DkimSigningConfig | Set-DkimSigningConfig -Enabled $true  If you are not using a domain for outbound email, you don’t have to worry about DKIM.Domain-based Message Authentication, Reporting and ConformanceDMARC is the new kid on the bloc. Well kind of, the RFC is from 2015. It is yet another DNS record that an administrator can use to tell receiving systems what exactly they should do with emails that fail SPF or DKIM. Essentially DMARC builds on SPF and DKIM and uses both to calculate an authentication result that supports scenarios where SPF alone would fail (forwarding). The DMARC policy is also used to define what should happen with unaligned or failing DKIM signatures as DKIM itself doesn’t really specify that.So, another DNS record you said? Here we go:Name: _dmarc.example.comType: TXTValue: v=DMARC1; p=none; pct=100;  While the SPF record must be published at the root of your domain, the DMARC record must be at _dmarc.With DMARC it is recommended to implement monitoring, so we will have to look at an additional tool. I have found the DMARC Monitor from ValiMail is a good option to get started, it is also free for Microsoft 365 customers. There are many alternatives, please check with your security team if you already have a tool. Whichever tool you end up using, it will ask you to update your DMARC record to include an URI of a mailbox to send reports to. The rua and ruf tags in the TXT record are used for that, in the case of ValiMail the complete record looks like this:v=DMARC1; p=none; pct=100; rua=mailto:dmarc_agg@vali.email;This record tells a receiving system to deliver emails independent of the authentication result (p is set to none) and send aggregated reports (rua) to ValiMail.With this record in place, you are now ready to send emails from Exchange Online. But we’re not completely done with DMARC just yet.The ultimate goal is to set the DMARC policy to p=reject thereby telling any receiving system to reject emails that fail authentication. Before we can do that, we must make sure all legitimate emails pass authentication. The monitoring helps us verify exactly that, the example in the following screenshot shows outbound emails from our systems for the last month. As you can see, all of them authenticated successfully:                  Exchange Online does currently not send DMARC reports, so if you are sending only to Exchange Online recipients, don’t expect much information in your monitoring.Remember that I said from our systems above, now let’s change that filter in ValiMail and look at all emails from our domain. As you can see in the screenshot below, over the same period of time, 90 emails failed DMARC authentication:                In our case, we already have a reject policy in place, so receiving systems should not accept these emails which are spam or worse. So, after setting up DMARC monitoring with a policy of none, observe the situation for some time and, if you are confident your systems are configured correctly, go ahead and update the record:v=DMARC1; p=reject; pct=100; rua=mailto:dmarc_agg@vali.email;  If you are not using a domain for outbound email, please publish the following DMARC record to make it harder for criminals to abuse your domain:  TXT: v=DMARC1; p=reject; pct=100;In the next post we will have a look at preset security policies in Exchange Online Protection.— Tom.\",\n  \"url\": \"https://onprem.wtf/post/sender-authentication-exo-2021/\"\n},{\n  \"id\": \"post-why-is-this-website-fast\",\n  \"title\": \"Why is this website so fast?\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\",\"GitHub\"],\n  \"content\": \"I have recently updated our website and have learned a few things while doing so. As mentioned on the home page, this website is still built with Jekyll. The so-called grandfather of static website generators is maybe not perfect, but the following reasons make it a good option for me.  It just works: I don’t have much time to tinker with this side-project, there are no complicated, always changing dependencies like with newer, javascript-based tools (oh and no gigantic node_modules either)  It’s simple: True how variables are handled is not always intuitive but I have learned enough to use it effectively  GitHub pages: The build process is automated, I just push my changes and the rest is taken care ofYou promised fast, what’s all this?I’m getting there. Fast websites are generally associated with more modern site generators like Gatsby. These typically use a lot of javascript that makes them fast but also more complicated. I wanted to see, if I could get good results with good old Jekyll.This site is fast because it’s small and very simple. I’m not saying bigger sites don’t need all that node_modules goodness, I’m saying small sites - like this one - don’t need it.This site is also fast, because I’ve added a few extra lines to the head section of the html. At the end of every post you can find a next navigation button that brings you to the next post. With a little help from Jekyll, I was able to include the relative URL of the next post as link to the head section with the keyword rel=next. This little keyword tells the browser to download the post whenever it has a free moment:{% if page.next %}&lt;link rel=\\\"next\\\" href=\\\"{{ page.next.url }}\\\"&gt;{% endif %}The result is a super fast navigation experience because the target has already been downloaded. I’m also preloading fonts with rel=\\\"preload\\\" and the little CSS we use is inlined.Service workersAnother thing I learned while looking at modern websites is the concept of service workers. This is a little bit of javascript that can be very powerful indeed. Essentially, a service worker is a script that is installed in the browser when a user opens the website. Once installed it can intercept and handle network requests from the browser to the site. It’s a kind of proxy in your browser just for our site.I’m using a service worker to create a local cache for use with this site. On the first visit, the service downloads a few static files that visitors will definitely need (fonts, main pages). It uses a cache-first strategy, so whenever the browser requests something, the service worker looks in the cache first and returns any results from there. After that it goes out to the site and retrieves the latest version of what the browser was looking for. If there’s no cache-hit, the resource is fetched from the network.The service worker needs a manifest and we have to tell the browser where to find it. We add the manifest to the head section and use a few lines of javascript to trigger the installation of the service worker. This is the pointer to the manifest file:&lt;link rel=\\\"manifest\\\" href=\\\"/manifest.json\\\"&gt;And this is the code that registers the service worker in your browser after the page is loaded. I have added a condition to skip the registration if the site is accessed through localhost, which is the case when developing locally:if ('serviceWorker' in navigator &amp;&amp; !(/localhost/.test(window.location.href))) {  window.addEventListener('load', function() {    navigator.serviceWorker.register('//serviceworker.js')    console.log('Servie worker registered.');  });}Faster build times with Jekyll on WSLI have used Jekyll on Windows 10 leveraging the Windows Subsystem for Linux since 2017. Today I realized that actually storing the files within WSL makes the build time much (much) faster. Until today I stored the repository in my Windows user profile, something like C:\\\\users\\\\tto\\\\.... In the WSL I happily changed into this directory following /mnt/C/Users... before running jekyll serve. Build time was around 5 minutes. Not great.Today it ocurred to me to clone the repository again, this time into the WSL. So I can access it using a WSL path, something like /home/tto/.... Build time is now less than one minute. Not bad.WebpageTest resultsYou don’t have to take my word for it, webpagetest also thinks this website is pretty fast:                — Tom\",\n  \"url\": \"https://onprem.wtf/post/why-is-this-website-fast/\"\n},{\n  \"id\": \"post-so-long-2020\",\n  \"title\": \"So long, 2020\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\",\"GitHub\"],\n  \"content\": \"Goodbye 2020! What a year it has been.True, I had to cancel some trips and I stayed home a lot more than usual, but apart from that, it was a pretty spectacular year for me. I moved to Amsterdam from a smaller city in the outskirts. I was able to go to Zürich, Sardinia, Marbella, Napoli and a few other places. In a prolonged episode of lockdown blues I managed to get about 1000 km on my road bike done. However, that was sometime before the summer, since then I have been (a lot) less active. I worked a lot. I learned a lot.Since a certain global event made more travelling impossible, or at least not very recommendable, I’m staying in Amsterdam for the holiday season and started building this new site.After more than 10 years, it’s now time to say: Goodbye ntSystems.itWelcome onprem.wtfWelcome to our new home. This site is still build with Jekyll and hosted on GitHub pages. I replaced the default minima theme with a custom one, mostly because I wanted to learn and experiment with some CSS features. I also had a good look at some of the more modern static site generators and other alternatives but decided to stick with Jekyll because it is simple and I really don’t need all of that node_modules stuff for just a simple blog.The new site has a simpler layout with less clutter, should be easier to read on any screen, and it also has a dark theme. Actually, unless you select a theme, it will use the same settings that your operating system (or browser) uses. Pretty slick, right?What about the domain name you ask? Well, this one was available and it kind of fits with what we are doing at the moment. If you find a better one, I’m open to suggestions 😉What’s next?Well that’s a good question. For now, like many others, I’ll be watching how the vaccine rollout is going and what’s happening in the US of A. I would like to become a better writer so I will try to publish my thoughts more regularly. We’ll see how that goes.With that I wish you all the best for the new year.— Tom.\",\n  \"url\": \"https://onprem.wtf/post/so-long-2020/\"\n},{\n  \"id\": \"post-converting-powershell-help-to-a-website\",\n  \"title\": \"Convert PowerShell Help to a Website\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Help\",\"MarkDown\"],\n  \"content\": \"How to use the platyPS PowerShell module to convert comment-based help to markdown and easily host it on GitHub pages.Now you might have read that our blog is powered by Jekyll, which is a static-site generator that turns markdown files into html. So, obviously, if I would be able to convert PowerShell help content to markdown files, I could simply put them into a folder an serve them via the blog.Create markdown filesThe first step is to install platyPS (available on the PS Gallery) and create the markdown files for every function.Install-Module platyPSImport-Module platyPS, TAK, PSSpeechforeach ($cmdlet in (Get-Command -Module PSSpeech)) {     $h = Get-Help $($cmdlet.Name)    $meta = @{        'layout' = 'pshelp';        'author' = 'tto';        'title' = $($cmdlet.Name);        'category' = $($cmdlet.ModuleName.ToLower());        'excerpt' = \\\"`\\\"$($h.Synopsis)`\\\"\\\";        'date' = $(Get-Date -Format yyyy-MM-dd);        'redirect_from' = \\\"[`\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name)/`\\\", `\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name.ToLower())/`\\\", `\\\"/PowerShell/$($cmdlet.Name.ToLower())/`\\\"]\\\"    }    if($h.Synopsis -notmatch \\\"\\\\[|\\\\]\\\") {        New-MarkdownHelp -Command $cmdlet -OutputFolder .\\\\_OnlineHelp\\\\a -Metadata $meta -Force     }}The above example creates a .md help file for every function in the TAK module. The files are almost ready to be used by our Jekyll-powered blog, I’m using the -Metadata parameter to add some additional information to the ‘front matter’ of each file.  I could be using New-MarkdownHelp -Module TAK but that way, I was not able to include the metadata automatically.Rename files for JekyllThe only thing that I have to do now, in order to have Jekyll pick up the files and create websites, is to rename them accordingly.foreach ($file in (Get-ChildItem '.\\\\tak-md-help\\\\*.md')) {    $timestamp = (Get-Date -Format 'yyyy-MM-dd')    $NewName = $timestamp, $file.name -join '-'    Rename-Item -Path $file.FullName -NewName $NewName}The above example renames all *.md files in the tak-md-help folder to include a timestamp. This step is not necessary if you are using a collection in Jekyll.Include HelpUriThe Get-Help command has an -Online parameter, that can be used to easily open a related link when looking for help. To include this functionality in my scripts, I just have to put the URL of the online article in the [CmdletBinding()] statement, like so:[CmdletBinding(HelpUri = 'https://ntsystems.it/PowerShell/TAK/test-tlsconnection/')]Links  https://github.com/PowerShell/platyPSThat’s it :)Tom\",\n  \"url\": \"https://onprem.wtf/post/converting-powershell-help-to-a-website/\"\n},{\n  \"id\": \"post-using-powershell-and-azure-cognitive-services-to-convert-text-to-speech\",\n  \"title\": \"Using PowerShell and Azure Cognitive Services to convert text to speech\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"content\": \"In one of our recent Microsoft Teams projects I needed some voice prompts for a customer service call queue. I figured it would be nice to have Azure’s artificial-intelligence-powered speech service convert my text input to an audio file. Turns out it’s easier than I thought it would be.Azure Cognitive Speech ServiceFirst of all we need an Azure Subscription where we can deploy our Speech Services instance. If you don’t have an Azure subscription, you can sign up for a trial account using the links below. If you already have a subscription, you can easily create a free Speech Services account using the following commands from Azure Cloud Shell:az group create -n ntsystems-speech -l WestEuropeaz cognitiveservices account create -n ntsystems-speech -g ntsystems-speech --kind SpeechServices --sku F0 -l WestEurope --yesNow the account was created and we can start using it right away. To authenticate our calls from PowerShell, we need an API key, again we can use Azure Cloud Shell to retrieve the key:az cognitiveservices account keys list -n ntsystems-speech -g ntsystems-speechPowerShellThe speech service provides a well documented API that can easily be called using PowerShell’s native Invoke-RestMethod command. The required information is available on Microsoft Docs (link below), all I had to do is wrap a little PowerShell around it and I had created a quick module. You can install the module using the following command:Install-Module PSSpeechBefore we can call any of the speech service’s API endpoints, we have to use the API key to get a token and store it in a variable for later use:Get-SpeechToken -Key yourapikey | Save-SpeechTokenNow we should be able to get a list of available voices using Get-SpeechVoicesList | Format-Table.And finally we can convert some input text to speech using one of the voices from the list:Convert-TextToSpeech -Voice en-US-JessaNeural -Text \\\"Hi Tom, I'm Jessa from Azure!\\\" -Path jessa.mp3Convert-TextToSpeech -Voice en-GB-HarryNeural -Text \\\"Hi Tom, I'm Harry from Azure!\\\" -Path harry.mp3You can find a lot of information about the speech service in the links below, be sure to check out the SSML structure to see how you can customize the voices, introduce pauses to the audio file, and many other things.You can find the code for the module in my GitHub, please let me know if you find it useful and feel free to submit a pull request with your optimizations :)This is the first post in this new year, best wishes and thanks for reading!TomLinks  Speech Services  Speech Synthesis Markup Language (SSML)  Text to Speech REST API  PSSpeech Module\",\n  \"url\": \"https://onprem.wtf/post/using-powershell-and-azure-cognitive-services-to-convert-text-to-speech/\"\n},{\n  \"id\": \"post-configuring-policy-based-qos-for-teams-with-intune\",\n  \"title\": \"Configuring policy-based QoS for Teams with Intune\",\n  \"author\": \"tto\",\n  \"tags\": [\"Workplace\",\"Intune\",\"Teams\"],\n  \"content\": \"Traditional Active Directory with group policy has no place in the big-picture of the modern workplace, so we need a novel solution to apply policy-based QoS to our Teams clients. One could argue that QoS has no place in the modern workplace either, but that’s a discussion for another day.Configuration Service ProviderSo a CSP or configuration service provider is pretty much exactly what everyone with some traditional enterprise IT background would expect from a group policy object, but delivered from the cloud and, at least in theory, applicable to various types of devices. According to Microsoft Docs it is “an interface to read, set, modify, or delete configuration settings on the device. These settings map to registry keys or files.”You can find a link to the CSP reference below.NetworkQoSPolicy CSPNow it turns out there is a CSP for policy-based QoS but it just applies to Surface Hub devices. If you’re lucky enough to configure QoS on such a device, here is a screenshot of the settings you will most likely use.  The port numbers may be different in your environment.                MSFT_NetQosPolicySettingDataSo here we are trying to configure QoS settings on our Windows 10 clients but CSPs are of no great help. Luckily we can use PowerShell to configure policy-based QoS and Intune provides an easy way to deploy PowerShell scripts to our clients.To configure Windows 10 to tag packets sent by the Teams.exe and on the configured source ports for each modality, we could use three simple commands like in the example below:New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50020 -IPSrcPortEndMatchCondition 50039 -DSCPValue 46 -Name \\\"Teams Audio\\\"New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50400 -IPSrcPortEndMatchCondition 50059 -DSCPValue 34 -Name \\\"Teams Video\\\" New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50069 -IPSrcPortEndMatchCondition 50070 -DSCPValue 28 -Name \\\"Teams AppSharing\\\"You can find a link to the cmdlet reference for New-NetQosPolicy below.Save the above commands to a file with ps1 extension and head over to endpoint.microsoft.com. Create a new script for Windows 10, upload the the ps1 file and set it to run in system context and using the 64 bit PowerShell host. Now assign the script to a group that contains your devices.                Once the script was applied you can use Get-NetQosPolicy to verify the policies were applied correctly.Teams Meeting SettingsFor the above configuration to make any sense, we first have to specify a port range for each modality in the Microsoft Teams admin center.You can find a link to the Teams admin center below.The following screenshot shows an example configuration where a distinct port range is used for each type of traffic, this allows us to distinguish the traffic types and apply different DSCP tags using policy-based QoS.                Special thanks to Mr. Workplace Expert Dave Wenger! Check out his blog in the links below.Links  Configuration service provider reference  New-NetQosPolicy  Microsoft Teams admin center  https://blog.contoso-bern.ch/\",\n  \"url\": \"https://onprem.wtf/post/configuring-policy-based-qos-for-teams-with-intune/\"\n},{\n  \"id\": \"post-send-check-point-logs-to-azure-sentinel-beta\",\n  \"title\": \"Send Check Point Logs to Azure Sentinel (beta)\",\n  \"author\": \"tto\",\n  \"tags\": [\"Azure\",\"Cloud\",\"Security\"],\n  \"content\": \"Azure Sentinel is Microsoft’s new, cloud-native security information and event management (SIEM) tool. In my simplistic point-of-view it is a security-focused, machine-learning-driven add-on for Log Analytics (OMS). Today we will be looking into ingesting Check Point Firewall logs into Log Analytics.Log Analytics Agent (linux)Log Analytics currently lists only linux-based agents for syslog forwarding. In this case I installed Ubuntu Server 18.10, for production it maybe better to stick with 18.04. The following command installs required components:sudo apt install python auditdFrom the Azure Portal, copy the snippet to install the Log Analytics agent (non-Azure Linux VM). It should look something like this and already have the correct values for workspace id and key.sudo wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh &amp;&amp; sh onboard_agent.sh -w &lt;workspace-id&gt; -s &lt;workspace-key&gt; -d opinsights.azure.comFinally, download the security configuration file for OMS agent. This contains the required regular expressions for the oms.security event type:sudo wget -O /etc/opt/microsoft/omsagent/&lt;workspace-id&gt;/conf/omsagent.d/security_events.conf \\\"https://aka.ms/syslog-config-file-linux\\\"Syslog (rsyslog.d)Now with the Log Analytics agent ready, we need to configure rsyslog to accept logs from the firewall and forward them to the agent.Uncomment the following lines in the file /etc/rsyslog.conf to enable the rsyslog listener on udp port 514:module(load=\\\"imudp\\\")input(type=\\\"imudp\\\" port=\\\"514\\\")Now lets create a new configuration file to tell rsyslog to forward all events that contain the string “Check Point” to the Log Analytics agent. Azure Sentinel documentation creates the file at /etc/rsyslog.d/security-config-omsagent.conf::msg, contains, \\\"Check Point\\\" @127.0.0.1:25226At last it may be a good idea to change the default configuration in such a way that not all logs are written to a file. The default configuration for rsyslog is located at /etc/rsyslog.d/50-default.conf. Just modify the line with *.* accordingly:#*.*;auth,authpriv.none         -/var/log/sysloglocal.*;auth,authpriv.none      -/var/log/syslogWhen we’re done with the configuration we use the following commands to restart the Log Analytics agent and the rsyslog service:sudo /opt/microsoft/omsagent/bin/service_control restart &lt;workspace-id&gt;Sudo service rsyslog restartCheck PointCheck Point publish information about how to configure log export in the article sk122323, see links below. On version R80.20 the required packages are already installed and we just add a log export target like this. Note that this is using export mode shell:cp_log_export add name azsentinel target-server 10.1.1.1 target-port 514 protocol udp format cef read-mode semi-unifiedMake sure to select cef log format and set the read-mode to semi-unified. The existing configuration can be verified with:cp_log_export showname: azsentinel     enabled: true     target-server: 10.1.1.1     target-port: 514     protocol: udp     format: cef     read-mode: semi-unifiedTroubleshootAccording to the Sentinel documentation it can take a while before the first logs show up in Log Analytics, in my case it didn’t take more than five minutes. But if they don’t show up at all, the following steps can be helpful for troubleshooting:Check if syslog services are listening:tom@azsentinel:~$ netstat -anuActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 127.0.0.53:53           0.0.0.0:*udp        0      0 0.0.0.0:514             0.0.0.0:*udp        0      0 127.0.0.1:25224         0.0.0.0:*udp        0      0 127.0.0.1:25226         0.0.0.0:*udp        0      0 0.0.0.0:33569           0.0.0.0:*udp6       0      0 :::514                  :::*Note: rsyslog listens on 514 and the omsagent listens on 25224 and 25226, the latter is of interest in this case.Check if logs are coming in from Check Point:sudo tcpdump -A -ni any port 514 -vvCheck if logs are forwarded to omsagent:sudo tcpdump -A -ni any port 25226 -vvLog Analytics agent log file:sudo tail /var/opt/microsoft/omsagent/log/omsagent.logLinks  Check Point Log Export (sk122323)  Azure Sentinel Documentation\",\n  \"url\": \"https://onprem.wtf/post/send-check-point-logs-to-azure-sentinel-beta/\"\n},{\n  \"id\": \"post-create-a-sas-token-for-azcopy\",\n  \"title\": \"Create a SAS token for AzCopy\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\",\"Azure\"],\n  \"content\": \"I’ve spent way too much time trying to figure this out, so here goes a quick note that hopefully saves someone a minute.AzCopyIs a command-line tool that can be used to copy data to all kinds of Azure storage. In this post I am focusing on the Azure Files service because I want to use AzCopy to copy data from an existing file server to a new file share in Azure.According to the documentation, AzCopy supports authentication via Azure AD (using azcopy login) and SAS-token. For the files part, however, only SAS-token authentication is supported.Shared Access Signatures?A shared access signature, SAS, is a string that can be used to delegate access to resources in Azure. It looks something like that:?sv=2018-11-09&amp;sig=&lt;..key..&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=bfqt&amp;sp=racupwdlThere is some documentation out there on how to create the SAS token with the SDK but I couldn’t find much that I could easily use. So after some searching around I found the New-AzStorageAccountSASToken cmdlet in the Az PowerShell module.PowerShell Az ModuleThe Az module is the latest version (I believe) of the PowerShell module to manage Azure. We are going to use it to create the SAS token, so if you don’t have it already, install via the PowerShell Gallery (requires PowerShell 5.1):Install-Module Az -AllowClobberOnce installed I can login to my Azure subscription and create the token:Connect-AzAccount$StorageContext = New-AzStorageContext -StorageAccountName mystorageaccount -StorageAccountKey \\\"storageaccountkey==\\\"New-AzStorageAccountSASToken -Service File -ResourceType Service,Container,Object -Permission racwdlup -Context $StorageContext -ExpiryTime (Get-Date).AddDays(+3)The -ExpiryTime parameter can be used to set an expiration time for the generated token. I believe the default is one hour, so if you expect the copy job to take longer adjust accordingly.Please note: I could also create the storage context without specifying the -StorageAccountKey parameter, but that would lead to the following error message when creating the token:New-AzStorageAccountSASToken : Cannot create Shared Access Signature unless Account Key credentials are used.Copying the dataActually copying files or directories to Azure Files is pretty straight-forward once we have the SAS-token, we just pass it along with the url.To copy a single file:.\\\\azcopy.exe cp D:\\\\Data\\\\file.txt \\\"https://mystorageaccount.file.core.windows.net/myshare/file.txt?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\"To copy a directory:.\\\\azcopy.exe cp D:\\\\Data \\\"https://mystorageaccount.file.core.windows.net/myshare?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\" --recursiveLinks  https://github.com/Azure/azure-storage-azcopy  https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstorageaccountsastoken  https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-files  https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1\",\n  \"url\": \"https://onprem.wtf/post/create-a-sas-token-for-azcopy/\"\n},{\n  \"id\": \"post-ntsystemspsdrive-a-ships-drive-for-the-blog\",\n  \"title\": \"ntSystemsPSDrive: a SHiPS drive for the blog\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Jekyll\",\"ntSystems\"],\n  \"content\": \"Some time ago I wrote a post about Consuming ntSystems with PowerShell. It boils down to this: we have a json-based API that is available via https://ntsystems.it/api/v1/ and returns json elements for posts and pages on the blog. For more information check out the linked post. Then I wanted play around with the SHiPS module for some time and finally got around to doing it this past weekend. Now I’m happy to be sharing another method do consume ntSystems with PowerShell: It can be mounted as PSDrive.PSProviderPowerShell has always had the concept of providers which serve as a way of accessing and interacting with data that would otherwise not be easily available at the command-line. According to about_Providers they are Microsoft .NET Framework-based programs that make the data in a specialized data store available in PowerShell so that you can view and manage it.There are some built-in providers such as Alias, Certificate, and Registry that you will be familiar with. Essentially they provide a file-system-like view into the data stores, so we can easily see all defined aliases with the following command:Get-ChildItem -Path Alias:We can see installed certificates in the Cert: drive and access the registry via hkcu: and hklm:. Not only can we list the content of the data stores with cmdlets such as Get-ChildItem, we can also modify values with Set-Item or Set-ItemProperty like this:# Create a new REG_SZ New-ItemProperty -Path HKCU:\\\\Environment\\\\ -PropertyType string -Name TestPS -Value \\\"test pwsh\\\"# Create an aliasNew-Item Alias:\\\\test -Value \\\"Get-Process\\\"# Remove expired CertificatesGet-ChildItem Cert:\\\\CurrentUser\\\\my | Where-Object NotAfter -lt (Get-Date) | Remove-ItemWell, you get it by now: providers make it relatively easy to work data stored in certain locations.Some vendors, such as VMware, add providers to their PowerShell tools. So after installing PowerCLI and connecting to a server, we can browse the inventory using:Get-ChildItem vi:Get-ChildItem vmstore:We can see all available drives using Get-PSDrive.There are not too many 3rd-party providers out there, probably because it was quite hard to write them. Enter SHiPS.Simple Hierarchy in PowerShell (SHiPS)According to the SHiPS GitHub repository, “developing PowerShell provider got so much easier”. The module leverages PowerShell classes to create the hierarchy and items that are then exposed as a PS Drive.How easy you ask? Well I gave it a shot the other day and here is the result.ntSystemsPSDriveAs stated above, the module requires the SHiPS module and builds on top of it. So in the code we first declare the following:using namespace Microsoft.PowerShell.SHiPSThen we go ahead and create classes for our navigation nodes, folders (items containing child items) inherit from SHiPSDirectory and leafs (like files) inherit from SHiPSLeaf.In the classes we define constructors and methods as needed, if a folder shall be used as root node, i.e. the entry point used by New-PSDrive, it must have a constructor with the node name as parameter.Home([string]$name): base($name) { }All folder nodes must define a GetChildItem() method that is called when browsing the directory.[object[]] GetChildItem() { }So for example the Home node in the module ntSystemsPSDrive is used as root (entry point) when mounting the PSDrive:New-PSDrive -Name $Name -PSProvider SHiPS -Root \\\"ntSystemsPSDrive#Home\\\" -Scope Global -ErrorAction StopTo create such a node and its contents, we define a class like this :class Home : SHiPSDirectory {    # required constructor for root nodes    Home([string]$name): base($name) {    }    # The method GetChildItems is called when listing directory content    [object[]] GetChildItem() {        $obj = @()        $obj += [ntSystemsType]::new(\\\"Category\\\")        $obj += [ntSystemsType]::new(\\\"Tags\\\")        $obj += [ntSystemsType]::new(\\\"Author\\\")        $obj += [ntSystemsType]::new(\\\"Language\\\")        return $obj    }}The above example contains the constructor required for root nodes as well as a method GetChildItem that returns an array of objects when it gets called.See it in action:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\Posts by Category\\\\PowerShell\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\Posts by Category\\\\ntSystems\\\\Jekyll Fun: Consuming ntSystems with PowerShell' Pretty cool, right? Thanks for reading, have fun!TomLinks  SHiPS  SHiPS Architecture\",\n  \"url\": \"https://onprem.wtf/post/ntsystemspsdrive-a-ships-drive-for-the-blog/\"\n},{\n  \"id\": \"post-powershell-script-to-enable-specific-office-365-service\",\n  \"title\": \"Powershell Script to enable specific Office 365 Service\",\n  \"author\": \"dni\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"content\": \"Currently I’m in an Exchange Migration project to migrate all mailboxes from Exchange onPremise to Exchange Online. Yeah.. of course.. killing Exchange onPrem… again :)I have the following situation that all users already have Office 365 Licenses assigned like E1 / E3 or E5. There are some users that don’t have all Office 365 services the license includes enabled and so there are some disabled services. The license situation is not really structured.. When I’m going to migrate the mailboxes to Exchange Online I need to enable the Exchange service for every user so they can access the mailbox.It doesn’t sound like a big deal but the tricky part is I want to preserve the disabled services for every user. I cannot apply a default license to all users and I’m too lazy to click through all users and enable the Exchange Online switch manually..So now I want to share with you a script that does all the magic automatically.. Maybe its also helpful for you in some situations.Please consider:I’m not a DEV :)  The Scripts works for one service at a time  The Script works for E1 / E3 / E5 licenses but can easily extend to include other license types  I write out a LOG file with the detail the script does  The user list can also be a CSV file# ConnectConnect-MsolService# Load User List$UserList = \\\"User1@domain.local\\\",\\\"User2@domain.local\\\",\\\"User3@domain.local\\\"$LogFile = \\\"C:\\\\Users\\\\nitz_\\\\LOG\\\\LicenseLog.txt\\\"# Troubleshoot#$UserList = \\\"user1@domain.com\\\"#$User = \\\"user1@domain.com\\\"ForEach($User in $UserList){    If (Get-MsolUser -User $User)    {        #Variable        $UserLicense = $Null        $ChangeLicense = $false        # Check what License the user has        $LicensesAssigned = (Get-MsolUser -User $User).Licenses.AccountSkuId        If ($LicensesAssigned -like \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -notlike \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -notlike \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E5\\\"            $LicenseToActivate = \\\"EXCHANGE_S_ENTERPRISE\\\"            $UserLicense = \\\"ENTERPRISEPREMIUM\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E5\\\"        }        ElseIf($LicensesAssigned -notlike \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -notlike \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -like \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E3\\\"            $LicenseToActivate = \\\"EXCHANGE_S_ENTERPRISE\\\"            $UserLicense = \\\"ENTERPRISEPACK\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E3\\\"        }        ElseIf($LicensesAssigned -notlike \\\"*ENTERPRISEPREMIUM*\\\" -and $LicensesAssigned -like \\\"*STANDARDPACK*\\\" -and $LicensesAssigned -notlike \\\"*ENTERPRISEPACK*\\\"){            Write-Host \\\"User $User has E1\\\"            $LicenseToActivate = \\\"EXCHANGE_S_STANDARD\\\"            $UserLicense = \\\"STANDARDPACK\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\"User $User has E1\\\"        }        Else{            Write-Host \\\"User $User has License mismatch, please check\\\" -ForegroundColor Red            Add-content $Logfile -value \\\"ERROR -- User $User has License mismatch, please check\\\"        }        # Change License        If($ChangeLicense)        {            $DisabledLicenses = @()                $License = (Get-MsolUser -User $User).Licenses | where{$_.AccountSkuId -like \\\"*$UserLicense*\\\"}                ForEach($LicenseOption in $License.ServiceStatus){                    If($LicenseOption.ProvisioningStatus -eq \\\"Disabled\\\"){                        If($LicenseOption.ServicePlan.ServiceName -eq $LicenseToActivate){                            Write-Host \\\"Skip disabling License $LicenseToActivate for User $User\\\" -ForegroundColor Green                        }Else{                            If($DisabledLicenses -eq $Null){$DisabledLicenses = $LicenseOption.ServicePlan.ServiceName}                            Else{$DisabledLicenses = $DisabledLicenses + $LicenseOption.ServicePlan.ServiceName}                                        }                    }                }                Add-content $Logfile -value \\\"User $User has disabled Plans $DisabledLicenses\\\"                # Assign new License Option                $LicenseOptions = New-MsolLicenseOptions -AccountSkuId $License.AccountSkuId -DisabledPlans $DisabledLicenses                Write-Host \\\"Applying License Option to User $User\\\" -ForegroundColor Green                Set-MsolUserLicense -UserPrincipalName $User -LicenseOptions $LicenseOptions                Add-content $Logfile -value \\\"User $User assigned new License Option\\\"        }    }else{        Add-content $Logfile -value \\\"ERROR -- User $User NOT FOUND\\\"    }}Feel free to use this script or just to take the basic functions and improve it to fulfill your special needs.Daniel\",\n  \"url\": \"https://onprem.wtf/post/powershell-script-to-enable-specific-office-365-service/\"\n},{\n  \"id\": \"post-windows-server-2019-radius\",\n  \"title\": \"Windows Server 2019 and RADIUS\",\n  \"author\": \"tto\",\n  \"tags\": [\"Security\",\"Firewall\"],\n  \"content\": \"First of all, happy new year :) Today we will have a quick look at Windows Server 2019, more specifically the Network Policy Server role.BackgroundI was recently asked to help with an enterprise WiFi deployment and decided to use a RADIUS server for authentication purposes. I went on to deploy a new Windows 2019 VM and installed the NPS role. After adding the RADIUS client and configuring the required policies, I added the NPS server’s IP address to the WiFi controller and tried to authenticate. A simple task generally, but this time it did not work.TroubleshootingThe RADIUS server was located behind a NAT device so my first guess was that I had misconfigured a policy or mistyped an address or something. I double checked the configuration and, as it looked ok, started to scratch my head. In order to better understand what was going on, I installed wireshark on the NPS machine and saw packets incoming from the WiFi controller quite happily. But packet were only incoming, I could not find a single response coming from NPS. The Security Event Log on the VM, where you would typically find NPS logs, had no events related to NPS. So basically the NPS was not responding to RADIUS messages at all.SolutionAfter a quick google search for “Windows 2019 NPS” I found an entry in the TechNet Forums (link below) where someone explained the Windows Firewall had to be configured to allow RADIUS (udp/1812, udp/1813) traffic even though such a rule did already exist. Sure enough, after adding the firewall rule, authentication worked.DHCP Relay (update)So today, half a year later, I had a very similar problem with DHCP relay. The Windows 2019 DHCP Server would receive DHCP requests from a relay agent but it would never respond to them. I configured the local firewall to allow traffic on UDP ports 67 and 69 and voilà, DHCP started working.Links  TechNet Forums  User Voice\",\n  \"url\": \"https://onprem.wtf/post/windows-server-2019-radius/\"\n},{\n  \"id\": \"post-sending-events-to-splunks-http-event-collector-with-powershell\",\n  \"title\": \"Sending events to Splunk's HTTP Event Collector with PowerShell\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Using Invoke-RestMethod to send events to a Splunk instance.SplunkIf you don’t know Splunk this article is not going to give a thorough introduction. Let’s just say it’s a pretty fancy log collector/analytics tool. According to the company’s profile, Splunk turns machine data into answers. The goal of this article is to demonstrate how to use PowerShell to send events to the HTTP Event Collector which is Splunk’s REST interface to ingest logs.Enable Event Collector and create API Key (Token)Connect to your Splunk’s web interface with appropriate permissions and using Settings, Data inputs, click on HTTP Event Collector. If you are not already using the Event Collector service it has to be enabled using the Global Settings button in the top right corner.Then use the New Token button to create a new API key and configure how Splunk handles data it receives using this token. In the first step, give a name to the token you are about to create.The second step is about handling the data, select an appropriate source type, I use json in this case, and the the right App Context. I select the search app for this example, though it can be any installed Splunk app. At the bottom of step two, select the index where Splunk will store the data. If you are not sure which index to use, create a new one. I created an index with the name of PowerShell and assigned it to the search application as selected before.Review the configuration in the last step and create the new token. Take note of the Token Value, you will need it later.Once the token has been created, you can click on Start Searching and Splunk will automatically create the right search for you. As we have not yet sent data, the search should not return any results.PowerShell Send-SplunkEventI put together a quick wrapper for Invoke-RestMethod that makes sending logs to Splunk relatively easy. All you need is the API key (Token Value) from above and the URI of your event collector service. For this example I am using a Splunk instance on my local machine, so the Uri is “http://localhost:8088/services/collector”, for a production environment, you would probably use https and replace localhost with the name of your instance.The idea behind the script was to sort through logs from different systems in PowerShell, turn them into structured data and send them to Splunk. As logs originate on systems other than the one where this script runs, the HostName parameter can be used to specify the ‘host’ property of the event and the DateTime parameter can be used to set the ‘time’ property.Examples and usageThe script has two required parameters, InputObject and Key. Use the InputObject parameter to pass an object (or hashtable) to the script. This will be turned into json, using PowerShell’s ConvertTo-Json and then sent to the REST API using Invoke-RestMethod.Use the Key parameter to pass the HTTP Event Collector token that we created above to the script..\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\"Hello Splunk!\\\";severity=\\\"INFO\\\"} -Key &lt;token&gt; Get-Service wuauserv | .\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; -Uri http://localhost:8088/services/collectorThe first example just sends a custom hashtable with the two fields message and severity. The second example gets a service object and converts it into a json object before sending it.Note: The Uri parameter defaults to localhost, you will have to specify it like in the second example, if sending to a remote instance.SearchNow search for the events in the newly created PowerShell index: index=\\\"powershell\\\" sourcetype=_jsonPerformanceAs the script is making a new RESTful call for every single event, this is not the fastest way to get logs into Splunk. I have made some tests to compare WindowsPowerSell with the Core edition, here is what I’ve found:Measure-Command { Get-Process | .\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; }The above command takes 30 seconds on WindowsPowerShell, while it takes about 280 seconds on Core (tested with 6.1.0 and 6.2.0 preview 2).Download &amp; Source forThe Script is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    Links:  Send-SplunkEvent  Splunk REST API Reference  PowerShell Invoke-RestMethod\",\n  \"url\": \"https://onprem.wtf/post/sending-events-to-splunks-http-event-collector-with-powershell/\"\n},{\n  \"id\": \"post-lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5\",\n  \"title\": \"lost & found: FFmpeg and Skype4B, Security Baseline for RS5\",\n  \"author\": \"tto\",\n  \"tags\": [\"Skype4B\",\"WSL\",\"Client\",\"Server\"],\n  \"content\": \"A quick edition of lost &amp; found on how to use FFmpeg on WSL to create audio files that can be used for Skype for Business announcements. And an observation about the recently published security baseline for Windows 10 1809 and Server 2019.FFmpegAccording to it’s website, FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.Packages are available for various operating systems but since Ubuntu runs just fine on Windows 10, I started using linux-style command-line tools in the Windows Subsystem for Linux.Check if you are running the latest version using ffmpeg -version or install to tool using sudo apt-get install ffmpeg.According to @greiginsydney a 16 kHz, mono, 16-bit Wave file is recommended for best performance.To convert an MP3 file to Wave with the above specifications, we can use something like this:ffmpeg -i Downloads/ringtone.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ringtone.wavSecurity BaselineMicrosoft recently released the draft of the security baseline configuration for RS5 builds, that’s Windows 10 v1809 and Windows Server 2019. You can find more information about that on the Security Guidance blog, I just wanted to share a quick note for the Office 365 Admins out there:The security baseline configuration contains a setting to disable Basic Authentication for the WinRM client. After applying the baseline configuration, I was no longer able to connect to Exchange Online or Skype for Business Online remote PowerShell Sessions as they rely on basic authentication.Set the following configuration to Not Configured on your admin machines:Administrative Templates\\\\Windows Components\\\\Windows Remote Management (WinRM)\\\\WinRM Client\\\\Allow Basic authenticationLinks:  Audio file formats for Lync and Exchange  FFmpeg  Security baseline (DRAFT) for Windows 10 v1809 and Windows Server 2019\",\n  \"url\": \"https://onprem.wtf/post/lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5/\"\n},{\n  \"id\": \"post-remote-ems-over-ipmi-serial-over-lan\",\n  \"title\": \"Remote EMS over IPMI serial-over-lan\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"PowerShell\",\"Server\",\"AudioCodes\"],\n  \"content\": \"Using standards-based IPMI to get some sort of out-of-band management for AudioCodes’ embedded server modules.BackgroundWe’ve installed a number of session border controllers with embedded server modules for our international customers. The embedded server modules are typically used to run Skype for Business survivable branch servers which provide limited calling services in case of a connectivity issue with the Front End pools. Because IT personnel is not available in branch sites or the devices are installed in data centres with limited access, we relied upon Intel’s AMT for out-of-band management of the earlier version of the server module.AudioCodes upgraded the embedded server module and it turns out, the new version no longer has an AMT chip. Studying the data sheet of the OEM that builds the module, we found that it Supports IPMI v1.5 and Serial-over-LAN function. The OEM couldn’t help much so I basically googled/tried my way to this solution, maybe my experience saves someone a few hours in the future.Intelligent Platform Management Interface (IPMI)First of all, I had to read up on IPMI. According to Wikipedia it provides management and monitoring capabilities independently of the host system’s CPU, firmware (BIOS or UEFI) and operating system. Windows does implement some basic functionality through CIM and the PcsvDevice PowerShell module, but, apart from that, we have to rely on other tools such as ipmiutil to communicate with this interface.ipmiutil is an open-source utility to manage and interpret IPMI systems with common software. If used inside the OS on the server, it can access and configure the local Baseboard Management Controller (BMC). Once configured, the utility can be used to invoke IPMI functions remotely.IPMI configurationTo show the current configuration of the local BMC we can use the following examples:.\\\\ipmiutil.exe config.\\\\ipmiutil.exe lan -lTo set an IP address and the username/password to use for remote connections, we can use something like this:.\\\\ipmiutil.exe lan -e -I 192.168.120.131 -S 255.255.255.0 -G 192.168.120.254 -L 5 -p ipmipass -u ipmiadminThe above example sets the IP address of the BMC to 192.168.120.131/24 and the default gateway to 192.168.120.254. Additionally, we set the username to ipmiadmin and the password to ipmipass.We verify the configuration using the ipmiutil config from the first example, if it looks good, we can try the same from a remote system:[PS] ~\\\\ipmiutil&gt; .\\\\ipmiutil.exe config -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil config ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0### ipmiutil config, GetPefEntry ...# GetPefEntry(1): ret = 193 Invalid Command### ipmiutil config, GetLanEntry for channel 5 ...LanParam 5,0,0:  00LanParam 5,1,0:  14LanParam 5,2,0:  14 14 14 14 00LanParam 5,3,0:  c0 a8 78 83# LanParam(5,3,0) IP address: 192.168.120.131LanParam 5,4,0:  01LanParam 5,5,0:  c4 00 ad 01 f5 73...In the above example, we run ipmiutil config on another machine and use the -N parameter to specify a remote host, -U and -R are used to specify the username and password, respectively. The output shows the connection succeeded and thus, we have remote connectivity.Now we have an way to manage certain features of the remote system independently from the operating system that’s installed on said system. We can, for example, use ipmiutil reset to control the systems power state..\\\\ipmiutil.exe reset -c -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\ipmiutil.exe reset -d -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\ipmiutil.exe reset -u -N 192.168.120.131 -U ipmiadmin -R ipmipassThe above lines power cycle, power down or power up the remote system. Use with caution.If the BMC is not reachable from a remote system, I’ve found ipmiutil reset -k useful. This does reset the BMC, without affecting the OS.Serial over LAN (sol) and Emergency Management Services (EMS)Apart from controlling the systems power state, IPMI also implements serial-over-lan connectivity. This can be used to connect to a remote system’s serial console using an IP connection. Now on Windows servers we do not typically use serial connections, at least not for management. But, as it happens, the Emergency Management Services console provides exactly that: a special management console over serial connections. The Emergency Services are not enabled by default, so we have to enable it and make sure it uses our serial-over-lan connection.To do this, we use the bcdedit utility (from an administrative command-line), first to redirect the EMS console to serial port #2, then to enable EMS for the current Windows installation:bcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200bcdedit /ems on To activate the change and enable EMS, Windows must be rebooted. After that, we can go ahead and start our first sol session using the following command:[PS] ~\\\\ipmiutil&gt; .\\\\ipmiutil.exe sol -a -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil sol ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0Opening lanplus connection to node 192.168.120.131 ...[SOL session is running, use '~.' to end, '~?' for help.]SAC&gt;The SAC prompt indicates we are now connected to the special administration console. This console can be used to retrieve information about the system, it’s network interfaces and running processes. We can also connect to the OS via cmd.SAC&gt;cmdSAC&gt;ch -si 1The above example creates a new cmd channel and connects to it. It will prompt for credentials to connect to Windows and, upon success, we have a remote cmd.exe interface. Type in powershell and enjoy :)Finally, we can use -d to disconnect from the sol session:.\\\\ipmiutil.exe sol -d -N 192.168.120.131 -U ipmiadmin -R ipmipassThis is also useful if the sol session fails with the message: “SOL payload already active on another session”.SecurityNow as you can see, enabling IPMI and making the SAC available over serial-over-lan, adds another way of managing the system. This can be convenient but it also increases the system’s attack surface. Make sure to limit access to IPMI endpoints and don’t use high-privilege accounts when logging into the SAC remotely.Links:  Sourceforge download and man page  AudioCodes 1000 sbc  Boot Parameters to Enable EMS Redirection\",\n  \"url\": \"https://onprem.wtf/post/remote-ems-over-ipmi-serial-over-lan/\"\n},{\n  \"id\": \"post-network-assessment-with-policy-based-qos-and-iperf3\",\n  \"title\": \"Network assessment with policy-based QoS and iperf3\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"Skype4B\",\"PowerShell\"],\n  \"content\": \"In Skype for Business and, more recently, Teams deployments, a solid network and a good knowledge of it are fundamentally important.We typically work very closely with the network/security departments and make sure to involve them from the beginning to have their support throughout the project. After deploying QoS, ideally before rolling out voice/video for the end-users, we run some tests to verify the QoS configuration, measure the reserved bandwidth and whether it remains stable over some amount of time. There are various tools available for this task, I mostly use iperf3 to generate traffic and measure basic parameters.iperf3 basicsAccording to the GitHub page, iperf3 is “a tool for active measurements of the maximum achievable bandwidth on IP networks”. It is primarily developed on Linux but Windows executable are available from various sources. I’m using the version 3.6 build that can be found on NeoWin (see below).After copying the files to the machine, we can start the server using the the following command line. This starts a listener at tcp/udp 5201 and waits for iperf clients to connect..\\\\iperf3.exe -sOn the client side, we have multiple options, as stated above, iperf’s goal is to measure the maximum bandwidth, so if we start the client without parameters, that is what it will do: .\\\\iperf3.exe -c 192.168.120.185 Connecting to host 192.168.120.185, port 5201[  5] local 192.168.120.160 port 52070 connected to 192.168.120.185 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec   530 MBytes  4.44 Gbits/sec[  5]   1.00-2.00   sec   607 MBytes  5.09 Gbits/sec...Note that in the above example, iperf uses TCP and measures end-to-end available bandwidth between the client and server. This may saturate network links in between. Use with caution.We can also try to simulate RTP media (small UDP packets) by specifying the following parameters: .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200Note that with UDP, the target bitrate defaults to 1 Mbit per second, this can be changed with the -b parameter. Also, when using UDP, jitter and packet loss are measured.More information: NeoWin, GitHub, Documentation (outdated)Now that we have a tool to generate traffic and measure bandwidth, we can go ahead and put some DSCP tags on the traffic to see how the network handles quality of service.  iperf has a –dscp parameter, this does not work on Windows as applications are not trusted to set DSCP values. The only way (that I know of) to tag packets with DSCP values is policy-based QoS.Creating the QoS PoliciesWe would typically use group policies to manage policy-based QoS settings but since this is a test, we can go ahead and use the NetQos PowerShell module on the client/server machines to create temporary policies.A quick Get-Command -Module NetQos shows that the module provides four cmdlets, we can Get, Set, Remove, and create New QoS policies with the respective *NetQosPolicy cmdlet.So we create two policies for the iperf server and client applications. The server listens on port 5201 by default, so all traffic originating from the server will use that source port.New-NetQosPolicy -Name \\\"iperf_server\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPSrcPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreThe client will communicate with the server by sending to the port 5201, so all traffic originating from the client will use that destination port.New-NetQosPolicy -Name \\\"iperf_client\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPDstPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreNote: By specifying ActiveStore as the policy store, the QoS policy will not be persistent. On the next reboot of the system, it will be gone.  We want to measure both directions, so we create both policies on the server and both on the client.Test and traceNow it’s time to start a network trace on the client and the server and run iperf again. If QoS has been configured, we should see packets leaving the client tagged with DSCP 46 and this tag should be preserved and be displayed on the server-side as well. I run the following two tests on the client, the -R parameter reverses the flow, so in the second case, the server sends packets to the client: .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -J --logfile send.json .\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -R -J --logfile recv.jsonThe following screenshots show a trace from the above test on the client (1) and on the server (2). We can see that packets from client to the server (source: 192.168.120.160, destination: 192.168.120.185) are tagged on the client…… and the tag is still present when the server receives them.After switching the stream’s direction (with -R), we observe the same: packets leave the server tagged, and are received by the client with the tag still on.With the -J and --logfile parameters we instruct iperf to write output in JSON format and redirect it to a text file. With PowerShell we can now easily work with that data:$send = Get-Content send.json -Raw | ConvertFrom-Json$send.intervals.streams | Out-GridView$send.end.sumAt this point, it’s important to note that until now we have only proved, that the network does not remove the DSCP tags we put on our test packets. Whether the network actually prioritizes such packets is not yet clear. The easy way to verify that, would be to log into the network devices (QoS policies are typically enforced on routers) and get some counters/statistics. If that is not possible, we have to find out how much bandwidth is reserved for a given class empirically. To do that, we need a link that can be saturated (no congestion, no prioritization) and then run the above test again.More about QoS PoliciesWhen configuring policy-based QoS, either by group policy or by PowerShell, check the event log to see if the system refreshed the policy correctly. The following event is logged, when a policy change is detected:Log Name:      Microsoft-Windows-Policy/OperationalSource:        Microsoft-Windows-EQoSEvent ID:      2Level:         InformationDescription:   Computer QoS policies successfully refreshed. Policy changes detected.The NetQos module is a wrapper for the WMI/CIM objects managing the quality of service policies. We can also manipulate the CIM instance directly, e.g. to delete policies:Get-CimInstance -Namespace ROOT/StandardCimv2 -ClassName MSFT_NetQosPolicySettingData | Remove-CimInstanceLinks:  How to validate VPN throughput to a virtual network\",\n  \"url\": \"https://onprem.wtf/post/network-assessment-with-policy-based-qos-and-iperf3/\"\n},{\n  \"id\": \"post-exchange-hybrid-observations\",\n  \"title\": \"Exchange Hybrid Observations\",\n  \"author\": \"tto\",\n  \"tags\": [\"Office365\",\"Hybrid\",\"Exchange\"],\n  \"content\": \"Like I did here with Skype for Business, I’m collecting some observations and useful snippets about Exchange in hybrid environments.Completing individual migration usersRecently we have been using the CompleteAfter flag in favour of the older SuspendWhenReadyToComplete to set a date for migration batches to complete. To update this timestamp for a single mailbox in a batch, we can use the following command:Get-MoveRequest tom | Set-MoveRequest -CompleteAfter (Get-Date).AddHours(-1)In the above example, the move request for the mailbox tom will be completed immediately without affecting other mailboxes in the batch.Getting details about BadItemsPart of every migration are mailboxes with items that are either corrupt or cannot be imported to Exchange Online for some reason. Now if we don’t just increase the BadItemLimit counter but want more information about the corrupt items, we can get more information by using the -IncludeReport parameter with the Get-MigrationUser cmdlet:$Stats = Get-MigrationUserStatistics -Identity tom@ntsystems.it -IncludeReport $Stats.Report.BadItemsRecipient PermissionsThe *RecipientPermission cmdlets are used to manage SendAs permissions in Exchange Online. A nice goody of the Get-RecipientPermission cmdlet is the option to find permissions by assignee, i.e. by user to whom the permissions are granted. To get all entries that grant permissions to the user tom we use the -Trustee parameter like this:Get-RecipientPermission -Trustee tomLikewise, we can find all permissions by access right using the -AccessRights parameter. The following example gets all entries that grant SendAs permissions:Get-RecipientPermission -AccessRights SendAsShared MailboxesStarting with the June 2018 quarterly updates (2013 CU21 and 2016 CU10), the management of shared mailboxes in hybrid scenarios got easier. A -Shared parameter got added to the *RemoteMailbox cmdlets, instead creating a shared mailbox on-prem and then moving it to Exchange Online, we can now use New-RemoteMailbox -Name Office -Shared.You have already updated to CU21/CU10 but the Shared parameter is not available? Run .\\\\setup.exe /PrepareAD /IAcceptExchangeServerLicenseTermsMore Info: KB4133605Tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-hybrid-observations/\"\n},{\n  \"id\": \"post-lost-found-no-tracking-on-ntsystems\",\n  \"title\": \"lost & found: Updates and no more tracking on ntSystems.it\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"I’ve recently updated the sources of the blog and moved to the gem-based version of the minima theme. This should make the site easier to maintain in the future.On the old, blogengine-based site, we used Google Analytics to get some information about our readers.  Since the migration to GitHub pages and Jekyll, I’ve tried to remove external scripts and tracking as much as possible.This is just a static website with some free (as in beer) content we’d like to share. We do no longer inject any tracking code and the few scripts we use are served directly from GitHub pages. But, until recently, there was one last exception to this: the comments. We’ve used Disqus comments for a long time now and I don’t really see a need to change that.However, as the comments iFrame is loaded from an external source (and may include tracking code), I’ve decided to stop automatically loading the iFrame and instead give you, the reader, an option to load it.From now on, you’ll see a “Show comments.” link at the bottom of each post and only after clicking the link, external content is loaded.What do you think? Leave a comment below ;)Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-no-tracking-on-ntsystems/\"\n},{\n  \"id\": \"post-azure-functions-building-a-telegram-bot-with-powershell-2\",\n  \"title\": \"Azure Functions: Building a Telegram Bot with PowerShell 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"content\": \"Welcome back to the second part of our little fun experiment with Telegram and Azure Functions. In the first part we created the function app and the bot, now let’s hook them up.Connecting the bot with the Azure FunctionWe can get updates from Telegram bots in two ways, there is a getUpdate method that can be polled periodically, or we can use Webhooks. Our HTTP trigger function in Azure will run whenever it receives a http request, so it is just perfect for the latter.To configure our Azure Function as a destination for the bot’s webhook, we use the setWebhook method and pass a hashtable with an URL parameter:Invoke-RestMethod -Uri https://api.telegram.org/bot528059907:AAxxVs/setWebhook -Body @{    \\\"url\\\"=\\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\"} -Method PostTo verify that the URL has been set correctly, we can call getWebhookInfo:[PS] C:\\\\&gt; Invoke-RestMethod https://api.telegram.org/bot528059907:AAxxVs/getWebhookInfo  ok result  -- ------True @{url=https://ntsystemsbot.azurewebsites.net/api/Listener?code=Waa...At this point our function will get a http request every time someone writes to the Bot account. So now it’s time to do something with it.OverviewFirst of all: I am sure there are a hundred ways this can be done better… What I am trying to accomplish with this simple example is a demonstration of Azure Functions and the different triggers, inputs, and outputs it provides. That said, here’s what I came up with:Our first function, the Listener, uses a HTTP trigger as input and Azure Queue Storage as output. This function will run, whenever a user sends a message to our bot and it will take the message and write it to a Storage Queue.Another function, I called it UpdateData uses a timer trigger to get information from the blog and write it to Azure Blob Storage.The third function, our Worker, uses Azure Queue Storage as trigger and Azure Blob Storage as input. The trigger is the same Queue that the Listener writes to, so a request coming from Telegram will be written to a Queue by the Listener function and trigger this Worker function.A last function, the Responder, finally sends a POST request to the Telegram bot. This function is triggered by the Worker’s output queue and uses no other inputs or outputs.To summarize, the Storage Queues are connected like this:  Listener &gt; Worker &gt; ResponderThe FunctionsThere are different ways to create or modify functions. The Azure console provides an easy-to-use GUI to configure triggers, inputs and outputs. It even has an editor for the functions’s code :) For the more advanced stuff, we can connect to the functions Kudu Services and upload files directly or use the debug consoles. Each function basically consists of a folder, the folder contains a function.json file which describes the function (type, trigger, input, output) and a run.ps1 file which contains the PowerShell code.The ListenerAs mentioned before, the first function just listens for a http request by the Telegram Bot and writes it to a storage queue.The function.json file defines the trigger httpTrigger and the input/output variables. The following is the actual configuration file for my Listener function:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"req\\\",      \\\"type\\\": \\\"httpTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"webHookType\\\": \\\"genericJson\\\"    },    {      \\\"name\\\": \\\"res\\\",      \\\"type\\\": \\\"http\\\",      \\\"direction\\\": \\\"out\\\"    },    {      \\\"type\\\": \\\"queue\\\",      \\\"name\\\": \\\"outputQueueItem\\\",      \\\"queueName\\\": \\\"listenerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}The name defined in each object is made available as variable in the function’s code and contains a file path. That allows us to use Get-Content $req to get the HTTP request’s body. As well as Out-File $outputQueueItem and Out-File $res to write to the Storage Queue or respond to the HTTP request, respectively. How cool is that?!The functions code, in the run.ps1 file is as simple as that:# POST method: $req$requestBody = Get-Content $req -Raw # Wirte input to QueueOut-File -FilePath $outputQueueItem -Encoding Ascii -inputObject $requestBody# Respond to the incoming web requestOut-File -Encoding Ascii -FilePath $res -inputObject $trueThe request body is made available through the $req variable, we read the variable and write it to the $outputQueueItem which represents the Storage Queue listenerqueue\\\\outputQueueItem in the AzureWebJobsDashboard storage account.We do also respond to the incoming web request by writing to the $res variable.The WorkerThe next function is triggered by the same listenerqueue\\\\outputQueueItem we write to in the first function, so it will always run, after the first function finished. The content of the storage queue is made available through the $triggerInput variable:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"triggerInput\\\",      \\\"type\\\": \\\"queueTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"queueName\\\": \\\"listenerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\"    },    {      \\\"type\\\": \\\"blob\\\",      \\\"name\\\": \\\"inPosts\\\",      \\\"path\\\": \\\"outcontainer/posts\\\",      \\\"connection\\\": \\\"AzureWebJobsStorage\\\",      \\\"direction\\\": \\\"in\\\"    },    {      \\\"type\\\": \\\"queue\\\",      \\\"name\\\": \\\"outputQueueItem\\\",      \\\"queueName\\\": \\\"workerqueue\\\",      \\\"connection\\\": \\\"AzureWebJobsDashboard\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}This function does not send HTTP responses, so there is no need to define an HTTP output. The only output for the Worker is another storage queue.As you’ve noted, we define another input for this function, namely outcontainer/posts, we’ll get to that later.The PowerShell code in run.ps1 does the actual work, so it evaluates the input and decides what to do with it.# Read input from StorageQueue$requestBody = Get-Content $triggerInput -Raw | ConvertFrom-Json$posts = Get-Content $inPosts -Raw | ConvertFrom-Json | Select-Object -Expand items...Out-File -Encoding Ascii -FilePath $outputQueueItem -inputObject ($outObj | ConvertTo-Json)Again, we simply read the input using Get-Content and write the output to the defined variable. I’ve omitted the actual code, to make this readable. You can find the code here:             ntsystemsit/ntsystemsbot    The ResponderThe responder is finally triggered by the workerqueue\\\\outputQueueItem and sends an http request to the Telegram Bot API, thereby responding to the user. The configuration is basically the same as above, and you can find it in the GitHub repo.To actually send a message to the Telegram Bot, I’ve created the following helper function. It uses Invoke-RestMethod to send a POST request to the /sendMessage API endpoint.function New-TelegramMessage {    [cmdletbinding()]    param(        $ChatId,        $Text,        $Mode = \\\"Markdown\\\",        $ReplyId,        $ReplyMarkup    )    $body = @{        \\\"parse_mode\\\" = $mode;        \\\"chat_id\\\"= $ChatId;        \\\"text\\\" = $Text;    }    if($ReplyId) {        $body.Add(\\\"reply_to_message_id\\\",$ReplyId)    }    if($ReplyMarkup) {        $body.Add(\\\"reply_markup\\\",(ConvertTo-Json $ReplyMarkup -Depth 5))    }    Invoke-RestMethod -Uri https://api.telegram.org/bot$env:TG_Token/sendMessage -Body $body -Method Post}  Note: The URL must contain the Bot’s API key. As I wanted to publish the code, I’ve stored the key in the function’s application settings. These settings are available as environment variables in the code, so I can access the key thorough: $env:TG_Token.Update DataThe last piece we need for our little example is the UpdateData function. This one uses a timer trigger and just gets all posts of our blog and stores them in an Azure Storage Blob.The function definition contains the schedule and the Storage Blob we want to write to:{  \\\"bindings\\\": [    {      \\\"name\\\": \\\"myTimer\\\",      \\\"type\\\": \\\"timerTrigger\\\",      \\\"direction\\\": \\\"in\\\",      \\\"schedule\\\": \\\"0 0 1 * * *\\\"    },    {      \\\"type\\\": \\\"blob\\\",      \\\"name\\\": \\\"outPosts\\\",      \\\"path\\\": \\\"outcontainer/posts\\\",      \\\"connection\\\": \\\"AzureWebJobsStorage\\\",      \\\"direction\\\": \\\"out\\\"    }  ],  \\\"disabled\\\": false}The schedule is in a cron-type format, so this function will run at 01:00 hours every day.Again, the PowerShell code is simple enough:(Invoke-WebRequest https://ntsystems.it/api/v1/posts/ -UseBasicParsing).content | Out-File -Encoding ascii -FilePath $outPostsThe Bot in actionOk, so with all of our code in place, we should now be able to communicate with our Bot using the Telegram messenger. Just search for the ntsystemsbot account and try it out :)This turned out to be a long story and there is so much left to explore. I hope the first two posts of this little series helped you understand the basics of Azure Functions, if someone finds a more practical use case a PowerShell-based Chatbot, I’d like to hear about it :)Thanks for reading!TomMore Information:  Telegram Bot Api  Azure Functions Webhooks\",\n  \"url\": \"https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-2/\"\n},{\n  \"id\": \"post-azure-functions-building-a-telegram-bot-with-powershell-1\",\n  \"title\": \"Azure Functions: Building a Telegram Bot with PowerShell 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"content\": \"Today I’ve got a fun one, we’re going to use Azure Functions to build a Telegram Bot with PowerShell. Sounds interesting? Well here we go. Before diving into the technical details, lets have a quick overview of what we’re trying to do.A Telegram Bot is an application that runs inside Telegram; users can interact with a Bot by sending them messages (or commands). The bot’s administrator controls the bot through a https-based API.Azure Functions is a serverless platform that lets us run pieces of code (functions) without worrying about the infrastructure. It’s called serverless because we just deploy code, no need to install virtual machines or applications. Azure functions support different programming languages, one of them is PowerShell. It’s still in experimental state, but it works just fine for what we’re going to do.So yes, we’re going to hook up our bot with a function app running PowerShell code in Azure.Azure FunctionsIn order to deploy our Azure Function, we have to login to the Azure Portal and create a new resource. Select the “Serverless Function App” which is currently listed in the Popular section of the marketplace, if it doesn’t show up, search for “Function App” and click Create.We’ll have to give a name to our app and select a storage account and location for the deployment. Once the deployment is finished, we can find the application through the All resources button on the left side in the Azure portal. Click the function app and add a new function. As noted before, PowerShell support is still experimental, so we have to create a new custom function, enabling the “Experimental Language Support”.Functions can have different triggers as well as various inputs and outputs. For our example, we’ll go with the “HTTP trigger” function. This function will run whenever it receives a HTTP request. Set the Language to PowerShell and the Authorization level to Function.The function is created with some basic code to get started, I’ve changed it a bit so that it will just return the object we pass to it.# POST method: $req$requestBody = Get-Content $req -Raw | ConvertFrom-Json# Response: $resOut-File -Encoding Ascii -FilePath $res -inputObject ($requestBody | ConvertTo-Json)Please make note of the function URL, right there next to the Run button. Remember that we selected an Authorization level of Function when creating the function, so we need to use a key when calling the function. This makes sure, that only our bot can call the function.To test the function, we can use Invoke-RestMethod to send a POST request:[PS] C:\\\\&gt; Invoke-RestMethod -Uri \\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\" -Body '{\\\"Name\\\": \\\"Tom\\\"}' -Method PostName----TomOk, so now that we’ve got a working function, let’s go ahead and create the bot.Telegram BotTo create a Telegram bot, well, we use a bot. Look up the @BotFather account and follow the instructions.For this basic example, it was enough to specify a name and account name:The BotFather will guide you through the process and, at the end, give you access token for the http API. To edit the bot after the fact, just use the /myBots command. To test the access token and verify the bot has been created, we can call the following URL:https://api.telegram.org/bot&lt;AccessToken&gt;/getMeReplace &lt;AccessToken&gt; with the actual token, just like that:[PS] C:\\\\&gt; Invoke-RestMethod -Uri \\\"https://api.telegram.org/bot528059907:AAxxVs/getMe\\\"  ok result  -- ------True @{id=550258749; is_bot=True; first_name=ntSystems.it; username=ntsystemsbot}Ok, now we should have a working Azure function app and a barebones Telegram bot. Continue to part two for the next steps.\",\n  \"url\": \"https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-1/\"\n},{\n  \"id\": \"post-lost-found-onion-service-cloudflare-dns\",\n  \"title\": \"lost & found: ntSystems Onion Service, Cloudflare DNS\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"It’s Friday and here’s another edition of lost &amp; found.We’re on torOur few twitter followers may already know it, for the rest of you here’s the news: Our little website is now also available as an Onion Service. Check it out at: ntsystcp…id.onionI’ve made some changes to the site in order to improve our readers privacy. Basically trying to serve all content directly and, for the Onion version, there are no Disqus comments as that requires external content and automatically loads some tracking scripts.Cloudflare launches 1.1.1.1We have been using Cloudflare to enable TLS and IPv6 (and more) for quite some time now. They launched a consumer DNS service on the first day of April. No, it was no joke. The Service is available at 1.1.1.1 and 1.0.0.1 and, interestingly, supports DNS over HTTPS.I have not been aware of DoH until now, and even though there don’t seem to be any existing client implementations, it enables some nice use cases. We can now use PowerShell’s Invoke-RestMethod to make DNS queries :)Here’s a quick function that does it:function Resolve-HttpsDns {    param(        [Parameter(Mandatory=$true)]        [string]        $Name,        [string]        $Type = \\\"A\\\",        [ipaddress]        $Server = \\\"1.1.1.1\\\"    )    $uri = -join(\\\"https://\\\",$Server,\\\"/dns-query\\\")    Invoke-RestMethod -Uri $uri -Body @{        ct = \\\"application/dns-json\\\"        name = $Name        type = $Type.toUpper()    } | Select-Object -ExpandProperty Answer}And there is a much more advanced module on GitHub and the PowerShell Gallery.Sun’s out, so let’s have a cold one. Nice weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-onion-service-cloudflare-dns/\"\n},{\n  \"id\": \"post-skype-for-business-hybrid-observations\",\n  \"title\": \"Skype for Business Hybrid Observations\",\n  \"author\": \"tto\",\n  \"tags\": [\"Office365\",\"Lync\",\"Skype4B\",\"Hybrid\",\"Exchange\"],\n  \"content\": \"A collection of information about Skype for Business in hybrid environments.Hosting ProviderExchange Online Hosted VoiceMailNew-CsHostingProvider -Identity 'ExchangeOnline' -Enabled:1 -EnabledSharedAddressSpace:1 -HostsOCSUsers:0 -ProxyFqdn \\\"exap.um.outlook.com\\\" -IsLocal:0 -VerificationLevel UseSourceVerificationSkype for Business OnlineNew-CsHostingProvider -Identity \\\"SkypeforBusinessOnline\\\" –Enabled:1 -ProxyFQDN \\\"sipfed.online.lync.com\\\" – EnabledSharedAddressSpace:1 -VerificationLevel UseSourceVerification – HostsOCSUsers:1 -AutodiscoverUrl 'https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root'  Note: Make sure the Edge Servers can lookup the _sipfederationtls records for your domains. The targets must be the Edge Server’s external interface.Push NotificationFor the push notification service to work, make sure the Skype for Business Online hosting provider has been configured and add push.lync.com to the allowed domains. Then enable the Push Notification Configuration:New-CsAllowedDomain -Identity \\\"push.lync.com\\\"Set-CsPushNotificationConfiguration -EnableMicrosoftPushNotificationService $True – EnableApplePushNotificationService $TrueExchange Online Integration# SFB Online PowerShell: Get Tenant Guid(Get-CsTenant).TenantId.Guid# SFB On-Premises PowerShell: OAuth ConfigurationNew-CsOAuthServer microsoft.sts -MetadataUrl \\\"https://accounts.accesscontrol.windows.net/&lt;GUID from above&gt;/metadata/json/1\\\"New-CsPartnerApplication -Identity microsoft.exchange -ApplicationIdentifier 00000002-0000-0ff1-ce00-000000000000 -ApplicationTrustLevel Full -UseOAuthServerSet-CsOAuthConfiguration -ServiceName 00000004-0000-0ff1-ce00-000000000000# SFB On-Premises PowerShell: Export SfB OAuth Certificate (on Front End Server)$thumbprint = (Get-CsCertificate -Type OAuthTokenIssuer).ThumbprintExport-Certificate -Cert Cert:\\\\localMachine\\\\my\\\\$Thumbprint -FilePath C:\\\\oAuth.cer# SFB On-Premises PowerShell: Point Autodiscover to EXOSet-CsOAuthConfiguration -ExchangeAutodiscoverUrl \\\"https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc\\\"# MSOnline PowerShell: Publish OAuth Cert and Add Service Principal Name$certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate$certificate.Import(\\\"C:\\\\oAuth.cer\\\")$binaryValue = $certificate.GetRawCertData()$credentialsValue = [System.Convert]::ToBase64String($binaryValue)New-MsolServicePrincipalCredential -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000 -Type Asymmetric -Usage Verify -Value $credentialsValue# Add Service Principal Name (sfb pool web services)$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\"00000004-0000-0ff1-ce00-000000000000/sfbwebext.uclab.eu\\\")$MsolSP | Set-MsolServicePrincipalThe Service Principal Names can alternatively be set using the *-AzureRmADServicePrincipal cmdlets from the AzureRM module.Once the configuration is complete, we can test Exchange Storage connectivity with the following command:Test-CsExStorageConnectivity -SipUri \\\"sip:tom@uclab.eu\\\" -Verbose  Note: The Front End Servers must be able to communicate with Exchange Online (directly or via proxy), otherwise the “Add Skype meeting” button will not be visible in Exchange Online OWA. This is also required for Modern Hybrid Authentication.To troubleshoot the Exchange Online Integration, run an UCWA (Web Infrastructure) trace on the Front End Servers. You should see incoming requests from Exchange Online and the corresponding responses from the Front End.# Request: Start-Line: POST /ucwa/oauth/v1/applicationsStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/defaultValuesStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/customInvitationStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/phoneDialInInformation...User-Agent: Exchange/15.20.588.14/OnlineMeetingContent-Type: application/vnd.microsoft.com.ucwa+jsonAccept: application/vnd.microsoft.com.ucwa+jsonX-ExCompId: OnlineMeeting# Response:Start-Line: 200 OKContent-Type: application/vnd.microsoft.com.ucwa+json; charset=utf-8{\\\"accessLevel\\\": \\\"Everyone\\\",\\\"entryExitAnnouncement\\\":\\\"Enabled\\\",\\\"attendees\\\":[],\\\"automaticLeaderAssignment\\\":\\\"SameEnterprise\\\",\\\"description\\\":\\\"\\\",\\\"leaders\\\":[],\\\"onlineMeetingId\\\":\\\"RMANN9FF\\\",\\\"onlineMeetingUri\\\":\\\"sip:tom@uclab.eu;gruu;opaque=app:conf:focus:id:RMANN9FF\\\",\\\"onlineMeetingRel\\\":\\\"myOnlineMeetings\\\",\\\"organizerUri\\\":\\\"sip:tom@uclab.eu\\\",\\\"conferenceId\\\":\\\"257150\\\",\\\"phoneUserAdmission\\\":\\\"Enabled\\\",\\\"lobbyBypassForPhoneUsers\\\":\\\"Disabled\\\",\\\"subject\\\":\\\"\\\",\\\"joinUrl\\\":\\\"https://meet.uclab.eu/tom/RMANN9FF\\\",\\\"2c04865e-a621-4a4d-81e0-8047131f87d8\\\":\\\"please pass this in a PUT request\\\",\\\"_links\\\":{\\\"self\\\":{\\\"href\\\":\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF\\\"},\\\"onlineMeetingExtensions\\\":{\\\"href\\\":\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF/extensions\\\"}},\\\"rel\\\":\\\"myOnlineMeeting\\\",\\\"etag\\\":\\\"3055269905\\\"}...Modern AuthenticationTo use modern authentication with Skype for Business, the ADFS Server has to be prepared using the sfbadalscripts. More information about how to use the scripts can be found here. The script has to be run on the ADFS server, be sure to include all internal and external URLs of the Skype deployment in the PoolIds parameter..\\\\Setup-Adfs2016OAuthTrustForSfB.ps1 -PoolIds 'https://sfbwebext.uclab.eu/','https://sfbwebint.uclab.eu/'When the ADFS Server has been prepared, the following commands can be used to enable modern authentication.  Note: This can only be configured globally, double-check the prerequisites and, even though existing sessions will not be re-authenticated, schedule a maintenance window.# Create new OAuth ServerNew-CsOAuthServer -Identity uclabFS -Type ADFS -MetadataURL \\\"https://fs.uclab.eu/FederationMetadata/2007-06/FederationMetadata.xml\\\"# Require Authorization using ADFSSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity uclabFSAfter that just wait for the management store replication to publish the change and test it with a client or the Test-CsRegistration cmdlet.  To roll back the change simply set the ClientAuthorizationOAuthServerIdentity parameter to $null.Hybrid Modern AuthenticationFor hybrid authentication to work, we need to add more SPNs to the MSOL Service Principal. Add all internal and external Web Services URLs of the Skype deployment to the list:# MSOnline PowerShell$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\"https://sfbwebext.uclab.eu\\\")$MsolSP.ServicePrincipalNames.Add(\\\"https://sfbwebint.uclab.eu\\\")$MsolSP | Set-MsolServicePrincipalThen, add the evoSTS (Azure AD Federation Service) to the Skype for Business OAuth configuration and enable it using:# Create new OAuth ServerNew-CsOAuthServer -Name evoSTS -IssuerIdentifier sts.windows.net -MetadataUrl \\\"https://login.windows.net/common/FederationMetadata/2007-06/FederationMetadata.xml\\\" -Type AzureAd -AcceptSecurityIdentifierInformation $True# Require Authorization using Azure ADSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity evoSTSOn the client, make sure to set AllowAdalForNonLyncIndependentOfLync and Enable Modern Authentication if required.$a = New-CsClientPolicyEntry -name AllowAdalForNonLyncIndependentOfLync -value \\\"True\\\"Set-CsClientPolicy -Identity Global -PolicyEntry @{Add=$a} HKEY_CURRENT_USER\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\1x.0\\\\Lync\\\"AllowAdalForNonLyncIndependentOfLync\\\"=dword:00000001Hybrid VoiceIf we move enterprise voice users to the cloud they can still use our on-perm PSTN connectivity to make and receive calls. For that to happen, we need Skype for Business Edge Servers and the edge’s next-hop pool must also be running Skype. Then we configure a PSTN Usage for the online users as well as an Online Voice Routing policy. In it’s most basic form we need the following:# SFB Online PowerShell: Create the PSTN UsageSet-CsOnlinePstnUsage  -Identity Global -Usage @{Add=\\\"Unrestricted\\\"}# Create and assign the Voice Routing policyNew-CsOnlineVoiceRoutingPolicy OnlineVRP -OnlinePstnUsages UnrestrictedGrant-CsOnlineVoiceRoutingPolicy -Identity tom@uclab.eu -PolicyName OnlineVRPTo move a user from on-premises to Skype for Business Online, use the following:Move-CsUser -Identity tom@uclab.eu -Target sipfed.online.lync.com -Credential (Get-Credential)To move a user from Skype for Business Online to on-premises, use the following:Move-CsUser -Identity tom@uclab.eu -Target sfb01.uclab.eu -Credential (Get-Credential) -HostedMigrationOverrideUrl https://admin1e.online.lync.com/HostedMigration/hostedmigrationService.svcThe host part of the HostedMigrationOverrideUrl parameter can change based on where your tenant is hosted. To determine the host part, open the legacy Skype for Business admin center and copy the URL. It should look something like this: https://webdir1e.online.lync.com/LSCPThen replace webdir with admin and LSCP with HostedMigration/hostedmigrationService.svc. You think I am making this up, right? Read more here.Skype for Business Online users must be assigned an E5 license or have PSTN calling added to their E1/E3 plans to be able to make and receive calls.To be continued ;)Tom\",\n  \"url\": \"https://onprem.wtf/post/skype-for-business-hybrid-observations/\"\n},{\n  \"id\": \"post-aad-connect-failed-to-load-configuration-information\",\n  \"title\": \"Azure AD Connect: Failed to load configuration information\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\",\"Azure\",\"Office365\"],\n  \"content\": \"When upgrading Azure AD Connect (ADSync), the wizard fails with the error: “Failed to load configuration information from primary ADFS server”.ProblemThis can happen if the federation service was moved to a different machine after installing Azure AD Connect. Subsequent updates to the synchronization service fail with the above error message. This is because AD Connect stores the name of the original ADFS server in the PersistedState XML file.The fils is located at: C:\\\\ProgramData\\\\AADConnect\\\\PersistedState.xmlThe ADFS servername is stored in the IAdfsContext.TargetAdfsServers property, oh and it’s Base64 encoded. PowerShell can be used to easily read the file:[xml]$xml = Get-Content \\\"C:\\\\ProgramData\\\\AADConnect\\\\PersistedState.xml\\\"$xml.PersistedStateContainer.Elements.PersistedStateElementSolutionSimply update the value of the IAdfsContext.TargetAdfsServers with the servername of the new ADFS machine, as the servername has to be Base64 encoded, the following PowerShell code can be used to convert a string:$name = \\\"adfs01.example.com\\\"[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($name))Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/aad-connect-failed-to-load-configuration-information/\"\n},{\n  \"id\": \"post-tunneling-ssh-through-tor\",\n  \"title\": \"Tunneling SSH through Tor\",\n  \"author\": \"tto\",\n  \"tags\": [\"WSL\",\"Cloud\"],\n  \"content\": \"I’ve been using Onion Services aka. Hidden Services to connect to remote machines for some time now. Tor clients can connect to such services through the Tor network, there is no need to know the IP address of the destination machine, likewise there is no need to configure inbound port mappings or firewall rules.Destination (running the Onion Service)On the destination machine, we need to install Tor. For best results follow the instructions here.Once installed, we configure the hidden service in the /etc/tor/torrc configuration file. Find the section dedicated to hidden services in the file and create a new service or uncomment on of the examples.HiddenServiceDir /var/lib/tor/my_hidden_service/HiddenServicePort 80 127.0.0.1:80HiddenServicePort 2244 127.0.0.1:22The above example, creates a service with the name of my_hidden_service which will listen on port 80 and provide whatever runs on 127.0.0.1:80 over the Tor network. It will also listen on port 2244 and provide ssh (which runs on 127.0.0.1:22) as a hidden service.Securing SSHAs you are essentially making your sshd accessible to the whole Tor network, it might be a good idea to disallow password authentication and root access. To do that, make sure your /etc/ssh/sshd_config contains the following lines:PasswordAuthentication noPermitRootLogin prohibit-passwordHostname and KeysAfter configuring the Onion Service, restart the Tor service: sudo service tor restart. After it has started, the hidden service directory (as configured in HiddenServiceDir) will have been created and we can find two files in the directory. The hostname file contains the hostname that we need on the client side in order to connect to the service.sudo cat /var/lib/tor/my_hidden_service/hostnamexxxxxxx.onionClient (accessing the Onion Service)To connect to the first hidden service, a website running on port 80, we can simply use Tor Browser and open the hostname we found in the hidden service directory above. To connect via SSH, there are multiple options but first, we do also need to install Tor. Again for best results follow the official instructions.On WSL I was able to install it by simply using sudo apt-get install tor. We will also need the nc tool from the netcat-openbsd package, if it is not available on your system, install it using: sudo apt-get install netcat-openbsd.Once installed, start tor by typing tor --runasdaemon 1.torifyTorify comes with the installation of the Tor package on the client and is a simple wrapper that tries to connect a given application through Tor.torify ssh tom@xxxxxxx.onion 2244The above example connects ssh to the .onion address on port 2244. On my system, torify throws a few errors but finally works well enough..ssh/configAnother option is to add the destination hostname to the ssh config file of the client. This can typically be found in the users profile directory at .ssh/config.Simply add a line for each destination you want to connect to. The ProxyCommand uses the nc tool, to tunnel the connection through 127.0.0.1:9050 which is the clients Tor endpoint.Host t01 HostName xxxxxxxx.onion port 2244 ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %pPlease note, on Mac OS I had to use ncat instead of nc, so the ProxyCommand looks like:   proxyCommand ncat --proxy rhel01:9050 --proxy-type socks5 %h %p  A final note on privacy: This guide is meant to help connect to remote systems behind NAT routers or firewalls with and changing public IPs. Think connect to your home network from work. It is not meant to provide the best possible privacy. For that, please refer to the official documentation.Have fun!Tom\",\n  \"url\": \"https://onprem.wtf/post/tunneling-ssh-through-tor/\"\n},{\n  \"id\": \"post-testing-coinhive\",\n  \"title\": \"Testing CoinHive\",\n  \"author\": \"tto\",\n  \"tags\": [\"ntSystems\",\"Crypto\"],\n  \"content\": \"I’ve recently stumbled upon coinhive and with all the recent fuzz about crypto currencies, I decided to have a look at it. So what’s that all about?coinhive: A JavaScript Monero MinerMany crypto currencies rely on a https://en.wikipedia.org/wiki/Proof-of-work_system algorithm in order to verify transactions. There are quite a few different algorithms out there, some of them more difficult than others. Bitcoin for example uses hashcash which, at current difficulty levels, can only be feasibly generated on specialized hardware (ASIC).Another one of those PoW algorithms is CryptoNight which has been designed to be ASIC resistant and can feasibly be generated on modern CPUs and GPUs. Monero, a private and censorship-resistant digital currency, happens to use the CryptoNight algorithm, which means it can be mined efficiency on consumer devices.That’s what the coinhive miner does. It essentially runs a JavaScript application in the users web browser and uses the devices CPU to mine Monero. The mined Monero will then be payed out to a wallet we own.ntSystemsNow as this website is a side-project and does not make us any money at all (and we don’t like Ads), we decided to test drive coinhive for a week.  Starting today, by visiting our side your device will be used to mine Monero and, by doing so, help us maintain the site and deliver more awesome content.After the first week’s trial we will publish the stats and discuss the ethics behind “abusing” our visitors spare CPU cycles.The following code has been added to the site’s footer in order to start the miner:/edit: removed codeUpdateAfter one week of testing here are the results of this little experiment. This site has between 300 and 600 active users on a given day, not a lot but it’s something. So with the above code, we are using up to 90% of the visitors CPU cycles to generate Monero using coinhive’s JavaScript miner.This resulted to be about 468 hashes per second totalling about 173.82 million hashes in a week. According to monerobenchmarks.info, these figures can be compared to what a not-very-modern GPU with 4GB of memory would produce.The final balance after the weeks test is 0.02582 xmr, worth about 2€ at the time of this writing.Another UpdateSoon after the last update, ad-blockers started blocking the download of the javascript and the hashrate dropped quite a bit. I’ve since decided to remove the code and stop (ab)using our visitors CPUs.Thanks!Tom\",\n  \"url\": \"https://onprem.wtf/post/testing-coinhive/\"\n},{\n  \"id\": \"post-the-invisible-internet-project-and-wsl\",\n  \"title\": \"The Invisible Internet Project and WSL\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"WSL\",\"Cloud\"],\n  \"content\": \"The Windows Subsystem for Linux can be used to run quite a few interesting things on Windows, one of them is the Invisible Internet Project or i2p.Install i2pFirst of all we’ll have to install i2p on our system. Before starting the installation, we have to add the required repository:sudo apt-add-repository ppa:i2p-maintainers/i2psudo apt-get updatesudo apt-get install i2pAfter the installation we can start the i2prouter with the following command:i2prouter startAs soon as the service  is running, we can access the homepage using http://127.0.0.1:7657/home likewise the configuration page is available at http://127.0.0.1:7657/configConfigure ProxyFor testing, we don’t have to change anything in the home or configuration pages and we can just point our systems proxy configuration to i2p. The i2prouter listens on ports 4444 and 4445 for http and https traffic, respectively.Now you will soon notice that pointing your system’s proxy to i2p will allow you to browse .i2p sites but the “clear” intertnet will no longer work very well.Unlike tor, i2p is not intended to be used as proxy to the internet, but it’s purpose is to enable secret communication to resources inside the i2p network. Therefore it does not make a lot of sense to route all internet traffic trough i2p, it’s enough if we use the i2prouter to access *.i2p domains.Install PrivoxyTo get that done, i.e. routing only requests to .i2p domains to the i2prouter, we’ll need another small proxy that is capable of routing requests based on pattern. Let’s install privoxy:sudo apt-get install privoxyAfter installing privoxy, we’ll have to configure it so that it routes requests to *.i2p domains to i2prouter which runs at localhost:4444:Use your favorite editor to update the config file at /etc/privoxy/config and add the following line:forward .i2p localhost:4444Now restart privoxy sudo /etc/init.d/privoxy restart and set the systems proxy configuration to 127.0.0.1:8118.Setting the proxy with PowerShell and PACConstantly changing the proxy configuration does not work really well, I forget that I’ve set the proxy and if privoxy is not running, I have to disable the proxy in order to access the internet. In the first iteration, I wrote two quick and dirty PowerShell functions to enable/disable the proxy settings:Function Disable-Proxy {    $reg=\\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 0    Set-ItemProperty -Path $reg -Name ProxyServer -Value \\\"\\\"}Function Enable-Proxy {    param($proxyServer = \\\"localhost:8118\\\")    $reg=\\\"HKCU:\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 1    Set-ItemProperty -Path $reg -Name ProxyServer -Value $proxyServer}I put these in my $PROFILE and used them for a few days. It was ok, but there had to be a better solution… So I started to look into PAC or “Proxy auto-config” which is a configuration file that defines how web browsers can automatically choose the appropriate proxy server. Read more on WikipediaLong story short, I ended up using the following configuration file:function FindProxyForURL(url, host) {        // .onion URLs need a proxy:        if (shExpMatch(host, \\\"*.onion\\\"))        {                return \\\"PROXY localhost:8118\\\";        }        // other requests go directly        return \\\"DIRECT\\\";}Save the function above to a text file called proxy (without extension) and put it in C:\\\\Windows\\\\system32\\\\drivers\\\\etc\\\\ and set the systems AutoConfigUrl to: file://C:/Windows/system32/drivers/etc/proxyEnjoyTom\",\n  \"url\": \"https://onprem.wtf/post/the-invisible-internet-project-and-wsl/\"\n},{\n  \"id\": \"post-powershell-and-variable-references\",\n  \"title\": \"PowerShell and Variable References\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"I’ve come across an interesting behavior (or feature) of PowerShell the other day. As I don’t really understand what’s going on, I decided to write it up, maybe someone out there can help explaining this.ExpectedI’m writing a script that contains multiple functions and objects get passed from one function to another. As it happens the functions modify the objects that are passed in and output the modified information. So far so good, but what I found is, that the original object gets updated. So in the end I don’t need the function to output anything and can just carry on using the passed-in object.Confused? Well I am, so let’s try it with an example:$var = 1function Update-Value ([int]$InputObject) {    $InputObject++    Write-Output $InputObject}In the above example we define a variable with a value of 1 and a simple function that increases the value by 1 and outputs the increased value. That works as I would have expected, if we run the code, the output is:C:\\\\&gt; Update-Value $var2C:\\\\&gt; $var1UnexpectedNow if we do the same exercise with an object instead of a simple integer, the outcome is not exactly as I would have expected it to be. Here goes another example:$obj = New-Object -TypeName psobject -Property ([ordered]@{ a=1; b=2; c=3; })function Update-Value ([psobject]$InputObject) {    $InputObject.a++    Write-Output $InputObject}The idea is basically the same as above, the variable in this case contains a custom object with three properties: a, b, c. The function is still increasing the value on the input object, only that now we access the “a” property and increase it’s value.The output is as follows:C:\\\\&gt; Update-Value $obja b c- - -2 2 3C:\\\\&gt; $obja b c- - -2 2 3Now apparently the variable $obj gets updated as well. While in the first example, the integer in $var did not change, i.e. after running the function it was still 1, the value of $obj.a does change when I run the function.In my script I just decided to change the function so that it does no longer output the modified object and instead, I just call the function and carry on with my original variable. I do think the variable referencing in memory might be different when using a single integer vs. an object. It works for now, but as stated above, I don’t understand why and that worries me to some degree…Thanks to anyone who cares to comment and offer an explanation!TomUpdateAfter posting this to /r/PowerShell someone referred me to this thread which explains the behavior quite well.The variable $InputObject in my case does not contain the object but is just a pointer to $obj, which is therefore updated directly.\",\n  \"url\": \"https://onprem.wtf/post/powershell-and-variable-references/\"\n},{\n  \"id\": \"post-jekyll-on-wsl\",\n  \"title\": \"Jekyll on WSL\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"WSL\",\"ntSystems\"],\n  \"content\": \"Today we are looking at running Jekyll on WSL or Bash on Ubuntu on Windows.Install WSLFirst of all we’ll have to make sure our system fulfills the prerequisites to run the “Windows Subsystem for Linux”. We need a 64-bit version of the Windows 10 Anniversary (build 14939) or newer for that. Then we’ll have to enable the “Developer mode” using “Settings”, “Update &amp; Security” and finally “For Developers”.Once the above prerequisites are met, we can go ahead and enable the WSL using the control panel or the following command in an elevated PowerShell session:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-LinuxAnd finally we can type bash into an administrative command prompt to download and install bash.A detailed installation guide is available on MSDNInstall JekyllAfter setting up Bash on Ubuntu on Windows we can now install the required packages for Jekyll using the following commands.sudo apt-add-repository ppa:brightbox/ruby-ngsudo apt-get -y updatesudo apt-get install git build-essential libcurl4-openssl-dev zlib1g-devsudo apt-get install ruby2.4 ruby2.4-devAfter installing ruby verify the the installed version using ruby -v. Jekyll requires a version greater that 2.Now let’s install nodejs and finally Jekyll:curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -sudo apt-get install -y nodejssudo gem install jekyll bundlerServeNow that the prerequisites are installed, we can go ahead and build our static website. To get started with Jekyll, head over to the official documentation page. In my case, I just want to serve up a local copy of this great blog, so I clone the git repository and build the site locally using:git clone https://github.com/ntsystemsit/ntsystemsit.github.iocd ntsystemsit.github.io/bundle installbundle exec jekyll serve -d /tmp/ntsystemsNote: There seems to be a bug related with WSL. I have to use the --force-polling switch with the serve command on Windows 10 1607, on 1703 it works without that switch. Check the  following issue on GitHub.Well, what can I say? I really like the possibility to natively run Linux packages on Windows 10. Even though it doesn’t make the Linux part less complicated, at least I don’t need a VM anymore :)So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/jekyll-on-wsl/\"\n},{\n  \"id\": \"post-keeping-track-of-powershellcore-releases-on-github\",\n  \"title\": \"Keeping track of PowerShellCore releases on GitHub\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"GitHub\"],\n  \"content\": \"I’ve been using PowerShell Core on my MacBook for a while now. As the code is still in its early stages, there’s no way of managing/updating the software one is running, at least none that I would be aware of. I did miss some updates and, as a result, had problems with Visual Studio Code. So I’ve put together a quick function that checks the latest release on GitHub and can conveniently be put into my $PROFILE.GitHub Releases feedPowerShell Core was open-sourced some time ago and the team behind it is using GitHub to manage the code. The latest version for all the supported operating systems can be found in the PowerShell repository. Every so often, a new release is published to the Releases feature of GitHub and it happens that GitHub does provide an atom feed for releases. This feed can be accessed by simply appending “.atom” to the URL.Get-PSVersionGitHubArmed with this information, I wrote the following simple function. It just gets the latest release from the repository’s atom feed and adds the information to a hash table, which is then output as a custom object:Now I just put the function into my $PROFILE and make it run every time PowerShell starts.Easy enough, right?Tom\",\n  \"url\": \"https://onprem.wtf/post/keeping-track-of-powershellcore-releases-on-github/\"\n},{\n  \"id\": \"post-jekyll-fun-consuming-ntsystems-with-powershell\",\n  \"title\": \"Jekyll Fun: Consuming ntSystems with PowerShell\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"As you might have read before, our little blog is powered by Jekyll. Well I stumbled over the jsonify filter the other day, and so I built a little “kind-of” API :) Sound interesting? Read on.HowIt all started with search, I was looking for a search feature for our blog. After some testing with Algolia I stumbled over this great post by Katy. She’s using lunr.js with Jekyll. I liked the client-side approach of lunr.js and that it has no external dependencies, so I adopted Katy’s implementation for our site and, voilà, we have search. So, why do I keep talking about search? Well lunr.js consumes data in as json objects, so that’s how I learned about the jsonify filter.After some playing around with curly braces and the forloop in liquid I ended up creating the first version of our so-called API.Basically, what I’m doing is looping through the posts and creating json objects.I created a few different folders to expose different information, but more about that in the examples below.Use Invoke-RestMethod to consume the jsonThere are various “endpoints” available, we can get meta information about the site at /meta/ or a list of all pages and posts at /pages/and /posts/, respectively.In the following example, we’re getting all posts with a Category of ntSystems and then just select the tags property:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Where-Object category -eq ntSystems | Select-Object tagstags----{migrate, jekyll}{migrate, jekyll}{update, jekyll}Alternatively, we can get list of all categories, just like that:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Select-Object Category -Uniquecategory--------CloudAzureDev...Awesome, right?Well, that’s all for today. Enjoy your weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/jekyll-fun-consuming-ntsystems-with-powershell/\"\n},{\n  \"id\": \"post-my-takeaways-from-ms-techsummit\",\n  \"title\": \"My takeaways from MS Tech Summit\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\"],\n  \"content\": \"Daniel and I have attended the Microsoft Tech Summit in Milan earlier this week. Overall it was a pretty good event, especially taking into account that it was free. The keynote was quite interesting, so much so, that I thought I’d share my takeaways.  Focus on solutions (not individual components) and add valueThis, for me, is the message that came across most clearly. Focus on helping your business, brining value by enabling new processes and possibilities. Don’t waste your valuable time upgrading the umpteenth server or migrating from v14 to v15. Move to the cloud where it makes sense and free-up resources.  Infrastructure continues to lose importance and platform services get more importantSure, there is a huge uptake in IaaS but that can only be an interim solution. If any organization is going to really benefit from using cloud services, the managing of virtual machines (just like on-prem) should not be part of the equation.  Skills change!In a modern world, the IT pro’s focus can no longer be a single nitty-gritty technical thing. Many of us almost ignored the business’ evloving needs while pursuing mastery in that single discipline. In this increasingly cloud-first world, we will have to change. Radically.  GDPR: General Data Protection RegulationThis thing is coming and fast. The business must be prepared and IT can should play a key role in implementing the right tools and policies to follow the regulation. Oh, and tell me about changing skills ;)  Cloud adoption in Italy is above average and growingIt was really interesting to see that the economic turbulences were a driver for cloud adoption in Italy. A great customer story with a well-known, Italian media outlet showed how a sensible approach to cloud technologies could both, enable exciting new scenarios and drive down cost.Sessions and slide decks can be downloaded from the Tech CommunityWhat do you think about the changing role of IT? Leave a comment below!Tom\",\n  \"url\": \"https://onprem.wtf/post/my-takeaways-from-ms-techsummit/\"\n},{\n  \"id\": \"post-aure-site-recovery-deployment-planner\",\n  \"title\": \"Azure Site Recovery Deployment Planner\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"ASR\"],\n  \"content\": \"Today I was super excited about the first tests with the Azure Site Recovery Deployment Planner. Sometimes calculating the Bandwidth, Storage, local infrastructure needed for Site Recovery can be very tricky. Therefore, I’m happy that Microsoft released a helpful tool to get the right information needed.The planner is a command-line tool in public preview for VMWare only, so the final version is not completed yet. Profiling the environment can be done remotely, so no agents or pieces of software on ESX Server or vCenter is needed. The planner provides following details:  Compatibility assessment  Network bandwidth need versus RPO assessment  Azure infrastructure requirements  On-premises infrastructure requirementsRequirementsThe planner needs following components:  Windows Server 2012 R2  .Net Framework 4.5  VMware vSphere PowerCLI 6.0 R3  Microsoft Visual C++ Redistributable for Visual Studio 2012  Microsoft ExcelProfilingFirst of all, we have to start profiling the VM’s that we want to protect with Azure ASR. The tool connects to the vCenter server (or ESX) to collect performance data. There is no performance impact on the VM’s because the performance data of the vCenter is taken and no data from inside the VM. The tool basically queries every 15 minutes the vCenter to get the performance data.As first step we create a VM list with VM’s we want to profile. Connect to the vCenter with the VMWare CLI:Connect-VIServer -ServerExport the list of all VM’s to a Text FileGet-VM |  Select Name | Sort-Object -Property Name &gt;  C:\\\\Service\\\\Output.txtYou should get a list like this. I deleted the not needed VM’s from the Textfile and saved the changes.Now we are ready to start profiling. Microsoft recommends to profile at least 15 days. In our test we will profile 24 hours. From a Powershell window we can start profiling with the following command:.\\\\ASRDeploymentPlanner.exe -Operation StartProfiling -Directory “C:\\\\vCenter1_ProfiledData” -Server vCenter1.FQDN -VMListFile “C:\\\\Service\\\\Output.txt” -NoOfDaysToProfile 0.04 -User vCenterUser1A complete list of all switches can be seen here.If you see following output in powershell you are all right. In my case, there are some VM’s not running and therefore a warning is displayed because the tool can obviously not collect performance data.Generate reportAfter profiling is completed we can see that the tool created some performance CSV Files:Now we can run the tool in report-generation mode to get the report.\\\\ASRDeploymentPlanner.exe -Operation GenerateReport -Server vCenter1.FQDN -Directory “C:\\\\vCenter1_ProfiledData” -VMListFile “C:\\\\Service\\\\Output.txt”A complete list of all switches can be seen here.The report is named as “DeploymentPlannerReport” and can be opened with Excel.What we can see from the Excel Report is basically the number of profiled, compatible and incompatible VM’s. If we click on details, we can get the name of the not compatible VM. In my case a VM’s has a Disk with 10TB VMDK attached. (Azure has a limit of 1TB per disk).I selected in the right corner a desired RPO with 15 minutes. Based on this value the report start calculating the Mbit/s needed.In the Required Network Bandwidth section there are 3 graphs:  To meet RPO 100 percent of the time: The recommended bandwidth in Mbps to be allocated to meet the desired RPO 100 percent of the time.  To meet RPO 90 percent of the time: If we cannot set the bandwidth needed to meet your desired RPO 100 percent of the time, we can choose to go with a lower bandwidth setting that can meet a desired RPO 90 percent of the time. (In my case 100 and 90 RPO are both 2 Mbit.. maybe there is still a bug with the calculation. Because the tool is in preview I guess this will be fixed before GA)  Achieved Throughput: This is the real Throughput that can be measured with the following command:ASRDeploymentPlanner.exe -Operation GetThroughputIn my case this is $Null because I have to change the QoS rules and didn’t execute the test acutally.Based on the storage activity the planner recommends the storage accounts needed. I have one VM with heavy storage operations that needs Premium disks (SSD).Very interesting is the recommendation about the local infrastructure. In my case, only one server is needed to replicate the VM’s to Azure.The WhatIf Graph shows what would happen if we decide to use a throughput to meet 90% of the RPO. Actually, I don’t fully understand the sense of the graph. Helpful would be to choose the bandwidth in a combo box or something similar and then see what happens.In the Recommended VM batch size for initial replication section, Microsoft shows the recommendation of number of VMs that can be protected in parallel to complete the initial replication within 72 hours with the suggested bandwidth to meet desired RPO 100 percent of the time being set. The value can be changed using the GoalToCompleteIR parameter during report generation.Let’s switch to the “Input” Tab in Excel. Here we can see some very interesting values. The most interesting values for me is: Total Data to be replicated for initial replicationConclusionSome things don’t work as expected. But we have to consider that the tool is in public preview, so many changes and improvements are expected. Stay tuned for further updates.Daniel\",\n  \"url\": \"https://onprem.wtf/post/aure-site-recovery-deployment-planner/\"\n},{\n  \"id\": \"post-get-going-with-go\",\n  \"title\": \"Get Going with Go!\",\n  \"author\": \"tto\",\n  \"tags\": [\"Go\",\"Basics\"],\n  \"content\": \"Everyone is talking about Go these days so I decided to have a look at it and see what it could do for me.BasicsSo what is Go? Well according to golang.org  Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.Ok, so another programing language, why do I care you ask? Well that’s a story for another day, for now, let’s say that I’m just generally interested in awesome technology.Installing on macOSThe first “Hello World” kind of program can easily be done using tour.golang.org but I wanted to get it up and running on my MacBook so I installed the package using brew, it’s easy enough with: brew install goAfterwards, a quick go version confirmed that the latest and greatest version of Go has been installed. 1.8 at the time of writing.go version go1.8 darwin/amd64Environment VariablesBefore firing up an editor, some environment variables need to be set in order for Go to work and store projects and dependencies in some user-defined path. I’ve added the following to lines to my bash profile:export GOPATH=$HOME/git/goexport GOBIN=$(go env GOPATH)/binexport PATH=$PATH:$GOBINWhat this does, is setting the GOPATH and GOBIN environment variables to a folder in my home directory and adding the GOBIN directory to the systems’ PATH variable. The first variable instructs Go to look for and install sources and packages in the specified folder, the second variable defines where binaries are located and adding this to the systems’ PATH simply makes running Go programs easier.Hello World with Visual Studio CodeOn the Mac, I’m mostly using VS Code to write/edit text files, as it has some extensions for Go, I figured it would do the trick for the beginning. So I opened up my GOPATH directory in VS Code and created a new folder under src, hello in my case. In this folder I created a hello.go file, and at this point, Visual Studio Code recognises the Go language and downloads some required tools to the GOPATH directory.After a restart, I created the following hello world program:package mainimport \\\"fmt\\\"// SayHelloTo takes a string and prints it to the console.func SayHelloTo(s string) {\\tfmt.Println(\\\"Hello \\\" + s + \\\"!\\\")}// The main function just invokes SayHelloTo with a stringfunc main() {\\tSayHelloTo(\\\"Tom\\\")}Run / Build / InstallTo run the above program, just change into the hello folder and run go run hello.go which should result in the following output:ttor$ go run hello.goHello Tom!Now if I wanted to create a binary and install it, I could simply run go build hello.go which leaves me with the executable file. To install it, into Go’s bin directory (GOBIN) I use: go install hello.goAfter that, I can run hello and again get the above output:ttor$ helloHello Tom!Well that was my quick introduction to Go, we’ll soon see if there’s more to come…Nice weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/get-going-with-go/\"\n},{\n  \"id\": \"post-get-started-with-azure-arm-templates\",\n  \"title\": \"Get started with Azure ARM Templates\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"RM\"],\n  \"content\": \"To start with the deployment using Azure ARM Templates is quite easy. A first step can be to deploy an Azure SQL Database. But let’s start with a bit of background information:TemplatesWe can create a template (in JSON format) that defines and configures the Azure solution. When we create a solution from the portal, the solution automatically includes a deployment template. So, we don’t have to create our template from scratch but we can download the templates for the existing deployments. To get the templates open the “Resource Group” section in the Azure Portal and click on DeploymentsClick on “View Templates”What we can see now is the Template and Parameter file. When we start a new deployment, we have to define parameters for the resource template, these needs to be entered in before the deployment can start.You can find other ARM templates on the following Microsoft WebsiteDeploymentWe are going to deploy a new SQL Database, so my template looks like this:{    \\\"$schema\\\": \\\"http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#\\\",    \\\"contentVersion\\\": \\\"1.0.0.0\\\",    \\\"parameters\\\": {        \\\"collation\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"databaseName\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"edition\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"requestedServiceObjectiveId\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"maxSizeBytes\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"serverName\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"serverLocation\\\": {            \\\"type\\\": \\\"String\\\"        },        \\\"diagnosticStorageAccountId\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        },        \\\"diagnosticsTemplate\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        },        \\\"sampleName\\\": {            \\\"defaultValue\\\": \\\"\\\",            \\\"type\\\": \\\"String\\\"        }    },    \\\"resources\\\": [        {            \\\"type\\\": \\\"Microsoft.Sql/servers/databases\\\",            \\\"name\\\": \\\"[concat(parameters('serverName'), '/', parameters('databaseName'))]\\\",            \\\"apiVersion\\\": \\\"2014-04-01-preview\\\",            \\\"location\\\": \\\"[parameters('serverLocation')]\\\",            \\\"properties\\\": {                \\\"collation\\\": \\\"[parameters('collation')]\\\",                \\\"edition\\\": \\\"[parameters('edition')]\\\",                \\\"maxSizeBytes\\\": \\\"[parameters('maxSizeBytes')]\\\",                \\\"requestedServiceObjectiveId\\\": \\\"[parameters('requestedServiceObjectiveId')]\\\",                \\\"sampleName\\\": \\\"[parameters('sampleName')]\\\"            }        }    ]}Let’s focus on the parameter file that specifies the deployment. It should look like this:{    \\\"$schema\\\": \\\"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#\\\",    \\\"contentVersion\\\": \\\"1.0.0.0\\\",    \\\"parameters\\\": {        \\\"collation\\\": {            \\\"value\\\": \\\"SQL_Latin1_General_CP1_CI_AS\\\"        },        \\\"databaseName\\\": {            \\\"value\\\": \\\"Database3\\\"        },        \\\"edition\\\": {            \\\"value\\\": \\\"Basic\\\"        },        \\\"requestedServiceObjectiveId\\\": {            \\\"value\\\": \\\"dd6d99bb-f193-4ec1-86f2-4fe4rscbc49c\\\"        },        \\\"maxSizeBytes\\\": {            \\\"value\\\": \\\"2147483648\\\"        },        \\\"serverName\\\": {            \\\"value\\\": \\\"sqllogicalz2010\\\"        },        \\\"serverLocation\\\": {            \\\"value\\\": \\\"westeurope\\\"        },        \\\"diagnosticStorageAccountId\\\": {            \\\"value\\\": \\\"\\\"        },        \\\"diagnosticsTemplate\\\": {            \\\"value\\\": \\\"\\\"        },        \\\"sampleName\\\": {            \\\"value\\\": \\\"AdventureWorksLT\\\"        }    }}I modified that Database Name because I want my new Database to be called “Database3”. Lets save both files to the local machine (or GitHub if you want). Name the template file NewSQLDatabase.json and the parameter file Parameter-NewSQLDatabase.json.The Template and Parameter files are now ready for deployment. Lets fire up Powershell and push the change to Azure. First, we have to connect to the Azure Account and select our subscription# Connect to Azure RM AccountLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId c2a12a42-0179-*************With the “New-AzureRmResourceGroupDeployment” cmdlet we start the deployment process using our template and parameter file as attributes.# ARM Template SQL DatabaseNew-AzureRmResourceGroupDeployment -Name SQLDatabase -ResourceGroupName rg_Z2010 -TemplateFile \\\"F:\\\\Templates\\\\SQL Database\\\\NewSQLDatabase.json\\\" -TemplateParameterFile \\\"F:\\\\Parameters\\\\SQL Database\\\\Parameter-NewSQLDatabase.json\\\"After we executed the command we should see similar output and the Database is running on Azure :)Stay tuned for further postsDaniel\",\n  \"url\": \"https://onprem.wtf/post/get-started-with-azure-arm-templates/\"\n},{\n  \"id\": \"post-disable-backup-protection-for-azure-vm\",\n  \"title\": \"Disable Azure Backup Protection for a VM with Azure PowerShell\",\n  \"author\": \"dni\",\n  \"tags\": [\"PowerShell\",\"Azure\",\"RM\"],\n  \"content\": \"My Azure credits burn faster than expected :) So I decided to remove some VM’s and Backup that I used for a customer’s demonstration. Since I don’t use the Azure Portal for configuration anymore, I fired up Powershell and did the Job. With the following commands, I show you how to stop the Backup for a Virtual Machine and delete the associated Recovery Points.Disable and delete VM BackupLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId ***************$container = Get-AzureRmRecoveryServicesBackupContainer -Name VIRTUAL-MACHINE-NAME  -ContainerType AzureVM$BackupItem = Get-AzureRmRecoveryServicesBackupItem $container -WorkloadType AzureVM Disable-AzureRmRecoveryServicesBackupProtection -Item $BackupItem -RemoveRecoveryPointsI know you may think this is quite simple and why is this guy writing a post with only 3 lines of code.  It’s because Tom moved our blog to Git and this is my first blog post that I try to upload and don’t wanted to wait :)Greetings\",\n  \"url\": \"https://onprem.wtf/post/disable-backup-protection-for-azure-vm/\"\n},{\n  \"id\": \"post-migrating-blogengine-to-github-pages-2\",\n  \"title\": \"Migrating from BlogEngine to GitHub Pages: Fixing the links\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"In this episode of our little series on migration we are having a look at the URL structure of Jekyll and some of the less visible stuff that was associated with the old ntSystems.All the existing URLs on our BlogEngine-based blog used both, upper- and lowercase letters, and had an filename extension of .aspx. Now Jekyll does not use filename extensions (or at least doesn’t display them) and it uses all lowercase letters in URLs.Additionally we moved from https-enabled to https-only and the usage of a www. hostname was not defined. So all of those URLs would have worked on the old blog:  http://ntsystems.it/CONTACT.aspx  https://ntsystems.it/contact.aspx  http://www.ntsystems.it/contact.aspx  …You see, it was a mess. On the current version of ntSystems, only the following URL will work:  https://ntsystems.it/contact/But what about existing links from social media, other blog posts, or where ever else, you ask? Well the solution is twofold. First, enter…CloudflareWe have been using Cloudflare for a while to easily enable IPv6 and and https even for our old blog. Now another feature, Page Rules, comes in very handy indeed. In fact a single rule is enough to get rid of the .aspx extensions:If the URL matches *ntsystems.it/*.aspx forward the request to https://ntsystems.it/$2 where $2 is the stuff that was matched by the second asterisk * in the matching pattern. Easy enough!Jekyll URL structureThe second part of getting URLs right is instructing Jekyll to make them the same as before, without .aspx. And it turns out, that’s not to hard, either:The following setting in our _config.yml file tells Jekyll to build all posts in the /post/ directory.permalink: /post/:titleThe title property was copied into the front matter by the script we used to migrate the posts. Quite ready, but not yet.We still have to deal with the uppercase/lowercase filenames in the URLs. We ended up using JekyllRedirectFrom to work around that. We just added the 'jekyll-redirect-from' gem to our Gemfile and used the migration script to add an uppercase version of the filename to the front matter like this:redirect_from: [\\\"/post/Azure-File-Services\\\", \\\"/post/azure-file-services\\\"]URLs. Check.RSSBlogEngine used a number of .axd scripts/handlers as endpoints for things like the RSS feed, the sitemap file, or a metaweblog extension. Obviously, the /syndication.axd URL does no longer work on Jekyll, a simple /feed.xml file is used instead.I tried various redirection methods but found that RSS clients (like The Old Reader) ignored them and the feed would go dead.After some testing I found that I could create a directory with the name of syndication.axd and simply put an index.html into it. Jekyll does not show the index.html in the URL, therefore the URL would still be /syndication.axd. I copied the content of feed.xml into the /syndication.axd/index.html and, voilá, the existing RSS link continued to work.SitemapThe URL of the sitemap.axd file is less important as it’s only used by search engines and not by users. So we just created a new sitemap.xml file and pointed the search engines to this new file. Additionally, we updated the Sitemap property in our robots.txt file.Well, and that’s it for today. Happy Halloween! :)Tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-blogengine-to-github-pages-2/\"\n},{\n  \"id\": \"post-introducing-tak\",\n  \"title\": \"Introducing: TAK\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Cloud\"],\n  \"content\": \"Over the years I did create, find, copy, paste, quite a few lines of PowerShell code. Some of which I’m turning into re-usable functions and collecting in a module, creatively called “Tom’s Admin Kit” or TAK. I hope you find it useful.I try to credit the sources for the stuff that I just copied off of the interwebs, even though I don’t actually remember all of them.PesterAs written before, Pester is  a unit testing framework for PowerShell code. So one can write simple tests to verify the code actually does, what it is supposed to do. Not all functions are covered by tests, yet, but I try to be better at that. The existing tests can be found in the GitHub repo for the module.CI&amp;D: GitHub and AppVeyorI read a lot about this continuous integration and delivery and I thought it would be nice to play with some of the involved tools myself. So I created a small-ish release pipeline/workflow for this module using GitHub, AppVeyor and the PowerShell Gallery. Here is how it works: When a new commit is pushed to GitHub, AppVeyor picks up the latest code and deploys it to a test machine. It then runs all the pester tests and, upon success, publishes the module to the PowerShell Gallery.The tests that should be run to verify the code, are defined in the appveyor.yml file in the GitHub repository.test_script:    - ps: |        $testResultsFile = \\\".\\\\TestsResults.xml\\\"        $res = Invoke-Pester -OutputFormat NUnitXml -OutputFile $testResultsFile -PassThru        (New-Object 'System.Net.WebClient').UploadFile(\\\"https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)\\\", (Resolve-Path $testResultsFile))        if ($res.FailedCount -gt 0) {            throw \\\"$($res.FailedCount) tests failed.\\\"        }Just like the deployment task, that will be invoked if the tests passed.deploy_script:  - ps: |      Install-PackageProvider -Name NuGet -Force      $manifest = Join-Path -Path $pwd -ChildPath \\\"TAK\\\\tak.psd1\\\"      (Get-Content $manifest -Raw) -Replace(\\\"1\\\\.0\\\\.0\\\\.\\\\d{1}\\\", $env:APPVEYOR_BUILD_VERSION) | Out-File $manifest      Publish-Module -NugetApiKey $env:psgkey -Path ($PublishPath = Join-Path -Path $pwd -ChildPath TAK) -Confirm:$falseHelpMost functions include comment-based help and a HelpUri that links to the online version of the help article. Just add the -Online parameter when getting help, like in the following example:Get-Help Test-TCPConnection -OnlineA full list of available help files can be found here: TAKDownload &amp; Source forThe Module is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    More information about the PowerShell Gallery can be found in the FAQGive it a try, and, if you spot a bug or have an idea for improvement, just create in a pull request.So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/introducing-tak/\"\n},{\n  \"id\": \"post-azure-stack-poc-tp2-on-vmware\",\n  \"title\": \"AzureStack POC TP2 on VMware\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"Azure\"],\n  \"content\": \"I’ve been trying to make the Azure Stack Proof-of-Concept (Preview 2) run on VMware and here is what I found. First of all, the documentation to set this stuff up can be found here: Deploy Azure Stack POCPrepare VMAs I currently run VMware in my lab and didn’t want to re-install the physical server, I tried to get the Azure Stack up and running in a VMware VM. Following the recommendation for sizing, I created a VM with 100GB of RAM, 24 vCPUs, one vNIC and 5 hard disks with 200GB each. The many vCPUs are actually not necessary, as the hardware check does fail even though enough cores should be available. More on that later.Additionally, I did enable the “Hardware virtualization” feature in the VM’s CPU settings. You can do this using the vSphere Web Client or use the following quick-and-dirty PowerCLI function for it:As the Virtual Machine will run Hyper-V and some guest VMs, we have to disable the security features on the virtual Port Group where the VM is connected to:Get-VDSecurityPolicy -VDPortgroup VLAN95 |Set-VDSecurityPolicy -AllowPromiscuous:$true -MacChanges:$true -ForgedTransmits:$true  Note in the above example I’m using a distributed virtual Port Group. For a standard virtual Port Group use Set-SecurityPolicy.Prepare WindowsThe next step is to install Windows and the VMware tools, download the Azure Stack TP2 support files (see documentation link above) and copy the CloudBuilder.vhdx file to the root of the C drive of our VM. Then I started .\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath and was confronted with an error, stating “The server is currently already booted from a virtual hard disk…”Fortunatelly, the fix is easy: Open the PrepareBootFromVHD.ps1 file and find the following section:if ((get-disk | where {$_.isboot -eq $true}).Model -match 'Virtual Disk')     {    Write-Host \\\"The server is currently already booted from a virtual hard disk, to boot the server from the CloudBuilder.vhdx you will need to run this script on an Operating System that is installed on the physical disk of this server.\\\"    Exit    }Now either remove the section or just remove the Exit. That way, it will still display a warning but no longer stop the execution of the script.Again, start .\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath which should now succeed and prompt for a reboot of the machine.Install the CloudThe VM restarts and boots from the CloudBuilder.vhdx file with the typical OOBE asking for an admin password and the product key. Once set, startup continues and we can log-in to the VM. At this point, we’ll have to install the VMware tools again. The next step is to initialize the additional hard disks for the machine. The disks must be “empty” so do not create any volumes. I just run Get-Disk | Initialize-Disk and move on.Now the documentation wants us to open an administrative PowerShell console, change into the C:\\\\CloudDeployment\\\\Configuration folder and run the installation script. As a few checks are built-in to prevent this kind of setup (and verify hardware resources) this will fail with the following error message:2016-10-13 08:03:58 Error    Task: Invocation of interface 'Validate' of role 'Cloud\\\\Infrastructure\\\\BareMetal' failed: Function 'Test-BareMetalRole' in module 'Roles\\\\PhysicalMachines\\\\PhysicalMachines.psd1' raised an exception:One or more validation test failed for Role 'BareMetal' on machine 'WIN-MUTSIQJMO43'For detailed test results look at file '\\\\\\\\WIN-MUTSIQJMO43\\\\C$\\\\CloudDeployment\\\\Logs\\\\Tests\\\\TestResults_WIN-MUTSIQJMO43_BareMetal_2016-10-13-08-03-44.xml'Test Failed: Validate that the computer 'WIN-MUTSIQJMO43' is a physical machine.Test Failed: Validate that at least 12 cores are available in computer WIN-MUTSIQJMO43.At C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1:875.+         Trace-Error $messageat Trace-Error, C:\\\\CloudDeployment\\\\Common\\\\Tracer.psm1: line 52at Start-Test, C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1: line 875at Test-BareMetalRole, C:\\\\CloudDeployment\\\\Roles\\\\PhysicalMachines\\\\TestPhysicalMachines.psm1: line 86at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 08:03:58 Verbose  Step: Status of step '(DEP) Validate Physical Machines' is 'Error'.So the two tests that failed use the following CIM Instances (WMI) to query information about the host system: Win32_ComputerSystem, Win32_Processor Now even though I did configure 24 vCPUs for my VM, the NumberOfEnabledCore attribute of Win32_Processor shows a value of “0”.Here too, there’s an easy fix: Find the BareMetal.Tests.ps1 file in the C:\\\\CloudDeployment\\\\Roles\\\\PhysicalMachines\\\\Tests directory and make the following tests pass:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        $physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        ($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}Again, we could just remove the actual test (the expression inside the It {} statement) or make it a comment or modify the code to make it pass. I ended up with the following, slight modification:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        #$physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        #($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}By the way, you’ll see that this script is signed, so in order to make it run, remove the signature and save the script.Install the Cloud #2Now we can go ahead and invoke the install script to actually install Azure Stack inside the virtual machine. As there is no DHCP Server available in the network into which I’m deploying, I specify a few options when invoking the installation script:$installParams = @{    NatIPv4Subnet = \\\"172.16.8.0/24\\\";    NatIPv4Address = \\\"172.16.8.212\\\";    NatIPv4DefaultGateway = \\\"172.16.8.254\\\";    EnvironmentDNS = \\\"172.16.8.120\\\";}.\\\\InstallAzureStackPOC.ps1 @installParamsNote that this script has a rerun parameter, so if execution failes, it can be invoked again and will continue where it left off: .\\\\InstallAzureStackPOC.ps1 -RerunNote that at some point of the installation, the VM is rebooted and logged in automatically to the account “azurestack\\\\azurestackadmin”. From that moment on, all installation related tasks (such as a -Rerun) should be performed using this account.I did stumble over another prolem, installation stopped with the following error:2016-10-13 13:48:18 Error    Task: Invocation of interface 'Configure' of role 'Cloud\\\\Fabric\\\\NC' failed: Function 'ConfigureNC' in module 'Roles\\\\NC\\\\NC.psd1' raised an exception:Task failed with the following error: 'The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota.'.At C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1:83.+         $status.ErrorMessageat Trace-Error, C:\\\\CloudDeployment\\\\Common\\\\Tracer.psm1: line 52at Start-PSScriptUsingTask, C:\\\\CloudDeployment\\\\Roles\\\\Common\\\\RoleHelpers.psm1: line 83at ConfigureNC, C:\\\\CloudDeployment\\\\Roles\\\\NC\\\\NC.psm1: line 620at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 13:48:18 Verbose  Step: Status of step '(NET) Configure NC on VMs' is 'Error'.Apparently the default value of 500 for MaxEnvelopeSize is not enough, I used the following command to increase the size to 8192:winrm set winrm/config '@{MaxEnvelopeSizekb=\\\"8192\\\"}'ResultOnce the InstallAzureStackPOC.ps1 script finished running, there will be 13 VMs running on our “Host VM”, consuming about 52GB of RAM:Get-VMName         State   CPUUsage(%) MemoryAssigned(M) Uptime           Status             Version----         -----   ----------- ----------------- ------           ------             -------MAS-ACS01    Running 0           8192              00:46:18.2560000 Operating normally 8.0MAS-ADFS01   Running 0           1164              01:33:39.1820000 Operating normally 8.0MAS-ASql01   Running 0           4096              01:00:02.6710000 Operating normally 8.0MAS-BGPNAT01 Running 0           1460              01:46:26.7640000 Operating normally 8.0MAS-CA01     Running 0           844               01:32:56.9940000 Operating normally 8.0MAS-Con01    Running 0           4096              01:39:16.7620000 Operating normally 8.0MAS-DC01     Running 0           4096              02:09:00.7000000 Operating normally 8.0MAS-Gwy01    Running 0           4096              00:54:18.0770000 Operating normally 8.0MAS-NC01     Running 0           2048              01:19:39.9240000 Operating normally 8.0MAS-SLB01    Running 0           4096              01:04:11.8220000 Operating normally 8.0MAS-SUS01    Running 0           2048              01:37:49.5430000 Operating normally 8.0MAS-WAS01    Running 1           8192              01:36:31.2300000 Operating normally 8.0MAS-Xrp01    Running 0           8192              01:34:04.3710000 Operating normally 8.0If you encounter problems during installation, make sure to check the summary.log.xml file in C:\\\\CloudDeployment\\\\Logs.To actually log in to the Azure Stack Portal, open the MAS-Con01 VM’s conole and find a link to the portal on the desktop:Ok, so with that: Have fun with Azure Stack and happy hacking ;)Tom\",\n  \"url\": \"https://onprem.wtf/post/azure-stack-poc-tp2-on-vmware/\"\n},{\n  \"id\": \"post-migrating-blogengine-to-github-pages-1\",\n  \"title\": \"Migrating from BlogEngine to GitHub Pages: BlogML to Markdown\",\n  \"author\": \"tto\",\n  \"tags\": [\"Jekyll\",\"ntSystems\"],\n  \"content\": \"As promised here, I’m sharing the first part of our migration process from BlogEngine to GitHub Pages. A major part is, obviously, the migration of the content of the blog itself.BlogMLAccording to Wikipedia “BlogML is an open format derived from XML to store and restore the content of a blog.” Luckily, BlogEngine has an export option that exports all content (posts and pages) to a XML file.  Note: The XML file contains only the text content. So images, files and other assets have to be migrated separately.I downloaded the BlogML file and started to look around for solutions to somehow convert the stuff to something Jekyll could use. After some googling, I found this blog describing something very similar. Apparently he was using a ruby script to create a properly formatted markdown (.md) file for each post in the BlogML file. Thankfully, the script could be found in his GitHub Repo.The script was almost perfectly suited for our purposes after some small modifications I started it like so:$ ruby -r './blogml.rb' -e 'Jekyll::BlogML.process(\\\"BlogML.xml\\\")'Note that in my case the BlogML.xml file is located in the same directory as the script and a new directory named “_posts” is created in the same path. Any existing directory with the same name will be deleted.The modified version of the script is available here.WritingOnce the posts (and the rest) was migrated, one has to start writing new stuff. Posts are written in plain text with markdown formatting so no super fancy editor is required and I’m getting along well with VS Code. I’m using the “Spelling and Grammar Checker” extension hoping it catches to most obvious typos ;)Stay tuned for more.Tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-blogengine-to-github-pages-1/\"\n},{\n  \"id\": \"post-welcome-to-the-all-new-ntsystems\",\n  \"title\": \"Welcome to our new blog!\",\n  \"author\": \"tto\",\n  \"tags\": [\"Update\",\"Jekyll\",\"GitHub\"],\n  \"content\": \"This site has been running on Azure Web Sites for some time. As we are doing this for fun and are not making any money with the site (see any ad?) we had to use the “Shared” pricing tier which was economically acceptable but from a performance and feature point-of-view, well, not great. We used Cloudflare to get some caching and enable stuff like https and IPv6 for the site and it was OK :) Then came……JekyllRecently I started publishing some of the PowerShell code I’m writing to GitHub and while browsing around, I stumbled over a static page generator, called Jekyll. I was quite impressed and started hacking around for a little while… after a couple of train rides I was happy with the result and decided to give it a go. So, that’s it:  Welcome to our new home on GitHub!As of 2016-10-02 we moved to Jekyll. The current version of our little blog is hosted on GitHub Pages and uses a slightly modified version of the default Minima theme for Jekyll.ToolsAs this is now, essentially, a static website, we have to use some tools to make it as awesome as possible:  Cloudflare: Security, IPv6, TLSv3, Page Rules… and more awesomeness  Algolia: Search as a Service  lunr.js: Full-text search in your browser  Favicon Generator  Shariff: Share without compromising privacy  Disqus: CommentsWork in progressThis migration is a work in progress and therefore not all features the good, old ntsystems.it are available as of today. I intend publishing a few lines about the migration itself, and keeping it up-to-date as we move along and build new features into the site.We do hope you enjoy our new look. It is all open source, so if you are interested in how we do stuff, just check out our repoOh and if you find any errors you’d wish to correct, please just send us a pull-request :-)So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/welcome-to-the-all-new-ntsystems/\"\n},{\n  \"id\": \"post-powershell-on-macos\",\n  \"title\": \"PowerShell on macOS\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\",\"macOS\",\"GitHub\"],\n  \"content\": \"Just sharing some quick notes on how to run PowerShell (and dotnet core) on macOS Sierra.OpensslPowerShell requires dotnet core which, in turn, requires openssl to be installed (and linked correctly). Using brew, one can easily install openssl, if it is already installed, use brew list to show the installation location:$ brew install openssl$ brew list openssl.../usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib/usr/local/Cellar/openssl/1.0.2j/lib/libssl.1.0.0.dylib...As of 2016-10 it is required to create symlinks for the above listed libraries (libcrypto, libssl) at /usr/local/lib, use ln -s like so:$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/lib$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/libNote: Make sure that the path used in the link (ln) actually matches the one given by the `brew list` output..NET CoreHead over to https://www.microsoft.com/net/core#macos and download a copy of the installer. Installation is straight-forward, just double-click the .pkg and follow instructions.After installation, verify that dotnet works by creating the “Hello World” app as suggested on the download site:$ mkdir testapp$ cd testapp$ dotnet newCreated new C# project in /Users/tom/testapp.$ dotnet restore$ dotnet runPowerShellGet the latest .pkg at https://github.com/PowerShell/PowerShell/releases. Again, installation is simple, just double-click the .pkg and follow instructions. To verify installation, open a terminal and run powershell`$ powershellPowerShellCopyright (C) 2016 Microsoft Corporation. All rights reserved.PS /Users/tom&gt; $PSVersionTableName                           Value----                           -----PSVersion                      6.0.0-alphaPSEdition                      CorePSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}BuildVersion                   3.0.0.0GitCommitId                    v6.0.0-alpha.10CLRVersionWSManStackVersion              3.0PSRemotingProtocolVersion      2.3SerializationVersion           1.1.0.1Note: It's still early days, the above procedure might be simplified soon Enjoy :)\",\n  \"url\": \"https://onprem.wtf/post/powershell-on-macos/\"\n},{\n  \"id\": \"post-deploying-labs-using-azure-resource-manager\",\n  \"title\": \"Deploying Labs using Azure Resource Manager\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Azure\",\"Cisco\"],\n  \"content\": \"I did a demo of Cisco CSR 1000v on Azure the other day and the easy deployment of a small test-network was part of that demo. I really enjoyed deploying the lab using ARM templates, so why not share the love?So what’s ARM?Azure Resource Manager is the “new” deployment model for all kinds of resources within Azure. The great thing about it is, that it works with template and parameter files, so we can easily prepare an environment and deploy it over and over again, with either the same or different parameters.CSR 1000v?That’s what the customer wanted to see and why I got do a demo on Azure in the first place. Cisco provides images in the Azure Marketplace (https://azure.microsoft.com/en-us/marketplace/) so that customers can run a fully featured IOS XE router in the cloud.The Lab networkSo as mentioned above, i wanted to demo the setup of a quick lab along with the CSR, having only the router and no endpoints to connect to, doesn’t make to much sense. I used the Azure Resource Manager to create a new resource group and a new virtual network with two subnets. One of which would be CSR’s “public” facing subnet (with a Public IP associated) the other one was my “backend” network for cloud workloads (without Public IPs). A Nano Server was quick to deploy and provided the “backend” for my lab.The templateI did use Visual Studio to modify and adapt the ARM template to my needs, but really any text editor/ISE can be used.The template consists of two files, the template itself and a file for parameters. In my case, I did use the parameter file just for the passwords of the CSR and the Nano Server, the other parameters are assigned directly in the template file. There is room for improvement in this case, as the template would be more flexible if it had less “hardcoded” information.The template specifies how the virtual network, subnets and eventually the CSR and Nano Servers should be deployed.DeployOnce ready, the template can be be deployed to any Azure Subscription using a number of methods: One can deploy directly from Visual Studio or PowerShell or even from the cross-platform CLI on a Mac.Using PowerShellFirst, we have to create a Resource Group to which the template will be deployed:$RGName = 'rg-tomt-lab' $RGLocation = 'westeurope' New-AzureRmResourceGroup -Name $RGName -Location $RGLocation Then we prepare a variable which specifies the resource group, the template file and the parameters file.$Params = @{     'ResourceGroupName' = $RGName    'TemplateFile' = 'C:\\\\azure\\\\azure_arm_csr_nano_template.json'    'TemplateParameterFile' = 'C:\\\\azure\\\\azure_arm_csr_nano_parameters.json' }Using the Test-* cmdlet we can simulate deployment and verify that all checks out:Test-AzureRmResourceGroupDeployment @Params -VerboseAnd if everything looks good, we can go ahead and finally create the deployment:New-AzureRmResourceGroupDeployment @Params -VerboseUsing the xPlat CLIAlmost the same thing can be be done using the cross-platform CLI, which is what I use on my Mac.Create a Resource Group:azure group create -n rg-csr-lab -l \\\"West Europe\\\"Deploy the templateazure group deployment create -f azure_arm_csr_nano_template.json -e azure_arm_csr_nano_parameters.json -g rg-csr-lab -n CSR01Find the template, parameters file and more detailed information for deployment at my GitHub: https://github.com/tomtorgglerSo, once the template is prepared, deployment is just a piece of cake! That’s how deploying labs just got a lot quicker, don’t you think?Enjoy,— Tom\",\n  \"url\": \"https://onprem.wtf/post/deploying-labs-using-azure-resource-manager/\"\n},{\n  \"id\": \"post-veeam-direct-restore-to-azure\",\n  \"title\": \"Veeam direct restore to Azure\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"Veeam\"],\n  \"content\": \"Today I tried to restore a Veeam backed up VM directory to Microsoft Azure. Veeam gives you a free piece of software to get this done quickly with few easy steps. Lets jump into the configuration First of all we deploy the Veeam Direct Restore to Azure preconfigured VM from the Azure marketplaceWhen the VM starts up, we connect and have to specify some configuration parameter. We click on “Configuration”Veeam asks us to specify the configuration File for the subscriptionWe can download the configuration file with the following lines of codeNow the Veeam Part in Azure is configured and ready to convert Veeam Backup files to Azure virtual machines. We create a backup of a machine and upload the files to the Veeam virtual machine in Azure. After the files are available we start the restore process and specify the BackupFile:We can choose which restore point we want to restoreAfter that we can select the region and size of the virtual machine&nbsp;After we specified the Network and storage account the restore begins&nbsp;After few minutes the machine is restored from a Veeam backup and available in Azure. &nbsp;With Veeam Version 9.5 a direct restore to Azure with API and without a convert VM is also possible. Stay tuned for Version 9.5Greetingdn\",\n  \"url\": \"https://onprem.wtf/post/veeam-direct-restore-to-azure/\"\n},{\n  \"id\": \"post-lync-sdn-api-and-cisco-wlc\",\n  \"title\": \"Lync SDN API and Cisco WLC\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Cisco\",\"en\",\"Skype4B\"],\n  \"content\": \"Some days ago I had the chance to test Cisco’s Wireless LAN Controllers with the Lync Software Defined Networking (SDN) API.For those who don’t know what SDN API is, a quick overview: You can basically think of the SDN API as a little add-on, that can be installed on Lync Front End Servers, and that allows Lync to “let the network know” what’s going on from it’s perspective. The SDN API is made up of two components, the Lync Dialog Listener (LDL) and the Lync SDN Manager (LSM). The LDL component is installed on each Front End Server, and sends information to the LSM. The LSM forwards information to a so called SDN Controller, which, in our case, is the Cisco WLC.More information and the API documentation is available on the MSDN: https://msdn.microsoft.com/en-us/library/office/dn387071.aspxThe WLC SideThe SDN Controller has to accept and process information coming from the LSM, Cisco has built this  functionality into it’s Wireless LAN Controller software from 7.6. We used 8.2 in this example. First we need to define a port, protocol, and enable the “Lync Server” option globally. This can be done using the “Lync Server” option in the “Wireless” tab:Now that the WLC listens for information, we’ll have to tell it, what to do with. Using the “WLANs” tab, we created a new SSID, enabled “Lync Server” and selected the appropriate QoS policy for each type of traffic:A quick excerpt from show wlan shows the QoS settings:Local Policy---------------Policy Name                                       Priority---------------                                   --------  Lync State ...................................... EnabledAudio QoS Policy................................. PlatinumVideo QoS Policy................................. GoldApp-Share QoS Policy............................. SilverFile Transfer QoS Policy......................... BronzeThe Lync SideMeanwhile, we’ve installed the Lync SDN Manager on a dedicated server, as it’s not recommended to run it on the Front Ends (and it didn’t work either). The LSM is configured through a configuration file SDNManager.exe.config, which can be found in the LSM’s installation directory: C:\\\\Program Files\\\\Microsoft Lync Server\\\\Microsoft Lync SDN API\\\\The configuration is quite simple, the value submituri specifies the WLCs IP Address and Port, additionally, the value for backwardcompatibility must be set to true:&lt;appSettings&gt;    &lt;add key=\\\"submituri\\\" value=\\\"http://172.25.81.105:15120\\\"/&gt;    &lt;add key=\\\"backwardcompatibility\\\" value=\\\"true\\\"/&gt;With the LSM configured, we installed the Dialog Listener on the Front End Server. During setup, we are asked for the submituri so we don’t even have to edit the config file in this case. Note that the submit URI for the LDL points to the LSM. The configuration file for the LDL can be found here: C:\\\\Program Files\\\\Microsoft Lync Server\\\\Microsoft Lync SDN API\\\\LyncDialogListener.exe.config:&lt;appSettings&gt;  &lt;add key=\\\"submituri\\\" value=\\\"http://srv01.ccielab.local:9333/LDL/CallInfo\\\"/&gt;The Client SideNow we were ready for some testing and connected our clients to the new SSID. After signing into Lync and making some calls, we were able to verify that they appeared in the WLC’s “Monitoring” tab.Using Wireshark, we were able to verify the DSCP values for incoming packets from the WLAN:Last but not least, we had a look at the POST requests from the LSM to the WLC. As we are not using https, they are sent in clear-text and can be analyzed using Wireshark’s “Follow TCP stream” feature:POST /LDL/CallInfo HTTP/1.1Content-Type: text/xmlAccept: text/xmlHost: srv01.ccielab.local:9333Content-Length: 2823Expect: 100-continue&lt;/p&gt;HTTP/1.1 100 Continue&lt;LyncDiagnostics Version=\\\"1.0\\\"&gt;  &lt;ConnectionInfo&gt;    &lt;FrontEnd&gt;s4b&lt;/FrontEnd&gt;    &lt;CallId&gt;8a5ee59e7f24cc47a8a5e5ef5408164b&lt;/CallId&gt;    &lt;CSEQ&gt;3&lt;/CSEQ&gt;    &lt;ConversationId&gt;AdHItACZ40eYIzsElkmUXxEpJfdLYA==&lt;/ConversationId&gt;    &lt;TimeStamp&gt;2016-06-17T16:36:16.0502033Z&lt;/TimeStamp&gt;  &lt;/ConnectionInfo&gt;  &lt;StartOrUpdate Type=\\\"audio\\\"&gt;    &lt;From&gt;      &lt;Id&gt;1c36b0157b&lt;/Id&gt;      &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;      &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;      &lt;IP&gt;172.25.81.237&lt;/IP&gt;      &lt;Port&gt;21448&lt;/Port&gt;    &lt;/From&gt;    &lt;To&gt;      &lt;Id&gt;94b8a54712&lt;/Id&gt;      &lt;EPId&gt;213808492931&lt;/EPId&gt;      &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;      &lt;Contact&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local;      opaque=user:epid:vaj8zwoldfc0zkl6hghhoaaa;gruu&lt;/Contact&gt;      &lt;IP&gt;172.25.81.238&lt;/IP&gt;      &lt;Port&gt;11616&lt;/Port&gt;    &lt;/To&gt;    &lt;Properties&gt;      &lt;Protocol&gt;UDP&lt;/Protocol&gt;      &lt;EstimatedBandwidth Codec=\\\"SIREN/16000\\\"&gt;        &lt;Low&gt;52600&lt;/Low&gt;        &lt;High&gt;68600&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"PCMU/8000\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"PCMA/8000\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\"RED/8000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"CN/8000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"CN/16000\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\"telephone-event/8000\\\" /&gt;    &lt;/Properties&gt;  &lt;/StartOrUpdate&gt;…&lt;StartOrUpdate Type=\\\"video\\\"&gt;  &lt;From&gt;    &lt;Id&gt;94b8a54712&lt;/Id&gt;    &lt;EPId&gt;213808492931&lt;/EPId&gt;    &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;    &lt;IP&gt;172.25.81.238&lt;/IP&gt;    &lt;Port&gt;15150&lt;/Port&gt;  &lt;/From&gt;  &lt;To&gt;    &lt;Id&gt;1c36b0157b&lt;/Id&gt;    &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;    &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;    &lt;Contact&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local;    opaque=user:epid:a_6tcapa01gtycf5ts8qnqaa;gruu&lt;/Contact&gt;    &lt;IP&gt;172.25.81.237&lt;/IP&gt;    &lt;Port&gt;6490&lt;/Port&gt;  &lt;/To&gt;  &lt;Properties&gt;    &lt;Protocol&gt;UDP&lt;/Protocol&gt;    &lt;EstimatedBandwidth Codec=\\\"x-rtvc1/90000\\\"&gt;      &lt;Low&gt;460000&lt;/Low&gt;      &lt;High&gt;2510000&lt;/High&gt;    &lt;/EstimatedBandwidth&gt;  &lt;/Properties&gt;&lt;/StartOrUpdate&gt;As you can see, the LSM uses simple http POST requests to send information to a network controller. The network controller just has to “listen” for such data and act on it.This concludes our journey into the wireless network for today, hope you enjoyed it as much as I did :)Many thanks to my colleague and fellow call-quality-optimizer KD!Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-sdn-api-and-cisco-wlc/\"\n},{\n  \"id\": \"post-azure-backup-part-three\",\n  \"title\": \"Azure Backup - Part Three\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"In my previous posts I gave you an overview of Azure Backup und explained the “Direct Backup Azure VM to Backup Vault” solution a bit in detail. Lets now focus on the Azure Backup Server option which we can backup Files and Applications like ActiveDirectory, SQL, Sharepoint, Exchange and Hyper-V. InstallationFirst of all you have to access the Backup vault and download the Microsoft Azure Backup Agent.Select a server in your organization that is domain joined where you want to install the Backup software. Before the server uploads the data to the backup vault it saves at least one copy to a local drive. Give the server an empty volume with some space.At the end you pair the server with our backup vault with a vault credential file. The file can be downloaded from the backup vault. Specify a Passphrase to encrypt your backups.The server is now registered in visible in the backup vault.Prerequisites and a more detailed description can be found here: https://azure.microsoft.com/en-us/documentation/articles/backup-azure-microsoft-azure-backup/Backup planThe next step is to define a Backup plan for the servers we want to protect. This task is pretty straight forward, I explain only the most important parts:We specify Disk and online protection. Disk protection represents the short term and online the long term protection.We specify how much restore points we keep on local disk for short term protectionNext step is to define the online Backup schedule and retention policy. In this example we configure the schedule to upload restore points daily at 09:00 PM.&nbsp;Simple restoreThe Backup runs now everyday and uploads the restore point to the backup vault. If we want to restore data we can see where the server recovers them from:&nbsp;Full restoreLets assume we backup our whole infrastructure with the Backup Server and upload the restore points to Azure. The local infrastructure isn’t available due to fire / server damage and we cannot access the backup server (and short term backups) anymore. All of our backups are in the cloud and we want to restore the whole infrastructure.It's a bit more complicated: To get access to the Azure Backups we have to install a Backup Server. To install the Backup Server we need a machine that's domain joined. Because of this prerequisites we have to follow some additional steps to recover the whole environment.Here are the steps we have to do to get the full restore done: Install a new server Create a temporary domain and make the server its domain controller Install a second new server Join the server to the temporary domain Install Azure Backup Server on the second server Join the Backup Server to the Azure Backup vault. We have now access to the restore points Restore the system state backup from a domain controller to a network location Throw away everything except the restored backup Install a new server, this will be the domain controller Restore the system state backup on the new domain controller Verify that the restored AD is working properly Install a new server as the Azure Backup Server Join the new Azure Backup Server to the restored domain Install Azure Backup Server and connect it to the Azure Backup vault Restore the DPM database Start restoring everything else according to your DR plan&lt;/ul&gt; Greetings\",\n  \"url\": \"https://onprem.wtf/post/azure-backup-part-three/\"\n},{\n  \"id\": \"post-lost-found-nano-server-github-psgallery-pester\",\n  \"title\": \"lost & found: Nano Server, GitHub, PSGallery, Pester\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"PowerShell\"],\n  \"content\": \"Nano Server status updateIt would be about time for the next post in the series about hyper-converged-infrastructure with Nano Server. Over the past few days I deployed Nano on some real hardware and I can't wait to share my findings. But, unfortunately I'm facing a few issues, probably related to hardware, with the lab servers and I didn't have a lot of time to investigate further. As TP5 should be out any day now, I decided to wait for that before wasting too much time. GitHubIn the meantime I have started to move some of my PowerShell scripts to GitHub for source control and publish them to the PowerShell Gallery for easy installation. I thought it might be interesting to share my process, so here we go.First of all, I’m not your typical developer, so I had a general idea about source control and I knew GitHub existed but never really used it, much less with PowerShell. The ongoing discussions about Continuous Integration and DevOps and what not, sparked my interest and so I decided to give it a try. The benefits of putting scripts under version control are obvious, the more you commit, the more history you get and the easier it gets to track code changes and errors. Additionally I really enjoy the community that has formed around PowerShell and publishing code to GitHub is one of many ways to contribute and give back to said community.Should you like to get started with git and don’t now where to start, this article helped me a lot when setting it up on my machines.And you can find my stuff at: https://github.com/tomtorgglerPowerShell GalleryIn case you didn’t know, Windows 10 (actually WMF5) comes with package management, yes that’s right, kind of like you know it from Linux or OSX. OneGet was introduced a while ago and eventually evolved into the PackageManagement module that is now included in WMF5. The PSGallery is already configured as a PackageSource and can therefore be used right away. Just try Find-Script or Find-Module and install whatever you find interesting with Install-Script or Install-Module. Now anyone can publish scripts to this PSGallery thing, which is exactly what I did with Invoke-SEFAUtil.ps1 and Restore-VMPermission.ps1.Other Package Sources can obviously be added, find out more at: https://msdn.microsoft.com/en-us/powershell/wmf/oneget_cmdletsPesterAlong with the move to GitHub I started to write some Unit Tests for my code. So what does that mean? Well I told you, I’m not your typical developer so I’m still figuring this thing out :) The basic idea of unit testing is to write additional code that tests your code automatically. So when you change something in a script, you run the tests and if everything is green, the script is ready to go into production. Pester is a unit testing framework for PowerShell, that can be used to achieve exactly that. Once I have found out enough to explain it in a better way, there might be a dedicated post :)&nbsp;With that, have a great weekend!Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-nano-server-github-psgallery-pester/\"\n},{\n  \"id\": \"post-azure-storage-explorer\",\n  \"title\": \"Azure Storage Explorer, the easy way to manage your storage\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"Today I gave a try to the new Azure Storage Explorer. Its actually in preview but already amazing. You can download the Explorer from the official website.When you open Azure Storage Explorer the first time the program asks for an subscription:After you specify username and password you are able to see your storage accounts.Within the explorer you can manage all of your Azure Storage Accounts, copy Blob containers, delete VHD’s or copy them to another location and much more:&nbsp;&lt;/p&gt; &lt;/code&gt; Give it a tryGreetings\",\n  \"url\": \"https://onprem.wtf/post/azure-storage-explorer/\"\n},{\n  \"id\": \"post-azure-backup-part-two\",\n  \"title\": \"Azure Backup - Part Two\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"Let’s focus on Option 1 the direct Azure VM Backup:The Backup TasksWe are now going to Backup an Azure VM from the Web interface. First of all, you have to start a discovery search.When the discovery search is completed you can select the VM you want to Backup. Keep in mind: Today it’s not possible to Backup VM’s that's located on the Azure premium storage (SSD) or VM’s in created with the Resource Manager model.  The next step is to create a Backup policy. You can have a single policy that works for all servers or multiple policies with different settings regarding Backup Windows and retention period. This step should be known from other Backup solutions.  On the retention range page you specify how long protected VM’s are kept.  We have created the Backup policy and can now assign it to our VM. From now a VM Backup will be started on a daily basis. Lets restore a VM To restore a VM you basically highlight the VM in the Backup Vault and select the Restore function.   After you selected the restore point you want to restore, the wizard asks you some information. This step is important because you can specify the name and VNET the VM will belong to. Be careful to not place you restores VM in the same Network as the productive one as this is only a test.   A nice log shows the progress and result of the restore request.  When the restore is done a new VM with the specified name is visible in the Virtual Machine section of Azure. We can start this VM, restore our files or put the VM into production if this was a real restore. Greetings          \",\n  \"url\": \"https://onprem.wtf/post/azure-backup-part-two/\"\n},{\n  \"id\": \"post-azure-backup-part-one\",\n  \"title\": \"Azure Backup - Part One\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\",\"en\"],\n  \"content\": \"On Azure you can choose basically between two different Backup Options:1. Direct Backup Azure VM to Backup Vault2. Backup Applications like SQL, Sharepoint… and Files, System State through Microsoft Azure Backup ServerToday I will give you a short overview of the service.  &lt;/a&gt; Prerequisites - Backup Vault: First of all you have to create a Backup Vault (Thomas described this already in a former post)- If you use Microsoft Azure Backup Server a Internet Connection is needed Costs The costs are counted by instance and space used. An instance is either a Azure VM Server using Backup Option 1 or a Server to Backup specified with Microsoft Azure Backup Server using Option 2. (Price table from 12.2015)  When you create the Backup Vault you can choose between LRS or GRS. This can only be specified at the beginning.If you started already some Backups the GRS storage cannot be switched to LRS anymore. You have to recreate the backup vault.   &nbsp; For the Backup Data Azure Block Blob Storage is used. The costs can be seen from the following price table from 12.2015  &nbsp; In Part 2 I create a Backup Plan for some Azure VM’s and restore a Test-VMPart 3 covers a OnPrem Backup using Option 2 with Microsoft Azure Backup Server. I make a full Backup and full restore assuming the VM’s don’t exist anymore. Greetings\",\n  \"url\": \"https://onprem.wtf/post/azure-backup-part-one/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-part-3\",\n  \"title\": \"Hyper-Convergence with Nano Server: Part 3\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"en\"],\n  \"content\": \"In this post we are going to configure the Hyper-V part of our hyper-converged Nano-Server-Cluster. We already deployed the VMs in part 1 an configured Storage Spaces Direct in part 2.Hyper-VWhen creating the Nano Server VHD files, I installed the Hyper-V role by selecting the –Compute parameter. As we have already created the cluster and the virtual disk, we could simply go ahead and create VMs now. Before doing that, I wanted to configure the Hyper-V Servers to&nbsp; store VM configurations and VHD files on the Cluster Shared Volume and I created a virtual Switch that can be used by the VMs:As you can see, I’m using the $cimSessions variable from part 1 again. This variable contains CIM Sessions to my four Nano Servers, so that the above lines do configure all servers at once. Here’s how I’ve created those sessions: $cimSessions = New-CimSession -ComputerName n01,n02,n03,n04VMsNow we are ready to create the VMs and add them to the cluster. I copied the “win2012r2.vhdx” file over to the ClusterStorage and used this as a parent disk for my VMs: That was pretty easy, so lets have a look at what our current environment looks like in the Failover Cluster Manager.We see all the VMs that were added to the cluster and we can go ahead and move them around between nodes using the Failover Cluster Manager. The same goes for the “nodes”, we see all four Nano Servers participating in the cluster and we can control the nodes status:In the storage folder of the FCM we see the virtual disk and some information about health status and capacity:&nbsp;Ok, that is pretty basic stuff if you just look at the Hyper-V part. The interesting point however, is that those same servers do also provide the shared storage that the hypervisors use.Stay tuned for more Tom\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-3/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-part-2\",\n  \"title\": \"Hyper-Convergence with Nano Server: Part 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"en\"],\n  \"content\": \"In this post, we build on the Nano Servers that were set-up in the part one, we are going to create a Failover Cluster and enable Storage Spaces Direct.Cluster NetworkWhen creating the Nano Server vhd files, I did add the package for failover clustering by using the –Clustering parameter of New-NanoServerImage. So now that the servers are running, I can use remote server management tools or PowerShell to create a cluster. But, before doing that, I went ahead and configured the second network adapter with static IP addressing. Remember that I created the Nano VMs with two network adapters, one connected to my lab network – where DHCP provides addressing – the other connected to an internal vSwitch, as it’ll be used for cluster communication only.Failover ClusterBefore creating a cluster I run the “Cluster Validation Wizard” to make sure my configuration checks out. We could run that wizard using the GUI tools or using the following line of PowerShell:Test-Cluster –Node n01,n02,n03,n04&nbsp; –Include “Storage Spaces Direct”,Inventory,Network,”System Configuration”Some summary information as well as the location of the html report will be printed to the screen. In the report we can actually see the results of the tests that were run. Problems are pointed out and some level of detail is provided.The only warning I got was the following: Failed to get SCSI page 83h VPD descriptors for physical disk 2. This was because my VMs originally used the default “LSI Logic SAS” controller for the OS disk, while the additional, 100GB disks were connected to the SATA Controller. To fix this, I did connect the OS disk to the SATA Controller as well.All green, so we can go ahead and create the cluster:New-Cluster -Name hc01 -Node n01,n02,n03,n04 –NoStorageThis will create another html report at a temporary location, the path will again be printed to the screen. My cluster has an even number of nodes, so I decided to use a File Share Witness. Using the following commands, I created a quick share on my management server (tp4):New-Item -ItemType Directory -Path c:\\\\hc01witness New-FileShare -Name hc01witness -RelativePathName hc01witness -SourceVolume (Get-Volume c) -FileServerFriendlyName tp4Get-FileShare -Name hc01witness | Grant-FileShareAccess -AccountName everyone -AccessRight FullAfter that, I used the following to update the cluster quorum configuration:Set-ClusterQuorum -Cluster hc01 -FileShareWitness \\\\\\\\tp4.vdi.local\\\\hc01witness Storage Spaces DirectAt this point, we have a running cluster and we can go ahead and configure storage spaces.But again, before doing that, I want to point something out. If we open the Failover Cluster Manager at this point, we can connect to the cluster just as we are used to. If we expand the “Storage” folder in the newly created cluster, we can see there are no Disks, no Pools and no Enclosures present at this time.Using the following command, I enabled storage spaces direct for the cluster:Enable-ClusterS2D -S2DCacheMode Disabled -Cluster hc01And using the following command, I create a new storage pool using the “Clustered Windows Storage” subsystem:If we go back to the Failover Cluster Manager after the above steps, we can see that now there is a Pool as well as four Enclosures, one representing each server:Ok, so far it is looking quite good, and we can go ahead an create a volume (or virtual disk):Our new virtual disk will automatically be added to the Cluster Shared volumes, we can verify that using:Get-ClusterSharedVolume -Cluster hc01Alright, we are getting close. In the next post, we are going to configure the Hyper-V roles and create some virtual machines. Sounds great? Stay tuned :)&nbsp;Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-2/\"\n},{\n  \"id\": \"post-azure-file-services\",\n  \"title\": \"Azure File Services\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"Today I mapped an Azure File Share to my local computer  First you have to create a Storage account and a File ServiceWithin the Webinterface you can create folders and upload filesWhen you click on “Connect” you can get the commands to map the volume. Its basically a normal Network drive.The access key can be taken from the Settings / Key sectionIf you execute the command or simply mount the network volume you have the Azure File Service connected as Volume.Greetingsdn\",\n  \"url\": \"https://onprem.wtf/post/azure-file-services/\"\n},{\n  \"id\": \"post-re-register-azure-mfa-server\",\n  \"title\": \"Re-register Azure MFA Server\",\n  \"author\": \"dni\",\n  \"tags\": [\"Azure\"],\n  \"content\": \"If you also installed the Azure MFA Server with a MSDN Subscription and now want to switch to another subscription without re-installing the Server, you have to do the following. (Please keep in mind you loose all the settings you made within the MFA console) Export your users Make some screenshots of you configuration (Radius, Company settings ect..) Make a Backup of this folder: C:\\\\Program Files\\\\Multi-Factor Authentication Server\\\\Data Stop the service “MultiFactorAuthSvc” Delete the folders content Start the service “MultiFactorAuthSvc” When you open the console the registration wizards starts and you can register the server with another subscriptionGreetings\",\n  \"url\": \"https://onprem.wtf/post/re-register-azure-mfa-server/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-part-1\",\n  \"title\": \"Hyper-Convergence with Nano Server: Part 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"In this post I’m walking through the steps creating the images for my Nano Servers and then deploying them. Like in this post, I’ll use WDS for the deployment, so some steps might already be familiar.Create Nano Server ImagesI installed a Windows 2016 TP4 Server with full desktop experience that serves as DHCP, WDS and management machine. I’ll run all of the scripts from there, you might as well use Windows 10 for it. So the first step is to create a new image, which is really quite similar as described in the post mentioned above.What’s different, is that I’m creating an image for each node and I’m using the DominBlobPath parameter, so before creating the images, I have to harvest the blobs using “djoin.exe”. My servers are going to be named n01 trough n04, so I’m using a little foreach loop to get all four blobs and build the four images:As noted in the intro post to this series, I’m running the first version of this lab on virtual machines, as I’m using ESXi as hypervisor, I needed to add the OEMDrivers as well as drivers for vmxnet3 NICs to the image. Those vmxnet3 drivers are located at DriversPath. I do also add Compute, Storage and Clustering packages, as we need them to provide Hyper-V and Storage Spaces Direct.Do note that the boot image needs to include drivers for vmxnet3 as well, they can be added using the WDS admin console quite easily.Once the images are created, we need to import them into WDS.Import into WDSAgain, I’m going to use the foreach loop to import all VHD files as WDS install images:Now we are ready to create the Nano Server VMs and deploy from WDS.VMsI create four VMs with the following specs on my lab ESXi host:NumCPU = 2;MemoryGB = 16;DiskGB = 20;DiskStorageFormat = 'Thin';GuestID = 'windows9Server64Guest'Then I remove the default NIC and add two of the Type ‘vmxnet3’ and make sure they are connected at startup. Finally, I add two hard disks to the VMs:StorageFormat = 'Thin';CapacityGB = 100;DiskType = 'Flat'Once again, please note that I had to use the SATA controller for these data disks, using default LSA or even the VMware paravirtual controllers, resulted in the following error in the Cluster Validation Wizard:  Disk partition style is GPT. Disk has a Microsoft Reserved Partition. Disk type is BASIC. The required inquiry data (SCSI page 83h VPD descriptor) was reported as not being supported.Using a SATA controller, and attaching the hard disks to that controller, solved the problem.To install the Nano Servers, all I need to do now, is to boot the VMs, press F12 and select the right image on the Windows Deployment Service. About a minute later my server is ready :)Yes, I did also create the VMs with PowerShell, look for a post on that soon…ish.Verify VMsOnce the VMs are installed, I create a CIM session and test connectivity by getting the system uptime like this. As all commands above, these are issued on my management machine (tp4):\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-1/\"\n},{\n  \"id\": \"post-install-office-web-apps-server-2013-on-server-2012-r2\",\n  \"title\": \"Install Office Web Apps Server 2013 on Server 2012 R2\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"A quick hint about installing WAC Server. As it happens, Office Web Apps Server&nbsp;2013&nbsp;only added support for 2012R2 with SP1, and even though SP1 is about 3x the file size of RTM, you cannot install it without RTM;&nbsp;RTM setup fails and that’s where I found myself this morning. Copy SP1 files to ‘updates’ folder Download the service pack 1 for WAC Server from this link: http://go.microsoft.com/fwlink/p/?LinkId=510097 Then extract the service pack using /extract to a folder on the disk. Like this:  wacserversp2013-kb2880558-fullfile-x64-glb.exe /extract:C:\\\\temp\\\\wacsp1 Now copy all the extracted files into the “updates” folder of the RTM install files. Once the updates are there, RTM setup works on 2012R2 and automatically installs SP1, too. Note: Make sure to follow other requirements, as listed on TechNet Enjoy, Tom \",\n  \"url\": \"https://onprem.wtf/post/install-office-web-apps-server-2013-on-server-2012-r2/\"\n},{\n  \"id\": \"post-hyper-convergence-with-nano-server-intro\",\n  \"title\": \"Hyper-Convergence with Nano Server: Intro\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"This is the first post of a series about building a hyper-converged solution with Nano Server in Windows Server 2016 Tech Preview 4. Over the next weeks, I’m going to cover the following parts of my journey:   building the nano servers  creating a cluster and setting up storage spaces direct  bringing in hyper-v  testing and breaking stuff&lt;/ul&gt;   Hyper…what? Before we get started, my quick introduction to hyper-converged, just in case you’ve never heard about it. The basic idea is to bring storage closer to the CPU and so minimize delay. This is achieved by creating groups of servers with local discs and, through the magic of software, pool all the disks into volumes that span the entire group. Such a solution does offer some benefits when we think about scale: adding nodes to the cluster gives you more storage as well as more processor/memory capacity. Obviously we will also see some interesting problems introduced by the complexity of said solutions where troubleshooting will require a great deal of knowledge in multiple fields. While in the old days we had storage, network and compute as cleanly separated silos, hyper-convergence brings all of that together.  So, what I’m going to build and test in this lab is cluster of four Nano Servers running Storage Spaces Direct as well as Hyper-V. The local disks of all Nano Servers will be used to create a virtual disk, that will then be used to store the virtual machines.   Building blocks In the first parts of the series I will build the solution using virtual machines, it’s all about proof-of-concept and learning the basics before getting access to lab equipment. Later I’d like to apply the topics and test the setup on actual hardware, measuring performance data and pulling some disks :)  The requirements for my lab are quite simple, I need an Active Directory domain, one 2016 TP4 Server where I can build and deploy the Nano Server images and later manage the cluster, and four VMs that will be running Nano Server.  DC01: Domain Controller, DNS, Certificate Authority  TP4: DHCP Server, Windows Deployment Services  N01..4: Nano Servers&lt;/ul&gt; I took to visio for a quick diagram, kindly think of the database symbols as disks:  So in the first post of the series, I’m going to build the Nano Server images and deploy them to my virtual machines using Windows Deployment Services. &nbsp; so long,Tom\",\n  \"url\": \"https://onprem.wtf/post/hyper-convergence-with-nano-server-intro/\"\n},{\n  \"id\": \"post-lost-found-onyx\",\n  \"title\": \"lost & found: Onyx\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Another version of lost and found, another fling I’d like to share: &nbsp;https://labs.vmware.com/flings/onyx\",\n  \"url\": \"https://onprem.wtf/post/lost-found-onyx/\"\n},{\n  \"id\": \"post-happy-holidays-and-some-numbers\",\n  \"title\": \"Happy holidays and some numbers\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\"],\n  \"content\": \"It’s this time of the year again, everybody is trying to relax a bit and maybe making some plans for the coming year. Well at least that’s what I’m up to these days.NumbersI thought this would be a good opportunity to share some statistics of our blog. So a little more than a year ago, we moved to azure and cloudflare, I took the following numbers mostly from cloudflare.We are blogging here since July 2009, that’s almost six and a half years or around 2350 days. wow.In this time, we produced 250 posts, some in german, some in english. Even though there have been some times with lower activity, that’s still about one post every 10 days.All of this started over a few beers, and neither of us would have thought that it might last this long. Yet here we are, making plans for 2016 and beyond.Now according to cloudflare around&nbsp;8000 unique visitors are stopping by our little site each month, around 300 every single day. Not really mind-blowing, but also not bad.Greetings With that said, we’d like to wish all of you a happy new year and we do certainly hope to see you around.&nbsp;Cheers, Tom\",\n  \"url\": \"https://onprem.wtf/post/happy-holidays-and-some-numbers/\"\n},{\n  \"id\": \"post-lost-found-openlivewriter-rackhd-ehc-diskspd\",\n  \"title\": \"lost & found: OpenLiveWriter, RackHD, EHC, diskspd\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\",\"Server\",\"VMware\"],\n  \"content\": \"Another quick and dirty edition of “lost &amp; found”, just sharing stuff that I thought is interesting. Open Live WriterSo this is the first post published (and written) using the open-sourced version of Live Writer. I always liked Live Writer, so I am very happy to have it back. More info at Github: https://github.com/OpenLiveWriter/OpenLiveWriterEMC RackHDAnother open source project I stumbled upon the other day is RackHD from EMC {code}. This comes a vendor independent management and orchestration solution for the datacenter. Now I know, that sounds a lot like everything and nothing but why not have a look: http://blog.emccode.com/2015/12/08/introducing-rackhd-automate-bare-metal/VMware Embedded Host ClientThis is especially awesome for the MAC users out there, as you no longer need a Windows VM to run the C# vSphere Client. So you simply install a VIB package on your ESXi (lab) servers and point your browser to https://hostname/ui to manage the host. More Info: https://labs.vmware.com/flings/esxi-embedded-host-clientInstallation is simple and doesn’t require a reboot.esxcli software vib install -v /tmp/esxui-signed.vibThe same is true for removal:  esxcli software vib remove -n esx-ui And a quick look at what you’ll get.  DiskSpd Heard of SQLIO? Meet it’s sequel, DiskSpd. A handy little tool that generates synthetic workload to help asses storage performance. There is a good post on TechNet going into quite a bit of detail. Get the tool and documentation in the TechNet Gallery. &nbsp; Thats all for tonight, so long Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-openlivewriter-rackhd-ehc-diskspd/\"\n},{\n  \"id\": \"post-domain-joining-the-vcenter-server-appliance-6\",\n  \"title\": \"Domain-joining the vCenter Server Appliance 6\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\",\"VMware\"],\n  \"content\": \"In this post, we started out by deploying the VCSA to a new environment, today we'll see how to join the VCSA to an Active Directory domain and authenticate using domain accounts.&nbsp;&nbsp;PrepareTo join a domain we need the distinguished name of the organizational unit where we want the VCSA's computer object to be created, as well as an account with the required permissions to join a machine to the domain.To get the DN use your tool of choice, like PowerShell: Get-ADOrganizationalUnit -Filter {Name -like \\\"servers\\\"} | Select-Object -ExpandProperty DistinguishedName &nbsp;&nbsp;Before joining the vCenter Server Appliance to the domain, make sure DNS is working perfectly, that includes reverse lookup.&nbsp;&nbsp;JoinNow sign-in to the vCenter using the local SSO domain created during setup and go to Administration/System Configuration/Nodes. Select the VCSA from the list of Nodes and in the right pane, go to Manage/Active Directory and click the \\\"Join\\\" button on the right.&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Specify the domain name and DN of the organizational unit as well as the credentials to use.&nbsp;&nbsp;\\t&nbsp;&nbsp;After joining the domain, a restart is required. To perform a restart, either use SSH or use the \\\"Reboot\\\" button in the \\\"Actions\\\" menu.&nbsp;&nbsp;Once the VCSA is restarted we can see that a Computer object has been created in AD. Now we log-in again, still using the local account, and go to Administration/Configuration where we select \\\"Identity Sources\\\" in the right pane, using the \\\"+\\\" button, add a new Identity Source. &nbsp;&nbsp;\\t&nbsp;&nbsp;Configure PermissionsOnce the Identity Source has been added, we can configure roles and permissions for AD accounts. This can be done using Administration/Global Permissions. Using the \\\"+\\\" button, we assign an AD user or group to a vCenter Role.&nbsp;&nbsp;Alternatively, we can add AD users or groups to the preconfigured groups that can be found in the \\\"Single Sign-On\\\" section of the Administration menu.&nbsp;&nbsp;\\t&nbsp;&nbsp;Verify Finally we can log-out of the local admin account and log-in using our AD user, which should be able to access resources, as specified by the assigned roles. Note: Users with no assigned roles will also be able to log-in, obviously they won't see any objects.&nbsp;&nbsp;TroubleshootNow if some of the steps don't work, for example you cannot log-in or you cannot access AD users or groups in the configuration, double-check DNS and have a look at the following log files:/var/log/vmware/sso/vmware-sts-idmd.log&nbsp;/storage/log/vmware/sso/ssoAdminServer.log&nbsp;I got \\\"Cannot load the users for the selected domain\\\" in the Web Client and found the &nbsp;following lines in the above mentioned logs:&nbsp;Failed to get non-GC connection to domaincom.vmware.identity.idm.IDMException: Failed to establish server connection\",\n  \"url\": \"https://onprem.wtf/post/domain-joining-the-vcenter-server-appliance-6/\"\n},{\n  \"id\": \"post-azure-backup-restore\",\n  \"title\": \"Azure Backup: Restore\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\",\"de\"],\n  \"content\": \"In diesem Post habe ich beschrieben, wie man Daten mit Azure Backup sichert, nun wollen wir diese wiederherstellen.&nbsp;&nbsp;Backup AgentDie Wiederherstellung wird über den Azure Backup Agent gestartet, im ersten Schritt wählt man aus, welcher Server wiederhergestellt werden soll.&nbsp;&nbsp;\\t&nbsp;&nbsp;Anschließend werden die wiederherzustellenden Dateien über die Suche oder einen Filesystem Browser ausgewählt. &nbsp;&nbsp;\\t&nbsp;&nbsp;\\t&nbsp;&nbsp;Wie üblich kann man die Dateien am ursprünglichen Ort wiederherstellen, oder einen anderen Pfad angeben. Außerdem kann ausgewählt werden, ob die Berechtigungen (ACL) wiederhergestellt werden sollen. &nbsp;&nbsp;\\t&nbsp;&nbsp;Nach der Bestätigung wird der Wiederherstellungsprozess gestartet, dieser wird auch im Azure Portal angezeigt und protokolliert.&nbsp;Weitere Infos und Doku: https://azure.microsoft.com/en-us/documentation/services/backup/\",\n  \"url\": \"https://onprem.wtf/post/azure-backup-restore/\"\n},{\n  \"id\": \"post-installing-nano-server-using-wds-and-pxe\",\n  \"title\": \"Installing Nano Server using WDS and PxE \",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"Technical Preview 4 of Windows Server 2016 brings along new \\\"packages\\\" for Nano Server, it can now run DNS and IIS along other roles. See TechNet for a complete list. So to get started with Nano, I tried to deploy it via WDS.&nbsp;&nbsp;PrepareNano Server is not installed like other editions of Windows Server, one has to build a customized image with the roles and packages one needs. This underscores the very nature of Nano Server, being a minimal install with minimal overhead.Now to create this image we have to mount the Windows 2016 TP4 ISO on our workstation. In the NanoServer folder right at the root of the ISO, we find the .wim along with two PowerShell scripts. There is quite a detailed guide available on TechNet so I am not going into to much detail here:&nbsp;&nbsp;First import the Module: ipmo .\\\\NanoServerImageGenerator.psm1&nbsp;&nbsp;As I ran the New-NanoServerImage cmdlet before, it already converted the WIM to VHD (that's the VHD you'll find at the \\\"BasePath\\\") so I can omit \\\"MediaPath\\\" for subsequent runs and save a little time:&nbsp;&nbsp;New-NanoServerImage -BasePath C:\\\\nanotemp -TargetPath C:\\\\Nano\\\\Nano_dns.vhd -OEMDrivers -Packages Microsoft-NanoServer-DNS-Package -ComputerName nano_dns -DomainName tomt.it -Language en-us&nbsp;&nbsp;\\t&nbsp;&nbsp;Note: I had to specify the Language parameter as I my system is not using en-us. I am planning to run the VHD on VMware, that's why I included \\\"OEMDrivers\\\" and not \\\"GuestDrivers\\\".&nbsp;&nbsp;WDS The steps above created a VHD at the target path and in the next step I am adding this VHD as an install image to WDS:&nbsp;&nbsp;\\t&nbsp;&nbsp;I changed the name to avoid confusion :)&nbsp;&nbsp;\\t&nbsp;&nbsp;The same can be achieved using PowerShell:&nbsp;&nbsp;Import-WdsInstallImage -Path C:\\\\nano\\\\Nano_dns.vhd -NewImageName \\\"Nano_dns_10.0.10586\\\"&nbsp;&nbsp;That's basically it, now we have to create a new VM an pxe-boot from the WDS.&nbsp;&nbsp;InstallI created a new VM using the \\\"Windows 2016\\\" template in Fusion, but before installing I reduced the size of the new virtual disk to 10G, which still is way to much ;)&nbsp;&nbsp;\\t&nbsp;&nbsp;\\t&nbsp;&nbsp;Very few miutes later our new DNS server is ready.&nbsp;&nbsp;\\t&nbsp;&nbsp;There is nothing really to be done on the server console, the \\\"Emergency Console\\\" can be used to configure networking, the rest is done with RSAT or PowerShell remoting.&nbsp;&nbsp;DNSTo test the functionality of my newest Nano Server, I actually set up DNS:&nbsp;&nbsp;So first of all, using Get-WindowsFeature I checked which features were installed and which ones were available. As you can see from the screenshot, there are not very many features available:&nbsp;&nbsp;\\t&nbsp;&nbsp;Using the following command, I installed DNS Server role: Add-WindowsFeature -ComputerName nano_dns -Name DNS&nbsp;&nbsp;After that, I was able to add the Server to the DNS Management console and configure DNS zones:&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Oh, and of those of you who care, the size of the virtual harddisk is 626,6MB. Awesome, right? :)&nbsp;&nbsp;\\t&nbsp;&nbsp;&nbsp;&nbsp;Enjoy, Tom\",\n  \"url\": \"https://onprem.wtf/post/installing-nano-server-using-wds-and-pxe/\"\n},{\n  \"id\": \"post-lost-found-tp4-th2-win32-openssh-vs-code\",\n  \"title\": \"lost & found: TP4, TH2, Win32-OpenSSH, VS Code\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\",\"Server\"],\n  \"content\": \"Tech Preview 4The latest preview of Windows Server 2016 has been released, it brings many new features including options for Containers and Nano Server.Download it from the Evaluation Center: http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview\\tWindows 10 1511Aka. Threshold 2 was released, pulled, and re-released, apparently because of some privacy settings. Windows Insiders got it a little earlier and so it landed on my Surface Pro 3. It leaves much more of a stable impression than \\\"RTM\\\" and fixed most of the problems I had.OpenSSH comes to WindowsYes, that's right, some folks at Microsoft heard the calls and started a project on GitHub, aiming to bring OpenSSH to the Windows-world. The wiki page at GitHub has some info about installing, which is quite simple:Once downloaded, run the following commands from an administrative PowerShell:Expand-Archive .\\\\OpenSSH-Win32.zipcd .\\\\OpenSSH-Win32\\\\OpenSSH-Win32\\\\.\\\\ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key.\\\\sshd.exe installStart-Service sshdAnd don't forget to create a firewall rule: New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSHThen I was able to connect from my MacBook: \\tFind more info, a wiki and the download over at GitHub: https://github.com/PowerShell/Win32-OpenSSH\\tVisual Studio CodeA free, cross platform code editor with interesting language support.https://code.visualstudio.com\\t&nbsp;Have fun,Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-tp4-th2-win32-openssh-vs-code/\"\n},{\n  \"id\": \"post-getting-started-with-vcenter-server-appliance-6\",\n  \"title\": \"Getting started with vCenter Server Appliance 6\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\",\"VMware\"],\n  \"content\": \"So I’ve done some work with VMware in the past and even got certified on vSphere 4, but then I changed jobs and ended up working, almost exclusively, with Microsoft software. That included a little bit of Hyper-V but mostly I worked “higher up” in the stack, with applications like Exchange and Lync, that is. As I changed jobs again and find myself focusing on Datacenter technologies now, I decided it was time to reactivate some VMware skills and get to know the latest version.I deployed a vCenter Server Appliance in a new environment the other day, and thought it might be a good starting point.PrepareYou may have heard that VMware want’s to ditch the good ol’ vSphere client and switch to a Web Client kind of a thing, this has been going on for a while, but in every release they are getting more serious about it. New features almost always come “web only”. Unfortunately they decided to make this a flash-based client, yeah, it’s almost as bad as java, but that’s another story.So get yourself a machine with a web browser and install/enable the flash plugin. I had troubles with Safari, Chrome and IE11 so I ended up using Firefox (think about that for a sec…).&nbsp;Download the VCSA from vmware.com, it comes as an ISO image that you will have to mount on your management machine. The idea is, basically, to use a website to deploy an OVF template to one of your vSphere hosts.Install&nbsp;Inside the ISO you’ll find the Web Client Plugin, which is required to deploy the OVF template, it’s located at: \\\\vcsa\\\\VMware-ClientIntegrationPlugin-6.0.0.exeOnce the Client Plugin has been installed, open the \\\\vcsa-setup.html file and follow the wizard.Most steps are straightforward, first select the target ESXi host and configure the VM name and a password for the root account.Then select how the Platform Services Controller is deployed. As far a I know, this is a new role in vCenter 6, which controls Licensing, SSO and Certificates. I selected to deploy an embedded PSC.&nbsp;The next step is to configure Single Sign-On. In my case I created a new SSO domain, as this was the first vCenter Server in the environment. Remember the “SSO Domain name” you use, it will be required to log on later. The SSO domain name must be different than the Active Directory domain name.&nbsp;Note: Make sure to check documentation when upgrading an existing vCenter, as the SSO configuration has changed quite a bit.Select an appliance size and which datastore to use for the VCSA appliance.Finally you can configure network settings. When entering a FQDN for the vCenter appliance, make sure it is already configured in DNS and the VCSA can reach the DNS server you specify. Deployment will fail if DNS doesn’t check out. As I had no NTP Server handy, I selected to synchronise the VCSA’s time with the ESXi host. And no, I would not recommend this.Now after the deployment of the OVF finishes, we should be able to logon to the vSphere Web Client using a browser, or to the classic vSphere Client installed on Windows. Make sure to logon using the administrator@ssodomain account, you wont be able to do much configuration as root!Stay tuned for more :)Tom\",\n  \"url\": \"https://onprem.wtf/post/getting-started-with-vcenter-server-appliance-6/\"\n},{\n  \"id\": \"post-netscaler-as-adfs-proxy\",\n  \"title\": \"Netscaler as ADFS Proxy\",\n  \"author\": \"dni\",\n  \"tags\": [\"ADFS\",\"Citrix\",\"en\"],\n  \"content\": \"I decided to use Netscaler to publish my ADFS server to the internet instead of a dedicated server in the DMZ. I checked several blogs and the official Citrix documentation but this looked overloaded. Citrix documentation: NetScaler as ADFS Proxy Deployment Guide - CitrixBlogs: http://blogs.citrix.com/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/, http://cividan.blogspot.it/2015/02/use-citrix-netscaler-as-replacement-for.htmlSo I searched a way to:- Publish ADFS to the Internet with URL filter- Do not pre-authenticate with Netscaler (Customizing multiple pre-authentication Websites can be very time consuming per tenant)- Modify the Header that ADFS server understands the request comes from externalThere was no blog post that explained the whole configuration, so I decided to write down the required steps:1. The serviceFirst create the service and specify to forward the Client IP (Header: X-MS-Forwarded-Client-IP)&nbsp;2. The vServer&nbsp;Create the vServer not directly addressable to not trash an IP address and bind the certificate3. Content switch policyCreate a content switch policy to forward only /adfs and the exact hostname to the vServer4. Content Switch vServerCreate the content switch vServer and apply the content switch policy5. Rewrite ActionsYou want to let the ADFS know that the request comes from extranet. So you can apply different authentication methods in the different zones. You have to add the header X-MS-Proxy to the request. Therefore you create a rewrite actionCreate also a rewrite action to rewrite URL /mex 6. Rewrite Policy7. Bind the PoliciesNow bind the policies to the vServer. Both are rewrite policies for requests. Be careful with the GoTo expression to the Header transformation, this must be “NEXT”8. The MonitorADFS has a probe check build in. If you check /adfs/probe you get a 200 message if everything is OK. Create the monitor and add it to the service    &lt;p&gt;&lt;a href=\\\"/assets/archive/image_684.png\\\"&gt;&lt;img width=\\\"265\\\" height=\\\"339\\\" title=\\\"image\\\" style=\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_682.png\\\" border=\\\"0\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Netscaler configuration is done. You can test now the authentication if you access the URL &lt;a href=\\\"https://portal.office.com\\\"&gt;https://portal.office.com&lt;/a&gt; through Netscaler. Then you will be redirected to the ADFS website for authentication:&lt;/p&gt; &lt;p&gt;&lt;a href=\\\"/assets/archive/image_685.png\\\"&gt;&lt;img width=\\\"438\\\" height=\\\"156\\\" title=\\\"image\\\" style=\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_683.png\\\" border=\\\"0\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For internal requests use split DNS to forward the authentication directly to the ADFS server and not to the Netscaler ADFS proxy. So the Proxy Header is missing and your client will use internal authentication.&lt;/p&gt; &lt;p&gt;Stay tuned for my post series about configuring Exchange in Hybrid mode with Office 365.&lt;/p&gt; &lt;p&gt;Greetings&lt;br&gt;ND&lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/netscaler-as-adfs-proxy/\"\n},{\n  \"id\": \"post-azure-backup\",\n  \"title\": \"Azure Backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"Cloud\",\"de\"],\n  \"content\": \"Seit einiger Zeit bieten die Recovery Services in Microsoft Azure die Möglichkeit, virtuelle Maschinen oder ganze Rechenzentren zu sichern. Das ist vor allem für Unternehmen interessant, die sich kein DR Rechenzentrum leisten können/wollen.Mit Azure Backup gibt es dazu auch&nbsp;die Möglichkeit einzelne Server, Clients oder nur bestimmte Daten in die Cloud zu sichern. So kann jeder an den Luxus eines off-site Backups kommen. Im folgenden Beispiel konfiguriere ich Azure Backup für meinen Windows 10 Client.&nbsp;Backup VaultAls Grundvoraussetzung benötigt man natürlich eine Azure Subscription, hier kann man sich das Ganze im Free Trial anschauen: https://azure.microsoft.com/en-us/pricing/free-trial/&nbsp;\\tIn der Subscription wird ein Backup Vault benötigt, dort werden die Backups gespeichert. Um ein Backup Vault zu erstellen, ist nach wie vor das \\\"alte\\\" Management Portal nötig, dieses erreicht man über: https://manage.windowsazure.com&nbsp;\\tUnter New, Data Services, Recovery Services erstellt man das Backup Vault.Einmal angelegt muss man nur noch die \\\"Vault credentials\\\" herunterladen, diese findet man im Dashboard des neu angelegten Vaults.Backup AgentDer Backup Agent wird auf dem Client/Server installiert, welcher in das Azure Backup Vault gesichert werden soll. Der aktuelle Backup Agent kann hier heruntergeladen werden: http://aka.ms/azurebackup_agent&nbsp;\\tEinmal installiert, kann man die lokale Maschine über \\\"Register Server\\\" hinzufügen, in dem Wizard werden die \\\"Vault Credentials\\\" importiert. Diese verwendet der Agent um das Vault zu finden und sich zu authentifizieren. Die Daten werden lokal verschlüsselt und über eine https Verbindung übertragen. Der Benutzer erstellt ein Kennwort für diese Verschlüsselung, die auch in der Cloud erhalten bleibt (at rest). Das Kennwort wird in einer Textdatei gespeichert und sollte sicher aufbewahrt werden.&nbsp;\\tSobald der Client/Server registriert wurde, kann man das Backup konfigurieren. Im ersten Schritt wählt man die Daten aus, welche gesichert werden sollen.\\t\\t&lt;p&gt;Dann gibt man unter Backup Scheduleand Retention Policy an, wann Backups erstellt werden sollen und wie dieseaufbewahrt werden.&lt;/p&gt;&lt;p&gt; \\t&lt;/p&gt;&lt;p&gt;That’s it. Das Backup kann mit Backup Now gestartet werden, oder man wartet bis der geplante Task das erledigt.&lt;/p&gt;&lt;p&gt; \\t&lt;/p&gt;&lt;p&gt;Kosten&lt;/p&gt;&lt;p&gt;Die Kosten für das Backup Vault können unter folgendem Link nachgelesen werden:&lt;/p&gt;&lt;p&gt;http://azure.microsoft.com/en-us/pricing/details/backup/ \\t&lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/azure-backup/\"\n},{\n  \"id\": \"post-getting-started-with-osx\",\n  \"title\": \"Getting started with OSX\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\"],\n  \"content\": \"Well yes, I amswitching to OSX on my work machine. I'm still using my Surface Pro 3 at homeand for meetings, but my primary work computer will be a 13\\\" MacBook Profrom now on. As I had no experience whatsoever working with OSX, here are mynotes on getting started:&nbsp;GetOneNoteOne of the mostimportant productivity tools,for me, is OneNote. Everything from screenshots, recipes, drafts, ideas,writing, learning, to meeting notes goes there. I am simply not functionalwithout it :) so just go to onenote.com and grab the latest version. It's free,too.&nbsp;GetBrew and CaskA package managerfor OSX, once installed you can easily install packages (includingdependencies) just like this:$brew search nmap$brew install nmap&nbsp;And, importantly,updating packages is straightforward to. No more updating all individualapplications, just run (Caution: this will update all packages!):$brew update &amp;&amp; brew upgrade &nbsp;Simple as that. Caskextends brew, and brings along many more packages.&nbsp;KeyboardshortcutsThis was reallyimportant for me, as I am using keyboard shortcuts a lot on windows. There is agood list of possible shortcuts at apple.com.Another importantpart, at least for me, in getting around in OSX are trackpad gestures. The mostimportant can be found in the Trackpad section of \\\"SystemPreferences\\\".&nbsp;PythonThere's noPowerShell on the Mac. Bummer. I decided to look into Python and found a couplegood sites for beginners.&nbsp;Moretools...I use KeePass on myWindows machines, a lot. There are multiple possible solutions on OSX, the onethat worked best for me is MacPass. Itopens kdbx files and there is an autotype feature.As I work a lot withconsole/command-line tools, a decent terminal emulator is key. A colleaguepointed me to iTerm2, and I love it :)Atom is a great, customizable text editor.&nbsp;Whatelse?Am I missingsomething, do you have any suggestions? Comments are highly appreciated :) &nbsp;LinksOneNote: http://onenote.comHomebrew: http://brew.shKeyboard Shortcuts: https://support.apple.com/en-us/HT201236Learn Python thehard way: http://learnpythonthehardway.org/book/Coursera: https://www.coursera.org/course/pythonlearnPython: https://docs.python.org/2/library/index.htmlMacPass: http://mstarke.github.io/MacPass/iTerm2: http://iterm2.comAtom: https://atom.io\",\n  \"url\": \"https://onprem.wtf/post/getting-started-with-osx/\"\n},{\n  \"id\": \"post-moving-on!\",\n  \"title\": \"Moving on!\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\"],\n  \"content\": \"Wie der Eine oder Andere vielleicht weiß, habe ich die vergangenen zwei Jahre in Paderborn verbracht. Dort durfte ich einige sehr spannende Projekte im Bereich Unified Communications umsetzen und konnte sowohl beruflich wie auch persönlich viel lernen. Ein großer Dank gilt hier meinem ehemaligen Arbeitgeber, meinen Vorgesetzten und den lieben Kollegen! ;)Der Ruf der Heimat (=Berge) wurde mit der Zeit immer lauter und so entschied ich mich Anfang des Jahres, wieder nach Südtirol zu gehen. Nachdem ich den Sommer für persönliche und kulturelle Weiterbildung (und viel Urlaub) genutzt habe, geht es für mich nun auch beruflich wieder weiter. Ich bleibe dem Leben als Dienstleister treu, freue mich aber sehr in einen neuen Bereich einzusteigen und somit meinen Horizont zu erweitern. In nächster Zeit geht es für mich weg von UC und hin zu Datacenter, Netzwerk und Storage.Hier im Blog möchte ich, soweit es die Zeit zulässt, weiterhin&nbsp;aus der Praxis erzählen.Bis bald!Tom\",\n  \"url\": \"https://onprem.wtf/post/moving-on!/\"\n},{\n  \"id\": \"post-how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you\",\n  \"title\": \"How to prepare for Exchange 2013 PF migration and what the Microsoft Guide doesn’t tell you\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"I’m currently preparing my Exchange 2010 / 2013 environment for the public folder migration from 2010 to 2013. I created a test lab to simulate the migration before I do it on the productive servers. During the test migration I noticed some problems that have to been fixed before you get into the migration.1. Fix wrong aliasesIf you have mail enabled folders with aliases containing special characters like spaces or “@” you get an error when you start the first migration part and Exchange wants to create the hierarchy.You can enumerate mailbox folders with, for example, spaces in aliases with the following query:Get-MailPublicFolder | where{$_.Name -match &quot; &quot;}If you have just less than 10 folders to fix you can do it manually. But if you have more than 50 to correct you can use the script written by Johan Veldhuis (http://www.johanveldhuis.nl/tools/scripts/fix-aliasv20.ps1)2. Set the storage quota for the public folder mailboxes on 2013 to unlimitedDuring migration, I recommend to set the storage quota for the public folder mailboxes to unlimited. I saw very strange problems with hierarchies on 2013 not comparing to 2010 if a folder is over quota. You can change the storage limit after migration is done.3. Set the legacy public folder – folder quota to unlimitedDuring migration I had some problems with mail enabled public folders. On the 2010 side the PF are mail enabled, on the 2013 not all PF’s are mail enabled but the PF’s are able to receive mails. You cannot manage the folders with EAC or porwershell. In my case, this problem was related to a PF quota set on a folder. I have many folders with content that reached the maximum limit. For all of these folders the mail enabled option was not enabled after migration. I recommend setting the PF Quota on PF Database basis to unlimited before migration. Please keep in mind to set the quota for all folders to “use database defaults”. You can do this with the following line of powershell:Get-PublicFolder -Recurse | where{$_.UseDatabaseQuotaDefaults -eq $false} | Set-PublicFolder -UseDatabaseQuotaDefaults $trueAdjust the new storage quotas later on a mailbox basis.Greeting   dn\",\n  \"url\": \"https://onprem.wtf/post/how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you/\"\n},{\n  \"id\": \"post-netsh-trace-and-the-message-analyzer\",\n  \"title\": \"netsh trace and the Message Analyzer\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"en\"],\n  \"content\": \"This is just a quick post about a cool feature of netsh and the successor to Microsoft’s NetMon.netsh traceWith Windows 7 / Server 2008R2 and newer versions a cool feature has been added to netsh: the possibility to capture network traces without the need to install any third party software.All you need to do is to start an elevated command prompt (run as Admin) and type the following command:netsh trace start capture=yesThen do the stuff you want to capture and stop the trace by using:netsh trace stopAn .etl trace will be generated and the file path is displayed. Note: if you use the persistent=yes parameter when starting the trace, you can even trace system reboots. Microsoft Message AnalyzerSo NetMon has been around for a while and IT pros around the world still love it, well at least I do ;) Some time ago, Microsoft introduced its successor, a tool by the name of “Message Analyzer”. This tool can to a lot more than just network traces, find some information on the MessageAnalyzer Blog.So I just captured a trace using netsh, copied the .etl file to my machine and then opened it in Message Analyzer. As you can see in the screenshot, the layout is quite a bit different from what we’re used from NetMon but the important things are still there. Filtering is quite intuitive, either write an expression into the text box at the right-hand side, or load a filter from the library. Alternatively, just right-click a property of a packet and select “Add to Filter” Well that’s about all I know about Message Analyzer for now. I was able to verify that packets got tagged with the DSCP values I expected and I did not have to install additional software to capture a trace.Happy tracing,Tom\",\n  \"url\": \"https://onprem.wtf/post/netsh-trace-and-the-message-analyzer/\"\n},{\n  \"id\": \"post-considerations-when-planning-for-directaccess\",\n  \"title\": \"Considerations when planning for DirectAccess\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012-R2\"],\n  \"content\": \"I’ve seen a fair share of DirectAccess installations recently. Here are some quick questions to ask before you or your customer start getting into the technical titbits. Licensing: DirectAccess requires the Enterprise Edition of Windows on the Client side!  Version:   Client: DirectAccess works with Windows 7 and later, Windows 8.1 i preferred as the technology has evolved  Server: DirectAccess works with Windows Server 2008R2 and later, but Windows 2012 is highly recommended as NAT64 and DNS64 have been included.&lt;/ul&gt; IPv6: Yep, DirectAccess is an IPv6 technology. Make sure your applications support IPv6 and make sure applications always use DNS names to connect to the Servers. If the client is configured to connect to an IPv4 address directly, DirectAccess will not work.  Windows Firewall: It’s sad but I do still see many organizations disabling Windows Firewall via Group Policy. Well in that case, not only are you putting your users at risk, DirectAccess will also not work. Windows Firewall must be enabled as DA uses Connection Security Rules.  Dual NIC: The DircetAccess Server should be configured with to NICs, one for external/dmz connectivity and one for connectivity to the internal network.  Static Routing: As you set the the default gateway to the external NIC, static routes will have to be created for internal networks. Make sure to use “New-NetRoute” as “route add” is no longer recommended.  Firewall: DirectAccess requires tcp/443 to be allowed from the Internet to the external network adapter of the DA server.  Public DNS: A name must be registered in the public DNS zone, clients will use this name to connect to the corporate network.  Public Certificate: A certificate issued by a publicly trusted Certification Authority is highly recommended for the DirectAccess server’s public DNS name. The DA Client checks the Certificate Revocation List before connecting, so if you are using an internal CA, make sure the CRL is available without connectivity to the corporate network.  No Schema or AD changes required: The only requirement for DirectAccess is a Windows Server 2012 (preferably 2012R2) member server. As long as you are on a 2003 or later domain level, you are good to go.  Probe Host: Clients try to connect to a “Probe Host” do determine whether or not a DirectAccess connection should be attempted. This host should, obviously, only be accessible from inside the corporate network. The DirectAccess Wizard resolves name in the Probe Host certificate’s subject, if there is no DNS record, or the DNS record points to an incorrect IP address, the Wizard will fail. Also if the probe host fails, Clients will attempt DA connections even if they are connected to the corp. network, which may lead to problems.  2FA: DirectAccess can be configured for two-factor authentication. Force Tunnelling is not supported in that scenario.  High Availability: Multiple DirectAccess Servers can be deployed for high availability. Windows Network Load Balancing can be used but I’d recommend you use an external Load Balancer.  VPN: The Remote Access Server can be configured for VPN as well.&lt;/ul&gt; &nbsp; Phew. I don’t like bullet lists… Whatever, with those in mind you should be able to plan your remote access strategy :) Tom\",\n  \"url\": \"https://onprem.wtf/post/considerations-when-planning-for-directaccess/\"\n},{\n  \"id\": \"post-wmf-5-preview-update-is-not-applicable-to-your-computer\",\n  \"title\": \"WMF 5 Preview: Update is not applicable to your computer\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"PowerShell\"],\n  \"content\": \"I just stumbled upon this one on a new machine I was working with:&nbsp;&nbsp; Are you trying to install the Windows Management Framework 5 Preview, to get all the new PowerShell stuff, and see an error like this one?\\\"The update is not applicable to your computer\\\"    This preview actually requires the system local to be set to \\\"en-US\\\", you can easily check this using Get-Host within PowerShell:    In my example, the CurrentUICulture was set to \\\"en-GB\\\" and, apparently, that's why the update failed to install. Once I changed my regional settings and downloaded the \\\"en-US\\\" language pack, the update installed just fine.  In case you haven’t heard of the preview as of yet, you can grab it here: http://www.microsoft.com/en-us/download/details.aspx?id=44070  The issue is also listed in Connect: https://connect.microsoft.com/PowerShell/feedback/details/877188/update-is-not-applicable-to-your-computer-windows-management-framework-5-0-preview-may-2014  &nbsp; Have fun,Tom \",\n  \"url\": \"https://onprem.wtf/post/wmf-5-preview-update-is-not-applicable-to-your-computer/\"\n},{\n  \"id\": \"post-windows-10-vhd-boot\",\n  \"title\": \"Windows 10 VHD Boot\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Seit einigen Tagen ist die Technical Preview von Windows 10 verfügbar. Auf meinem Notebook nutze ich Windows 8.1 und habe das Hyper-V Feature aktiviert um virtuelle Maschinen betreiben zu können. In so einer VM habe ich auch Windows 10 installiert und getestet.Nach ersten erfolgreichen Tests, wollte ich dann doch mein Notebook mal mit Windows 10 booten, also habe ich mit “bcdedit” einen neuen Eintrag im Bootloader erstellt und die virtual Hard Disk der Windows 10 VM als “device” und “osdevice” angegeben.Wichtig: Vor einer Änderung sollte man die aktuelle Konfiguration immer sichern:bcdedit /export \\\"C:\\\\Users\\\\thomas\\\\Documents\\\\bcdedit\\\"Dieser Befehl kopiert den Boot Configuration Eintrag für das aktuelle Betriebssystem. Der neue Eintrag erhält eine eigene GUID, diese wird gleich ausgegeben und wird in den darauffolgenden Befehlen verwendet.bcdedit /copy {default} /d \\\"Win10 Preview”Mit folgenden Befehlen werden die Einstellungen für den neuen Eintrag angepasst, die virtuelle Festplatte der Windows 10 VM wird als “device” konfiguriert, die GUID des oben erstellten Eintrags muss verwendet werden: bcdedit /set {&lt;new-GUID&gt;} device vhd=[C:]\\\\temp\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} osdevice vhd=[C:]\\\\temp\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} detecthal on&lt;/code&gt; Wenn das Notebook jetzt neu gestartet wird, kann ich im Bootloader zwischen Windows 8.1 und der Tech Preview von Windows 10 wählen. Auch die virtuelle Maschine kann nach wie vor verwendet werden. Viel Spaß,Tom&nbsp; \",\n  \"url\": \"https://onprem.wtf/post/windows-10-vhd-boot/\"\n},{\n  \"id\": \"post-lost-found-windows-tech-preview-delve-sway-and-keybaseio\",\n  \"title\": \"lost & found: Windows Tech Preview, Delve, Sway and Keybase.io\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"WindowsSome days ago, on September 30, @tmyerson and @joebelfiore introduced Windows 10 and announced the availability of a Technical Preview. The announcement and some demos are on YouTube. Some interesting new features such as snap for 4 windows and continuum, which switches between the start menu and the start screen based on whether or not a keyboard is connected, are coming to Windows 10.The preview can be downloaded at: http://windows.microsoft.com/en-us/windows/previewAlong with the tech preview of Windows 10 came the preview for the next version of Windows Server. A ton of new features will come to the next gen server OS, a notable one might be the SDN controller role, which provides a interface between higher layer applications (think SCVMM) and the software defined networking stack in Windows.The preview for Windows Server can be downloaded at: http://technet.microsoft.com/evalcenter/dn781243DelveThe long rumored and previously shown “Office Graph” aka “Oslo” has started rolling out to Office 365 customers under the new name: “Office Delve”. To get a chance to test new features before regular users get them, one needs to enable “First Release” in the Office 365 Admin Center. SwayAnother addition to the Office family, by the name of “Sway”, started a limited preview a couple of days ago. More information and some demos can be found here: https://sway.com/Keybase.ioAfter signing up some time ago, I finally received an invite for https://keybase.io. Keybase is an interesting approach to make public key cryptography more accessible to users, among many other features it provides&nbsp; a simple way of finding someone’s public key, based on their social media and web identities, in order to be able to encrypt messages for them. It is available as a command-line tool but the website works as client, too.View my publicly-auditable identity here: https://keybase.io/tomt So long,Tom\",\n  \"url\": \"https://onprem.wtf/post/lost-found-windows-tech-preview-delve-sway-and-keybaseio/\"\n},{\n  \"id\": \"post-scvmm-hyperv-script-to-reboots-vms-with-powershell\",\n  \"title\": \"SCVMM–HyperV Script to reboots VM’s with powershell\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Today I wondered that with Hyper-V there is no option to „reboot“ a VM with right clicking on it. With ESX I have the option to reboot the guest and so I created a script to schedule the reboot with the help of VMWare Powershell and VMWare tools.   The Hyper-V modules on SCVMM gives you the option to shut down and start a VM. Therefore I wrote a simple script that shutdown all VM machines in a specified list (you can use an argument if you want to work with multiple lists). The shutdown is initiated with the “-RunAsynchronously“ switch so that the Powershell command does not wait until the vm is powered off. Immediately after sending the shutdown command a “do while” loop begins to work and waits until one of the machines is powered off. If a machine is switched off the loop powers the VM machine on. The loop ends when all machines are started up.As I have also a VMWare vCenter connected in SCVMM I only touch VM machines with a filter: VirtualizationPlatform = “HyperV”   &#160;# Import Module   Import-Module -Name &quot;virtualmachinemanager&quot;# Clear Variables   [String[]] $VMsToStart = $Null# Get List of VM's to reboot   $VMsToReboot = Get-Content &quot;C:\\\\Program Files\\\\Scripts\\\\ServerList.txt&quot;# Shutdown each VM   Foreach($VMToShutdown in $VMsToReboot){    &#160;&#160;&#160; $VMToShutdownObject = Get-SCVirtualMachine $VMToShutdown    &#160;&#160;&#160; If ($VMToShutdownObject -ne $Null){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToShutdownObject.VirtualizationPlatform -eq &quot;HyperV&quot; -and $VMToShutdownObject.VirtualMachineState -eq &quot;Running&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Shutdown-VM -VM $VMToShutdownObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart += $VMToShutdown    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }Else{    &#160;&#160;&#160; Write-Verbose (&quot;Machine &quot; + $VMToShutdown + &quot; not found&quot;)    &#160;&#160;&#160; }    }# Start each VM after graceful shutdown   Do{    &#160;&#160;&#160; ForEach($VMToStart in $VMsToStart){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMToStartObject = Get-SCVirtualMachine $VMToStart    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToStartObject.VirtualMachineState -eq &quot;PowerOff&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Start-VM -VM $VMToStartObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart = $VMsToStart | ? {$_ -ne $VMToStart}    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }    }while($VMsToStart.Count -ne 0)    \",\n  \"url\": \"https://onprem.wtf/post/scvmm-hyperv-script-to-reboots-vms-with-powershell/\"\n},{\n  \"id\": \"post-lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode\",\n  \"title\": \"Lync 2013 backend on SQL Cluster with mixed authentication mode\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"en\",\"Skype4B\"],\n  \"content\": \"So I came across this issue at a customer’s site the other day. EnvironmentThe customer runs multiple Lync 2013 Front End Servers in an enterprise pool with the backend and monitoring databases being hosted on a SQL 2008R2 Cluster (default instance) that is also used for other applications and, thus, uses mixed authentication mode.A SQL admin was present during the initial installation of the Lync Pool, and his credentials were used to perform the DB installation.ProblemSo far so good, but when the SQL admin was gone and the Lync Admins (members of RTCUniversalServerAdmins) tried to access the databases with cmdlets like Test-CsDatabase, Update-CsAdderssbook or Install-CsDatabase, they got a nasty little error like:Command execution failed: Property DefaultSchema is not available for Database '[LcsCDR]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.We verified the Logins and permissions on the SQL cluster and everything looked OK, meaning the logins and permissions for all the RTCUniversal… groups were there, just as expected. Still, the error would not go away.  The problem seems to be, that Active Directory groups cannot be used with mixed mode authentication??  Solution? The only solution we found, was to add the user account of the Lync Admin as a login on the SQL cluster and assign permissions directly to the user. Once the user was granted permissions directly (and not through an AD group membership), the error disappeared and the cmdlets worked just fine. This, by the way, explains why the initial setup worked just fine: The SQL admin, whose account was used during setup, had a login and permissions configured for his AD user. The solution is OK for a temporary workaround, but is not very feasible for an enterprise deployment. If anyone has a better solution, I’d love to hear from you :) &nbsp; Cheers,Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode/\"\n},{\n  \"id\": \"post-moving-to-azure\",\n  \"title\": \"Moving to Azure…\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"… well there is not much more to say. We have been using aruba.it as hosting provider since the beginning of ntSystems info|tech in 2009. On the upside, their simple “hosting windows” plan worked pretty OK and was very affordable, on the downside, they didn’t really care to update the servers and were not able to provide us with IPv6 or a possibility to manage the DNS zone for ntsystems.it.So after testing out various platforms and providers Daniel and I decided to move the blog to Windows Azure. It’s simple, up to date and the new “shared infrastructure” pricing tier is not to expensive, either. We are now in control of the DNS zone and use CloudFlare to improve the sites performance and easily enable IPv6.As you may already have noticed, we took advantage of Azure’s up-to-date hosting platform to migrate to the latest version of the .NET blog engine. &nbsp;We hope you enjoy the new design as much as we do and continue to find our postings helpful and interesting :)Cheers!Tom \",\n  \"url\": \"https://onprem.wtf/post/moving-to-azure/\"\n},{\n  \"id\": \"post-noop-and-nat-traversal\",\n  \"title\": \"NoOp and NAT Traversal\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"In a recent Lync project I came across an interesting issue with SIP Trunks, fortunately we had an AudioCodes SBC so there was a simple solution to the problem. Problem In some call-forwarding scenarios no audio connection could be established, a debug trace on the gateway would show no RTP packets at all.&nbsp;Signaling was working just fine, all the right IPs and Ports were listed within the SDP messages, as you see in the screenshot, though, no RTP packets can be seen.SolutionApparently the SIP provider used some kind of NAT or security device in front of their SIP equipment, and pinholes were only opened when this device received any incoming packets from our side of the communication.That’s when I learned about the “NoOpEnable” parameter which is designed for problems, just like this one. Once the “NoOpEnable” parameter is set to “True”, the SBC will send one RTP packet (with payload No-Op) to each IP involved in the session (retrieved from SDP). The following Screenshot shows another debug trace, please note the first to RTP packets:This did the trick, whatever device the remote side was using, it let RTP packets through once it received an incoming packet.For more Information on the No-Op Payload Type, check out the following IETF Draft: A No-Op Payload Format for RTPEnable NoOpThe NoOpEnable parameter can be configured using the devices AdminPage, which can be found at: https://&lt;IPAddress&gt;/AdminPage Another way, the one I prefer nowadays, is to use the SSH command-line interface, simply connect to the device using PuTTY or TeraTerm and use the following syntax:configure voip    media RTP-RTCP    &nbsp; no-operation-enable 1    &nbsp; activate&nbsp;Lessons learnedAlways use an SBC if dealing with SIP trunks :) &nbsp;Tom\",\n  \"url\": \"https://onprem.wtf/post/noop-and-nat-traversal/\"\n},{\n  \"id\": \"post-ipv6-im-unternehmen\",\n  \"title\": \"IPv6 im Unternehmen\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Network\"],\n  \"content\": \"In diesem Artikel versuche ich ein paar Argumente für IPv6 in Unternehmensnetzwerken zu erklären, die meisten Netzwerker und Admins mit denen ich zu tun habe sind verunsichert oder schlecht informiert und versuchen aus diesen und anderen Gründen IPv6 als unwichtig oder gar unnötig abzutun.Warum?Diese Frage hört man immer wieder, dabei gibt es einige Gründe die für IPv6 sprechen. Ich teile diese Frage in zwei Bereiche auf, IPv6 im Unternehmensnetzwerk und IPv6 im Internet. IPv6 im InternetViele neuen Trends in der IT haben eines gemeinsam: immer mehr Geräte wollen immer mehr Informationen an immer mehr Teilnehmer senden. Dazu werden immer mehr Verbindungen und immer mehr Adressen benötigt. Das Internet of Things, immer-online Smartphones und viele Cloud Produkte sind ohne IPv6 bereits jetzt schon nicht mehr denkbar. Facebook stellt derzeit sogar das interne Netzwerk wegen Adressmangel auf IPv6 um.Aus der Sicht eines Unternehmens ist IPv6 spätestens dann interessant, wenn man Geschäftspartner in Regionen mit wenigen öffentlichen IPv4 Adressen hat. So werden z.B. in Asien, Afrika und Osteuropa nur noch IPv6 Anschlüsse verkauft, nur selten ist es möglich einige IPv4 Adressen zu ergattern. Durch Übergangstechnologien (transition technology) bietet der Provider zwar die Möglichkeit weiterhin auf IPv4 Inhalte zuzugreifen, aber will man sich als Unternehmen wirklich darauf verlassen, dass potentielle Kunden und Partner die Website schon irgendwie erreichen werden? Dass Emails mit Aufträgen schon irgendwie ankommen werden?Um Problemen mit Übergangstechnologien (Tunneling, CGN…) aus dem Weg zu gehen, sollten bestimmte Dienste aus dem nativen IPv6 Netzwerk erreichbar sein. Die bereits angesprochenen Aufträge oder Webzugriffe sind dabei nur ein Grund, Mitarbeiter (und Führungskräfte) reisen in Regionen in denen IPv6 Internet bereits Normalität ist und auch von dort wollen diese auf das Firmennetzwerk zugreifen und Emails abrufen.Wegen des einfachen (und für den Benutzer kaum merkbaren) Fallbacks ist E-Mail ein Dienst, der relativ einfach über IPv6 erreichbar gemacht werden kann, hier profitiert man sofort von einer besseren Erreichbarkeit und kann den Umgang mit der Technologie lernen.IPv6 im internen NetzwerkBei der Entwicklung von Windows Vista und Server 2008 wurde der Netzwerkstack komplett neu geschrieben, dabei wurde großer Wert auf die Implementierung von IPv6 gelegt. So ist IPv6 ab Windows Vista/2008 nicht nur standardmäßig aktiv, es wird auch bevorzugt. Bekommt ein Client also sowohl ein IPv4 als eine IPv6 Adresse für eine DNS Abfrage zurück, versucht dieser die Verbindung über IPv6 zuerst.Da Windows XP hoffentlich nicht mehr zum Einsatz kommt, kann man davon ausgehen, dass in den meisten Unternehmen bereits jetzt IPv6 großflächig ausgerollt wurde! Leider passiert das häufig ohne detaillierte Planung und manchmal sogar ohne das Wissen der Admins bzw. Netzwerkverantwortlichen. Während das IPv4 Netzwerk genau geregelt wird, Firewalls und IPS Systeme in regelmäßigen Audits gecheckt werden, hat man einen zweiten, nicht berücksichtigen, nicht verwalteten Netzwerkstack. Aus Sicht der Netzwerksicherheit ist dies deshalb kritisch, weil Windows teilweise automatisch Tunnel aufbaut welche dem Client einen ungefilterten Zugriff auf das wachsende IPv6 Internet geben. Da IPv6 bevorzugt wird, kann man mit einem IPv6 “Router Advertisement” einfache Man-in-the-Middle Attacken ausführen und z.B. den gesamten Traffic eines Subnets über einen Proxy umleiten. Security Features wie DHCP Snooping und ARP Inspection sind weiterhin wichtig um das IPv4 Netzwerk zu schützen, in diesem Fall sind diese aber nutzlos.Spätestens zu diesem Zeitpunkt sollte man sich Gedanken über IPv6 machen! Man muss nicht gleich das gesamte Netzwerk umstellen, wichtiger ist eine genaue Planung und die Übertragung der bestehenden Sicherheitsrichtlinien auf IPv6.MigrationDas (langfristige) Ziel einer IPv6 Einführung ist die komplette Migration des Netzwerkes auf natives IPv6, trotzdem wird man IPv4 über eine lange Zeit weiter betreiben. Wie bei jeder Einführung oder Migration ist auch hier die Planung ein wichtiger, erster Bestandteil.Dabei sollten folgende Punkte berücksichtigt werden:   Adressplan: Welche IP Adressen, Subnets? Im Enterprise Umfeld Providerunabhängige Adressen    Übergangstechnologie: Nativ, Tunnel oder eine Mischung?    Bestehendes Equipment: Können benötigte Features abgebildet werden? Firmware Update nötig? Der erste Schritt bei der Einführung ist das Aktivieren des IPv6 Zugriffes am Übergangspunkt des Netzwerkes, hier muss in der Regel mit dem ISP gearbeitet werden. Sind Routing und Sicherheitsrichtlinien eingerichtet, kann IPv6 von außen nach innen ausgerollt werden. Beginnen sollte man mit einer Labor oder Testumgebung, diese kann in einer DMZ, nahe am Übergangspunkt angesiedelt werden, so kann man Erfahrungen sammeln ohne IPv6 ans letzte Ende des Netzwerkes zu transportieren.Nach ausgiebigem Test bieten sich E-Mail und DNS als erste Dienste an, die in einer produktiven Umgebung für IPv6 aktiviert werden können. Beide fallen ohne Probleme auf IPv4 zurück, sodass Benutzer im Problemfall nicht betroffen sein sollten.Ein weiterer interessanter Punkt sind Load Balancer oder Application Delivery Controller, diese veröffentlichen bereits jetzt Systeme und stellen eine Verbindung zwischen öffentlichem und privatem Netzwerk dar. In aktuellen Versionen bieten viele dieser ADCs die Möglichkeit auch über IPv6 mit dem öffentlichen Netzwerk zu kommunizieren. Verwendet der ADC eine Technologie wie NAT64 ist dies für den veröffentlichten Dienst (SharePoint, Exchange, Web…) transparent und dieser muss nicht geändert werden.Möglichkeiten und VorteileDie Einführung von IPv6 bietet, neben der Vielfalt an Adressen weitere Vorteile, so können Router z.B. schneller arbeiten da der IP Destination Header immer an derselben Stelle im Paket zu finden ist. Außerdem erledigen sich die Themen ARP und Broadcasts, für die Auflösung der L2 Adressen wird ICMPv6 verwendet, die sogenannte Neighbor Discovery findet immer über Multicast statt.Ein weiterer Punkt der in IPv4 Netzwerken häufig zu Problemen führt ist MTU und Paketfragmentierung, auch das gibt es in IPv6 Netzwerken nicht mehr. Über ICMPv6 wird die Path MTU ermittelt, so weiß der Client wie groß seine Pakete für den Server sein dürfen, bevor er diese losschickt.Die Automatische Konfiguration von Clients wird oft als Vorteil genannt, dies kann in kleineren Netzwerken sicher interessant sein, im Unternehmen wird es weiterhin DHCP und statische Adressierung für Server geben.Eine der größten Krücken und der Grund aus dem viele immer noch an IPv4 festhalten, ist NAT oder Network Address Translation. Diese Technologie hat es überhaupt erst ermöglicht die Einführung von IPv6 so lange hinaus zu zögern, gleichzeitig hat sie aber auch jede Menge Probleme für Applikationen mit sich gebracht. Mit einem global skalierbaren IPv6 Adressplan wird eine End-to-End Kommunikation von Geräten endlich möglich, das wechseln zwischen Netzwerken kann so für den Benutzer einfacher werden. In einer mobile-first Welt ein nicht unwichtiger Punkt ;)Natürlich ist auch Sicherheit ein wichtiger Aspekt und auch da bietet IPv6 einige Vorteile, so ist IPSEC z.B. standardmäßig implementiert und jeder Host kann (theoretisch) verschlüsselt kommunizieren. Allerdings sieht man auch hier, dass es sich schon um ein älteres Protokoll handelt, einige Standardheader gelten heute als unsicher und es gibt schon einen Nachfolger für Neighbor Discovery, SEND oder SEcure Neigbor Discovery.ProblemeWie bei jeder neuen Technologie gibt es auch bei der Einführung von IPv6 bestimmte Fallstricke, so kann es z.B. sein dass Clients zwar die IPv6 Verbindung bevorzugen, das Routing dafür aber einen weniger optimalen Pfad wählt und die Verbindung deshalb langsamer ist. Aktives Monitoring, saubere Dokumentation und gutes Configuration Management sind wie bei IPv4 unerlässlich. Hier gilt es bestehende Prozesse an die neue Technologie anzupassen. &#160;Einige hilfreiche Links zum Thema hab ich hier gesammelt: IPv6 Learning Resources&#160;Ich hoffe in diesem Artikel das Interesse an IPv6 geweckt zu haben :)Happy hacking!   Tom\",\n  \"url\": \"https://onprem.wtf/post/ipv6-im-unternehmen/\"\n},{\n  \"id\": \"post-work-folders-demo-mit-microsoft-azure\",\n  \"title\": \"Work Folders Demo mit Microsoft Azure\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Vor einigen Tagen wollte ich in einer Demo das neue Windows Feature “Work Folders” zeigen, da ich gerade keine passende Umgebung hatte, habe ich kurzerhand zwei virtuelle Maschinen in Microsoft Azure IasS gestartet.ÜbersichtDa es sich um eine einfache Demo handelt verwende ich nur zwei Server die ich aus dem Windows 2012R2 Image in Azure erstelle. Auf dem ersten werden die Rollen Domain Controller, ADFS, Zertifizierungsstelle und Work Folders installiert, der zweite wird als Web Application Proxy für die Veröffentlichung verwendet. Da die beiden Server miteinander kommunizieren sollen, verwende ich ein virtuelles Netzwerk in welches die beiden Server ausgerollt werden. Work FoldersWork Folders ist ein Feature von Windows 2012R2 und kann mit OneDrive/Dropbox verglichen werden. Work Folders bieten dem Benutzer eine einfache Möglichkeit auf Daten zuzugreifen und diese über mehrere Geräte zu synchronisieren. Leider gibt es derzeit nur Unterstützung für Windows 7 und 8/8.1, Clients für mobile Geräte wurden noch nicht angekündigt.Im ersten Schritt stufe ich den ersten Server zum Domain Controller hoch und installiere/konfiguriere die Zertifizierungsstelle. Eine spezielle Konfiguration dieser Rollen ist nicht notwendig, die einzige Anpassung ist das Erstellen eines neuen Zertifikattemplates welches später für die ADFS und WAP Zertifikate verwendet wird.DNSVor der Konfiguration der AD FS Rolle überlege ich mir einen Namen über welchen die Federation Services später erreichbar sein sollen, hier entscheide ich mich für adfs.uclab.eu. Damit ich interne Anfragen direkt zum AD FS Server leiten kann, erstelle ich ein DNS Zone für diesen Eintrag: Der A-Record verweist auf meinen Domain Controller und AD FS Server.AD FSNach der Installation der Active Directory Federation Services sind folgende Schritte für die Konfiguration notwendig.Ein Zertifikat mit dem Namen für die Federation Services sowie dem internen Servernamen wird angefordert. Hier verwende ich ein Kopie des WebServer Templates als Zertifikatsvorlage. Sobald das Zertifikat installiert wurde, kann die AD FS Farm installiert werden, dafür wird der Thumbprint der Zertifikates benötigt, diesen kann man sich per PowerShell einfach anzeigen lassen:Get-ChildItem Cert:\\\\LocalMachine\\\\my -DnsName adfs*Außerdem wird ein Service Account für den AD FS Dienst benötigt, dafür verwende ich ein normales AD User Account. Jetzt kann die Farm installiert werden, dabei wird das Service Account mit Get-Credential abgefragt:Install-ADFSFarm -CertificateThumbprint 9EA51F4DAA939C077602DF0B7EE7426F61E2DE0A -FederationServiceDisplayName \\\"Uclab Demo\\\" –FederationServiceName adfs.uclab.eu -OverwriteConfiguration -ServiceAccountCredential (Get-Credential) -ErrorAction Stop In der AD FS Management Konsole sehen die Federation Service Properties folgendermaßen aus:&nbsp;AD FS Relying TrustJetzt wird ein Relying Party Trust hinzugefügt, dazu klickt man in der AD FS Management Konsole mit rechts auf “AD FS” und wählt “Add Relying Party Trust”. Die Daten müssen manuell eingegeben werden, ein Name wird für den Trust gewählt. Das AD FS Profil wird verwendet, die Auswahl des Zertifikates für Token Signierung sowie die Konfiguration der URLs für WS-Federation und SAML können übersprungen werden.Als Identifikation muss “https://windows-server-work-folders/V1” verwendet werden. Multi Faktor Authentifizierung ist in meiner Demo nicht nötig und wird auch übersprungen. Der letzte Schritt kann auch übersprungen werden, anschließend wird der Trust erstellt. Jetzt müssen noch “Claim Rules” definiert werden. Folgende Attribute werden definiert: Jetzt müssen per PowerShell noch folgende Eigenschaften konfiguriert werden:Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -EnableJWT:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” –Encryptclaims:$false Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -AutoupdateEnabled:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -IssueOAuthRefreshTokensTo:’AllDevices’Der AD FS Server ist jetzt soweit bereit für die Authentifizierung der Work Folders.File and Storage Services: Work FoldersJetzt kann die Work Folders Rolle installiert werden, das geht am schnellsten per PowerShell:Install-WindowsFeature –Name FS-SyncShareServiceNach der Installation erfolgt die Konfiguration der Work Folders über den Server Manager, die Konfiguration ist (wie die Server Rolle) unter “File and Storage Services” zu finden.Ein neuer “Sync Share” wird angelegt, hier wird ein lokaler Pfad für die synchronisierten Daten angegeben. Anschließend wird ausgewählt wie die Ordner auf dem Server benannt werden sollen: Dann können die Berechtigungen vergeben werden, Standardmäßig wird die NTFS Vererbung unterbrochen und der Benutzer erhält exklusiven Zugriff auf sein Sync Share. Über Client Richtlinien kann geregelt werden ob die Work Folder Dateien lokal verschlüsselt werden müssen und ob das Gerät mit einem Passwort gesperrt wird. Nachdem der Sync Share erstellt wurde, muss die Authentifizierung auf ADFS geändert werden, dazu muss man im Server Manager auf Server klicken und den lokalen Server auswählen, dann kann mit einem Rechtsklick “Work Folders Settings” ausgewählt werden:Ich gebe die vorher erstellte AD FS Farm für Authentifizierung an.  Web Application ProxyJetzt ist es an der Zeit den Reverse Proxy auf meinem zweiten Server zu installieren, dieser ist nicht Mitglied der AD Domain, die Authentifizierung erfolgt über AD FS.Noch auf dem Domain Controller fordere ich ein Zertifikat für den Proxy an, hier verwende ich wieder den Namen der AD FS Farm sowie einen weiteren Namen über den ich die Work Folders veröffentlichen werde: Dieses Zertifikat exportiere ich am Domain Controller und importiere es auf dem Reverse Proxy, da dieser nicht Mitglied der Domain ist, muss auch das Root Zertifikat importiert werden.Jetzt kann die Rolle Web Application Proxy installiert werden, diese geht wieder am schnellsten per PowerShell:Install-WindowsFeature –Name Web-Application-ProxyAnschließend wird die Rolle konfiguriert, dafür kann die “Remote Access Management Console” verwendet werden, da sich diese aber nach pre-Beta anfühlt bevorzuge ich auch hier PowerShell. Ein guter Tipp für unbekannte oder selten verwendete cmdlets ist “Show-Command” so kann man sich seinen Befehl einfach zusammenstellen: Der Befehl für die Konfiguration des Web Application Proxy ist dann:Install-WebApplicationProxy -CertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -FederationServiceName adfs.uclab.eu -FederationServiceTrustCredential (Get-Credential)Nun kann die Work Folder Applikation erstellt werden, auch dafür verwende ich wieder “Show-Command” um den PowerShell Befehl zu erstellen.Der Befehl für das veröffentlichen der Applikation ist:Add-WebApplicationProxyApplication -BackendServerUrl https://wfdemo.intra.uclab.eu -ExternalCertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -ExternalUrl https://workfolders.uclab.eu -Name WorkFolders -ADFSRelyingPartyName WorkFolders -ExternalPreauthentication ADFS –UseOAuthAuthenticationNachdem die Applikation über den WAP veröffentlich wurde, muss diese nur noch von außen erreichbar gemacht werden. Dazu werden in der öffentlichen DNS Zone zwei CNames erstellt, einen für die AD FS Farm den anderen für den Namen der Work Folders. Diese CNames zeigen auf den Cloud Service der Reverse Proxy VM in Microsoft Azure. Der Reverse Proxy bekommt einen HTTPS Endpunkt und wird somit erreichbar gemacht: DEMONach all diesen Schritten wird es Zeit die AD FS Authentifizierung zu testen, dazu kann folgende URL verwendet werden:https://adfs.uclab.eu/adfs/ls/idpinitiatedsignon.htm  Das sieht schon mal gut aus, also können wir die Work Folders testen, diese finden sich in der Systemsteuerung: Die URL für die veröffentlichte Applikation wird angegeben, es gibt die Möglichkeit diese in der Registry oder einem AD Attribut für Auto Discovery zu hinterlegen, beide Varianten sind aber nur auf Domain Clients interessant. Für die Anmeldung werde ich auf AD FS umgeleitet: Dann kann ich einen lokalen Speicherort auswählen und werde auf die Richtlinien hingewiesen:  In der Übersicht sieht man Status der Synchronisation und den verfügbaren Speicherplatz am Server. Viel Spaß mit den Work Folders und ein schönes, langes Wochenende :)Tom\",\n  \"url\": \"https://onprem.wtf/post/work-folders-demo-mit-microsoft-azure/\"\n},{\n  \"id\": \"post-activedirectory-displayname-mit-umlauten-und-audiocodes-isdn\",\n  \"title\": \"ActiveDirectory DisplayName mit Umlauten und AudioCodes ISDN\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Vor einigen Tagen bin ich in einem Lync Projekt auf das Problem gestoßen, dass bestimmte Benutzer keine Anrufe in das PSTN (ISDN E1) tätigen konnten. Der Kunde setzt ein AudioCodes Gateway ein, die Syslogs des Gatways sind zur Fehlersuche sehr gut geeignet. Das Gateway bekommt die SIP Signalisierung von Lync sowie die Q.931 Signalisierung aus dem ISDN mit.Nach kurzer Suche hat sich herausgestellt, dass Benutzer welche keine Anrufe tätigen konnten, folgenden Fehler verursachten:&lt;132&gt;[S=831454] Error Indication: Last Command (Primitive) was not performed due to cause 100  [Trunk:0 Bchannel:1 ConnID:2] [Code:0x23127] &lt;133&gt;[S=831455] (   lgr_psbrdex)(833974    )   recv &lt;-- UnHandled event: EV_ISDN_ERROR_INDICATION (317) &lt;133&gt;[S=831456] [SID:766997237] (   lgr_psbrdex)(833975    )   pstn recv &lt;-- CALL_RELEASED Trunk:0 Conn:2 RetCause:73 NetCause:255 &lt;132&gt;[S=831457] REPORT_TYPE_ERROR_IN: ErrorCauseString = Incorrect parameter type, DiagnosticString= Condition unknown, ErrorCause = d, Diagnostic =  [Trunk:0 Bchannel:-1 ConnID:-1] [Code:0x23127] &lt;133&gt;[S=831458] [SID:766997237] (   lgr_psbrdif)(833976    )   pstn send --&gt; PlaceCall: Trunk:0 BChannel:1 ConnID:2 SrcPN=xxx SrcSN= DstPN=151xxxxxxxx DstSN= SrcNT=4 SrcNP=1 SrcPres=0 SrcScrn=0 DstNT=2 DstNP=1 ServiceCap=M RdrctNum= RdNT=0 RdNP=0 RdPres=0 RdScrn=0 RdRsn=-1 Excl=1 Display=Müller, Max IE= UUIE=0, RawData:0 CLIRReason:-1 OrigPN= OLI=-1 OffhookInd=0 &lt;133&gt;[S=831462] [SID:766997237] (   lgr_psbrdif)(833980    )   Abnormal Disconnect cause:255#?reason(255)? Trunk:0 Conn:2Die Normalisierung der Nummern ist bei allen Benutzern identisch, daran konnte es nicht liegen, nach einiger Zeit ist mir aufgefallen, dass Benutzer die keine Anrufe tätigen konnten einen Umlaut im Active Directory Anzeigenamen hatten… Dieser Namen wurde bei einem Benutzer zu Testzwecken umbenannt und schon konnte dieser auch telefonieren.LösungDas Attribut DisplayName bei allen Benutzern zu ändern kam natürlich nicht in Frage, glücklicherweise gibt es eine Einstellung auf dem AudioCodes Gateway mit der man das Verhalten steuern kann.Eine Möglichkeit ist es, den Calling Name nicht ins ISDN zu signalisieren, dazu kann man den Parameter Remove Calling Name auf dem entsprechenden Trunk auf Enable setzen.Alternativ kann über die AdminPage (oder die INI Datei) der Parameter ISO8859CharacterSet auf “0” gesetzt werden, dieser ändert die Umlaute in Latin-Only Zeichen, so wird “ä” zu “a”, “ö” zu “o” usw…Dieser Parameter kann auch über das CLI gesetzt werden, dazu verbindet man sich per SSH auf das Gateway. Die Einstellung versteckt sich hier:configure voip  gw digitalgw digital-gw-parameters   iso8859-charset no-accentedTom\",\n  \"url\": \"https://onprem.wtf/post/activedirectory-displayname-mit-umlauten-und-audiocodes-isdn/\"\n},{\n  \"id\": \"post-app-v-and-the-start-menu-folder-redirection-issue\",\n  \"title\": \"App-V and the start menu folder redirection issue\",\n  \"author\": \"dni\",\n  \"tags\": [\"AppV\",\"en\"],\n  \"content\": \"If you are using redirected start menu and App-V you might get into some issues with the management of the App-V application shortcuts. First let&rsquo;s start with some background information.Start Menu The Windows start menu is located in the following folder&hellip;. If you are using folder redirection, you can redirect the folder to a fileserver. This is a very often seen scenario in RDS and Citrix deployments.App-V and the Start Menu When you publish an application for a group of users, App-V can create the folder and shortcuts in the start menu. You can manage this in the management website from App-V.App-V and the System Account After you install the App-V Client on your desktop or terminalserver machine, you can find the following service &ldquo;Microsoft App-V Client&rdquo; in the services. The App-V Client services runs with the local system account. If you change this account to a domain user account with the needed permissions, you get errors when publishing / un-publishing applications.The issue: You are using redirected start menu and remove an user from an App-V publishing group. The App-V Client does not delete the programs folder and shortcuts in the users start menu.The reason is, that the local System account, under which the App-V Client services runs, doesn&rsquo;t have the permissions to delete the folder and shortcuts from the fileserver where your start menu is located.There are 2 work around1. Don&rsquo;t redirect the start menuIf you don&rsquo;t use start menu redirection, you don&rsquo;t run into this issue2. Redirect the start menu and use a script to delete death program shortcutsI don&rsquo;t want to disable the start menu redirection and wrote a script to find &ldquo;death&rdquo; shortcuts and delete them with the appropriate folder. You can specify the following script as user logon script:Start-Sleep -Seconds 10$ErrorActionPreference = \\\"SilentlyContinue\\\" $StarMenuPath = \\\"REDIRECTED_FOLDER\\\" + [Environment]::UserName + \\\"\\\\Start Menu\\\"$Shortcuts = gci $StarMenuPath -Recurse -Filter \\\"*.lnk\\\" ForEach ($Shortcut in $Shortcuts) { &nbsp;&nbsp;&nbsp; $WshShell = New-Object -ComObject WScript.Shell &nbsp;&nbsp;&nbsp; $LocalAppDataPath = $env:LOCALAPPDATA &nbsp;&nbsp;&nbsp; $Link = $WshShell.CreateShortcut($Shortcut.Fullname) &nbsp;&nbsp;&nbsp; $PathToApp = $Link.TargetPath &nbsp;&nbsp;&nbsp; $PathToApp = $PathToApp.replace(\\\"C:\\\\Windows\\\\system32\\\\config\\\\systemprofile\\\\AppData\\\\Local\\\",$LocalAppDataPath) &nbsp;&nbsp;&nbsp; IF((!(Test-Path $PathToApp)) -and ($PathToApp.Contains(\\\"AppV\\\"))){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-item -LiteralPath $Shortcut.Fullname -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = $Null &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = gci $Shortcut.Directory.FullName -Recurse &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If($RemainingFiles -eq $Null){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Item $Shortcut.Directory.FullName -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } }Microsoft will fix this I opened a MS call and last week I got an email that the issue for this problem will be fixed in the upcoming Spring release.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/app-v-and-the-start-menu-folder-redirection-issue/\"\n},{\n  \"id\": \"post-lync-sip-inter-domain-federation-with-cisco-unified-presence-2\",\n  \"title\": \"Lync: SIP inter-domain federation with Cisco Unified Presence - 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"In my last post I went through the required configuration steps on the Cisco Unified Presence Server, in this post I will cover the Lync Server configuration as well as some troubleshooting aspects.Lync configurationOn the Lync server side we have to create a trusted application pool along with a trusted application in order for Lync to accept SIP requests from the CUPS. This is done using the Lync Server Management Shell:New-CsTrustedApplicationPool -Identity cups.tomt.local -Registrar lync01.tomt.local -ThrottleAsServer $true -TreatAsAuthenticated $true -OutboundOnly $false -RequiresReplication $false -Site 1 New-CsTrustedApplication -TrustedApplicationPoolFqdn cups.tomt.local -Port 5062 -ApplicationId CUPSAfter that we need a static route pointing to the CUP Server so that Lync knows where to find Users within a certain address space (@tomt.local in our case).$r = New-CsStaticRoute -TLSRoute -Destination cups.tomt.local -Port 5062 -MatchUri tomt.local -UseDefaultCertificate $true      Set-CsStaticRoutingConfiguration -Route @{Add=$r}Note: As we are using TLS as transport protocol, we create a new TLSRoute, the destination parameter specifies where requests for a certain domain (MatchUri) are routed to, as always with TLS, the common name of the certificate must match the FQDN entered as destination. I am using Port 5062 because that is the default port for the “Peer Authentication Listener” on CUP. Once this configuration is in place, we need to make sure the Lync Server trusts the certificate used on the CUPS, so I made sure the CA that issued the CUPS certificate was present in the Lync Servers “Trusted Roots” store.Nice work, Lync users can now see Cisco users presence states and they can even chat with each other :) &#160; Ok, now that we have a working configuration, let’s have a look at troubleshooting.Problem PointsNote: This post is in progress, I will add more troubleshooting steps over the next couple of days.I will list some of the more problematic points here, so just in case you have a half working configuration, make sure to check for the following issues:Unsupported CertificateIf the Lync Server certificate does not include the Enhanced Key Usage of “Client Authentication”, the TLS handshake fails. As the error occurs before the two systems are speaking SIP, we will have to rely on NetMon or Wireshark to troubleshoot the TLS Handshake, sure enough it shows an “Encrypted Alert”:&#160; In the Binary data of the handshake we can see the alert value is 2B (hex) which translates to decimal 43 an means: unsupported certificate. So to fix this, re-issue the Lync Server certificate (Default, Web Services don’t matter here) and make sure the template includes the Client Authentication enhanced key usage.Lync Client signs out when searching for federated userThis is one of the oddest behaviors of the Lync 2013 clients that I have ever seen. A Lync user searches for another user which is homed on the Cisco Unified Presence server. As soon as the user completes the entry of the sip address (and the Lync Server sends a SUBSCRIBE message to the CUPS) the Lync user is signed out of the client.Same thing happens if a CUPS user sends an IM to the Lync user. The Lync client log shows that CUPS is trying to do MD5 authentication (yes md5 in 2014….) and that the Lync Clients handles this by signing out.### client error log ###Check the ACL configuration on the CUP Server, all Lync Servers and Clients must be excluded from MD5 authentication. Also check that your static Route on Lync points to the Peer Authentication listener.&#160;So long,    Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-2/\"\n},{\n  \"id\": \"post-lync-sip-inter-domain-federation-with-cisco-unified-presence-1\",\n  \"title\": \"Lync: SIP inter-domain federation with Cisco Unified Presence - 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"As a consultant I do have the pleasure to be working with new customers on a regular basis. Recently I had the interesting request to make Lync 2013 talk to a Cisco Unified Presence 9.1 server. The goal for the customer was, to provide Lync users with the presence information available in the Cisco world.Luckily the configuration was setup with multiple domains, Lync using the public (tomt.it) and Cisco Unified Presence using an internal only (tomt.local) domain. What’s possible?Before you get your hopes to high, here goes a quick list of what functionality will be available, once the federation is in place.   Presence     Contact List (users from both domains can add each other)     IM (Peer to Peer only)  That’s it. Sure you can use Jabber to make your Cisco Desk Phone call a Lync endpoint, if you have a SIP trunk configured between the two systems, but that’s got nothing to do with the presence federation.Basic TopologyThe topology I was working with, consisted of a single Lync 2013 Standard Edition Front End Server with an associated Edge server. Lync was completely configured and operational, the SIP domain I’m going to use in this example is: @tomt.itThe Cisco Unified Presence Server was a standalone box, too. It was hooked up to a clustered CUCM installation, though that should not matter in this example. The SIP domain on the CUPS was @tomt.localAll of my test VMs are located in the 10.1.1.0/24 subnet.CUPS configurationThere are a couple of requirements on the Cisco side of things. First let’s talk certificates.The recommended configuration uses TLS as transport for the federation, not only is it more secure, it’s interesting enough that it’s easier to setup, too.So we need a certificate on the Unified Presence server, to complete this step, log in to the “OS Administration” website of the CUP Server, to connect to the OS Administration website, use /cmplatform. Once signed-in, go to Security, Certificate Management and:    Import the internal certification authority’s certificate to CUPS. Select the Type: “cup-trust”     Create a new certificate signing request (CSR). Select the Type: “cup”     Issue the certificate using a template that uses Server Authentication and Client Authentication as “Enhanced Key Usage”. Note: You’ll need a CA running on Windows Server Enterprise Edition for that, the default WebServer template does not include Client Authentication.     Import the issued certificate on the CUPS. Select the Type: “cup”  After that, my Certificate Management looked like this: The next step is setting up the SIP Federation, this requires you to log-in to the “IM and Presence Administration” website, it can be found at /cupadmin.Using Presence, Inter-Domain Federation, SIP Federation, Federated Domain we add the Lync Servers SIP Domain (tomt.it) as inter-domain federation:Note: Some documentation state that you need to check the “Direct Federation” box, I found that it will work either way. If someone with CUP knowledge reads this, please do get in touch.The next step is setting up a static route from the CUP Server to Lync. This is done using the Presence, Routing, Static Routes menu. We configure a destination pattern with an associated next hop and transport protocol, do note the notation used for the destination pattern! Important: Select TLS as “Protocol Type” and User as the “Route Type”. 5061 is the default port on which a Lync Server will listen for TLS requests.While we are in the “IM and Presence Administration” there are another couple of things to configure:The Lync Servers FQDN (i.e the Common Name on the Lync Pools Certificate) must be added as TLS Peer Subject using System, Security, TLS Peer Subjects:Then, using System, Security, Peer Auth Security Context add the newly created TLS Peer Subject: Also make sure to check the “Disable Empty TLS Fragments” box and add the TLS_RSA_WITH_3DES_EDE_CBS_SHA cipher to selected ciphers.Still in System, Security we need to configure ACLs. The ACLs are not traditional ACLs which allow or block IP:Port combinations, these are used to configure whether or not a communication partner has to be authenticated using MD5. Neither Lync Servers nor Lync Clients support SIP Digest authentication using MD5, so we need to make sure that they will not be prompted for authentication:The following show my incoming and outgoing ACL entries:The last configuration step on the CUP Server is to update the public FQDN using System, Service Parameters, Federation Routing Parameters:Note: The documentation and help context for this parameter state that it should not be changed, although I found the Federation Routing FQDN will be used in the Record-Route Header (maddr field) and if Lync does not have a Trusted Application Pool for this FQDN, communication will fail.Lastly we’ll have to restart some services on the CUP Server in order for the configuration changes to become active. To do this, we need to log-in to the “IM and Presence Serviceability” website, which can be found at /ccmservice.Navigate to Tools, Control Center, Feature Services and restart SIP Proxy Service, then navigate to Tools, Control Center, Network Services and restart the XCP Router Service.Ok, so that’s it on the Cisco side of things. Click here for the Lync Server Configuration.Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-1/\"\n},{\n  \"id\": \"post-lync-conf-2014-keynote\",\n  \"title\": \"Lync Conf 2014 Keynote\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Gestern wurde die zweite Lync Conference in Las Vegas er&ouml;ffnet. In der Keynote gab es einige interessante Ank&uuml;ndigungen:Skype und MobileUnter anderem hat Derek Burney die lange erwartete Video Kommunikation mit Skype demonstriert. Weitere Infos dazu gibt&rsquo;s auf dem Skype Blog und auf dem Offical Microsoft Blog, hier schreibt der neue (alte) Pr&auml;sident der Lync &amp; Skype Engineering Gruppe, Gurdeep Singh Pall auch &uuml;ber weitere Ziele. Die Unterschiede in Bedienung und Funktion der Technologien die wir im privat- bzw. Arbeitsleben einsetzen, sollen wegfallen. Der Fokus liegt auf Work-Life-Balance und sogenannten Digital Natives.All diese &Auml;nderungen und Ziele werden unter dem neuen Schlagwort Universal Communications zusammengefasst.In einer weiteren Demonstration wurde das Lync Mobile App f&uuml;r Android Tabled vorgestellt, dieses soll in den n&auml;chsten Monaten ver&ouml;ffentlicht werden. Damit gibt es mobile Clients f&uuml;r:Windows Phone 8Windows 8.1 / Windows RTiOS: iPhone und iPadAndroid: Phone und TabletInteropInteressant f&uuml;r viele Kunden mit bestehenden Videokonferenzsystem d&uuml;rfte der &ldquo;Interop Server&rdquo; sein, dieser soll als Bestandteil der n&auml;chsten Lync Server Version ausgeliefert werden und erm&ouml;glicht u.a. die Anbindung von Tandberg VTC an Lync.VideoSeit einiger Zeit wird das Thema WebRTC mehr oder weniger hei&szlig; diskutiert, es w&auml;re sicher interessant wenn anonyme Benutzer ganz ohne Plug-in an einer Konferenz teilnehmen k&ouml;nnten. Nun konnte sich die Industrie allerdings noch nicht wirklich auf einen gemeinsamen Weg einigen, dementsprechend wenig Informationen gab es &uuml;ber die Demo eines Video Gespr&auml;ches direkt im Browser.Bei der Technologie handelt es sich um einen Javascript Wrapper f&uuml;r die Unified Communications Web API (http://ucwa.lync.com), welche Codecs verwendet wurden und ob ein Plug-in ben&ouml;tigt wird, hat Derek allerdings nicht angesprochen.Lync OnlineAuch f&uuml;r das Cloud Angebot hat Microsoft ein neues Feature angek&uuml;ndigt, so soll es Unterst&uuml;tzung f&uuml;r Meetings mit bis zu 2000 Teilnehmern geben. Die Unterst&uuml;tzung f&uuml;r Enterprise Voice in der Cloud wurde erneut angek&uuml;ndigt, auch hier fehlen weitere Details.Die Keynote wurde aufgezeichnet und kann hier angesehen werden.http://www.lyncconf.comNa dann, willkommen im Zeitalter der Universal Communications :)Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-conf-2014-keynote/\"\n},{\n  \"id\": \"post-exchange-2010-update-hybridconfiguration\",\n  \"title\": \"Exchange 2010 Update-HybridConfiguration\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Office365\",\"de\"],\n  \"content\": \"Ein schneller Tipp für Hybrid-Admins ;)Beim ausführen des Hybrid Configuration Wizard auf einem Exchange 2010 Server tritt folgender Fehler auf:Fehler beim Aktualisieren der Hybridkonfiguration: 'System.Management.Automation.Remoting.PSRemotingTransportException: Beim Ausführen von Daten vom Remoteserver ist folgender Fehler aufgetreten: [ClientAccessServer=DB3PR05CAXXX,BackEndServer=db3pr05mbXXX.eurprd05.prod.outlook.com, RequestId=ce4f8474-2bcc-4b3b-b4e4-5089f60f2372,TimeStamp=2/11/2014 10:11:28 AM] The request for the Windows Remote Shell with ShellId FC244D6B-C78E-4605-B7E1-91A480CD914B failed because the shell was not found on the server. Possible causes are: the specified ShellId is incorrect or the shell no longer exists on the server. Provide the correct ShellId or create a new shell and retry the operation. Weitere Informationen finden Sie im Hilfethema &quot;about_Remote_Troubleshooting&quot;.&lt;/p&gt;    Weitere Informationen zur Fehlerbehebung finden Sie in der Protokolldatei &quot;Update-HybridConfiguration&quot; unter C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\Logging\\\\Update-HybridConfiguration\\\\HybridConfiguration_2_11_2014_10_10_45_635277102457617512.log.&lt;/code&gt;  Wieder mal hat das Problem mit den unterschiedlichen Datumsformaten zu tun, der Server hatte deutsche Regionaleinstellungen.      Diese müssen auf English (USA) geändert werden und schon läuft der Wizard ohne Probleme durch.  Gruß,   Tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-update-hybridconfiguration/\"\n},{\n  \"id\": \"post-lync-2013-hosting-pack-v2-and-skype-federation\",\n  \"title\": \"Lync 2013 Hosting Pack v2 and Skype federation\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"With the hosting pack v2 for Lync 2013 Microsoft made the Skype federation available for hosting environments. To configure the federation, follow the official Microsoft guide.If you have configured Skype federation, you have to enable Federation on to tenant:Import-Module LyncOnline Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowFederatedUsers $true Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowPublicUsers $trueIf you try to send some IM&rsquo;s to a Skype user, you get the following error message in the OCS loggerms-diagnostics: 27000;reason=\\\"To-Uri Domain is not in the sender-tenant allow list\\\";To get the federation working, you have to add the following domains to the tenant allow list. This is the way Microsoft do this on Office 365.$d1 = New-CsEdgeDomainPattern -Domain \\\"br.live.com\\\" $d2 = New-CsEdgeDomainPattern -Domain \\\"hotmail.ch\\\" $d3 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.il\\\" $d4 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.jp\\\" $d5 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.th\\\" $d6 = New-CsEdgeDomainPattern -Domain \\\"hotmail.co.uk\\\" $d7 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com\\\" $d8 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com.ar\\\" $d9 = New-CsEdgeDomainPattern -Domain \\\"hotmail.com.tr\\\" $d10 = New-CsEdgeDomainPattern -Domain \\\"hotmail.es\\\" $d11 = New-CsEdgeDomainPattern -Domain \\\"hotmail.de\\\" $d12 = New-CsEdgeDomainPattern -Domain \\\"hotmail.fr\\\" $d13 = New-CsEdgeDomainPattern -Domain \\\"hotmail.it\\\" $d14 = New-CsEdgeDomainPattern -Domain \\\"live.at\\\" $d15 = New-CsEdgeDomainPattern -Domain \\\"live.be\\\" $d16 = New-CsEdgeDomainPattern -Domain \\\"live.ca\\\" $d17 = New-CsEdgeDomainPattern -Domain \\\"live.cl\\\" $d18 = New-CsEdgeDomainPattern -Domain \\\"live.cn\\\" $d19 = New-CsEdgeDomainPattern -Domain \\\"live.co.in\\\" $d20 = New-CsEdgeDomainPattern -Domain \\\"live.co.kr\\\" $d21 = New-CsEdgeDomainPattern -Domain \\\"live.co.uk\\\" $d22 = New-CsEdgeDomainPattern -Domain \\\"live.co.za\\\" $d23 = New-CsEdgeDomainPattern -Domain \\\"live.com\\\" $d24 = New-CsEdgeDomainPattern -Domain \\\"live.com.ar\\\" $d25 = New-CsEdgeDomainPattern -Domain \\\"live.com.au\\\" $d26 = New-CsEdgeDomainPattern -Domain \\\"live.com.co\\\" $d27 = New-CsEdgeDomainPattern -Domain \\\"live.com.mx\\\" $d28 = New-CsEdgeDomainPattern -Domain \\\"live.com.my\\\" $d29 = New-CsEdgeDomainPattern -Domain \\\"live.com.pe\\\" $d30 = New-CsEdgeDomainPattern -Domain \\\"live.com.ph\\\" $d31 = New-CsEdgeDomainPattern -Domain \\\"live.com.pk\\\" $d32 = New-CsEdgeDomainPattern -Domain \\\"live.com.pt\\\" $d33 = New-CsEdgeDomainPattern -Domain \\\"live.com.sg\\\" $d34 = New-CsEdgeDomainPattern -Domain \\\"live.com.ve\\\" $d35 = New-CsEdgeDomainPattern -Domain \\\"live.de\\\" $d36 = New-CsEdgeDomainPattern -Domain \\\"live.dk\\\" $d37 = New-CsEdgeDomainPattern -Domain \\\"live.fr\\\" $d38 = New-CsEdgeDomainPattern -Domain \\\"live.hk\\\" $d39 = New-CsEdgeDomainPattern -Domain \\\"live.ie\\\" $d40 = New-CsEdgeDomainPattern -Domain \\\"live.in\\\" $d41 = New-CsEdgeDomainPattern -Domain \\\"live.it\\\" $d42 = New-CsEdgeDomainPattern -Domain \\\"live.jp\\\" $d43 = New-CsEdgeDomainPattern -Domain \\\"live.nl\\\" $d44 = New-CsEdgeDomainPattern -Domain \\\"live.no\\\" $d45 = New-CsEdgeDomainPattern -Domain \\\"live.ph\\\" $d46 = New-CsEdgeDomainPattern -Domain \\\"live.ru\\\" $d47 = New-CsEdgeDomainPattern -Domain \\\"live.se\\\" $d48 = New-CsEdgeDomainPattern -Domain \\\"livemail.com.br\\\" $d49 = New-CsEdgeDomainPattern -Domain \\\"livemail.tw\\\" $d50 = New-CsEdgeDomainPattern -Domain \\\"messengeruser.com\\\" $d51 = New-CsEdgeDomainPattern -Domain \\\"msn.com\\\" $d52 = New-CsEdgeDomainPattern -Domain \\\"passport.com\\\" $d53 = New-CsEdgeDomainPattern -Domain \\\"sympatico.ca\\\" $d54 = New-CsEdgeDomainPattern -Domain \\\"tw.live.com\\\" $d55 = New-CsEdgeDomainPattern -Domain \\\"webtv.net\\\" $d56 = New-CsEdgeDomainPattern -Domain \\\"windowslive.com\\\" $d57 = New-CsEdgeDomainPattern -Domain \\\"windowslive.es\\\" $d58 = New-CsEdgeDomainPattern -Domain \\\"outlook.com\\\" Greetings nd\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-hosting-pack-v2-and-skype-federation/\"\n},{\n  \"id\": \"post-lync-client-certificate-warning-exchange-autodiscover\",\n  \"title\": \"Lync Client certificate warning Exchange Autodiscover\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"I’ve seen this problem at a customer the other day, even though I had a solution to fix it, I do still not fully understand why it happens. So I’m going to document it here, we’ll see if that sheds more light… :)The Problem As the title implies, the problem is similar to this one I described earlier, it does however also affect Lync 2010 clients. Once signed-in, the Lync Client will show a certificate warning, indicating that it wants to connect to some Exchange Server but the certificate was not ok, only after double (triple) checking, the certificate really was ok.BackgroundSure enough, the problem only appears in certain environments, the one I was in used different domains for the SIP address and the users primary SMTP address. So, here goes an example:UserPrincipalName: user@contoso.com     PrimarySMTPAddress: user@contoso.com     msRTCSIP-PrimaryUserAddress: user@fabrikam.comWhen this users signs into Lync, the client will perform an Exchange Autodiscover request, in order to retrieve the Exchange Web Services Endpoint. The certificate used on the Exchange Server had the following attributes:CN=exchange.contoso.com    DNS=exchange.contoso.com     DNS=exchange.fabrikam.com     DNS=….Now the warning in the Lync Client says there was a problem connecting to exchange.contoso.com, even though the certificates CN was exactly the same name, that the client tired to reach. Makes sense? Not to me…WorkaroundThe workaround I described in the earlier article still applies, just add the Exchange Servers domain to the clients TrustModelData registry entry. The registry key locations change depending on the client version:            Lync 2010                 HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Communicator\\\\TrustModelData                         Lync 2013                 HKEY_CURRENT_USER\\\\Software\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync                         Type        Reg_SZ                  Value        contoso.com contoso.eu        So if anyone has more information on this one, please do get in touch.Cheers,    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-client-certificate-warning-exchange-autodiscover/\"\n},{\n  \"id\": \"post-migration-ntsystems-mail-von-aruba-nach-office-365\",\n  \"title\": \"Migration: ntSystems Mail von Aruba nach Office 365\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Office365\"],\n  \"content\": \"Nachdem einigem &uuml;berlegen haben wir uns entschieden Mail f&uuml;r die Domain ntsystems.it nach Office 365 zu migrieren. Wir verwenden einen E1 Plan, dieser bietet f&uuml;r 6,5&euro; pro User und Monat eine Exchange Mailbox, Lync, SharePoint und SkyDrive sowie Yammer.ArubaDer aktuelle Provider (und auch Hoster dieser Seite) ist Arbua. An dieser Stelle muss ich sagen, dass wir bisher zwar keine gr&ouml;&szlig;eren Probleme mit unseren Mails hatten, das Mail System allerdings nicht mehr wirklich zeitgem&auml;&szlig; ist, so fehlen z.B. Features wie Kalender, Active Sync und die Anmeldung erfolgt standardm&auml;&szlig;ig &uuml;ber http (ja richtig, unverschl&uuml;sselt. Im Jahr 2014.). Freundlicherweise wird ein Link zu einer &ldquo;Secure Version&rdquo; angezeigt&hellip;DNSEs gibt leider kein Angebot von Aruba, bei dem WebHosting und das Verwalten der DNS Zone m&ouml;glich w&auml;ren. Nach einigem hin und her, konnte ich den Support schlie&szlig;lich dazu bewegen, die ben&ouml;tigten DNS Eintr&auml;ge f&uuml;r Office 365 zu erstellen. Damit die Domain zu Office 365 hinzugef&uuml;gt werden kann, muss zun&auml;chst ein TXT Record mit einem von Microsoft vorgegebenen Wert erstellt werden:Type: TXT Name: @ TXT Value: MS=ms93664998 TTL: 1 HourJetzt kann die Domain verifiziert werden, sobald dieser Vorgang abgeschlossen ist, k&ouml;nnen Benutzer hinzugef&uuml;gt werden. Diesen Schritt habe ich &uuml;bersprungen und stattdessen der Domain ein Verwendungszweck zugewiesen. In unserem Fall: Exchange Online.Sobald der Verwendungszweck ausgew&auml;hlt ist, werden weitere DNS Eintr&auml;ge ben&ouml;tigt, diese sind:&nbsp;Auch diese Eintr&auml;ge hat der Support freundlicherweise erstellt, wichtig ist hierbei, dass Office 365 die Eintr&auml;ge &uuml;berpr&uuml;ft, der MX Eintrag muss also die Priorit&auml;t 0 haben und auch der TTL Wert muss &uuml;bereinstimmen, damit die Domain hinzugef&uuml;gt werden kann.MailEine serverseitige Migration der Inhalte war nicht m&ouml;glich, Inhalten konnten &uuml;ber einen Client (Outlook) oder &uuml;ber das &ldquo;Connected Account&rdquo; Feature von Office 365, &uuml;bernommen werden. Mit diesem Feature kann ein Benutzer bis zu f&uuml;nf Postf&auml;cher zu seinem Office 365 Konto hinzuf&uuml;gen. Unterst&uuml;tzt werden Konten die POP oder IMAP unterst&uuml;tzen.Viele Gr&uuml;&szlig;e aus der Cloud :) Tom\",\n  \"url\": \"https://onprem.wtf/post/migration-ntsystems-mail-von-aruba-nach-office-365/\"\n},{\n  \"id\": \"post-connect-to-office-365-with-powershell\",\n  \"title\": \"Connect to Office 365 with Powershell\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Office365\"],\n  \"content\": \"In this Post I explain how to connect to Office 365 with Powershell and manage Exchange and Lync.1. Install Microsoft Online Services Sign-In Assistant for IT Professionals BETA http://www.microsoft.com/en-us/download/details.aspx?id=392672. Install the Office 365 cmdlets http://go.microsoft.com/fwlink/p/?linkid=2362973. Set Execution Policy to Remote Signed Set-ExecutionPolicy RemoteSignedExchange Online4. Connect to Exchange OnlineImport-Module MSOnline $ExchangeOnlineCred = Get-Credential $ExchangeOnlineSession = New-PSSession &ndash;ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $ExchangeOnlineCred -Authentication Basic -AllowRedirection Import-PSSession $ExchangeOnlineSession -AllowClobber Connect-MsolService &ndash;Credential $ExchangeOnlineCredNow you are connected to Exchange Online:Lync Online4. Install Windows PowerShell Module for Lync Online http://www.microsoft.com/en-us/download/details.aspx?id=393665. Connect to Lync OnlineImport-module lynconlineconnector $LyncOnlineCred = Get-Credential $LyncOnlineSession = New-CsOnlineSession -Credential $LyncOnlineCred Import-PSSession $LyncOnlineSessionGreetings dn\",\n  \"url\": \"https://onprem.wtf/post/connect-to-office-365-with-powershell/\"\n},{\n  \"id\": \"post-import-certificate-to-rd\",\n  \"title\": \"Import Certificate to RD\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2012\",\"en\",\"Server-2012-R2\",\"RDS\"],\n  \"content\": \"With Server 2012 the MMC “Remote Desktop Session Host Configuration” doesn’t exist anymore. If you want to import a specific certificate to the RD Session Host you can do the following:1. Import the certificate to the machines personal store2. Then use the following commands to import the certificate to the Session Host:$pass = ConvertTo-SecureString “CERTIFICATE-PASSWORD” -AsPlainText –Force    $thumbprint = (Import-PfxCertificate -Password $pass -CertStoreLocation cert:\\\\localMachine\\\\my -FilePath '\\\\\\\\LocationToCertificate\\\\certificate.pfx').thumbprint    $path = (Get-WmiObject -class &quot;Win32_TSGeneralSetting&quot; -Namespace root\\\\cimv2\\\\terminalservices -Filter &quot;TerminalName='RDP-tcp'&quot;).__path    Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash=&quot;$Thumbprint&quot;}Now the certificate is imported.Greetings   dn\",\n  \"url\": \"https://onprem.wtf/post/import-certificate-to-rd/\"\n},{\n  \"id\": \"post-pal-performance-analyse\",\n  \"title\": \"PAL: Performance Analyse\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Neulich bin ich über ein interessantes Codeplex Projekt gestolpert, Performance Analysis of Logs (PAL) ToolHier handelt es sich um ein Tool, welches Perfmon Dateien (.blg) auswerten und einen schönen Report generieren kann. Interessant ist die Möglichkeit “Threshold files” zu auszuwählen, diese werden Teilweise mitgeliefert oder können selbst hinzugefügt werden. In diesen XML Dateien sind Performance Counter und entsprechende Schwellwerte hinterlegt.InstallationDie Installation erfolgt typischerweise auf einer Workstation, folgende Komponenten werden benötigt:   .NET Framework 3.5    Microsoft Chart Controls for Microsoft .NET Framework 3.5 (Download) Das PAL Tool selbst ist ein Instsaller der aus Codeplex heruntergeladen werden kann. Die Installation erfolgt nach C:\\\\Program Files\\\\PAL\\\\PAL\\\\ wo auch die mitgelieferten XML Dateien abgelegt werden. Weitere Threshold Files findet man z.B. in der TechNet Gallery, hier der Linkfür den Lync Server 2013.AnalyseInteressant an den XML Dateien ist, dass man daraus Templates für Perfmon Data Collector Sets erstellen. Man muss also nichtmehr mühsam Counter aus der Produtkdoku suchen und diese dann einzeln hinzufügen, es reicht PAL (PALWizard.exe) zu starten und im Reiter “Threshold File” auf “Export Perfmon template” zu klicken.&#160;Aus diesem Template erstellt man dann ein Data Collector Set auf den Systemen die analysiert werden sollen, die Standardwerte für den Dateipfad und die Laufzeit des Sets sollte noch angepasst werden. Ist die Datensammlung abgeschlossen, wird die .blg Datei wieder auf die Workstation mit dem PAL Tool kopiert.Die .blg Datei wird im PAL Tool ausgewählt: Anschließend müssen im Reiter “Questions” noch drei Fragen zu den analysierten Servern beantwortet werden: Unter “Output Options” wird das Verzeichnis angegeben in welchem die Reports erstellt werden sollen.Viel Spaß,   tom\",\n  \"url\": \"https://onprem.wtf/post/pal-performance-analyse/\"\n},{\n  \"id\": \"post-windows-azure-point-to-site-vpn\",\n  \"title\": \"Windows Azure – Point to Site VPN\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Cloud\"],\n  \"content\": \"An interesting feature in Windows Azure is the possibility to expand the local network to the Cloud. This feature comes in two options, a site-to-site tunnel can be created, as well as a simple client VPN, or point-to-site connection. A site-to-site tunnel is configured on a firewall device or router within the corporate network, essentially connecting the Cloud like any other remote site. This post is about clients connecting to the Cloud, so called point-to-site VPN connections. This feature might be of less interest to corporate customers, however, I find it quite cool for lab and dev/test scenarios.Azure Virtual NetworkTo get started we need to configure a virtual network in Windows Azure, chances are that if you have been using Azure virtual machines, you might already have a virtual network configuration. It is required to have VMs communicate with one another.So, in the management portal, create a new virtual network using the “Custom Create” option. After specifying a Name and Affinity Group, configure the DNS Server, this will be the DNS Server for the virtual machines in this virtual network. A quick hint: Azure virtual machines cannot be configured with static IP addresses, but the address assignment always starts with .4, so the first virtual machine that is started will get the .4 address. I do make sure to start my DNS server before starting anything else. Since we are configuring point-to-site VPN, we need to check the corresponding check box. In the next screen we are configuring an IP address range that will be used by the virtual network. This is not yet the subnet for the VM, it is just the address range within which the individual subnets will be created. And in the last screen we are actually configuring the subnets. We need one ore more subnets (within the address range configured before) for the virtual machines, as well as a “Gateway subnet”. This subnet will be used for the gateway. Once the virtual network has been created, we need to add a subnet for the VPN clients that will connect to the virtual network. This is done using the “Configure” tab in the virtual network’s properties. The last step is to create the gateway, using the “Create Gateway” button in the “Dashboard” tab of the virtual network. This process creates the required configuration within Windows Azure, an IP address and a hostname are assigned for clients to connect. Voila, that’s it from a network configuration point of view. AuthenticationNow when Clients are connecting to a VPN some form of authentication is required, in our case of point-to-site VPN, the Azure virtual network uses an SSTP connection with certificates for authentication.The first step is to upload the Certification Authority’s certificate (public key) to the virtual network. Certificates issued by this CA can then be used to authenticate and connect to the VPN. I am using my lab CA and had to install the CA certificate in my clients “Local Machine” trusted root store. After uploading the CA certificate, I requested a new certificate for my user account (using the “User” template). In order to connect to the virtual network in the Azure Cloud one last step is required, we need to download the Client VPN package which is available in the “Dashboard” tab in the virtual network configuration. The installation is simple and once installed, a new VPN connection will be available. And that’s it. Now I am able to connect my notebook to the Azure virtual network, making it possible to connect “directly” to the VMs running in the Cloud :)A quick ipconfig shows that my client got an IP address from the address range I configured earlier, the DNS servers have been assigned, too.&#160;&#160;Ok, enough for tonight, time to get my head out of the clouds :-)    Tom\",\n  \"url\": \"https://onprem.wtf/post/windows-azure-point-to-site-vpn/\"\n},{\n  \"id\": \"post-cng-certificates-and-lync-tmg\",\n  \"title\": \"CNG Certificates and Lync/ TMG\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"The other day I had a problem assigning certificates to a Lync 2013 Edge Server, today I had the same thing with TMG 2010. Here’s a quick summary, and the solution ;)ProblemI tried to assign an existing certificate to a Lync Edge Server. It did not work using the Deployment Wizard, I tried the PowerShell command and it didn’t work, either.Every time I tried to “Set-CsCertificate” I would get the following error:„Set-CsCertificate: Command execution failed: The buffer supplied to a Function was too small.”Kind of the same thing happened with TMG Server, I tried to assign a certificate to a Web Listener and it would not show up in the Wizard. When I unchecked the “Show only valid Certificates” checkbox, the certificate in question would show with an Error saying:“Incorrect Key Type”SolutionThe solution is to export the certificate, including private key, to a .pfx file. Copy the .pfx file to some workstation with Firefox installed and import the certificate in Firefox. Now use Firefox to “backup” the certificate, this will create a .p12 file, again containing the private key. Copy the .p12 file back to the Server delete the existing certificate and then import the .p12 file using MMC Certificates.Warning: Before deleting the certificate from the Server, make sure you have a working backup (like the .pfx file) or you will have to get a new one.Try to assign the Certificate to a Lync Service or a TMG Web Listener and enjoy.I realize that this sounds pretty silly at first, if you want more detail, keep on reading :)BackgroundIf you are still reading, there is a little more information for you. The certificates in question were using something called “Cryptography Next Generation”, which seems to be some new set of APIs that was introduced in Windows Vista and Server 2008. When creating a custom certificate request, one can select the “Template” to use, this is not the certificate template, but the “Crypto Provider” if you will.The certificates that I mentioned, have all been requested using the CNG Template. Importing/ Exporting them in Firefox seems to fix this, maybe because Firefox prefers CAPI over CNG? If you have any information on this topic, please leave a comment.More info on Crypto Next Generation is available on TechNet: http://technet.microsoft.com/en-us/library/cc730763(WS.10).aspxCheers,   tom\",\n  \"url\": \"https://onprem.wtf/post/cng-certificates-and-lync-tmg/\"\n},{\n  \"id\": \"post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-2\",\n  \"title\": \"How to build an UAG 2010 Array for Exchange publishing–Part 2\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"uag\",\"Skype4B\"],\n  \"content\": \"Finally I finished Part 2 of the UAG 2010 publishing post. I spent days with the UAG configuration to publish Exchange 2013 in the right way but with no success. There are some problem with Lync and OWA that I cannot fix. I decided to disable URL filters. Now my Exchange publishing works and in this final post I explain how my configurations looks like.First step is to create a new Trunk for Exchange publishingThen you have to create the Applications for Exchange. First create the Outlook Web Access Application:Select the Exchange CAS Servers or the CAS Server VIP.Configure the authentication and authorize all users.Next step is to rerun the Wizard to publish Outlook Anywhere and Exchange Active Sync.Configure Authentication, Kerberos for OWA and Basic for AutodiscoverDon&rsquo;t forget to configure SPN&rsquo;s and delegation in ActiveDirectory for Kerberos to work. You can export the settings needed into an LDIF File with the &ldquo;Export KCD settings&rdquo; wizard in UAG and import it in AD. Or you can set the SPN&rsquo;s manually:You can check the SPN&rsquo;s and export the file:When you created the applications you have an application list like this:Configure Portal Homepage Change the Portal Home page and uncheck display Home Page within portal frameDisable component installation To prevent UAG installing the client, disable component installation.Redirect HTTP to HTTPSTo redirect HTTP connections to HTTPS create the redirection Trunk in the &ldquo;HTTPS Connections&rdquo; section and select the Exchange Trunk.&nbsp;The basic configuration is done and Exchange is now published via UAG. But there are some issues:Lync: Lync Clients cannot get autodiscover settings In my environment Lync clients couldn&rsquo;t get the autodiscover configuration from Exchange. After checking the UAG logs I noticed that UAG has a problem when Lync announces his Client Agent.Solution: Disable scripting on the trunkOWA: 500 error message when you open another mailbox from OWA In my environment it was not possible to open another users mailbox without getting the following 500 error message:Solution: Disable &ldquo;verify URLs&rdquo; on the OWA ApplicationConclusionI&rsquo;m sure with deeper troubleshooting there must be exist a better way to fix this errors but in my opinion UAG is not the right product for publishing Exchange. Better you use a load balancer or II ARR. I my next publishing post I explain how to publish Exchange 2013 with Citrix Netscaler.\",\n  \"url\": \"https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-2/\"\n},{\n  \"id\": \"post-connect-sharepoint-2013-with-exchange-2013-to-sync-tasks\",\n  \"title\": \"Connect Sharepoint 2013 with Exchange 2013 to sync tasks\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\",\"Sharepoint\"],\n  \"content\": \"To sync Tasks with Exchange and Sharepoint 2013 some base functionality has to be prepared:- Running user profile synchronization - Work management service deployed - SSL for the Web Application with valid certificateUser profile synchronization There are some nice how to&rsquo;s how to get this service running. In simple words you need an user account that has &ldquo;Replicating Directory Changes&rdquo; rights in ADThen you have to start the User Profile Service Application in the Sharepoint Central Administration.If everything works both ForeFront Services are running and you can configure the user profile service.&nbsp;Work management The Work management Service application doesn&rsquo;t need extra configuration. It only has to be deployed and working. On Technet is a short description how to create this service application.http://technet.microsoft.com/en-us/library/fp161254.aspxSSLThe Web Application needs to be SSL enabled. This can be done easily in IIS by enabling the HTTPS binding:To verify that this works you can check if the Exchange server can access the AuthMetadataUrl with the browser. AuthMetadataUrl: https://intranet.domain.local/_layouts/15/metadata/json/1If you can access the 1.json file without authentication this step worked.Tip: If you have to enter credentials, check the authentication methods in IIS for the Web Application. Anonymous needs to be activated:&nbsp;Now you can connect Sharepoint with Exchange:On Sharepoint 2013 1) Download EWSManagedAPI.msi from http://www.microsoft.com/en-us/download/details.aspx?id=35371 2) Install the EWS API with the following switches: msiexec /i EwsManagedApi.msi addlocal=\\\"ExchangeWebServicesApi_Feature,ExchangeWebServicesApi_Gac\\\" 3) Reset IISOn Exchange 2013 1) Switch to the following directory: C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\Scripts 2) Configre Enterprise Partner Application .\\\\Configure-EnterprisePartnerApplication.ps1 -ApplicationType Sharepoint -AuthMetadataUrl https://intranet.domain.local/_layouts/15/metadata/json/1You should get the following outputNow you are able to sync Tasks with Sharepoint and Exchange 2013:Tip: If this does not work and - you are not in the same Domain with Exchange (maybe in a subdomain) - you have an error with Exchange Autodiscover in the Sharepoint logs - you have authentication errors with Exchange in the Sharepoint logs  check that your subdomain (for example subdomain.domain.local) is added to the accepted domains in Exchange.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/connect-sharepoint-2013-with-exchange-2013-to-sync-tasks/\"\n},{\n  \"id\": \"post-activesync-devices-ask-for-authentication\",\n  \"title\": \"ActiveSync devices ask for authentication\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"One of the first steps in an Exchange 2010 to 2013 migration is to make Exchange 2013 internet facing to handle the requests from external and internal clients.After my first attempt to switch from Exchange 2010 CAS and TMG to UAG and Exchange 2013 CAS servers on the frontend I noticed that some Android and iPad ActiveSync users got authentication requests.First thing I checked was the eventlog on the CAS machines and if the inheritance was enabled on the user accounts. Both were ok so I began to check the IIS logs first on the 2013 and then on the 2010 machine because the 2013 CAS proxies the requests to the 2010 CAS.On the 2013 CAS I could see that this users tried to logon but the session ended with a HTTP 401 (Unauthorized) Error:On the CAS 2010 I checked the logs and filtered users and time when they tried to logon. The result was that in the IIS logs the domain of the users that did not sync was different from the users that worked.User1 &ndash;&gt; domain\\\\User1 User2 &ndash;&gt; domain.local\\\\User2 User3 &ndash;&gt; domain.local\\\\User3I checked the devices of User2 and User3 and find out that the domain was missing in the account settings. Previously when Exchange 2010 with TMG were internet facing, TMG made this stuff working.To get this fixed with Exchange and UAG you can set the default domain in IIS on the Exchange 2013 CAS servers if the device does not send the domain.After an IIS reset the devices can successfully connected.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/activesync-devices-ask-for-authentication/\"\n},{\n  \"id\": \"post-lync-2013-survivable-branch-server-installation\",\n  \"title\": \"Lync 2013 Survivable Branch Server – Installation\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"de\",\"Skype4B\"],\n  \"content\": \"Nach dem Planen und Veröffentlichen der Topologie kann der Server installiert werden. Wie bereits erklärt, werden nicht alle Lync Rollen installiert, weshalb die Liste der Systemvoraussetzungen deutlich kürzer ausfällt:Windows 2012 SystemvoraussetzungenAdd-WindowsFeature Windows-Identity-FoundationSobald die Windows Identity Foundation installiert ist, kann das Lync Setup wie gewöhnlich ausgeführt werden. Dafür wird der Deployment Wizard verwendet und im ersten Schritt der lokale “Configuration Store” installiert.Anschließend werden im Schritt zwei und drei die Lync Komponenten installiert und ein Zertifikat zugewiesen. Das Zertifikat fällt auf dem Survivable Branch Server deutlich einfacher aus, was wieder auf die reduzierten Serverrollen zurückzuführen ist. Webservices und Lyncdiscover werden nicht installiert, je nach DNS Konfiguration muss man allerdings den Eintrag für SIP berücksichtigen. In meinem Lab sieht das sieht das Zertifikat so aus:CN = ly15-sba.tomt.local      DNS Name = ly15-tomt.local       DNS Name = sip.tomt.itIst das Zertifikat zugewiesen, können die Dienste gestartet werden, der Erfolg wird am Besten per PowerShell überprüft:Get-CsWindowsServiceInfrastrukturDie Verfügbarkeit von Infrastrukturdienste wie DNS und DHCP muss in Außenstellen natürlich auch berücksichtigt werden.Gibt es in der Außenstelle Telefone mit Lync Phone Edition sollte der DHCP Dienst lokal verfügbar sein, sonst verlieren diese Telefone bei Ablauf der Leases die Verbindung.Die DHCP Optionen werden dabei folgendermaßen konfiguriert:Option 42 (NTP): lokaler NTP Server, z.B. Router      Option 43 (Certificate Provisioning): Front End Server, ly15.tomt.local       Option 120 (SIP Registrar): SBS, ly15-sba.tomt.local&lt;/p&gt;    DHCPUtil -SipServer ly15-sba.tomt.local -WebServer ly15.tomt.local&lt;/code&gt;  Bei DNS kann man nicht immer eine separate Konfiguration darstellen, gibt es einen Domain Controller in der Außenstelle, stellt dieser für gewöhnlich die Active Directory integrierte Zone zur Verfügung. Das ist für Lync allerdings kein Problem, für das WebTicket benötigt der Client ohnehin eine Verbindung zum Front End Server. Wird der Benutzer dann auf den SBS verschoben, teilt der Lync Front End Server das im Anmeldeprozess mit.  Benutzer  Wenn der Survivable Branch Server einsatzbereit ist, können Benutzer auf diesen verschoben werden um von der höheren Verfügbarkeit zu profitieren. Dies kann über das Lync Server Control Panel oder die Lync Management Shell gemacht werden:  Move-CsUser –Identity user10@tomt.it –Target ly15-sba.tomt.local  Dieser Befehl verschiebt den Benutzer user10 auf den SBS. Der Anmeldeprozess am Client sieht jetzt folgendermaßen aus:  Das Erste REGISTER geht an den Lync Front End Server (10.1.1.27), dieser wurde über DNS Autokonfiguration ausgewählt, der Dienst Eintrag für _sipinternaltls.tomt.it zeigt nach wie vor auf diesen Server.     Der Front End Server antwortet mit einem “301 Redirect” und teilt dem Client seinen Home Server für die Anmeldung mit. Der Client sendet dann erneut ein REGISTER an diesen neuen “Home Server” (10.1.1.21).     Nach der erfolgreichen Anmeldung sehen wir in den Konfigurationsinformationen, dass der Client mit dem SBS Pool verbunden ist (Connected Lync Server). Außerdem fällt hier auf, dass der Client nach wie vor die Web Services des zentralen Lync Pools (Front End Server) nutzt.    Fällt die WAN Verbindung (oder der Lync Pool) aus, wechselt der Client in einen Modus mit eingeschränkter Funktionalität und zeigt eine Warnung an. Diese erinnert den Benutzer, dass er zwar seine Buddy Liste verliert, allerdings nach wie vor telefonieren kann. In diesem Fall ist es vorteilhaft wenn der Client ein lokales Adressbuch hat, die Client Policy für Benutzer auf dem SBS sollte entsprechend konfiguriert werden.    Natürlich kann auch der SBS ausfallen, in diesem Fall meldet sich der Lync Client wieder am Front End Server an und kann weiterhin die kompletten Features nutzen.  &#160;  Grüße,    Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-survivable-branch-server-installation/\"\n},{\n  \"id\": \"post-hyper-v-general-access-denied-error\",\n  \"title\": \"Hyper-V General access denied error\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Hyper-V\"],\n  \"content\": \"Like many others in the ITPro world, I am using many VMs to demo, learn, troubleshoot all different kinds of products and customer scenarios. I also mess with the disk files a lot. Every now and then I get the following error when trying to start a VM:Hyper-V Manager &lt;/p&gt;    An error occurred while attempting to start the selected virtual machine(s).     'dc02' failed to start. (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02' Microsoft Emulated IDE Controller (Instance ID 83F8638B-8DCA-4152-9EDA-2CA8B33039B4): Failed to Power on with Error 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02': IDE/ATAPI Account does not have sufficient privilege to open attachment 'C:\\\\Users\\\\Public\\\\Documents\\\\Hyper-V\\\\Virtual hard disks\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02':&#160; Account does not have sufficient privilege to open attachment 'C:\\\\Users\\\\Public\\\\Documents\\\\Hyper-V\\\\Virtual hard disks\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708) &lt;/code&gt;  Problem  The problem is rather simple, and since Hyper-V has been around for some time now, it should also be well-known to most of us: The VM does not have the necessary (read, write) permissions to use the assigned .vhd or .vhdx disk. So how do you restore the permissions?  Solution  As always, there are many solutions, one could use Hyper-V manager, remove the disk from the affected VM and then add it again. You could even use icacls to somehow get the ACLs right.  Or, simply use my Restore-VMPermission script :)  It’s a PowerShell script that can be used to easily restore permissions for a specific VM (or all VMs) on your Lab Host, it requires the Hyper-V PowerShell Module to get the VMId and then builds the required ACE and adds it to the virtual disk file’s ACL.  As always, please don’t use this in production without thoroughly testing. This is meant for Lab environments.  Verify  Just try to start your VM again, or have a look at the .vhd or .vhdx files security settings and find a similar looking entry:     &#160;  so long,    tom \",\n  \"url\": \"https://onprem.wtf/post/hyper-v-general-access-denied-error/\"\n},{\n  \"id\": \"post-lync-2013-survivable-branch-server-planung\",\n  \"title\": \"Lync 2013 Survivable Branch Server – Planung\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Immer häufiger ersetzen Unternehmen klassische Telefonanlagen (PBX) mit Unified Communications Lösungen wie Microsoft Lync. Da Telefonie immer schon gute Verfügbarkeit hatte, müssen in der Lync Umgebung Konzepte her um diesen hohen Anforderungen gerecht zu werden.Für das Rechenzentrum In Außenstandorten sieht das meist anders aus, durch die Zentralisierung der IT-Dienste gibt es wenige (oder gar keine) Server und kein Personal das sich um die Wartung einer komplexen Umgebung kümmern kann. Die Clients in der Außenstelle hängen also von einer zuverlässigen Verbindung zum Rechenzentrum ab. Fällt diese Verbindung aus, ist der Lync Pool nicht mehr erreichbar und somit auch Telefonie nicht mehr verfügbar.Survivable Branch…?Genau in diesen Szenarien kommen Survivable Branch Server oder Applicances ins Spiel. Diese werden eingesetzt um Telefonie in Außenstellen unabhängiger von der Verbindung in das Rechenzentrum zu machen.Folgendes Schaubild habe ich im TechNet gefunden, Benutzer die sich in der “Branch Site” aufhalten sollen weiterhin telefonieren können, wenn die WAN Verbindung (und dadurch der Lync Pool) nicht verfügbar ist. Features wie Konferenzen, Response Groups oder die Buddy List sind bei einem Ausfall der WAN Verbindung trotz SBS nicht verfügbar, es geht hier nur um Telefonie.Quelle: http://technet.microsoft.com/en-us/library/gg398095.aspxDie Grundvoraussetzung ist natürlich eine Verbindung in das Telefonnetz, die von der WAN Verbindung unabhängig ist. Üblicherweise hat man dafür einen Amtsanschluss und ein passendes Media Gateway in der Außenstelle. Appliance oder Server?Eine Survivable Branch Appliance ist, wie der Name schon sagt, eine Hardware Appliance. Diese kommt entweder direkt mit dem PSTN Gateway oder wird nachträglich eingebaut. Auf der Appliance läuft ein Windows Server, bei der Einrichtung werden die benötigten Lync Rollen installiert.Ein Survivable Branch Server ist ein “normaler Server” (auch virtuell) auf dem die benötigten Lync Rollen installiert werden.Bei beiden varianten, SBA und SBS, wird kein vollständiger Lync Front End Server, sondern “nur” die Rollen Mediation Server und Registrar, installiert. So erklärt sich auch, warum ein SBS zwar die Telefonie aufrechterhalten, aber z.B. keine Konferenzen hosten kann.Eine SBA kann für Außenstellen mit bis zu 1000 Benutzern verwendet werden, während ein SBS bis zu 5000 Benutzer bedienen kann.Beide Varianten benötigen keine Lync Server Lizenz, Windows muss natürlich entsprechend lizenziert werden.VorbereitungWie immer bei Lync, muss man die Konfiguration erst mal im Topology Builder planen, bevor es an die Installation geht.Wir erstellen also eine neue “Branch Site” in der Topologie, dabei vergeben wir einen Namen und weitere Eigenschaften wie City, State und Country. Die Branch Site wird immer einer Central Site zugewiesen:Die Checkbox für “Open the new SBA wizard…” ist Standardmäßig aktiv. Für die Lync Topologie gibt es den Unterschied zwischen SBS und SBA nicht, wir legen also im nächsten Schritt den FQDN für unseren SBS fest: Clients in der Branch Site benötigen Zugriff auf einen Front End und Edge Pool für die meisten Funktionen, diese Pools werden im Wizard angegeben: Im letzten Schritt wird das Gateway angegeben, welches in der Außenstelle für Telefonie verwendet wird:&#160;Die Topologie muss veröffentlich werden, bevor der Survivable Branch Server installiert werden kann, auch dieser holt sich die Informationen über die zu installierenden Rollen aus dem Central Management Store. Achtung: Das Computerkonto für den SBS sollte vor dem veröffentlichen der Topologie existieren, da einige Active Directory Berechtigungen gesetzt werden. Gibt es das Konto noch nicht, protokolliert der Topology Builder eine Fehlermeldung. Sobald der SBS Mitglied der Domain ist, muss die Topologie erneut veröffentlicht werden.Im nächsten Beitrag installieren wir die Lync Rollen auf dem Survivable Branch Server und schauen uns die Funktionalität der Clients an.   Schönes Wochenende!    Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-survivable-branch-server-planung/\"\n},{\n  \"id\": \"post-lync-private-line\",\n  \"title\": \"Lync Private Line\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"I was at a customer’s site the other day when we he received the following request.ProblemUser A (the Boss) forwards his phone to User B (the Assistant). As someone calls the Boss, obviously the Assistants phone rings and she picks it up, it turns out the caller is important and needs to talk to the Boss. The Assistant transfers the call to the Boss… and that’s it. Since the Bosses phone is forwarded, nobody will be able to reach him.Interestingly, in the ancient PBX world there was a “feature” (I’d call it bug) where the Assistant could “break through” the forwarding setting and therefore transfer calls to the Boss.After bouncing some ideas we came up with a pretty simple solution. As the title implies, it makes use of Private Line feature in Lync 2013.SolutionAfter some testing we configured a Private Line on the Bosses account and again, set up call forwarding to the Assistant in his Lync client.Now, if someone calls the Boss, the Assistants phone would ring. If the caller wants to talk to the Boss, the Assistant can now simply forward the call to the Bosses private line. Call forwarding settings are not applied to this line, so his client would ring and he would be able to take the call. Alternative solutionsSure enough, there is no “one” solution, other possibilities would be the use of the Delegate or even Team Call features. In this particular case, though, we decided to use the Private Line.Update: Another solution for this particular problem would be to have the Boss configure the Assistant as his delegate, and the configure “Forward to Delegate” in her Lync Client. This enables User B to put calls through to User A, even though User A’s client is configured to forward calls. You can use my wrapper script for SEFAUtil to configure this, too..\\\\Invoke-SefaUtil.ps1 –Server ly15.tomt.local –UserName boss@tomt.it –AddDelegate assistant@tomt.it –FwdToDelegates Thanks to @jpborth for pointing this out!ConfigurationThe Private Line feature requires Lync Server 2013, and is not exposed in the Lync Control Panel. The Set-CsUser cmdlet is used to configure a private line for a user:Set-CsUser –Identity boss@uclab.eu –PrivateLine “tel:+39123123”Note: TechNet says, private line is new in Lync 2013, next time I’m in a pure 2010 environment, I’ll check if this feature can be configured on Lync 2010, too.&#160;so long,    tom \",\n  \"url\": \"https://onprem.wtf/post/lync-private-line/\"\n},{\n  \"id\": \"post-updated-invoke-sefautil\",\n  \"title\": \"date_modified: Invoke-SEFAUtil\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"PowerShell\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Some weeks ago, I’ve written about my PowerShell wrapper function for SEFAUtil.exe, the original post can be found here: /post/Invoke-SEFAUtil-a-PowerShell-wrapper-function.aspxGUIFirst of all, in case you haven’t seen it yet, MVP Johan Veldhuis created an AWESOME GUI wrapper. Check it out: http://johanveldhuis.nl/en/sefautil-gui/If you still want to run it via PowerShell, keep on reading ;)Updated ScriptAfter playing around with my script I figured it would be cool if it would return more “PowerShell like” objects instead of the plain text returned by sefautil.exe. I also wanted it to take pipeline input and updated the related links to point to a help page instead of the blog article. Turning a bunch of strings into a PowerShell objectLooking at the text output of the tool, we can see it has a format of “description : value”. Sample output:User Aor: sip:ttorggler@uclab.eu      Display Name: Thomas Torggler       UM Enabled: True       Simulring enabled: False       User Ring time: 00:00:30       Call Forward No Answer to: voicemailAs they have the same structure, this does immediately bring PowerShell dictionaries (hashtables) to mind. I simply used the –split method to split the strings at “: “ (colon space) and saved the result to a new array.$SEFAResultSplit = $SEFAResult -split ': 'This worked as expected, so I went ahead and created my custom object like this:$data =&#160; @{$SEFAResultSplit[0] = $SEFAResultSplit[1];      $SEFAResultSplit[2] = $SEFAResultSplit[3];       }After testing it in the lab, I realized, even though this worked, it was less then ideal. Sefautil returns a dynamic amount of strings depending on which features are configured for the given user. So while it was reasonably sure that ”$SEFAResultSplit[0]” would always be “User Aor”, I would have no way of knowing the value of the next strings. And, more importantly, I would not know how many strings to expect, a more dynamic approach was needed.This is what I came up with after some serious head scratching:for ($i = 0; $i -lt $SEFAResultSplit.Count; $i++) {      &#160;&#160;&#160; if ([bool]!($i%2)) {       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $j = $i + 1       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $outData += @{$SEFAResultSplit[$i] = $SEFAResultSplit[$j]}       &#160;&#160;&#160; }       }And here is what it does: The array that contains the split strings would always contain the “description” at an even number while the actual values would be found at odd numbers. So, the script loops through the array, and for each even number it creates a new “Key : Value” pair that is saved to a hash table. Whatever object in the array is at the even index number would be used as key, and that even number +1 would be used as value. Sweet.Why?Well, first of all, because it’s cool ;)Then, think about this:Get-CsUser –OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\Invoke-SEFAUtil.ps1 –Server ly15.tomt.local | Where-Object {‘Simulring enabled’ –eq $true}First the Get-CsUser cmdlet is used to get all users within a specified organizational unit, the user objects are then piped into my wrapper script and the output can be filtered just like any other PowerShell output. Of course it could also be converted to html or exported to csv, the point is returning objects instead of text.Sure enough, we can now also take advantage of pipeline input processing to set call forwarding settings for multiple users:Get-CsUser -OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate user1@tomt.itAgain, we use Get-CsUser to get some Lync Users and pipe them to the script, which adds user1@tomt.it as a delegate to the every one of the users. DownloadI’ve updated the script on my Sky Drive, find a link at the new help page.Cheers,    tom\",\n  \"url\": \"https://onprem.wtf/post/updated-invoke-sefautil/\"\n},{\n  \"id\": \"post-exchange-unified-messaging-sprachauswahl\",\n  \"title\": \"Exchange Unified Messaging Sprachauswahl\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Exchange\",\"Skype4B\"],\n  \"content\": \"Seit Exchange 2007 integriert die Unified Messaging Rolle klassische Anrufbeantworter in Exchange und schafft so eine neue, “unified” Mailbox für Benutzer.Seit es die Exchange Unified Messaging Rolle gibt, kann man diese durch die Installation von Sprachpaketen anpassen. In diesem Post beschreibe ich eine Änderung in der Funktionsweise die mir in den vergangen Tagen einiges an Kopfzerbrechen bereitet hat.SzenarioAnhand folgender Test Benutzer versuche ich das Verhalten in den jeweiligen Exchange Versionen zu erklären. “Bekannt” und “Unbekannt” bezieht sich hier auf die Exchange Umgebung, “bekannt” heißt der Benutzer hat eine Mailbox, die für UM aktiviert wurde, in der Exchange Umgebung, “unbekannt” heißt er hat keine Mailbox.In dem Beispiel wurde das Sprachpaket für Deutsch auf dem Exchange UM Server installiert, außerdem gibt es einen Exchange Dial Plan, die Standardsprache des Dial Plans ist Deutsch.Benutzer A = bekannt, Regionaleinstellung: Deutsch    Benutzer B = bekannt, Regionaleinstellung: Englisch     Benutzer C = Unbekannt, z.B. Partner, KundeSubscriber Access: Ein bekannter Benutzer ruft eine in Exchange konfigurierte Nummer an, um auf seine Mailbox zuzugreifen.Call Answering: Ein bekannter oder unbekannter Benutzer wird auf ein UM Postfach weitergeleitet, da der ursprünglich Angerufene Teilnhemer das Gesrpäch nicht annehmen konnte.Exchange 2010 SP2 und neuerRuft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B oder C auf die UM Mailbox von Benutzer A weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Wenn Benutzer A oder C auf die UM Mailbox von Benutzer B weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Exchange 2007 bis 2010 SP1Ruft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer A auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer C auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)Wenn Benutzer C auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)UnterschiedeDas mag in Textform etwas verwirrend wirken, der Unterschied ist für mich jedoch beträchtlich:Bis Exchange 2010 SP1 benötigt man einen Dial Plan um alle Sprachen abzudecken, da Exchange rücksichft auf die Sprache der Mailbox nimmt.Ab Exchange 2010 SP2 benötigt man für jede Sprache die unterstützt werden soll einen eigenen Dial Plan, da die Sprache der Mailbox ausschließlich für Subscriber Access berücksichtigt wird.&#160;Tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-unified-messaging-sprachauswahl/\"\n},{\n  \"id\": \"post-lync-server-backup\",\n  \"title\": \"Lync Server Backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"Skype4B\"],\n  \"content\": \"As with all systems a sound backup and recovery strategy is key when deploying Lync. This post will cover some basic ideas about what (and how) to backup in a Lync Topology. Lync, being essentially a SIP proxy, does not store a lot of data. It cannot be compared to the likes of Exchange or SQL, systems that are all about storing stuff. With Lync, we need availability, the rest is real time traffic/ presence information, only interesting in the moment when it happens.What?So what does Lync store then?Topology, Policies, Configuration The topology contains all relevant information about Lync Servers and applications. Once the servers are set up, administrators start configuring voice and client policies, trunk settings and all the other good stuff.We can export all of this configuration settings using the cmdlet: Export-CsConfiguration.User Settings, Buddy Lists After configuring the server side of things it’s time to enable some users for Lync, as the admin does so, configuration about the users, like their RegistrarPool ,SipAddress and LineUri are saved within the Lync system. Once the user logs on and starts to add contacts to their buddy list, those get stored on the Lync Servers as well.We can export all of this information using the cmdlet: Export-CsUserDataResponse GroupIf Lync Response Groups are configured there is some configuration information to store for them as well. This can be exported using the cmdlet: Export-CsRGSConfigurationLocation ServiceThe same idea applies to the Location Services, if configured, the configuration can be exported using the cmdlet: Export-CsLisConfigurationLync File StoreSure enough, the Lync file store needs to be included in the backup plan as well. This is not stored inside Lync, it typically resides on a highly available fileserver.Now if that external fileserver is backed up regularly, just make sure it is included in your backup/recovery documentation and try to restore it regularly. If it is not included in existing backup strategies consider using robocopy.Monitoring and Archiving DataMonitoring and Archiving data are not really stored inside Lync, either. Data is stored within the LcsCDR, QoEMetrics and LcsLog databases on a SQL server. There are no Lync tools available to backup this data, it is typically backed up using existing backup software for SQL or through SQL Management Studio.As with the Lync file store, make sure to include backup/restore dependencies and scenarios in the Lync documentation.Persistent Chat DataLync 2013 introduced the persistent chat feature, now for the first time we really do store instant messages and attachments sent by users.Data is stored within the Persistent Chat Database and can be exported using the cmdlet: Export-CsPersistentChatData. If existing backup software for SQL is available, the persistent chat database is typically backed up like any other application database.How?Now that we know what there is to backup, let’s have a look at how. I did point out the Export-* cmdlets and they’re the tool of choice for backing up Lync configuration information and settings.  Note: The account used to run the Export-* cmdlets needs to be member of the RTCUniversalServerAdmins group.I’ve come up with a quick script that invokes the mentioned Export-* cmdlets. The script can be found on my Github.Find more information about the script on the help page.Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-server-backup/\"\n},{\n  \"id\": \"post-outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013\",\n  \"title\": \"Outlook Autodiscover and what to do when migrating from Exchange 2010 to 2013\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Outlook Clients &gt;= 2007 use Autodiscover to detect the connection settings to connect to the Exchange Server.When a CAS Server is installed, the server hosts a virtual directory in IIS named &ldquo;Autodiscover&rdquo;.Outlook and mobile phones contact this virtual directory and download the autodiscover.xml file if one of the following condition occurs:- When you configure a mailbox - When the mailbox is already configured but Outlook or the mobile phones is unable to connect to the Exchange server - Outlook contacts periodically the Autodiscover service to update the connection settings if neededThe client discovers and connects to the Autodiscover service in a different way if located internal and external.If Outlook is externalWhen the Outlook Client is outside the cooperate network it uses DNS to discover the Autodiscover URL by searching an A Record with autodiscover.domain.com or an SRV record that points to the public name.If Outlook is internalWhen the Outlook Client is inside the cooperate network it searches in AD for a SCP (service connection point) object. The SCP object is an entry for each CAS server in ActiveDirectory that contains the Autodiscover URL. You can check the SCP object by using the cmdlet Get-ClientAccessServer or ADSIedit. If you want to update the SCP records, use the cmdlet instead of ADSIedit.What do I have to do if I&rsquo;m upgrading from Exchange 2010 to 2013?When you upgrade from Exchange 2010 to 2013 one of the first steps is to make the CAS 2013 internet facing. So clients get the autodiscover.xml file and settings via the Exchange 2013 servers. The CAS knows if the mailbox is hosted on an Exchange 2013 server, then the CAS sends you the settings to connect to the 2013 environment, or on the old 2010, then the CAS sends you the settings to connect to Exchange 2010 (CAS 2013 proxies the requests to 2010).This is OK for external Clients. But for internal clients connections you have to update the SCP object from the old 2010 Exchange CAS server to point to the new 2013 CAS server. This is necessary because Exchange 2013 servers provide additional AutoDiscover information to clients to improve the discovery process. From this time when internal clients connect to the Autodiscover service they contact every time the 2013 CAS and get the connection settings. You can update the SCP object and so updating the URL by using the cmdlet Set-ClientAccessServer like in the following example:Set-ClientAccessServer CAS2010SERVER -AutoDiscoverServiceInternalUri https://cas2013server.domain.local/Autodiscover/Autodiscover.xmlGreetings dn\",\n  \"url\": \"https://onprem.wtf/post/outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013/\"\n},{\n  \"id\": \"post-troubleshooting-sharepoint-error-messages\",\n  \"title\": \"Troubleshooting Sharepoint Error Messages\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Sharepoint\"],\n  \"content\": \"When you get a Sharepoint error message, they are sometimes not very helpful and it can be tricky to figure out what’s going wrong.At this point the Sharepoint EventLog can help you getting more details. With the Powershell commandlet get-splogevent you can search the corresponding exception message. The correlation ID is the key.If I’m searching the corresponding exception message from the error shown on the printscreen above, I execute following command:get-splogevent | where-object {$_.Correlation -eq &quot;88ab369c-71dd-108f-df09-ea6c74999562&quot;} | flGreetings    dn\",\n  \"url\": \"https://onprem.wtf/post/troubleshooting-sharepoint-error-messages/\"\n},{\n  \"id\": \"post-lync-music-on-hold-wartemusik\",\n  \"title\": \"Lync: Music on Hold / Wartemusik\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Lync\",\"Skype4B\"],\n  \"content\": \"Nach einiger Zeit mal wieder ein Artikel in deutscher Sprache :)Heute wollen wir uns die Music On Hold Thematik in einer Lync Enterprise Voice Umgebung anschauen. In diesem Artikel betrachten wir nur den Lync Client, MoH Konfiguration für IP Phones und Gateways werden in einem eigenen Artikel beschrieben.Was ist Music on Hold?Das kennt eigentlich jeder, trotzdem zur Erklärung: Teilnehmer A spricht mit Teilnehmer B, B möchte A weiterleiten und ruft C an. Bevor B ein neues Gespräch aufbauen kann, muss das aktuelle Gespräch gehalten werden. Damit A sich gut aufgehoben fühlt bekommt er Musik oder einen Text (“Sie werden mit dem gewünschten Teilnehmer verbunden…”) vorgespielt.Wer spielt die Musik?Jetzt wird das Thema interessant: Woher kommt die Musik? In der klassischen Telefonie wird für gewöhnlich ein “Medienserver” dafür verwendet, dieser hängt zentral an der TK Anlage und stellt Music on Hold für alle Gegenstellen zur Verfügung.In einer End-to-End Infrastruktur wie Lync ist das nicht mehr so einfach, der Medien Datenstrom (Sprache) zwischen Teilnehmer A und B ist direkt, auch für die Signalisierung sind die User Agenten zuständig. Will also Teilnehmer B das aktuelle Gespräch halten, muss er dies Teilnehmer A irgendwie mitteilen und diesem dann, wenn gewünscht, Musik vorspielen.In einer Lync Umgebung ist also der Lync Client von Teilnehmer B für die Musik zuständig.Welche Musik?In den Einstellungen des Lync Clients kann eine Audio Datei, die als Music on Hold gespielt wird, ausgewählt werden.  Möchte man sich für diese Aufgabe nicht auf seine Benutzer verlassen, kann man dies in einer CsClientPolicy vorgeben.New-CsClientPolicy &quot;MusicOnHold&quot; -EnableClientMusicOnHold:$true –MusicOnHoldAudioFile:&quot;C:\\\\Program Files (x86)\\\\Microsoft Office\\\\Office15\\\\MEDIA\\\\DefaultHold.wma&quot;&lt;/p&gt;    Grant-CsClientPolicy –Identity “Username” –PolicyName “MusicOnHold”&lt;/code&gt;  Diesen Pfad bekommt der Lync Client per in-band provisioning mit, das sieht im Log so aus:     Achtung: Das setzen von EnableClientMusicOnHold:$true alleine ist nich ausreichend, der Benutzer muss hier nach wie vor die Datei selbst auswählen.  Dateipfad  Der aufmerksame Leser hat das Problem in der obigen Konfiguration sicher bereits gesehen, der Dateipfad für die Musik liegt im Installationsverzeichnis des Lync Clients. Dies unterscheidet sich allerdings von Lync 2010 zu Lync 2013 sowie bei 32 und 64 Bit Installationen.  Standardpfad Lync 2013: &quot;C:\\\\Program Files (x86)\\\\Microsoft Office\\\\Office15\\\\MEDIA\\\\DefaultHold.wma&quot;   Standardpfad Lync 2010: &quot;C:\\\\Program Files (x86)\\\\Microsoft Lync\\\\MEDIA\\\\DefaultHold.wma&quot;  Dies kann problematisch werden, wenn Benutzer sich an mehreren Geräten mit unterschiedlichen OS oder Lync Client Versionen anmelden. In diesem Fall empfiehlt es sich einen “allgemein gültigen“ Pfad in die CsClientPolicy zu schreiben. Dies kann wiederum problematisch werden wenn Benutzer sich von Unternehmensfremden Endpunkten anmelden, diese finden dann am personalisierten Pfad keine Datei, oder können nicht auf eine Freigabe zugreifen… Die aktuell Verfügbaren Konfigurationsmöglichkeiten erlauben es nicht wirklich alle Szenarien abzudecken.  Ausnahme: Response Group Service  Natürlich gibt es eine Ausnahme in der die Musik vom Lync Server kommt, ruft Teilnehmer A eine RGS Nummer an, kommt die Wartemusik vom Lync Server, allerdings nur bis zu dem Zeitpunkt an dem ein Agent das Gespräch entgegen nimmt. Jetzt liegt die Verantwortung beim Lync Client des Agenten, wird das Gespräch vom Agenten gehalten, kommt die Musik vom Client desselben.  Hintergrund: Auf folgender Seite habe ich die SIP Kommunikation zwischen Teilnehmer A und B aus diesem Artikel genauer beschrieben. SIP: Anruf halten     Schönes Wochenende!     Tom\",\n  \"url\": \"https://onprem.wtf/post/lync-music-on-hold-wartemusik/\"\n},{\n  \"id\": \"post-sip-anruf-halten\",\n  \"title\": \"SIP: Anruf halten\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"An dieser Stelle möchte ich einen Blick auf die SIP Kommunikation in einem Anruf halten Szenario werfen. Die Informationen aus der SIP Kommunikation die ich im folgenden zeige sind auf das absolute Minimum beschränkt, ein wirkliches SIP Paket enthält viel mehr Informationen. Im folgenden Beispiel ruft Teilnehmer A (+49151xxxxxxxx) Teilnehmer B (+39047xxxxx) an, Teilnehmer B nimmt das Gespräch an. Anschließend hält Teilnehmer B das Gespräch. Die Frage die sich stellt ist natürlich wie signalisiert ein Teilnehmer (B) dem anderen (A) dass er das Gespräch halten möchte?INVITE / OKBevor ein Gespräch gehalten werden kann, muss dieses aufgebaut werden. Dazu sendet Teilnehmer A eine INVITE Anfrage an Teilnehmer B. Der Header beschreibt die SIP Sitzung, im Body wird mit SDP die Medien Sitzung beschrieben. Die interessanten Felder fasse ich hier zusammen:Invite Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37     CSeq: 24467 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Invite Body:      c=IN IP4 192.168.1.100     m=audio 54720 RTP/AVP 0 8 115 13 118 97 101Der Lync Client des angerufenen Teilnehmers (B) muss die empfangene Anfrage beantworten und macht dies mit einem 200 OK. In diesem schickt er SDP Informationen mit, welche die RTP Sitzung aus seiner Sicht beschreiben:Ok Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 24467 INVITEOk Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101re-INVITE / OKUm eine existierende SIP Sitzung (Dialog) zu ändern, schickt Teilnehmer B ein INVITE bei dem die Werte für Call-ID sowie From und To Tag identisch mit denen aus der bestehenden Sitzung sind. Man spricht in diesem Fall von einem re-Invite. Das Ziel dieses erneuten Invites ist es die RTP Sitzung zu ändern, also schickt der User Agent des Teilnehmer B neue SDP Informationen an Teilnehmer A, diese enthalten die Beschreibung der RTP Sitzung aus sicht von Teilnhemer B.re-Invite Header:     From: &quot;&quot; &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     To: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 1 INVITEre-Invite Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101     a=sendonlyAuch diese Anfrage muss der Lync Client beantworten, in diesem Fall erhält Teilnehmer A die Invite Nachricht, Teilnehmer B möchte das Gespräch halten.Ok Header:      From: &quot;&quot;&lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;tag=4f75d0c634;epid=ea6d933f37     To: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     CSeq: 1 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Ok Body:      c=IN IP4 192.168.1.100     m=audio 6190 RTP/AVP 8 13 101     a=recvonly\",\n  \"url\": \"https://onprem.wtf/post/sip-anruf-halten/\"\n},{\n  \"id\": \"post-invoke-sefautil-a-powershell-wrapper-function\",\n  \"title\": \"Invoke-SEFAUtil – a PowerShell wrapper function\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Lync\",\"PowerShell\",\"Skype4B\"],\n  \"content\": \"I had to use SEFAUtil to get some tasks done the other day. As I prefer using PowerShell over just another command line tool, I decided to come up with a quick wrapper function that is intended to make my life a little easier.If you don’t know what SEFAUtil is and how to configure it, check out this great post or this one if you prefer German ;) In a nutshell, it’s a command line tool to configure Skype for Business (Lync) Voice Features (like call forwarding, team call) on behalf of end-users.Warning: I do not recommend using this in production without understanding what it does, although I did test it in my lab, it may break something!Ok, having that said, how do I use thins thing? First of all you will need a copy of this script on the computer where you have been running SEFAUtil until now. As the computer is authenticated using a certificate (it must be configured as a trusted application), you will not be able to run this from anywhere. Once you’ve downloaded the script, start a Skype for Business Management Shell and use like in the following examples:EXAMPLE 1.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\"OU=users,OU=tomt,DC=tomt,DC=local\\\" | .\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThe complete online help can be found hereWhat I did in this script, is basically wrap PowerShell around SEFAUtil.exe, I did add some parameter validation, it can only run against Lync users for example. It does write a logfile to the $temp directory and supports PowerShells common parameters like Verbose and WhatIf.Download &amp; Source for Invoke-SEFAUtil – a PowerShell wrapper functionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell      Note: The script requires the Lync Module to be available on the Computer where it will be run, it does also require PowerShell version 3.  Note: Changing the CallAnswerTime only does not work, a limitation of the SEFAUtil.exe does not allow this setting to be changed without also configuring CallForwardingso long,Tom\",\n  \"url\": \"https://onprem.wtf/post/invoke-sefautil-a-powershell-wrapper-function/\"\n},{\n  \"id\": \"post-your-windows-phone-does-not-support-this-server-version\",\n  \"title\": \"Your Windows phone does not support this server version…\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"This is just a a quick post about an interesting issue I&rsquo;ve seen today, interesting it was, at least to me. I was at a customer&rsquo;s site publishing Exchange 2010 using a Sophos &ldquo;Unified Threat Management&rdquo; box. Well, we all have to live in a post TMG world, don&rsquo;t we?After installing the certificate on the box we configured the &ldquo;virtual web servers&rdquo; and the corresponding &ldquo;real web servers&rdquo;. Outlook Web App worked straight away so we went ahead and tried to connect a Windows Phone 8 using ActiveSync.That didn&rsquo;t go so well, the Phone would not connect and instead give a strange error message saying:Error 85002028: Your Windows phone does not support this server version.Ok, that&rsquo;s where the interesting begins. I quickly fired up Remote Connectivity Analyzer which provided a much clearer error description along with a link to this KB article.It turned out that we had not installed the intermediate CA certificate on the Sophos box. As the Winodws Phone requires the Reverse Proxy to send the whole chain down for verification, this simply didn&rsquo;t work. Here comes a quote from the above KB article.Windows Mobile-based devices do not generally contain intermediate CA certificates in their certificate store. Internet Information Services (IIS) sends the whole certificate chain to the device. However, IIS does this only if it can verify the whole chain. By default, the device does not contain these certificates. Therefore, the server must send them. The device must contain only the root certificate in its certificate store.Makes sense, finally.until next time, tom\",\n  \"url\": \"https://onprem.wtf/post/your-windows-phone-does-not-support-this-server-version/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-5\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 5\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Welcome to the last post in this series, we did migrate all mailboxes in part 4, the only thing that is still missing is public folder. So let&rsquo;s go ahead and migrate legacy public folders over to modern public folders.Modern Public Folders, huh?Public folders have been around for quite a while now, and for some time they have been written off, even by Microsoft. Exchange 2007 RTM&rsquo;d without management features, 2010 came along with no real improvements to replication and high availability.Everything changed, Exchange 2013 introduces the shiny, new &ldquo;Modern Public Folders&rdquo;. This shows that the Exchange Team is actually listening to customers, this, and the availability of public folders in Exchange Online (Exchange Team Blog) tells us that modern public folders are here to stay. So what&rsquo;s changed?No more public folder databases, modern public folders are stored in the mailbox database, within special public folder mailboxes. This gives the administrator more flexibility (think DAG) and reduces a lot of the additional complexity that came with managing PF replication. Other nice side effects are that clients do not need to connect to the mailbox servers anymore, CAS is now able to handle ALL incoming connections.The hierarchy is stored within a root public folder mailbox but every public folder mailbox has a read-only copy, so all clients get quick access to it. The root mailbox can be shown using the following cmdlet:Get-OrganizationConfig | select RootPublicFolderMailboxMigrationOnce you are ready to migrate public folder to Exchange 2013, head over to Microsoft&rsquo;s Download Center and download the Public Folder Migration Scripts. I downloaded these scripts to the Exchange 2010 server, as they will be run there. The first script to run is Export-PublicFolderStatistics.ps1, it takes to parameters as input, the first one is a filename the second one is your Exchange 2010 mailbox server..\\\\Export-PublicFolderStatistics.ps1 sizemap.csv EX14.tomt.localThis script creates a file called sizemap.csv in the current directory, this file contains public folder statistics gathered from the server EX14.tomt.local. It&rsquo;s actually a simple list of public folder names and their respective sizes in bytes.The second script, PublicFolderToMailboxMapGenerator.ps1 reads the output file generated by the first one, and takes two additional parameters. The first parameter is the maximum mailbox size in bytes, then comes the sizemap.csv generated by the first script, the last parameter specifies a new file, which will contain a public folder to mailbox mapping based on the maximum mailbox size parameter..\\\\PublicFolderToMailboxMapGenerator.ps1 1073741824 sizemap.csv mailboxes.csvThis example specifies a 1GB mailbox limit, it reads the sizemap.csv from the previous script, and creates a new mailbox to home public folders every time the mailbox size will reach 1GB.As my little lab does not have a huge public folder structure, everything will be placed into the first mailbox. Note that I changed the name of the first &ldquo;TargetMailbox&rdquo; as the default was something like &ldquo;Mailbox1&rdquo;.So now that we have created the mailboxes.csv file, we need to copy it over to the Exchange 2013 mailbox server. In the next step we are going to import the mailboxes.csv file and create the target public folder mailboxes with a little bit of PowerShell:Import-Csv .\\\\mailboxes.csv | select -expand TargetMailbox | foreach {New-Mailbox -Name $_ -PublicFolder -HoldForMigration:$True -IsExcludedFromServingHierarchy:$true}The two parameters HoldForMigration and IsExcludedFromServingHierarchy are used to prevent users from accessing the public folder mailbox for now. To verify that the mailboxes have actually been created use the following cmdlet:Get-Mailbox &ndash;PublicFolderOk, so now that we have created the target mailboxes we can go ahead and start moving data. Again, we will need the mailboxes.csv file, as the New-PublicFolderMigrationRequest cmdlet takes it as input:New-PublicFolderMigrationRequest -SourceDatabase (Get-PublicFolderDatabase -Server ex14.tomt.local) -CSVData (Get-Content .\\\\mailboxes.csv -Encoding Byte)In this example I am getting public folder database information from the server EX14.tomt.local and then reading the content of mailboxes.csv, which has to be in the current location. As the name implies, a new Public Folder Migration Request is generated, it copies data at about two to three GB per hour. The request is created with the PreventCompletion parameter set to $true, that means, once the data has been copied, the request will be AutoSuspended.Users should not have noticed anything about this public folder migration until now, they continue working on the 2010 public folder as usual. Before we can complete the public folder migration request, though, we will need to block user access to the legacy public folders. We will need some time to synchronize the already moved data with latest changes during this window of downtime.So once you&rsquo;ve informed your users, we are going to prevent access to legacy public folders, remember that because of HoldForMigration:$true, we are also preventing access to the modern public folders!Set-OrganizationConfig -PublicFoldersLockedForMigration:$trueThis setting prevents users to access public folders, be sure to allow some time for it to replicate if you have more than one public folder database. Now that no one is able to make changes to the legacy public folders, we can go ahead and set the PreventCompletion flag to $false, and then resume the public folder migration request to finally move all data.Set-PublicFolderMigrationRequest -Identity \\\\PublicFolderMigration -PreventCompletion:$false Resume-PublicFolderMigrationRequest -Identity \\\\PublicFolderMigrationOnce this is done, it is recommended to test access to modern public folders with a few users, before allowing everybody to make changes again. This is the last point in time where you do have a way back without data loss!To test access to the modern public folders, we use the following cmdlet:Set-Mailbox &ndash;Identity user1 &ndash;DefaultPublicFolderMailbox PFMailbox001This overrides the IsExcludedFromServingHierarchy and allows the user user1 to access public folders on the new Exchange 2013 server. Outlook Connection Status will show something like this:If everything is fine, we can finally remove the IsExcludedFromServingHierarchy flag and set the PublicFolderMigrationComplete property to $true.Get-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy:$false Set-OrganizationConfig -PublicFolderMigrationComplete:$trueOk, one last thing: You may have noticed that the Proxy Server in the screenshot above shows the external server name for the connection to Exchange Public Folders. This is due to a bug in Outlook, before a fix becomes available, make sure internal clients can access the external hostname by creating a split DNS record. There is a KB article available, here.Nice, that completes this series on migrating Exchange 2010 to Exchange 2013. Thanks for following along :)&nbsp;so long, see you next time!tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-5/\"\n},{\n  \"id\": \"post-web-application-proxy-in-windows-2012-r2-preview\",\n  \"title\": \"Web Application Proxy in Windows 2012 R2 preview\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\"],\n  \"content\": \"The preview of the next version of Windows Server 2012 has been released very recently. Let&rsquo;s have a quick look at some of the features.The taskbar properties feature a new &ldquo;Navigation&rdquo; pane, we can configure stuff like &ldquo;Boot to Desktop&rdquo;, yay :)Web Application Proxy and ADFSAnother desperately needed feature is the new Web Application Proxy server role, many people (including me) think this is going to be the replacement for TMG. So, very keen to play with the new toy I went ahead and added the server role, found underneath &ldquo;Remote Access&rdquo;.&nbsp;Adding &ldquo;Web Application Proxy&rdquo; as a role service.Like in Windows 2012 the server manager kindly reminds me to configure the newly added role:Just in case you want to run this wizard again but can&rsquo;t find it anymore, it can be started from the Remote Access Management Console.The first step in the Wizard asks for a federation service name, now until this moment I didn&rsquo;t really bother researching anything about this new server role. Not the smartest move&hellip; As documentation is still pretty thin for Windows Server 2012 R2 I decided to simply set up an ADFS server in my lab and try to connect the Web Application Proxy to that federation service.Active Directory Federation ServicesThe first step is to add the Active Directory Federation Services server role to an machine in the domain.Again, the Server Manager reminds me to configure the new role, the first thing I do is supplying credentials which are used to perform the configuration:In the next step I select a certificate for the federation service and set a name for it. Obviously I do have to create a DNS record that resolves the federation service name to the IP address of the server that&rsquo;s actually hosting it.Now I have to select a service account for the federation service, note that the federation service name must be added as Service Principal Name to the account. This can be done using &ldquo;setspn &ndash;F &ndash;S host/adfs.tomt.local adfssvc&rdquo;In the last step I select the database to use for the federation service, as I am using only one server I&rsquo;ll give the Windows Internal Database a go.Ok, no we do have a federation service running, so we can go ahead and configure the Web Application Proxy.Web Application ProxyOk, picking up where we left for a quick excursion to ADFS, we are now back on the Web Application Proxy machine and specify the newly created federation service name.&nbsp;&nbsp;A certificate is required on the proxy, too. So after requesting a certificate from my internal CA, I can go ahead and select it here. Make sure that the certificate&rsquo;s subject alternative names include the federation service name!Ok, the last step shows the PowerShell code that get&rsquo;s executed and if everything works out, you&rsquo;ll see a message that the Proxy was configured successfully.A few caveats: Make sure DNS resolution is ok, the proxy must be able to resolve the federation service, and the ADFS server must me able to resolve the proxy. The certificate on both servers must include the federation service name.Publishing a serviceAfter having configured ADFS and the Web Application Proxy, which also acts as ADFS Proxy, we can finally proceed and publish a server. This is done using the Remote Access Management Console.I hit publish in the tasks pane and in the wizard that comes up, I am asked to select if I want to use pre-authentication or simply pass-trough the requests. After all that pain with installing and configuring ADFS I do definitely want to use pre-authentication :)Ok, so I have to select the ADFS relying party, whatever that is:After that I am prompted to enter a name for the publishing rule, an external and internal URL as well as a certificate.Again, we get to see the actual PowerShell code just before the publishing rule is created. Niiice, we have just successfully configured our first \\\"post TMG&rdquo; publishing rule.TestingNow to make sure that this is really working, let&rsquo;s fire up a client and browse to the published URL, owa.tomt.it in my case. Browsing to a published web site that requires pre-authentication, redirects the client to the AD FS Proxy service.After successfully authenticating against the Web Application Proxy the client gets redirected back to it&rsquo;s intended destination web site.Note: Make sure the client actually behaves like an external client, it must resolve the federation service name to the Web Application Proxy for this to work!Port mappingAnother application that I do publish using TMG frequently is Lync, sure enough I have to map the external web services port from 443 to 4443. This can be done using Web Application Proxy, too. For Lync we don&rsquo;t use pre-authentication:The internal URL contains the port to use:Awesome, that gives us a new possibility to publish web services, obviously we are not yet able to use it in production and time will tell if it get&rsquo;s a few additional features in RTM, all in all, for no additional cost, I think it is already a nice tool to use.Wish list,or: What would be nice to have in the RTM Version of Windows Server 2012 R2:Publish multiple servers for a particular external URL (think load balancing) Health checking of internal servers Maybe some additional authentication possibilities That&rsquo;s it for today, so long tom\",\n  \"url\": \"https://onprem.wtf/post/web-application-proxy-in-windows-2012-r2-preview/\"\n},{\n  \"id\": \"post-lync-and-exchange-2013-owa-integration\",\n  \"title\": \"Lync and Exchange 2013 OWA integration\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"content\": \"I configured Lync 2013 to work with Exchange 2013 these days, as it took me a while to get the &lsquo;Online Meeting request&rsquo; up and running, I thought I&rsquo;d post a quick post here.CertificatesThe first thing to consider when thinking about integration between Exchange 2013 and Lync is certificates. The servers use OAuth and TLS connections and we need the certificate common names to match the names that the servers use to access the resource. In my simple environment I do have the CN ly14.ntsystems.local on my Lync server&rsquo;s certificate, the Exchange server&rsquo;s certificate has a CN of ex14.ntsystems.local.Exchange 2013 - Enterprise Partner ApplicationThe first thing we configure, if it&rsquo;s not already set up, is Exchange Autodiscover service. What we actually care about is the internal URI used:Get-ClientAccessServer | fl AutoDiscoverServiceInternalUriIf it looks good, we go ahead and use the following script shipped with Exchange to set up an Enterprise Partner Application.&amp; $exInstall\\\\Scripts\\\\Configure-EnterprisePartnerApplication.ps1 &ndash;AuthMetaDataUrl https://ly15.ntsystems.local/metadata/json/1 -ApplicationType LyncThe &ldquo;&amp;&rdquo; sign tells PowerShell to start the script located at the Scripts folder in the Exchange 2013 installation directory. With the AuthMetaDataUrl we specify the Lync 2013 Pool&rsquo;s Auth Metadata document, this includes public key information for the Partner Application.Lync 2013 - Trusted Application PoolSo next up we have to configure Lync to trust the Exchange Server 2013.New-CsTrustedApplicationPool -Identity ex15.ntsystems.local -Registrar ly15.network.local -Site Bolzano -RequiresReplication $FalseNew-CsTrustedApplication -ApplicationId OutlookWebApp -TrustedApplicationPoolFqdn ex15.ntsystems.local -Port 5199&lt;/p&gt;New-CsPartnerApplication -Identity Exchange -ApplicationTrustLevel Full -MetadataUrl https://autodiscover.ntsystems.local/autodiscover/metadata/json/1Set-CsOAuthConfiguration &ndash;Realm ntsystems.localEnable-CsTopology&lt;/code&gt;Ok, so first we create a new Trusted Application Pool withing Lync, the Identity of the application pool is the Exchange 2013 server, the registrar is the Lync standard edition server. Then we create a Trusted Application and assign it to the trusted application pool configured before. The third thing we configure is a Partner Application and set the OAuth configuration, we need those last steps for the Online Meeting request in OWA, make sure that you actually use the Autodiscover URL, this didn&rsquo;t work if I used the server name instead.Ok, once the configuration is done, publish the topology.Exchange 2013 - Enable Instant MessagingBack on the Exchange side of things we need to configure the OwaVirtualDirectory to enable Instant Messaging.Get-OwaVirtualDirectory | Set-OwaVirtualDirectory &ndash;InstantMessagingEnabled $True -InstantMessagingType OCSNow comes the nasty part, we have to update OWA&rsquo;s web.config file to include the Exchange Servers certificate thumbprint. So first, we use the following cmdlet to get the certificate&rsquo;s thumbprint:Get-ExchangeCertificateCopy the thumbprint of the certificate that is assigned to the IIS service and fire up notepad to open the web.config file of the Owa virtual directory, located here:C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\ClientAccess\\\\OWA\\\\web.configNo we need to Include the following Lines underneath the &lt;AppSettings&gt; node:&lt;add key=\\\"IMCertificateThumbprint\\\" value=\\\"Exchange Cert Thumbprint\\\"/&gt; &lt;add key=\\\"IMServerName\\\" value=\\\"ly15.tomt.local\\\"/&gt;So, after updating that web.config file, there is one step left, we need to actually allow users to use instant messaging in OWA. This is controlled in the Owa mailbox policy, to keep it simple I&rsquo;ll just update the default policy which will enable IM for everybody.&nbsp;Set-OwaMailboxPolicy -Identity \\\"Default\\\" -InstantMessagingEnabled $True -InstantMessagingType \\\"OCS\\\"Wow, now that all configuration is done, I like to do a quick iisreset to make sure all the configuration changes are picked up, obviously this should not be done on production machines&hellip;If users sign in to webmail, they will be able to sign into Lync, set their state and participate in IM chats.And, as a nice little addon, we can now also create Online Meeting requests from OWA:Note, Exchange 2013 CU1 is required for Online Meeting requests and Lyncdiscover has to be set up, too.&nbsp;Enjoy,tom\",\n  \"url\": \"https://onprem.wtf/post/lync-and-exchange-2013-owa-integration/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-4\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 4\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Hello everybody, after thinking about installation, client access and mail routing, we are getting ready to move some mailboxes.So, we talked about Exchange 2013 CAS being a pretty smart proxy, that&rsquo;s why we had to append ?ExchClientVer=15 to the ECP URL in order to get to the new Admin Center while the Mailbox was still on Exchange 2010. Obviously, once the mailbox gets moved to Exchange 2013 this is no longer required. Another thing that will change as we move mailboxes from Exchange 2010 to 2013 is the Outlook Profile, it does no longer show the RPCClientAccess endpoint as Server, instead it gets updated to show the &lt;Mailbox GIUD&gt;@&lt;Primary SMTP domain&gt;.Moving mailboxes&nbsp;There are a couple of things to take into consideration before moving mailboxes to the 2013 server. As we learned in part two of this series, it is essential to move the namespaces used by Exchange to the new CAS prior to moving mailboxes, users would not be able to access mailboxes if the names would still point to an Exchange 2010 CAS. Another important check is whether new mailbox servers have been provisioned with enough disk space to accommodate the moved users, and if the properties of the mailbox database, such as ProhibitSendReceiveQuota and OfflineAddressBook have been set to desired values. Assuming that everything is fine, we go ahead and create some move requests, very much the same way as we did in Exchange 2010.New-MoveRequest &ndash;Identity user3@tomt.it &ndash;TargetDatabase mbd01This command moves the mailbox of user3 to the target mailbox database mdb01 which is hosted on Exchange 2013. Like in 2010, the move is performed online, so the user is able to work in his mailbox until the move request is finished. Once the move request completes, the user will be prompted to restart Outlook, this is when the Profile gets updated to show the GUID instead of the server name or RPCClientAccessServer property.Note that this is the users mailbox GUID, as that is the user&rsquo;s unique identifier within the Exchange Organization, it will be different for every user. This GUID is used to locate the active mailbox database copy, in Exchange 2013 all protocols are provided to the user by the server that is hosting the active mailbox database copy.Batch movesIn Exchange 2010 we had the ability to do batch move requests, but it was more like creating many move requests and assigning the same BatchName to them, Get-MoveRequest was used to retrieve information about the move requests. Now Exchange 2013 comes with some new cmdlets that are dealing with batch migrations: *-MigrationBach.Honestly I do think those new cmdlets are a little complicated, I guess they were primarily introduced to make hybrid or cloud move requests easier, in an on-premises world they might not be that useful. I created a New-MigrationBatch and then started the migration. The first thing we need is a CSV file with a column called EmailAddress, so let&rsquo;s get all users homed on the Exchange 2010 server, and export them to CSV:Get-Mailbox -Server ex14 | select @{n=\\\"EmailAddress\\\";e={$_.PrimarySmtpAddress}} | Export-Csv -NoTypeInformation -Path .\\\\BatchMove.csvNow we can use this CSV file to create a new MigrationBatch, you see what I mean with a little complicated&hellip;New-MigrationBatch -Local -Name BatchMove -CSVData ([System.IO.File]::ReadAllBytes(\\\".\\\\BatchMove.csv\\\")) -TargetDatabases mdb01It&rsquo;s looking like that in PowerShell:Ok, once we have created the MigrationBatch, we can go ahead and start the migration to actually move data over to the new Exchange.Get-MigrationBatch | Start-MigrationBatchThe Get-MigrationStatistics cmdlet can be used to get information about the ongoing migrations, once all mailboxes are moved, TotalCount and SyncedCount should show the same value. Get-MigrationUser can be used to get information about the individual mailboxes being moved. The Get-MigrationBatch cmdlet includes a Report property containing links to CSV reports about the MigrationBatch.Note that the Start-MigrationBatch does not complete the move requests, use the Get-MoveRequest cmdlet to show the individual move requests and their state, it will be AutoSuspended. The Complete-MigrationBatch cmdlet is used to complete the move requests:Get-MigrationBatch | Complete-MigrationBatchIf we run the Get-MoveRequest cmdlet again, we will finally see that mailboxes have been moved to Exchange 2013.Since there is not much documentation available, yet, I will stick with the &ldquo;old&rdquo; way and just use New-MoveRequest to move mailboxes for now.&nbsp;&nbsp;&nbsp;Outlook ProfileOk so now that we have migrated our users over to the new Exchange it&rsquo;s time to have a look at Outlook, as mentioned above, the profiles will be updated and no longer show a server name, but it will also be using RPC over HTTP on the internal network:The proxy settings of the Outlook profile is updated, too, it will now select &ldquo;On fast networks, connect using HTTP first&hellip;&rdquo; by default.The AutoDiscover.xml file now contains more information for clients, while Exchange 2010 had the following three Type nodes &lt;EXCH&gt;,&lt;EXPR&gt; and &lt;WEB&gt; the new AutoDiscover.xml contains two &lt;EXHTTP&gt; nodes for internal and external OutlookAnywhere settings.It is very important to update Outlook to the minimum required version by Exchange 2013 before moving mailboxes, as older Outlook versions will not be able to interpret the new xml file.Well, and that&rsquo;s it for part four. We do have one big thing left for part five, public folders.&nbsp;Stay tuned,tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-4/\"\n},{\n  \"id\": \"post-exchange-2013-open-public-folder-on-exchange-2010\",\n  \"title\": \"Exchange 2013, Open Public Folder on Exchange 2010\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"You may notice that with the Exchange 2013 defualt settings on Outlook Anywhere you are unable to open public folders located on you &ldquo;old&rdquo; Exchange 2010 server. You get an authentication pop up and the following error:Microsoft has released a KB (http://support.microsoft.com/kb/2834139/en-us) article how to get that work.Simply change your Outlook Anywhere settings to use internal and external NTLM with requirement of SSL:Get-OutlookAnywhere &ndash;server ex01 | Set-OutlookAnywhere -ExternalClientAuthenticationMethod NTLM -InternalClientAuthenticationMethod NTLM -ExternalClientsRequireSsl $true -InternalClientsRequireSsl $trueThe next time the client gets the Autodiscover File, it sets the Logon Network Security Settings of the Outlook Profile from &ldquo;Anonymous Authentication&rdquo; to &ldquo;Negotiate Authentication&rdquo; and you can open the public folders located on Exchange 2010.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2013-open-public-folder-on-exchange-2010/\"\n},{\n  \"id\": \"post-configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa\",\n  \"title\": \"Configure Exchange 2013 CAS Array with WNLB and enable Kerberos support for OA\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Like Tom described in his Post Migrating from Exchange 2010 to 2013 &ndash; part 2 the major changes in the Exchange 2013 CAS role, I explain in this post how to configure high available CAS Array with WNLB.First you have to install WLNB on both CAS nodes and create the Cluster and VIP. The CAS Servers need only one NIC, we use the Multicast operation mode.Next we create the Port Rules. In this example I create a port rule for the whole port range. Because there is not need of Affinity we can safely disable the the feature:Now create the Host A Record for the Cluster name excararray01 to point to the VIP.Remember to change the internal URL&rsquo;s of the virtual directories of both CAS servers to use the Cluster name and not the CAS computername.Kerberos supportI have 2 UAG servers that are publishing the Exchange 2013 CAS servers. On the UAG servers I don&rsquo;t want to publish both CAS servers and use the UAG load balancing. I want to publish the CAS Cluster Name and let the WNLB do the load balancing. If you don&rsquo;t configure an alternate service account for the CAS Cluster Name you will no be able to use NTLM authentication for Outlook Anywhere.To use Kerberos authentication you have to create a computer account in AD (the name don&rsquo;t have to match the array FQDN):Then run the following script that is located in C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V15\\\\Scripts to configure the Alternative Service Account.\\\\RollAlternateServiceAccountPassword.ps1 -ToArrayMembers excasarray01.domain.local -GenerateNewPasswordFor \\\"domain\\\\EXCASARRAY01ASA$\\\" &ndash;Verboseexcasarray01.domain.local stands for the FQDN of the CAS array domain\\\\EXCASARRAY01ASA$ stands for the created computer accountAfter the script has finished configuring we have to register some spn&rsquo;s with the CAS Array FQDNsetspn -s exchangeMDB/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s exchangeRFR/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s exchangeAB/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\EXCASARRAY01ASA$Now we can publish the CAS Array FQDN with uag and use NTLM as authentication method for Outlook Anywhere.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-3\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 3\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Hello again and welcome back to the third part of our journey to Exchange 2013. In the previous two posts (part 1, part 2) we covered preparing and installing Exchange 2013, as well as some news with the Client Access Server role and some design considerations. Now in this part we will try to cover some key aspects of transport in the new Exchange.Hub Transport RoleAs you already know, there is no Hub Transport server role in Exchange 2013, the transport pipeline has been split into three services, one of which is running on the CAS, the other two on the MBX role.Front End Transport serviceThis service is running on the CAS role, like all other CAS services, it is nothing more than a stateless (but smart) proxy for inbound and outbound SMTP connections. Neither message queuing, nor message filtering happens here. The front end transport service talks to the transport service on the MBX server role.Transport serviceThis service runs on the Mailbox server role, like the hub transport role in Exchange 2010, this service performs message queuing, inspection, categorization and so on. Very much NOT like in Exchange 2010, though, this service never talks to a mailbox database. This service routes messages between the front end transport service, the transport service and the mailbox transport service.Mailbox Transport serviceThis service runs on the Mailbox server role, too. It receives messages via SMTP from the transport service and connects via RPC to the mailbox database to deliver the message. It also connects to mailbox databases via RPC to retrieve messages and forward them to the transport service, again using SMTP.This shows one thing very clearly, through the use of SMTP, Exchange 2013 is able to break the close relationship between server roles that existed in previous versions. The front end transport role in CAS does no longer use RPC, an thus, could be running a different software version than the mailbox server, communication between mailbox servers, specifically between the mailbox transport service and the transport service, also uses SMTP and has no requirement to be on the same software version.I used Wireshark to capture an incoming mail proxied through the CAS:The Client (10.1.1.10) connects to the CAS (10.1.1.21) using TCP 25, all SMTP messages are exchanged between those two nodes. Note, that the CAS does only send the &ldquo;250 Queued Mail for delivery&rdquo; after connecting to the transport service on the Mailbox Server (10.1.1.25), since the Front End Transport service does not queue mails locally, this &ldquo;smart proxy&rdquo; functionality ensures that the message gets stored in the mailbox servers queue, before sending an OK to the client. The connection between CAS and MBX uses TCP 2525 and is encrypted using TLS, this is why Wireshark is not able to encode it as SMTP.There is whole section on Transport on TechNet: http://technet.microsoft.com/en-us/library/aa996349.aspxMigration Send and Receive connectorsNow that we know (a little bit) how transport works in Exchange 2013, we can start to include Exchange 2013 servers to the send connectors and configure the appropriate receive connectors.To add Exchange 2013 servers as sources to the existing send connectors, use the Exchange Admin Center and navigate to &ldquo;mail flow, send connectors&rdquo;. Then select the send connector to edit and add the new source server under &ldquo;scoping&rdquo;We could also use PowerShell to add additional SourceTransportServers to the connector, be aware though, that the existing servers have to be included in the command.Set-SendConnector &ndash;Id ToInternet &ndash;SourceTransportServers ex14,ex15Another interesting flag sits under the &ldquo;general&rdquo; node of the send connector&rsquo;s properties: Proxy though client access server&rdquo;So what&rsquo;s that all about? If this flag is checked, outbound mails are not sent directly by the mailbox server&rsquo;s transport role, but are proxied through a Client Access Server. This could be interesting if only a subset of Exchange Servers (CAS) were allowed to connect to the internet via SMTP. With multi role servers, which are recommended for many environments, this flag will have no effect.Ok, so now we have got our outbound mail flow configured, what about incoming mails? Receive connectors are per-server settings, so we have to check the configuration of existing connectors and configure the new server accordingly.Get-ReceiveConnector &ndash;Server ex14 | ft Identity,Enabled,Bindings,RemoteIpRangesThis command shows all receive connectors on the 2010 server, along with the Ports used and the remote IP addresses that are allowed to use this connector. Obviously, if there are custom AD permissions or authentication methods defined, those have to be configured on the new server, too.Nice, now we have got client access and transport covered, the next post will finally include moving some mailboxes to the new Exchange server.&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-3/\"\n},{\n  \"id\": \"post-exchange-2013-clean-install-but-many-msexchange-common-106-errors\",\n  \"title\": \"Exchange 2013 clean install but many MSExchange Common 106 errors\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"Update: 09.06.2013 Updated the PowerShell script and some additional information about event logs. /tomToday I installed 4 Exchange 2013 servers. All of them have many &ldquo;MSExchange Common&rdquo; 106 errors in the Application Log indicating&nbsp;that Performance Counters could not be updated:Performance counter updating error. Counter name is LDAP Queries Issued by Expanded Groups., category name is Expanded Groups Cache. Optional code: 3. Exception: The exception thrown is : System.InvalidOperationException: The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnlyThe problem is that the performance counters are not registered correctly. I wrote a simple script to re-register all the Exchange 2013&nbsp;performance counters. Now the Application log looks much better First open Powershell in Admin Mode, then execute the following code:Note that New-PerfCounters actually deletes and re-creates the performance counter, there is no need to use Remove-PerfCounters first. The script might throw some errors if performance counters cannot be created or files are invalid, other than that no information is displayed, no news is good news, I guess ;) For more information check the Application Log of the server, two events are logged for every performance counter. Event ID 1001 indicates that the counter has been removed, while Event ID 1000 is logged as soon as the counter has been loaded again.If an antivirus software is running on the server, it could be disabled temporarily to improve performance.Special thanks to @msxfaq&nbsp;:)&nbsp;Greetings nd\",\n  \"url\": \"https://onprem.wtf/post/exchange-2013-clean-install-but-many-msexchange-common-106-errors/\"\n},{\n  \"id\": \"post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-1\",\n  \"title\": \"How to build an UAG 2010 Array for Exchange publishing–Part 1\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\",\"Lync\",\"Skype4B\"],\n  \"content\": \"As TMG is not &ldquo;available&rdquo; anymore, I decided to use UAG 2010 with SP3 for the Exchange / Lync 2013 publishing. UAG SP3 supports Exchange 2013 and Lync 2013. In Part 1 of the Post I&rsquo;m going to explain how to build the UAG 2010 Array.First we have to prepare 2 Windows Server 2008 R2 Server each of them with 2 NIC&rsquo;s and at least 4GB RAM. The NIC&rsquo;s should be configured in this way:INTERNALDefault Gatewayshould not be definedDNS Serversshould be definedRegister this connection&rsquo;s address in DNSEnabledFile and Printer Sharing for Microsoft NetworksEnabledClient for Microsoft NetworksEnabledNetBIOS over TCP/IPEnabledLMHOSTS lookupEnabled&nbsp;EXTERNAL&nbsp;&nbsp;Default Gatewayshould be definedDNS Serversshould not be definedRegister this connection&rsquo;s address in DNSDisabledFile and Printer Sharing for Microsoft NetworksDisabledClient for Microsoft NetworksDisabledNetBIOS over TCP/IPDisabledLMHOSTS lookupDisabledThe order should modified that NIC INTERNAL becomes the first NIC used:The Next steps are to install NLB (without configuring it) and UAG on both nodes. Install UAG in the following order:UAG 2010 SP1 Update 1If Update 1 fails, download and install it manuallyUAG 2010 SP1 Updat 1TMG 2010 SP2UAG 2010 SP2UAG 2010 SP3When UAG is fully installed, we have to configure it. Lets start on the node that becomes the Array Manager.Open UAG and select the Network SettingsThen we have to define the Topology: Select the node as Array Member and specify credentialsBefore you join the 2nd node as the array member, open the TMG console and add the 2nd server to the &ldquo;Managed Server Computers&rdquo; group. Install the Policy.Open the UAG console on the 2nd server and join him to the arrayTIP: If the UAG services on the 2nd node don&rsquo;t start, copy the content of folder C:\\\\Program Files\\\\Microsoft Forefront Unified Access Gateway\\\\von\\\\Conf from the manager to the member server. Then start the services.Now we have to configure the NLB from the UAG console. Open Network Load Balancing from the Admin menu and add the first VIP IP:Next you have to save and activate the configuration. UAG is now building the NLB cluster with both nodes. You can check the activity with the UAG Activation Monitor:Finally we have to open the WebMonitor and navigate to the Array Monitor section. There we have to start the NLB nodes:After you have started the nodes, the NLB status changes to &ldquo;Converged&rdquo;INFO: When you open the NLB manager, you will get RPC errors. The reason is that DCOM does not work with TMG/UAG. But don&rsquo;t worry, the cluster is OK if the Web Monitor doesn&rsquo;t show errors.In Part 2 I will explain how to publish Exchange 2013 OWA / OA and ActiveSync.Greetings dn\",\n  \"url\": \"https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-1/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-2\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 2\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Updated: 08.06.2013: The original post had some errors regarding RPC over TCP and the RPCClientAccessServer namespace. You would never want to move this namespace&#160; to CAS 2013 as the new CAS does not understand RPC over TCP.Welcome back, this is the second part of my series on migration to Exchange 2013. I covered prerequisites, installation and a little bit of management in the first post, now we’ll have a look at namespaces and certificates.Namespaces in Exchange 2013After installing Exchange, it’s time to start getting into the planning phase :) Ok, just kidding, I’ll use the newly installed Exchange server to walk through some planning steps, though.First of all, let’s make some assumptions. We do have an Exchange 2010 server and a CAS array with the RpcClientAccessServer endpoint configured to outlook.tomt.local. For OWA, EWS, OAB, EAS and Outlook Anywhere there is only one namespace, mail.tomt.it. Outlook Anywhere is configured with NTLM authentication, more on that later. Internal Outlook clients would connect (via MAPI) to outlook.tomt.local, external clients would use Outlook Anywhere (HTTPS) and connect to mail.tomt.it. The certificate on Exchange 2010 has a Subject of CN=ex14.tomt.local and the following SANs: ex14.tomt.local, mail.tomt.it. Ok, so far so good. Now when migrating to Exchange 2013, it is recommended that the new server takes over the namespace and deals with all incoming client connections. For incoming connections with a mailbox homed on Exchange 2013, our new CAS would simply proxy the request to the mailbox server hosting the mailbox. For mailboxes hosted on Exchange 2010, though, the 2013 CAS would act as HTTP proxy and connect the client with the Outlook Anywhere endpoint (/rpc) of the Exchange 2010 CAS. So what does that mean? First of all, this does not apply for internal, RPC over HTTP clients, the RPCClientAccessServer namespace is not moved to CAS 2013. If you are in the unfortunate situation to have the RPCClientAccessServer namespace match your OutlookAnywhere namespace, there is a very good post over at the Exchange Team Blog.For RPC over HTTP connections, OutlookAnywhere must be enabled on the Exchange 2010 CAS before Exchange 2013 CAS can take over the namespace, and the IIS Authentication methods must include the NTLM. The Exchange 2013 CAS is authenticated by Exchange 2010, this does not work with basic authentication. To make sure Outlook Anywhere is configured, and the IIS Authentication method includes NTLM use the following cmdlet on Exchange 2010.Get-OutlookAnywhere –Server ex14 | fl ExternalHostname, ClientAuthenticationMethod, IISAuthenticationMethodsTo add NTLM as an IIS Authentication method, use the following cmdlet. Note that the ClientAuthenticationMethod does not matter in this case.Set-OutlookAnywhere –Identity ex14\\\\rpc* –IISAuthenticationMethods Basic,NTLMNice, now Exchange 2010 CAS is ready and we can start thinking about the certificate request for Exchange 2013. We want the new CAS to take over the namespace, so we do already know which name to include: mail.tomt.it, but is that enough? Well, the answer is, it depends ;)Protocol specific namesExchange 2013 introduces some radical changes, including how client connections are handled. In 2010, client affinity was everything. Clients would always need to be redirected to the same CAS for a specific session, if that CAS would become unresponsive or if the client would connect to another CAS, re-authentication would occur. When talking about load-balancing, an expensive Layer 7 capable load-balancer was required. The load-balancer would intercept the traffic and make sure client A would always reach server A for a particular session. This had one clear advantage, though, because the load-balancer was L7 aware (knows which endpoint the client asked for), it could check if a particular endpoint was reachable on a CAS, and if not redirect the client to a CAS where it was reachable. This is not the case in 2013 anymore, client to CAS sessions are stateless and a less-expensive Layer 4 load-balancer (or DNS round-robin) could be used with 2013. A L4 load-balancer, on the other hand, would have no idea of what endpoint the client was looking for, it would only see and forward encrypted (https) packets. Protocol specific namespaces are here to solve that problem. If we created a virtual IP and a distinct name for each endpoint on the CAS (OWA, EWS, EAS…) the L4 load-balancer would be aware of what endpoint the client was looking for.So, long story short, we are going to include more names in that certificate. The subject is CN=ex15.tomt.local and the SANs are: ex15.tomt.local, oa.tomt.local, mail.tomt.it, owa.tomt.it, eas.tomt.it, ews.tomt.it, oab.tomt.it. In the DNS configuration we need a CName for all of these names pointing to our new CAS, or an A record pointing to the load-balancers virtual IP. Next, we’ll use the Exchange Management Shell to update the ExternalUrl properties of the virtual directories.Set-OwaVirtualDirectory –Identity ‘ex15\\\\owa (Default Web site)’ –ExternalURL https://owa.tomt.it/owa      Set-EcpVirtualDirectory –Identity ‘ex15\\\\ecp (Default Web site)’ –ExternalURL https://owa.tomt.it/ecp       Set-OabVirtualDirectory –Identity ‘ex15\\\\oab (Default Web site)’ –ExternalURL https://oab.tomt.it/oab       Set-WebServicesVirtualDirectory –Identity ‘ex15\\\\ews (Default Web site)’ –ExternalURL https://ews.tomt.it/ews/exchange.asmx       Set-ActiveSyncVirtualDirectory –Identity ‘ex15\\\\microsoft-server-activesync (Default Web site)’ –ExternalURL https://eas.tomt.it/Microsoft-Server-ActiveSyncAnd last, but not least we configure Outlook Anywhere on the new Exchange 2013 CAS.Set-OutlookAnywhere –Identity ‘ex15\\\\rpc (Default Web site)’ –InternalHostname oa.tomt.local –InternalClientAuthenticationMethod NTLM –InternalClientsRequireSsl:$true –ExternalHostname mail.tomt.it –ExternalClientAuthenticationMethod NTLM –ExternalClientsRequireSsl:$true –IISAuthenticationMethods Basic, NTLM, NegotiateNow that Outlook Anywhere command was pretty long, let’s break it into smaller pieces. First we are setting the InternalHostname, as Exchange 2013 uses Outlook Anywhere for all client connectivity (internal and external) we don’t use the RpcClientAccessServer anymore. Along with that we set the authentication method for internal clients as well as the requirement for SSL. Next we set that same pieces of information for external clients, and the last property is configuring the supported authentication methods by IIS.Wow, now we should finally be able to take over that namespace with our brand new Exchange 2013 CAS. I updated the DNS records for mail.tomt.it to point to the new CAS and created a new CName oa.tomt.local for the internal OutlookAnywhere used in Exchange 2013. Nothing really changes for Outlook when it connects to an Exchange 2010 mailbox from inside the network, it will still use the RPCClientAccessServer endpoint to connect to the mailbox using RPC over TCP.If the mailbox is on Exchange 2013, though, Outlook will use RPC over HTTP and connect to the internal OutlookAnywhere endpoint: From a OWA point of view, all users do log on using the new CAS now:Exchange 2010 mailboxes get proxied to the Exchange 2010 CAS for OWA. After this text heavy post we have a nice little overview of CAS in Exchange 2013, I wanted to cover mail routing in this post, given the length I reckon it be better to save that for the next one.I hope this has been informative for you as the reader, at least it was extremely so for me :)so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-2/\"\n},{\n  \"id\": \"post-migrating-from-exchange-2010-to-2013-part-1\",\n  \"title\": \"Migrating from Exchange 2010 to 2013 – part 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Exchange\",\"Server\"],\n  \"content\": \"This is my first post about migrating from an existing Exchange 2010 environment to Exchange 2013. I&rsquo;ll try do cover everything that seems important to me, if I miss something that you think should be covered&hellip; well, that&rsquo;s what comments are for :)Preparing for Exchange 2013All servers in the Exchange 2010 organization must be running service pack 3, if you haven&rsquo;t already installed SP3, as always it&rsquo;s a very good idea to start with reading the release notes. On the Exchange 2013 side of things, we need Cumulative Update 1, there is a very good post at the Exchange Team Blog about that.Ok, so assuming we are running Exchange 2010 SP3 and have downloaded CU1, let&rsquo;s get started with preparing the first Exchange 2013 server. All the required Windows Features can be installed with the InstallWindowsComponent.ps1 script located in the Setup\\\\ServerRoles\\\\Common directory of the CU1 install files. The script takes several parameters, in this case I&rsquo;ll be installing a multirole server, I want the AdminTools to be installed as well as the Remote Server Admin Tools for Active Directory..\\\\InstallWindowsComponent.ps1 AdminTools, MailBox, ClientAccess -ADToolsNeeded:$TrueNote that the script has no parameter for source files, the server needs internet access to download the required files. That&rsquo;s not always practical, so I edited the script and simply added &ldquo;&ndash;Source wim:d:\\\\sources\\\\install.wim:4&rdquo; to the Add-WindowsFeature cmdlet within the script.After the required reboot, we need to install Unified Communications Managed API 4.0 Runtimethe Office Filter Pack is not mandatory and can be installed later on, it still produces a warning during setup, though.Now that we have the new, designated Exchange 2013 server ready, we need to prepare Active Directory. Obviously, if you don&rsquo;t know what all this is about, don&rsquo;t do it! So, that said, from an elevated command prompt change to the directory containing the Exchange 2013 installation files. You&rsquo;ll need Schema, Enterprise and Domain Admin rights to run the following tasks.In the first step, setup will extend the schema, this is done using:.\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareSchemaThe next step is to prepare the Active Directory Forest, this creates the Microsoft Exchange container (if it doesn&rsquo;t already exist) and universal groups used by Exchange..\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareAD /OrganizationName tomtAnd the last step is to prepare the Domain, this needs to be done for every Domain that will contain Exchange servers or Mail-Enabled users, alternatively use /PrepareAllDomains:.\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareDomainEach step relies on Active Directory to replicate changes throughout the topology, you should absolutely wait for the changes of each step to be replicated before continuing with the next step. In a distributed environment such a change needs to be properly planned and would typically take place during a maintenance window.&nbsp;Installing Exchange 2013With all prerequisites checked, we can now continue with the installation of our first Exchange 2013 server. Easy as it is, I&rsquo;m not going to walk through graphical setup screens, you basically just select the server roles to be installed and click next. There is a command line version of the setup, too. Try setup.exe /help:Install for a list of parameters that can be used to customize the installation. The Exchange setup is pretty smart, meaning that it keeps track of the installation and if errors occur, you will be able to continue right from where the error happened, no need to click through all the windows again. It also provides a lot of information in the ExchangeSetupsLogs folder, located at the root of the drive on which Exchange is installed.Something new with setup is that you cannot remove server roles anymore, the only way to do that would be to completely uninstall Exchange and re-install the role of choice.So, installing Exchange 2013 was pretty easy, let&rsquo;s move on the the more interesting stuff.Managing Exchange 2013The first thing I wanted to see after the setup completed, was the shiny new Exchange Admin Center, so I went straight to IE and typed https://localhost/ecp, I entered my credentials on the neat, new login screen only to see the good, old Exchange Control Panel from 2010. It took some time, but then I realized that that was exactly correct behavior. The Exchange 2013 Client Access Role is a stateless proxy and no longer responsible for rendering OWA (or anything for that matter) and my mailbox was still on Exchange 2010, so my request got proxied to 2010. There are two solutions for this, move your admin mailbox to 2013, or less troublesome, simply add ?ExchClientVer=15 to the URL. https://localhost/ecp?ExchClientVer=15 takes you right to the Admin Center. This is also the only way (I found) to access the Admin Center with a user that has no mailbox.From an Exchange Management Shell point of view, everything is very similar to the way we are used from Exchange 2010, a new remoting session can simply be created using:$Session = New-PsSession &ndash;ConnectionURI &lsquo;http://ex15.tomt.local/PowerShell&rsquo; &ndash;ConfigurationName 'Microsoft.Exchange&rsquo; Import-PsSession $SessionThat&rsquo;s it for the first part, in the second part I&rsquo;ll try to cover the basics of namespace planning, mail routing and maybe move some mailboxes.I see some real world projects coming closer and I know Daniel is working hard on the topic, I&rsquo;m sure there is more content coming&hellip; :)so long, enjoy your weekend!tom\",\n  \"url\": \"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-1/\"\n},{\n  \"id\": \"post-whats-happening-these-days\",\n  \"title\": \"What’s happening these days…\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"It has been quiet around here for some time, so what have I been up to?Well, on one side, I’m having fun at the Scripting Games (http://scriptinggames.org/) where I learn quite a bit (more from reviewing other entries, than from my own coding) and try to to improve my PowerShell skills. I’ll point out some of the things I’ve learned later on.On the other side, I’ve decided to quit my job in the heart of the Italian Alps and accepted a role in Germany, in the nice city of Paderborn. So the last few weeks have been pretty busy for me, moving my stuff from northern Italy way up to northern (at least for me) Germany. Right now I am trying to get used to my new surroundings and I do learn something every day :)So, what are my key takeaways from the Scripting Games so far?   Standard cmdlet parameter names: While I did know that there was a list of allowed Verbs (Get-Verb), I wasn’t aware that there was something similar for parameter names and types, too. Check out MSDN for more information.    Help and comments should be nested under the function, so if you are used to just press “Ctrl+J” to insert a new “empty” function and start from there, remember to move the help inside the function { } block.    ConvertTo-HTML has some really neat parameters like –Head, –PreContent and –PostContent so you can enhance and customize the HTML report generated by the cmdlet.    I started to use splatting to set parameter values and think this is really useful, basically you assign common values for parameters to a hash table and pass it to the cmdlet. I’ll post quick example later.    Filter, I tend to get every possible bit of information and then use Where-Object to select the few properties I really need, that’s not really efficient as most cmdlets provide a way to filter or just ask for the properties you need. And here comes the example for splatting:if ($Credential) {     &#160;&#160;&#160; $wmiParam = @{'Credential'=$Credential; 'ErrorAction'=&quot;Stop&quot;}      } else {      &#160;&#160;&#160; $wmiParam = @{'ErrorAction'=&quot;Stop&quot;}      }       Get-WmiObject @wmiParam –ComputerName “myComputer” –Class “Win32_Processor”This passes a hash table (wmiParam) to the Get-WmiObject cmdlet, so I don’t have to set the ErrorAction every time and the Credential parameter is only used when a $Credential object exists.&#160;Yeah, and that’s what’s new with me :)tom\",\n  \"url\": \"https://onprem.wtf/post/whats-happening-these-days/\"\n},{\n  \"id\": \"post-joining-wifi-before-login-on-mac-os-x-108\",\n  \"title\": \"Joining WiFi before login on Mac OS X 10.8\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\"],\n  \"content\": \"We had an interesting problem at work recently, as the solution was a little complex I decided to write about it here. So, as the title suggests, we are talking Wireless networking, authentication and Mac OS X today. It’ll be fun, trust me :)Some prerequisites: We use EAP-TLS as the authentication protocol for WiFi and SCEP for certificate enrollment. I’ve written about SCEP before, in a different context, though. We also use the iPhone Configuration Utility to deploy configurations to devices, more on that later. The ProblemWe join our MACs to the Active Directory domain and want our users to be able to login using their domain credentials. Obviously you need some sort of connectivity to the AD in order to login, we used to configure Wireless Networks as “System Profile” in OS X in the past. Unfortunately, that GUI went away in more recent versions of that operating system.This is a screenshot of 10.5, simple enough. As we tried to configure that same thing on 10.8, though, we realized that this little option was gone. All Wi-Fi networks would be started AFTER the used login, no AD login was possible. Oops.After scratching our heads for a while, we found a workaround other than installing Windows ;)The SolutioniPhone Configuration Utility was used ever since we had the requirement to connect iOS devices to the wireless network, it can be used to create configuration files that can be deployed to iOS devices. It has been possible for some time to deploy these same configuration files to OS X, too. As they are simple XML files, we took a deeper look into them. Wwith some help from Google we found that we could change the Wi-Fi payload to be a “System Profile” instead of a “User Profile”, and thus be started BEFORE user login.So, first thing is to create a configuration profile using iPhone Configuration Utility. Choose a name, identifier and description for the profile. Add the certification authorities certificate, so we trust certificates issued by our internal CA.  Configure SCEP, the iPhone or MAC is going to connect to the SCEP URL to enroll a certificate using the specified subject. Add the Wi-Fi payload, specifying the SSID and authentication protocol. As we use EAP-TLS we use the SCEP certificate to authenticate.Once the profiles is configured, export it: We get a .mobileconfig file from the export, it can be edited using a simple text editor. Here comes the fun part, we have to add the following lines to the configuration file:&lt;key&gt;SetupModes&lt;/key&gt;      &lt;array&gt;       &lt;string&gt;System&lt;/string&gt;       &lt;/array&gt;       &lt;key&gt;PayloadScope&lt;/key&gt;       &lt;string&gt;System&lt;/string&gt;This part goes just underneath the PayloadOrganization in the AutoJoin section.And we have to change “Configuration” at the very end of the file from:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;Configuration&lt;/string&gt;to “SystemConfiguration”:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;SystemConfiguration&lt;/string&gt;As it is quite important where you change/add the lines, I’ll paste a complete file for reference.&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      &lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;       &lt;plist version=&quot;1.0&quot;&gt;       &lt;dict&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AutoJoin&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPClientConfiguration&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AcceptEAPTypes&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;13&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPACAnonymously&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTUsePAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateAnchorUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EncryptionType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WPA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;HIDDEN_NETWORK&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures wireless connectivity settings.&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WiFi (MYSSID)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.wifi1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SetupModes&lt;/key&gt;        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadScope&lt;/key&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.wifi.managed&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;2CD56B1A-068C-4F3C-AC43-9D4E2115260F&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServer&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;proxy.ntsystems.it&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServerPort&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;8080&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Manual&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SSID_STR&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;MYSSID&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateFileName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MIIDYzCCAkugAwIBAgIQL1CM7d+PQrhAgO7UcdHbyDANBgkqhkiG&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bnBODc20wZMRDAhWuA==       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Provides device authentication (certificate or identity).&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.credential2&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.root&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Challenge&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;4F20EACEDE479165&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Type&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;RSA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Usage&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;0&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Keysize&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;2048&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Name&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Retries&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;3&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;RetryDelay&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;10&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Subject&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;CN&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;macbookair$&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;URL&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;https://scep.tomt.it/certsrv/mscep/mscep.dll&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures SCEP&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;SCEP (tomt-DC01-CA)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.scep3&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.scep&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt-wlan&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadRemovalDisallowed&lt;/key&gt;       &#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160; &#160; &lt;string&gt;SystemConfiguration&lt;/string&gt;        &#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;B58A2BCB-7617-421B-B0C8-12DE22B5A2B1&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &lt;/dict&gt;       &lt;/plist&gt;Now, if we copy that file to the MAC OS X machine, we can import the wireless configuration and it will be a system profile. Phew.(In this case we need some sort of connectivity in order to enroll for a certificate over SCEP, this could be via LAN or an open guest Wi-Fi)SummaryIt might be though to get your head around this if EAP-TLS and SCEP are new, yet the same idea holds through for a Username/Password or even pre-shared key authentication protocol. The problem remains the same, Wi-Fi user profiles are started after the user logs on, rendering Active Directory logins impossible. We couldn’t find a solution to change that behavior without the iPhone Configuration Utility.Would be happy to hear about others experiences with this stuff.Special thanks to my mate @eduriz :)&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/joining-wifi-before-login-on-mac-os-x-108/\"\n},{\n  \"id\": \"post-patching-office-web-apps-server\",\n  \"title\": \"Patching Office Web Apps Server\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Today I started my day with an Office Web Apps Farm that was not working anymore. After reviewing the Event Log I figured something strange happened… :)The Event Log was basically full with .Net Runtime and Application Errors, I’ll paste some for reference:Log Name: ApplicationSource: .NET RuntimeEvent ID: 1026Application: ppteditingbackendwatchdog.exeFramework Version: v4.0.30319Description: The process was terminated due to an unhandled exception.Exception Info: System.TypeInitializationExceptionStack:&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.ServiceInstanceFinder.GetLocalAgentInstance(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.PrepareRegistrations(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.WatchMachines(Microsoft.Office.Web.Common.OfficeServiceType, CheckServiceInstance, Microsoft.Office.Web.Common.OfficeServiceType, System.String)&amp;#160;&amp;#160; at Microsoft.Office.Server.Powerpoint.Watchdog.EditingBackend.Program.Main(System.String[])...Log Name: ApplicationSource: Application ErrorEvent ID: 1000Faulting application name: ppteditingbackendwatchdog.exe, version: 15.0.4481.1000, time stamp: 0x50ee5a9eFaulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988aa6Exception code: 0xe0434352Fault offset: 0x000000000003811cFaulting process id: 0x94cFaulting application start time: 0x01ce2b83409e789aFaulting application path: C:\\\\Program Files\\\\Microsoft Office Web Apps\\\\PowerPointEditingServicesWatchdog_App\\\\ppteditingbackendwatchdog.exeFaulting module path: C:\\\\Windows\\\\system32\\\\KERNELBASE.dllReport Id: 7e88e5ec-9776-11e2-93f3-0050569e79e3Faulting package full name:Faulting package-relative application ID: There would be the same errors for all of the Web Apps (Excel, Word…) Needless to say, neither SharePoint 2013 nor Lync 2013 would be able to leverage features that required Web Apps Server. So, what’s next?Well I continued digging through the Event Log and realized that the Server was patched and restarted very recently, as part of the patching someone applied KB2760445. Sweet.So I started searching TechNet for information on that Update for Office Web Apps and found a nice article on how to Apply software updates to Office Web Apps Server. Basically it goes like this: After patching the Server, you will have to re-create the Office Web Apps Farm. In my case, I simply removed the farm usingRemove-OfficeWebAppsMachineand then re-used the same cmdlet I used to create the Web Apps Farm initially.New-OfficeWebAppsFarm -InternalUrl \\\"https://myOWAserver.tomt.local\\\" -ExternalUrl \\\"https://office.ntsystems.it\\\" –CertificateName \\\"ntSystems OfficeWebApps\\\" –EditingEnabledAll set.If there is one take-away from this, it is very likely: Read that documentation, oh, and please, do test!Tom\",\n  \"url\": \"https://onprem.wtf/post/patching-office-web-apps-server/\"\n},{\n  \"id\": \"post-prepare-windows-server-2012-for-lync-2013\",\n  \"title\": \"Prepare Windows Server 2012 for Lync 2013\",\n  \"author\": \"dni\",\n  \"tags\": [\"Lync\",\"Skype4B\"],\n  \"content\": \"To prepare a Windows Server 2012 for a Lync 2013 installation, install the following features manually before you run the Lync setup:.Net Framework 3.5Windows Identity Foundation 3.5   Media Foundation    HTTP Activation    Use the Powershell to speed up the installation:Install-WindowsFeature –name NET-Framework-Core –source D:\\\\sources\\\\sxs (the Windows 2012 Disk is mounted on D: )Install-WindowsFeature –name Windows-Identity-Foundation,Server-Media-Foundation,NET-HTTP-ActivationIf you have to prepare the AD schema, install also the AD DS Administration Tools.\",\n  \"url\": \"https://onprem.wtf/post/prepare-windows-server-2012-for-lync-2013/\"\n},{\n  \"id\": \"post-installing-lync-2013-updates\",\n  \"title\": \"Installing Lync 2013 Updates\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Server\",\"Skype4B\"],\n  \"content\": \"A few days ago, Microsoft released a bunch of updates for Lync 2013. I will walk through the required steps to upgrade a Lync 2013 Standard Edition server in this post. The February updates for Lync 2013 enable some new features including Lync 2013 mobile Clients, Group Call pick-up and many more…Get Files and read documentationHead over to the download center and download the update files: http://www.microsoft.com/en-us/download/details.aspx?id=36820Make sure you read the corresponding KB article as there are some manual steps required after the update: http://support.microsoft.com/kb/2809243InstallPrior to installing the updates stop the Lync Services, you can use the –Graceful parameter:Stop-CsWindowsService –GracefulYou can use Get-CsPoolUpgradeReadinessState to check if the pool you are going to update is ready.Copy all the files from the download to a local folder on the Lync Server, open LyncServerUpdateInstaller.exe and install the updates by clicking “Install Updates”&#160;After installing the updates, check the folder with the update files for logs. If everything installed correctly, reboot the server.Update DatabasesAfter the reboot, the databases need to be updated, too. On a standard edition front end server, the databases are installed locally, so you can update them using the following cmdlets:Install-CsDatabase -ConfiguredDatabases -SqlServerFqdn lyncfe.ntsystems.local –VerboseThe Central Management Store needs an update too, it is also co-located on the standard edition server:Install-CsDatabase -CentralManagementDatabase -SqlServerFqdn lyncfe.ntsystems.local -SqlInstanceName rtc –VerboseAfter that, the newly published topology needs to be enabled, this can be done using the Enable-CsTopology cmdlet.Enable-CsTopologyNow the last step is to run the Bootstrapper on the updated front end servers, it can be found on the Lync Server in the following path:&quot;%ProgramFiles%\\\\Microsoft Lync Server 2013\\\\Deployment\\\\Bootstrapper.exe&quot;That should be it and the Lync 2013 February updates have been installed.so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/installing-lync-2013-updates/\"\n},{\n  \"id\": \"post-activesync-forefront-tmg-and-accountlockoutthreshold\",\n  \"title\": \"ActiveSync, ForeFront TMG and AccountLockoutThreshold\",\n  \"author\": \"tto\",\n  \"tags\": [\"en\",\"Server\",\"Security\"],\n  \"content\": \"The use of smartphones and other mobile email clients has been increasing for quite some time. With ActiveSync being one of the widest-used protocols comes the need to manage another set of devices. As users are forced to change their domain account&rsquo;s passwords from time to time, some might forget to update their smartphones as well.The ProblemSo, as a user changes their password, the mobile device will continuously try to sync with a wrong set of credentials. Now depending on the rate at which it tries to sync, this might very well lock-out the users AD account, depending on the Domains Password Policy.Another possibility to consider is an attacker who could create quite a disturbance by locking out accounts intentionally, using any published Web Site with Forms Base Authentication.The SolutionForefront TMG 2010 SP2 comes with a new feature, called AccountLockoutThreshold. Forefront TMG keeps track of failed logons and locks the account locally, after a specified amount of failures. After that, any other attempt to authenticate via TMG is not forwarded to Active Directory/LDAP, so that the users account does not get locked-out continuously .The AccountLockoutThreshold feature is local to the Forefront TMG server, so if there is an array of publishing servers, it has to be configured on each of them. It can only be configured for Web Listeners using Forms Based Authentication.To configure AccountLockoutThreshold we need to use PowerShell, there is no GUI that exposes this setting. A great script to control the settings is available in the Script Center. So, we copy the script and save it to a *.ps1 file on the Desktop of the TMG Server, then we use dot-sourcing to load it into an administrative PowerShell session.Example: I saved the script to AccountLockout.ps1 on the Desktop. Use &ldquo;. .\\\\Desktop\\\\AccountLockout.ps1&rdquo; to import the script.The Get-AccountLockoutSetting cmdlet is used to retrieve the current settings.&nbsp;The Set-AccountLockoutSetting cmdlet is used to configure the feature.Example: I use &ldquo;Set-AccountLockoutSetting -WebListener OWA -EnableAccountLockout $true -AccountLockoutThreshold 5 -AccountLockoutResetTime 300&rdquo; to enable the AccountLockout feature, accounts will get locked out for 300 seconds if there are 5 consecutive failed attempts.Once configured, the following event will be logged to the Application Log of the TMG server if an account gets locked out locally:Source: Microsoft Forefront TMG Web Proxy Event ID: 32581 Level: Error Text: limit for consecutive logon failures has been reached. Additional logon attempts by domain.local\\\\user.name will be automatically rejected for the next 300 secondsUnfortunately TMG has been discontinued and is no longer available for customers, but for anyone already using it, this should help you dealing with Account Lockout Policies and ActiveSync devices.&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/activesync-forefront-tmg-and-accountlockoutthreshold/\"\n},{\n  \"id\": \"post-lync-2013-(client)-and-lyncdiscoverinternal\",\n  \"title\": \"Lync 2013 (Client) and LyncDiscoverInternal\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Client\",\"Skype4B\"],\n  \"content\": \"Daniel and I have been quite busy implementing Lync 2013 these days. One interesting gotcha thing we knew, but didn’t give a lot attention about the Lync 2013 client is, that it makes use of the LyncDiscover and LyncDiscoverInternal DNS records. These records were introduced with Lync 2010 Mobility and were used by the mobile clients to locate a sign-in server. Lync 2010 Clients don’t look for them, they use _sipinternaltls._tcp and _sip._tls records for auto sign-in.With the Lync 2013 Client that changed. The new client now queries for the following DNS records in order to sign-in automatically:   LyncDiscoverInternal.ntsystems.it    LyncDiscover.ntsystems.it    _sipinternaltls._tcp.ntsystems.it    _sip._tls.ntsystems.it    sipinternal.ntsystems.it    sip.ntsystems.it    sipexternal.ntsystems.it  So, as you can see, even before trying to locate the SRV records, the 2013 Client tries to connect to the AutoDiscover Web Service. That works just fine, in most situations.But… in a configuration like the following you might run into this bug get a certificate warning when signing into Lync for the first time from the internal network.   You have a disparate namespace (like ntsystems.local for your Lync Servers while ntsystems.it is your SIP domain) AND    You use internal certificates on the Front End Servers AND    You have Split DNS configured (ntsystems.it on the internal DNS servers) AND    You set LyncDiscoverInternal.ntsystems.it DNS record (for public zone on internal DNS server) The certificate warning shows the server name to which Lync is attempting to connect, it also shows the certificate subject and you can view the certificate. You double (triple) check the certificate, subject alternate names, dates, DNS, basically everything and it seems to be just fine. Still, you continue to get the warning.WorkaroundFirst of all, I have to say that I do not fully understand why this happens. The way I see it, is that Lync 2013 connects to the internal Web Service (using LyncDiscoverInternal) and all certificate parameters are fine… As you are probably not going to get a certificate for ntsystems.local from a public CA I wonder what the right solution looks like…The good news: There is a workaround for this, you can use Group Policy to configure Lync 2013 to configure the Trusted Domain List. According to TechNet, this “Lists the trusted domains that do not match the prefix of the customer SIP domain.” – nice. So, I added ntsystems.local to the Trusted Domain List that can be found in User and Computer Configuration under: Administrative Templates/Microsoft Lync 2013/Microsoft Lync Feature PoliciesYou can download the admx/adml files for Office 2013 here. The Group Policy adds the domain to the either “HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync\\\\TrustModelData” or “HKEY_CURRENT_USER\\\\SOFTWARE\\\\Policies\\\\Microsoft\\\\Office\\\\15.0\\\\Lync\\\\TrustModelData” depending on what you choose in the Group Policy Object. Another workaround would be to simply remove the LyncDiscoverInternal record from the internal DNS zone, which breaks mobile clients (including Lync Windows Store App) on the internal network (Wireless). Not really a solution…Again, I don’t fully understand the problem, this is what I found during my research. If you have a better solution, please drop me a line :)&#160;Happy New Year and have a nice weekend,    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-(client)-and-lyncdiscoverinternal/\"\n},{\n  \"id\": \"post-lync-2013-installation-and-certificates\",\n  \"title\": \"Lync 2013 – Installation and Certificates\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Server-2012\",\"Skype4B\"],\n  \"content\": \"This post is the follow-up to the one about AD and topology preparation and I will again use screenshots to walk through the Installation and Certificate request and assignment processes.DNS RecordsThe last post ended with publishing the Topology, after that, the wizard provides a simple To-Do list, summarizing the next steps. Creating the DNS records for our Simple URLs was one of them. So, using DNSmgmt.msc I created CNames for the meet, dialin and lyncadmin URLs, all pointing to the Lync Front End Server.The DNS Records used for automatic sign-in are not mentioned in said To-Do list, though. I created the sip.tomt.local record as just another alias pointing to the Lync FE Server. Automatic Sign-in also needs the following Service Location Record (SRV)_sipinternaltls._tcp.tomt.local SRV service location:     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; port&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 5061      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; svr hostname&#160;&#160; = lyfe01.tomt.localAll in all, I do now have the following DNS Records:            HostName        RecordType        RecordData                  _sipinternaltls._tcp        SRV        [0][0][5061][lyfe01.tomt.local.]                  lyfe01        A        10.1.1.11                  dialin        CNAME        lyfe01.tomt.local.                  meet        CNAME        lyfe01.tomt.local.                  sip        CNAME        lyfe01.tomt.local.                  lyncadmin        CNAME        lyfe01.tomt.local.        Server PrerequisitesThe next step is to install the prerequisites on the Lync Server, for more information check TechNet. I use the following PowerShell cmdlet to install Lync Server prerequisites, make sure you specify a “–Source”.   Add-WindowsFeature NET-Framework-Core, NET-Framework-45-Features, RSAT-ADDS, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Redirect, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Http-Tracing, Web-Windows-Auth, Web-Client-Auth, Web-Basic-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, Web-Mgmt-Console, Web-Scripting-Tools, Web-Request-Monitor, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Mgmt-Compat, Desktop-Experience, Telnet-Client, BITS, Windows-Identity-Foundation –Source ‘D:\\\\sources\\\\sxs’ –Restart&lt;/code&gt;  Now after the reboot open Lync Deployment Wizard again and click &quot;Install or Update Lync Server System&quot;    After installing Local Configuration Store and Lync Server Components, we need to request and assign Certificates for Lync to use.    If you use an online (enterprise) CA, select send request immediately, if you intend to send the request to a public CA, select the offline certificate request option. As I have ADCS installed in my test forest, I use the enterprise CA for this.    Optionally specify credentials and a certificate template, if your current user has permissions to request a certificate using the “WebServer” template, click next. Then specify the friendly name for and the key length for the certificate.    Lync automatically includes the required Alternative Names along with Simple URLs and external pool name. Other details (such as City, Country, Region) typically used in certificate requests can be specified too.    Select the SIP Domains, so that they are included, too. You can optionally add additional SANs, I didn’t need any more than the ones included by the wizard.  Request the Certificate and tick the “Assign this certificate…” checkbox.    If you plan to use Server-to-Server authentication (Office Web Apps, Exchange, SharePoint) also request an OAuth Certificate. The procedure is the same as for the Server certificate.    The OAuth Certificate is a &quot;Global&quot; Certificate, that means that Lync Central Management Store replicates it to all Lync Servers, and all Lync Servers will use the same Certificate for OAuth.  Starting the Services  Phew, now after all those steps, we can finally go ahead and start the services. Give it some time, and check if all services are started using services.msc.  Now, we can use Lync Server Control Panel to check out our work. I prefer to use the Control Panel on my client PC, as it requires Silverlight to be installed. So, on a Computer sporting Silverlight, open the Simple Administration URL specified before.     I will continue to test some features of Lync 2013, stay tuned for more!  &#160;  so long, have a nice weekend!   tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-installation-and-certificates/\"\n},{\n  \"id\": \"post-lync-2013-prepare-ad-and-build-topology\",\n  \"title\": \"Lync 2013 – Prepare AD and build Topology\",\n  \"author\": \"tto\",\n  \"tags\": [\"Lync\",\"Server-2012\",\"Skype4B\"],\n  \"content\": \"In this post I use the screenshots taken in my test environment to walk through the steps of setting up a Lync 2013 Standard Edition Front End Server in a test environment.Install Deployment ToolsFirst of all we need to install the Lync Deployment Wizard on a server, this doesn’t necessarily have to be the Lync Server, although it’s a good idea to use this server. So, start Setup and select a location for the installation files.&#160;After that installation finishes, we we start the Deployment Wizard and install the administrative tools. Preparing Active DirectoryWarning: This is going to update the AD schema, make sure you are in test environment.From the Lync Server Deployment Wizard click “Prepare Active Directory” and update schema, prepare the forest as well as the current domain. The following cmdlets can be used to check domain/forest readiness.Get-CsAdDomain: If Domain is ready: LC_DOMAINSETTINGS_STATE_READY    Get-CsAdForest: If Forest is ready: LC_FORESTSETTINGS_STATE_READYNow preparing the current domain created some AD groups used by Lync. Add the account used to administer Lync to the CSAdministrator group.Define TopologyAfter preparing Active Directory we are ready to create a new Topology using the Topology Builder. So we start Topology Builder and create a new TopologySpecify a primary SIP domain, additional SIP domains can be specified in the next step.The first thing we need to create is a new Site within our new topology, specify a name and some details for the first Lync SiteStart the New Front End Pool wizard after finishing the New Topology wizard and enter the FQDN of your Lync Standard Edition Server. Specify the Lync Server Features to be installed on this serverAs we add Enterprise Voice and Conferencing we need a Mediation Server, tick the check box to Collocate the Mediation ServerDefine the SQL Store for the front end pool, as we install a Standard Edition Server we cannot change this Select a File Share that has already been added to the Topology builder or create a new one Specify the external URL, this URL will be used by external clientsAssociate an Office Web Apps Server that has already been added to the Topology or add a new one, if you have oneIf you selected the Monitoring on the features page, specify a SQL instance with Reporting Services. This can be installed locally or on a remote SQL server After finishing the new Front End Pool wizard, configure Simple URLs and Associate Central Management Server by right clicking “Lync Server” and selecting Edit Properties in the Topology BuilderCheck the Configured Settings and publish the Topology by selecting Action from the menu and clicking “Publish Topology”Ok, nice work. We have just created and published our Lync 2013 Topology. Time to get the Server ready.In the next post I will walk through the actual installation of the Lync 2013 Standard Edition Front End Server.so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-prepare-ad-and-build-topology/\"\n},{\n  \"id\": \"post-lync-2013-voicemail-escape\",\n  \"title\": \"Lync 2013 – Voicemail Escape\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Lync\",\"Skype4B\"],\n  \"content\": \"With the availability of all Office Wave 15 products, Lync 2013 piloting has begun. Exciting times :)So, this is a quick post about a new feature in Lync Server 2013, voicemail escape. What this does is, essentially providing a &ldquo;too soon&rdquo; timer for PSTN calls. Ok, you might say, why do I need such a thing?Well, if an enterprise voice user configures simultaneous ringing on her mobile phone, and that phones battery died or she wandered into an area with no network coverage, her provider&rsquo;s voicemail would answer. Now, even if she was sitting on her desk, she might never get the call, as the caller would always go to her voicemail. Voicemail escape defines a timer using the &ldquo;Set-CsVoicePolicy&rdquo; cmdlet, if a call is answered before that timer elapsed, Lync would ignore that answer and keep the call on premises.Enable the VoicemailEscapeTimer:Set-CsVoicePolicy -EnableVoicemailEscapeTimer:$true -PSTNVoicemailEscapeTimer:5000EnableVoicemailEscapeTimer enabled the timer. PSTNVoicemailEscapeTimer sets the timer (in ms) used to determine whether or not a call has been answered &ldquo;too soon&rdquo;.MonitoringThe Lync Monitoring server shows those ignored answers with a SIP Response Code of 480 and a Reason of: &rsquo;Terminating call as it is answered earlier than the specified voicemail escape timer&rsquo;The Lync Server Logging tool (Component: S4, Level: All) shows the timer in the SIP INVITE packet as:ms-vm-escape-timer: 5000You may have to tune the timer depending on your setup and the providers you are using. I had to set it pretty high to actually see an effect.so long, tom\",\n  \"url\": \"https://onprem.wtf/post/lync-2013-voicemail-escape/\"\n},{\n  \"id\": \"post-windows-server-2012-virtualized-domain-controller\",\n  \"title\": \"Windows Server 2012 – Virtualized Domain Controller\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"Hello, welcome and a very happy new year!During Windows Server 8 Beta times, I wrote about virtualizing Domain Controllers and the VM-GenerationID attribute, since the old post was in German and about the beta version, this will be an updated translation.ProblemThe problem in Active Directory versions before 2012 was, that the restore of a snapshot would introduce a condition known as USN-Rollback, breaking replication between Domain Controllers. For that reason, DCs could not leverage all features of a modern, virtualized environment. Cloning a DC was pretty much unthinkable. Until now!VDC Safe RestoreThe Active Directory replication model assigns an ongoing number to every transaction (Update Sequence Number). DCs keep track of these numbers, along with a unique identifier (Invocation ID) for each replication partner. If a DC was rolled back in time (applying a snapshot), that DC would start reusing aged USNs and, therefore, replication partners would refuse the updates and terminate the replication partnership. The only resolution for this problem was to manually remove the DC from the Active Directory.Now, Windows 2012 introduces a feature to tackle that problem. The Hypervisor exposes a VM-Generation ID through the ACPI table, this ID is saved in the Domain Controllers memory. If the VM-Generation ID changes (e.g. when a snapshot is applied), the restored DC knows that something happened and resets it’s invocation ID.&#160;As replication partners have never heard of the new Invocation ID before, they don’t care about USN reuse and replicate like it was a new relationship. Apart from resetting the Invocation ID, the DC also, non-authoritatively restores SYSVOL and logs the following Event to the “Directory Services” Event Log.The new Active Directory attribute used to store the VM-Generation ID is ms-DS-Generation-Id, find more information about that attribute on MDSN.There is no need (and no way) to configure VDC Safe Restore, as long as the Hypervisor supports VM-Generation ID, it automatically works. In a recent blog post VMware announced support for VM-Generation ID for it’s vSphere platform, so now you can choose Hyper-V 2012 and VMware’s ESXi as Hypervisor for your Domain Controllers.A word of caution at the end, never, and I mean NEVER, stop taking regular (AD aware) backups! The feature discussed in this post is meant just to solve the USN-Rollback issue, it is in no way a replacement for a backup as the DC is restored in a non-authoritative way.Stay tuned for DC cloning :)&#160;so long, have a nice weekend!   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-2012-virtualized-domain-controller/\"\n},{\n  \"id\": \"post-powershell-v3-invoke-webrequest\",\n  \"title\": \"PowerShell v3 Invoke-WebRequest\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Today I have a quick function to download the current Sysinternals Suite from http://live.sysinternals.com. I created this mainly to learn/try some concepts of PowerShell, if you have any hints/ideas feel free to drop me a mail.This function leverages the new &lsquo;Invoke-WebRequest&rsquo; cmdlet, available in PowerShell v3, so, obviously V3 is required.Example use:Update-SysinternalsSuite -Path C:\\\\tools\\\\sysinterals &ndash;AsJobThis downloads the Sysinternals Tools to C:\\\\tools\\\\sysinternals. If the specified folder does not exist, the script creates it. It also makes use of background jobs, so you can keep using PowerShell during the download.I&rsquo;ve posted the Function to PoshCode:&nbsp;enjoy, tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-v3-invoke-webrequest/\"\n},{\n  \"id\": \"post-microsoft-ndes-and-cisco-ios-part-2\",\n  \"title\": \"Microsoft NDES and Cisco IOS – part 2\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Network\"],\n  \"content\": \"This is part two of my article about NDES and Cisco. In the first article, I configured the Windows 2012 NDES role, in this part I will walk you through the enrollment process on a Cisco IOS router.RSA keySo what are we going to do here? We will be leveraging SCEP to obtain a digital certificate from a CA. As a prerequisite to this, the router needs a key-pair, that is, private and public keys. The public key will be sent to the CA (using SCEP), the CA will sign that public key and send the certificate (signed public key) back to the router.If you are already using services like “ssh” or “ip http secure-server” you can use the existing keys. If no keys exist, the router will create a new set of keys as we enroll for a certificate. This auto generated key-pair is only using a 512 bit key, that is not considered secure anymore.To create a new key-pair, using a reasonable secure key length:&#160;TrustpointHaving the keys in place, we need to get the CA certificate. The router will use the CAs public key to authenticate the CA and other digital certificates issued by that same CA.To download the CA certificate we define a new trustpoint and set to enrollment URL to the SCEP URL, if you have no name resolution configured, be sure to use the IP address of the SCEP server instead of the name.The SCEP URL defaults to: http://servername:80/CertSrv/mscep/mscep.dll After configuring the trustpoint, we tell the router to download the CA certificate: ´IOS shows the Thumbprint (fingerprint) of the digital certificate, so one could verify that this is the correct certificate using an out-of-band method.A quick look at the running-config shows that the key was received.EnrollNow that the router does trust our CA we can go ahead and request a digital certificate: IOS prompts for a password that would be used to revoke the certificate, and you can choose to add the IP address or serial number to the certificate. The request gets signed by the CA and the certificate is sent back to the router, you should see the following messages in the log or on “terminal monitor”CRYPTO_PKI:&#160; Certificate Request Fingerprint MD5: 4C9C472F 605AA33F 869EB167 9F097C56    CRYPTO_PKI:&#160; Certificate Request Fingerprint SHA1: E943141D 19A5C4EB 6B5EE5D2 B87AAF57 B829FFED     %PKI-6-CERTRET: Certificate received from Certificate AuthorityThe IIS Log on the SCEP server shows the successful transaction like this:2012-11-30 18:58:19 192.168.1.21 GET /CertSrv/mscep/mscep.dll/pkiclient.exe operation=PKIOperation&amp;message=MIIJUgYJKoZIhvcNAQcCoIIJQzCCCT8CAQExDjAMBggqhkiG…   …2Bw6Q1AJGzQs4wl7jA4GvWvikdP1wnPzAkVP7KZ%2FZ1%2Fz4hCYNpP4%3D%0A 80 - 192.168.1.1 - - 200 0 0 277In the “Certificate Authority” MMC Snap-In you see the certificates that have been issued:  &#160;That was the second, and final part on NDES and IOS routers.so long,tom\",\n  \"url\": \"https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-2/\"\n},{\n  \"id\": \"post-microsoft-ndes-and-cisco-ios-part-1\",\n  \"title\": \"Microsoft NDES and Cisco IOS – part 1\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"Cisco\",\"Security\"],\n  \"content\": \"With digital certificates being the de-facto standard for authentication, a handy enrollment model is key (pun intended). Microsoft included it’s NDES or Network Device Enrollment Service as a Role in Windows 2008, it has been available as add-on for Windows 2003, too. NDESSo, NDES sounds pretty cool, but what is it, you may wonder. It’s Microsoft’s implementation of SCEP or Simple Certificate Enrollment Protocol, which is a PKI communication protocol that leverages existing PKCS#10 and #7 technology over HTTP. It provides a simple means of requesting and issuing digital certificates across different devices and vendors.&lt;/p&gt;Installing NDES on Windows Server 2012To use SCEP with your existing ADCS based PKI simply add the Role to the Server that provides CA Web Enrollment. I’m not going through the details of setting up a ADCS based PKI here, that might very well be a topic for a future post, though.Add the Role using ServerManager or Windows PowerShell:Install-WindowsFeature –Name ADCS-Device-EnrollmentConfiguring NDESAfter successful installation of the Role, ServerManager informs you that there is some sort of configuration required for the newly added feature.An AD user account is required for the NDES service to use. That account must be member of the local IIS_IUSRS group on the NDES Server. I created a user with the name of scep and added it to the group before starting the configuration wizard.Select the Service Account:Fill in information required for the RA certificate. What happens here, is that the NDES Server is issued two Registration Authority certificates, which are then used for SCEP:Configure cryptographic settings for the RA keys:After reviewing the settings, and clicking Configure you will see the RA certificates in the personal store of the NDES Server: &lt;/p&gt;Configure NDES CA settingsThe certificate template used by NDES defaults to IPSECIntermediateOffline, that can be changed by modifying the following registry keys:HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\\\\MSCEPEncryptionTemplateGeneralPurposeTemplateSignatureTemplateI decide to go with the WebServer template, so I update the registry and restart the certsvc service. Keep in mind, that the service-user account (TOMT\\\\scep, in my lab) needs permissions to enroll for the selected certificate template. This can be configured using the Certificate Templates MMC Snap-In:NDES requires a challenge for every certificate transaction, unfortunately there seems to be no such setting in Cisco’s SCEP implementation. That default can be changed by setting the following registry key to 0:HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Cryptography\\\\MSCEP\\\\EnforcePassword\\\\EnforcePasswordWarning: This disables the need for a challenge, so that essentially anyone with knowledge of your NDES server can enroll for certificates.Restart the certsvc service after modifying the registry:Get-Service certsvc | Restart-ServiceConfigure NDES IIS settingsIIS request filtering sets the value for MaxQueryString to 2048 by default, a reasonable key length is at least 1024, more often 2048. You see the problem, that value needs to be changed in order to support strong keys.Use appcmd to change the value for MaxQueryString:%systemroot%\\\\system32\\\\inetsrv\\\\appcmd.exe set config /section:system.webServer/security/requestFiltering /requestLimits.maxQueryString:\\\"4096\\\" /commit:apphostIf you don’t update MaxQueryString you will see error 404.14 Query string too long in the IIS log.There is a really good guide to NDES on TechNet Wiki.That’s it for the first part, our NDES on Windows Server 2012 is configured and ready to go. Stay tuned for part 2.— Tom\",\n  \"url\": \"https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-1/\"\n},{\n  \"id\": \"post-get-access-to-a-windows-2012-server-without-a-password\",\n  \"title\": \"Get access to a Windows 2012 Server without a password\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2012\"],\n  \"content\": \"In this article, I will explain how you get access to a Windows Server without a password.When the server boots up you have a nice feature “Easy access” on the logon screen. In the next steps, we change the “Easy Access” function with a cmd command prompt:1. Boot with the Server 2012 CD and select “Repair your computer”2. Select “Troubleshooting” and “Command prompt”       3. Get the drive letter of your System Volume with diskpart4. Rename the utilman.exe file to utilman.old and copy cmd.exe to utilman.exe5. Reboot the server and start the “Easy Access” feature. You will get a command prompt. Now type whoami and you will see that you can run commands under the local system accountND\",\n  \"url\": \"https://onprem.wtf/post/get-access-to-a-windows-2012-server-without-a-password/\"\n},{\n  \"id\": \"post-sharepoint-2013-change-default-settings-of-upload-image-pop-up\",\n  \"title\": \"Sharepoint 2013 change default settings of “Upload Image” Pop-Up\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"When you upload files or images in Sharepoint you have get a pop-up that asks you about the file, destination library and an option to overwrite extsting files.When the pop-up appears the checkbox “Overwrite existing files” is checked. To change the default setting we have to change 2 aspx files:   Navigate to C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Web Server Extensions\\\\14\\\\TEMPLATE\\\\Layouts    Make a backup of the following files: upload.aspx and uploadex.aspx    Edit the upload.aspx file    Locate the line which contains: &lt;asp:CheckBox id=”OverwriteSingle” Checked=”true” Text=&lt;%$Resources:wss,upload_document_Overwrite_file%&gt;” runat=”server” /&gt;    Change the Checked=”true” to Checked=”false“    Edit the uploadex.aspx file and make the same changes on the same lines    Save the files    Perform an IISRESET The checkbox is now not selected default anymore.Greetings   nd\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2013-change-default-settings-of-upload-image-pop-up/\"\n},{\n  \"id\": \"post-exchang-2013-offline-owa\",\n  \"title\": \"Exchang 2013, Offline OWA\",\n  \"author\": \"dni\",\n  \"tags\": [\"en\",\"Exchange\"],\n  \"content\": \"In the last time I worked a lot on my Exchange 2013, SQL 2012 and Sharepoint 2012 lab. A really nice feature is the Exchange 2013 Offline OWA.You can start using OWA offline from the OWA Website:OWA informs you to that it will save some content of your mailbox on the computer.What you can see now is that OWA safes mailbox content on your local disk under C:\\\\Users\\\\user\\\\AppData\\\\Local\\\\Microsoft\\\\Internet Explorer\\\\Indexed DB&nbsp;Like Exchange also the offline files are some edb an log files.There is a full list of all offline OWA features: http://technet.microsoft.com/en-us/library/aa997437(v=exchg.80).aspxGreetings nd\",\n  \"url\": \"https://onprem.wtf/post/exchang-2013-offline-owa/\"\n},{\n  \"id\": \"post-windows-server-2012-directaccess\",\n  \"title\": \"Windows Server 2012 – DirectAccess\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Server\"],\n  \"content\": \"DirectAccess is a feature that has been introduced in Windows Server 2008R2 and Windows 7. It allows secure access to enterprise resources, without requiring a manual VPN connection. A DirectAccess enabled computer establishes a secure connection to the DirectAccess server every time the computer is connected to the internet.Windows Server 2012 and Windows 8 really simplify the configuration required for DA, making it much easier to deploy a remote access solution.RequirementsThe only requirement is the installation of a Windows Server 2012 member server, providing the “head end” of the connection. No Active Directory, schema, forest, domain-level updates are required.The DA Server needs two network adapters, one connected to the internal LAN, the other one connected to a DMZ or public network.&#160;If the DA Server is located behind a firewall, https (tcp/443) has do be allowed from the internet to the “public” network adapter.DirectAccess relies on IPv6 technology, the only hosts that require an IPv6 address are the DirectAccess Server and clients, though. The DA server performs NAT64 and DNS64 in order to enable the DA client to access IPv4 only servers.InstallationUse ServerManager or PowerShell to install the Remote Access server role on the designated DirectAccess server. Once installed, use the “Getting started” wizard to configure DirectAccess. The wizard can be started from ServerManager or from within the “Remote Access Management Console”.Select “Deploy DirectAccess only” in the wizard. Select the network topology to be used, in this example I am using a server with two network adapters, one connected to a DMZ and one connected to my LAN. Specify the name (or public IP) that clients will be using to connect.  And that’s all there is about it, it’s called “simplified deployment”. The Wizard goes ahead and creates Group Policies for DA Servers and Clients, creates DNS records for Network Location. Pretty cool, eh?To modify the settings, click the “here” link on the last page of the wizard, for my test environment I go with the defaults.As the wizard finishes, it shows some information about what it did.DirectAccess Server The DirectAccess Configuration can be shown and changed in the Remote Access Management Console. The Dashboard and Operations Status panels do provide information about the servers status, required services and connected clients. DirectAccess ClientsThe wizard created a Group Policy Object, named “DirectAccess Client Settings” and a WMI Filter, to apply that GPO to Notebooks running Windows 7 or 8 Enterprise editions. So all I had to do was to update the group policies on the notebook (gpupdate). As long as it was connected to the LAN nothing changed, if I connected the notebook to the internet, the DA (Workplace Connection) was established automatically and I was able to access internal resources as if I was on the LAN. I think this “simplified deployment” really does make it easier to get started with DirectAccess, to deploy it in an enterprise network, one should be a little more familiar with the technology :) So this post was meant to be a quick-and-dirty intro, stay tuned for more in-depth information.so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-2012-directaccess/\"\n},{\n  \"id\": \"post-windows-8-windows-to-go\",\n  \"title\": \"Windows 8 – Windows To Go\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"en\"],\n  \"content\": \"Windows to Go (WTG) is a new feature available in the Windows 8 Enterprise Edition. It enables the deployment of Windows 8 to USB thumb drives so that an End User can really plug in their USB drive and boot their Enterprise environment on any machine. Now, for security reasons the thumb drive can be encrypted using BitLocker and the User has no access to local hard disks of the &ldquo;host&rdquo;.HardwareWTG requires a &ldquo;fixed drive&rdquo;, that is, you cannot use any USB drive, it must be &ldquo;Certified&rdquo;. I am using a Kingston DataTraveler Workspace (www.kingston.com/wtg) other supported devices are listed on TechNet: Windows To Go: Feature OverviewEven though its not required USB 3 is highly recommended to speed things up. If you have no WTG certified drive handy, try using a USB hard disk.DeployDeployment is really simple, simply open &ldquo;Windows To Go&rdquo; from Control Panel. The WTG Wizard starts, and the first thing you have to select is which drive to use.In the next step you select the Windows 8 Image, for testing I mounted a Windows 8 Enterprise DVD. In a real-world scenario you would use your customized Image for deployment.Set a password to BitLocker the device (highly recommended).Obviously all data on the drive is lost, so if that is not a problem, click &ldquo;Create&rdquo;.Yeah, that&rsquo;s it. In the last step you can choose to reboot the machine or just finish and close.Boot and WorkSo now you have created a new WTG Workspace that can be used to boot Windows from almost any PC. If the PC can run Windows 7 or 8, it almost certainly will run Windows to Go. The first time you boot WTG it takes some time, just as every new Windows installation takes some time. After the quick, first steps you can start working, you&rsquo;ll notice that there is no access to the hard drives of the host computer. If local access is needed, simply open &ldquo;Disk Management&rdquo; and make the disks available (Requires Administrative permissions).If you shut down Windows To Go and remove your USB drive, the local Computer starts, absolutely unaffected by WTG. BYOD just got a lot simpler, IT just needs to hand out USB drives and doesn&rsquo;t need to be supporting all kind of different environments Users might have on their devices.On the other hand, Users do not have to worry about IT enforcing policies on there private-owned devices.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If you ask me, that&rsquo;s pretty cool :) tom\",\n  \"url\": \"https://onprem.wtf/post/windows-8-windows-to-go/\"\n},{\n  \"id\": \"post-sharepoint-2013-search-center-windows-8\",\n  \"title\": \"SharePoint 2013 Search Center – Windows 8\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Sharepoint\"],\n  \"content\": \"SharePoint 2013 Enterprise Search Center provides powerful indexing and search, not only for the local SharePoint instance but for file shares and other SharePoint farms as well.More info: What's new in search in SharePoint Server 2013Federated SearchWindows 7 and later support the connection of external sources through OpenSearch, which essentially is a Web Service that receives search queries by the client and returns results in either RSS or Atom XML format. This allows users to search remote data and view search results within Windows Explorer.More info: Federated Search in WindowsCreate OSDX FileNow to get SharePoint search into Windows Explorer you need to create an OSDX (OpenSearch Description) file and deploy it to your clients.Here is an example file that works for my SharePoint 2013 and Windows 8:&lt;?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?&gt; &lt;OpenSearchDescription xmlns=\\\"http://a9.com/-/spec/opensearch/1.1/\\\"&gt; &lt;ShortName&gt;SharePoint Search&lt;/ShortName&gt; &lt;Description&gt;Search the SharePoint Search Center&lt;/Description&gt; &lt;Url type=\\\"application/rss+xml\\\" template=\\\"http://intranet.ntsystems.local/sites/searchcenter/_layouts/srchrss.aspx?k={searchTerms}&amp;amp;web.count=50\\\"/&gt; &lt;Url type=\\\"text/html\\\" template=\\\"http://intranet.ntsystems.local/sites/searchcenter/Pages/results.aspx?k={searchTerms}\\\"/&gt; &lt;/OpenSearchDescription&gt; &nbsp;Simply create a new file using notepad, adjust the URLs to point to your SharePoint Enterprise Search Center and save it with the .osdx extension.There are many possibilities for customization within the OSDX specification, check out MSDN to learn more about Creating an OpenSearch Description File.To test the OSDX files, double-click it and click \\\"Add\\\" to add the search connector to Windows Explorer.This adds a link to \\\"Favorites\\\" so you can easily search SharePoint from there.Deploy OSDXNow, to deploy this to more than one client, you could publish a link to the OSDX file and have your users click on that link to add the search provider.Alternatively Group Policy Preferences can be used to deploy the search connector:Copy the .searchConnector-ms file from your Client (%UserProfile%\\\\Searches\\\\) to a share that is available to the clientsCreate a GPO and use the 'Files' GPP to copy the searchConnector-ms file from the share to %UserProfile%\\\\Searches&nbsp;&nbsp;Use the 'Shortcuts' GPP to create a Shortcut in the \\\"User Profile, Links\\\" folder, remember to select a nice Icon&hellip; ;)&nbsp;&nbsp;So that's how to get results from SharePoint into Windows Explorer.&nbsp;So long, tom\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2013-search-center-windows-8/\"\n},{\n  \"id\": \"post-office-2013-web-apps\",\n  \"title\": \"Office 2013 Web Apps\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Sharepoint\"],\n  \"content\": \"So October has been pretty quiet around here, but I have some cool stuff to share with you today.Office 2013 RTM'd some time ago and so did all the server products. So with SharePoint 2013 available on TechNet I decided to set up some demo sites to get a feel for the product, after looking for a new version of the Office Web Apps I realized that there was some change coming here.Office Web Apps ServerOffice 2013 Web Apps are no longer installed on SharePoint servers directly, it became a stand-alone product instead. Not only does that stand-alone product bring new design and scalability possibilities, it is also possible to share the Web Apps with Exchange and Lync 2013.PrerequisitesTo install Office Web Apps Server on a Windows Server 2012 box the following roles and features must be installed as a prerequisite:Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices If you want to use https for the Web Apps a proper certificate must be available on the server, too. To display the certificates installed on a computer try the following command:Get-ChildItem Cert:\\\\LocalMachine\\\\my | select Subject,FriendlyName The Web Apps Server can also be installed on Windows Server 2008R2, find the prerequisites on TechNet.Installing Office Web Apps Server and creating the farmThe actual installation of the Server is pretty straightforward, just download the ISO and double click it (love that&hellip;). The only thing you can choose during setup is the installation path.Once done with the installation, you can go ahead and use PowerShell to create a new Web Apps Farm. Not surprisingly the cmdlet to be used is New-OfficeWebAppsFarm, the following parameters have to be used to create a farm:-InternalUrl: the URL used for internal Clients-ExternalUrl: the URL used for Clients on the Internet-CertificateName: set the FriendlyName of the certificate to be used for the farm-EditingEnabled: enable editing of files in the browser (SharePoint)The following example creates a farmNew-OfficeWebAppsFarm -InternalUrl \\\"https://myOWAserver.tomt.local\\\" -ExternalUrl \\\"https://office.ntsystems.it\\\" &ndash;CertificateName \\\"ntSystems OfficeWebApps\\\" &ndash;EditingEnabled To verify that the farm has been created successfully, open a browser and go to https://myowaserver.tomt.local/hosting/discovery you should see some XML information about your internal and external URLs.SharePoint 2013Now to connect your SharePoint 2013 farm to the brand new Web Apps farm, fire up an administrative SharePoint Management Shell and use the New-SPWOPIBinding cmdlet. Use the &ndash;ServerName parameter to specify the internal URL of the Web Apps farm:New-SPWOPIBinding -ServerName https://myOWAserver.tomt.local &nbsp;After that you can have a look at the WOPI Zone, if users are accessing the SharePoint from internal and external clients you might want to change the zone from its default value of \\\"internal-https\\\" to \\\"external-https\\\":Set-SPWOPIZone &ndash;zone \\\"external-https\\\" &nbsp;Almost done, if you are using https on your SharePoint web applications you should be ready to go. If you are using http for SharePoint you need to set AllowOAuthOverHttp to true. This needs to be done in the SharePoint Management Shell using the following commands:$config = (Get-SPSecurityTokenServiceConfig) $config.AllowOAuthOverHttp = $true $config.Update() &nbsp;To check if it worked, use:(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp Try it&hellip;Ready to see it? Open a browser, go to your SharePoint 2013 sites and create a new Document or open an existing one, should be looking like that:&nbsp;So long,tom\",\n  \"url\": \"https://onprem.wtf/post/office-2013-web-apps/\"\n},{\n  \"id\": \"post-exchange-2010-and-maxinboundconnectionpersource\",\n  \"title\": \"Exchange 2010 and MaxInboundConnectionPerSource\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Exchange receive connectors do have a setting of MaxInboundConnectionPerSource which limits the maximum number of connections from a single IP address at any moment. So with a default value of 20, there are no more than 20 connections from a specific IP address allowed. The following warning is logged in the transport server's application log if the limit is exceeded:Event ID: 1021Event Source: MSExchangeTransportMessage Text: Receive connector 'Connector Name' rejected an incoming connection from IP address '10.10.10.10'. The maximum number of connections per source ('20') for this connector has been reached by this source IP address.The sender of a mail might receive the following message:Deferred: 421 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel\\\" Status 4.0.0, \\\"Transient failure\\\"According to RFC this is not a permanent error, so the sender's mail server should try to send the message again after some delay.\\\"The command was not accepted, and the requested action did not occur. However, the error condition is temporary, and the action may be requested again.\\\"Set-ReceiveConnectorTo view the configured value of MaxInboundConnectionPerSource use the Get-ReceiveConnector cmdlet, to change the value use the Set-ReceiveConnector cmdlet with the &ndash;MaxInboundConnectionPerSource parameter. The following example increases the value to 100 Get-ReceiveConnector default* | Select Name,MaxInbound*Get-ReceiveConnector default* | Set-ReceiveConnector -MaxInboundConnectionPerSource 100 More info on: TechNet &nbsp;So longtom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-and-maxinboundconnectionpersource/\"\n},{\n  \"id\": \"post-scheduled-jobs-in-powershell-v3\",\n  \"title\": \"Scheduled Jobs in PowerShell v3\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"I am really excited to write about that great feature of PowerShell I started using recently. It's all about scheduling administrative tasks, actually it's more like scheduling everything, to run when I am at home sleeping happily JSo as I have mentioned before I'm no PowerShell expert at all and I'm sure all that stuff can be done many other ways, but then this thing is working for me&hellip;SnippetsIf you have been using PowerShell ISE you might know what Snippets are, if you don't, just open powershell_ise.exe and press 'ctrl+j'. Snippets are code samples that can be added to your script easily. You can create your own snippets like that:$code = @' # this is my sample code '@ New-IseSnippet -Title 'Sample' -Description 'Just a sample' -CaretOffset $code.Length -Text $code -Force &nbsp;This will create a 'Snippets' folder at your Documents\\\\WindowsPowerShell where your new snippet is saved for later use. Having that said let's move on to scheduled jobs.Scheduled JobsUntil now it was quite a pain in the butt to run PowerShell scripts as scheduled tasks, you had to specify the path to powershell.exe and then use some params to make it run the script you choose. You could even pass arguments to those scripts, but it was no real fun. So now we can do all that very easy and directly from within PowerShell.TriggerFor starters we need to create a job trigger, to tell PowerShell when to execute out script.$trigger = New-JobTrigger -At 22:00 &ndash;Once &nbsp;This will create a variable containing our trigger, as you can see the script will be executed today, at 22:00 and it will be executed only once.JobOptionsNext we can define some job options, it's not necessary though$option = New-ScheduledJobOption &ndash;RequireNetwork -StartIfOnBattery -ContinueIfGoingOnBattery &nbsp;Using the New-ScheduledJobOption cmdlet we can specify all kinds of different options, you might already know them from Task Scheduler.ScriptblockNow that we have a trigger and some options we need to define a scriptblock that is going to be executed by our scheduled job.$sb={  param([System.IO.FileInfo]$path,[string]$string)  Add-Content -Path $path -Value $string -Force } &nbsp;This, obviously, is just a simple example. It will simply append a string to a file, should be enough to demo what I mean though.CredentialLast thing we need to specify is the account that should be used to run the task.$cred = Get-CredentialThis will create a variable containing the credential you type in. We will pass this to the &ndash;Credential parameter of the next step.RegisterScheduledJobWe have defined everything we need so we can go ahead and register the job.Register-ScheduledJob -Name \\\"test\\\" -Trigger $trigger -Credential $cred -ScheduledJobOption $options -ScriptBlock $sb -ArgumentList (\\\"c:\\\\temp\\\\test.txt\\\",\\\"abcde\\\") &nbsp;This creates a scheduled task at \\\\Microsoft\\\\Windows\\\\PowerShell\\\\ScheduledJobs, it can be viewed using Task Scheduler or using the Get-ScheduledJob cmdlet.If you want to specify a script file instead of a scriptblock, simply change the &ndash;ScriptBlock param and use &ndash;FilePath.UnregisterScheduledJobThe job can be deleted in Task Scheduler or by using the Unregister-ScheduledJob cmdlet.&nbsp;&nbsp;I hope you will find this feature as exciting as I do, I'll provide you with the code snipped so you can easily use 'crtl+j' to create a task the next time. Just copy the ps1xml file to your Documents\\\\WindowsPowerShell\\\\Snippets folder and enjoy. JScheduled Job.snippets.ps1xml (1.35 kb)&nbsp;&nbsp;So long, have a nice weekend!tom&nbsp;\",\n  \"url\": \"https://onprem.wtf/post/scheduled-jobs-in-powershell-v3/\"\n},{\n  \"id\": \"post-exchange-2010-attachments\",\n  \"title\": \"Exchange 2010, Outlook doesn’t show attachments\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Last Week I had into the problem that Outlook 2010 didn’t show some attachments. After a research on technet I found out that this attachment was a not referenced inline-attachment.To fix this behavior and make Outlook showing the attachment you have to do the following:- Stop the Exchange Transport service.    - Locate the EdgeTransport.exe.config file. This file is located in the following path:     C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\Bin\\\\ In the EdgeTransport.exe.config file, add the following entry between the &lt;appSettings&gt; element and the &lt;/appSettings&gt; element: &lt;add key=&quot;TreatInlineDispositionAsAttachment&quot; value=&quot;true&quot; /&gt; - Start the Transport serviceGreetings    dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-attachments/\"\n},{\n  \"id\": \"post-gal-photos-reloaded-batch-import\",\n  \"title\": \"GAL Photos reloaded–batch import\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"About two years ago I&rsquo;ve posted an article about Exchange 2010 and GAL Photos. Now this is not great news anymore, there are two great articles on the Exchange Team Blog, that explain how to configure this, too. Find them here: aka.ms/galphotosand aka.ms/galphotosfaqKey points are the the minor schema change and the maximum file size of 10KB. Images can be max. 96x96 pixels in size.Now in the last couple of days I wrote a &ldquo;cmdlet&rdquo; to make batch importing images easier. For starters, the cmdlet gets all *.jpg files in folder, then it uses the files BaseName to find corresponding Exchange Mailboxes. After that the image&rsquo;s physical dimensions as well as file size are verified, if they are ok, the image is imported using Import-RecipientDataProperty.The folder containing the images can be set using the cmdlet&rsquo;s &ndash;FilePath parameter, the cmdlet takes pipeline input from Get-ChildItem too.Here are two examples of how the cmdlet could be used:PS C:\\\\&gt; Import-GalPhoto -FilePath 'c:\\\\temp\\\\pics' &nbsp; PS C:\\\\&gt; dir 'c:\\\\temp\\\\pics' | Select-Object -First 2 | Import-GalPhotoI&rsquo;ve pasted the function to PoshCode, here it goes:enjoy, tom\",\n  \"url\": \"https://onprem.wtf/post/gal-photos-reloaded-batch-import/\"\n},{\n  \"id\": \"post-server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten\",\n  \"title\": \"Server 2008 R2, Disk Management und DiskPart lässt sich nicht starten\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008-R2\"],\n  \"content\": \"Mit Windows Server 2008 R2 kommt es manchmal vor, dass ich Volumes nicht extenden konnte und der Wizard folgenden Fehler anzeigt: “Unable to connect to Virtual Disk Service”&#160; Mit Diskpart sieht das dann so aus: “Diskpart encountered an error starting the COM service”&#160; Im EventLog ist folgender Fehler zu finden:Unable to start a DCOM Server: {9C38ED61-D565-4728-AEEE-C80952F0ECDE}. The error:        &quot;1260&quot;         Happened while starting this command:         C:\\\\Windows\\\\System32\\\\vdsldr.exe –EmbeddingWorkaroundHierzu habe ich einen kleinen Workaround um die Disk schnell zu extenden: CMD öffnen und folgendes Kommando starten: C:\\\\Windows\\\\System32\\\\vdsldr.exe –Embedding Nun funktioniert Diskpart und die Disk kann extended werden. Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten/\"\n},{\n  \"id\": \"post-my-powershell-profile\",\n  \"title\": \"My PowerShell Profile\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Today I am going to walk you through my PowerShell Profile and try to explain the basics of what a Profile is and how it can be used.So what is a Profile, and where is it?Well, basically a profile is a PowerShell script file (.ps1) that is stored in a preconfigured location and that gets executed every time PowerShell starts. This script enables you to customize your PowerShell session and predefine settings as you find them useful. There is a built-in variable, $Profile, which stores the location of the script that is executed every time PowerShell starts. The profile file is located in the WindowsPowerShell folder in every users “My Documents” folder. It has to be named Microsoft.PowerShell_profile.ps1.By default there is no profile and everything is left to their defaults, to create the profile script you can create the WindowsPowerShell folder and then use notepad to save a file containing some PowerShell commands in that folder. You can also use the New-Item cmdlet to create the folder and an empty file by typing:New-Item –Path $Profile -Type File –Force Example profileNow that we know what a profile is and where it is located we can go on and take a look at an example profile, it’s actually my profile so if you have any tips for me, feel free to leave a comment.I am starting my Profile with setting some variables, some are predefined and some are custom, I use them for the following settings:$MaximumHistoryCount is used to set the number of commands that are stored in History. Defaults to 64. Maximum 32767.    $Transcript is used to set the path for Start-Transcript     $env:PSModulePath is an environment variable (‘env:’) and it is used to customize the path where PowerShell will look for modules to import.     $cert is a variable I use to store my CodeSigningCert to sign scripts.After that I use Get-Host to figure out which version of PowerShell is running in the current session, if version 3 is detected, I set some DefaultParameterValues using $PSDefaultParameterValues. After that I check if the current session was started with “Run as administrator” if it was, the Update-Help cmdlet is run.Since I am writing a module I have a short function to just make my life a little easier, it signs the module file using Set-AuthenticodeSignature and then copies the file to some network share for my coworkers.At the end I am creating a new PSDrive of the FileSystem PS provider, after creating the drive the current location is set to that drive. This is my working directory, it contains all the scripts and test files I need.I pasted the file to http://poshcode.org, I really like their “embed code” feature.&#160;Now again, this is my profile, I use it to simply show what can be done, since I am still a beginner I appreciate ideas and tips from anyone!tom\",\n  \"url\": \"https://onprem.wtf/post/my-powershell-profile/\"\n},{\n  \"id\": \"post-vbnet-powershell-script-starten\",\n  \"title\": \"VB.Net PowerShell Script starten\",\n  \"author\": \"dni\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Vor einigen Tage habe ich versucht ein PowerShell Script über ein VB.Net Programm zu starten.    Hat mich ein wenig Zeit gekostet :)Anbei der Code:Public Function RunCreatePasswordPowerShell(ByVal script As String) As Integer    &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim execProcess As New System.Diagnostics.Process     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim psScriptTextArg = &quot;-Command &quot;&quot;&amp; &quot; + script + &quot; &quot; + &quot;'&quot; + System.Environment.CurrentDirectory + &quot;'&quot; + &quot;&quot;&quot;&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.WorkingDirectory = Environment.SystemDirectory &amp; &quot;\\\\WindowsPowershell\\\\v1.0\\\\&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.FileName = &quot;powershell.exe&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.Arguments = psScriptTextArg     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.UseShellExecute = True     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Return execProcess.Start     &#160;&#160;&#160; End FunctionErklärung:Die Funktion RunCreatePasswordPowerShell wird mit einer String Variable als Argument aufgerufen (script). Diese String Variable beinhaltet den Pfad zu unserem PowerShell Script.    In meinen speziellen Fall geben ich beim zusammenstellen der Argumente noch die den aktuellen Pfad mit. Eventuell noch interessant: Dieses PowerShell Script welches ich hier aufrufe erstellt verschlüsselte PasswordFiles, welche dann über die PowerShell weiter verwendet werden können. Anbei der Code dazu:param(    &#160;&#160;&#160; [parameter(Mandatory = $true)]     &#160;&#160;&#160; [string]$CurrentDirectory     )     $PasswdFilename = read-host &quot;Filename&quot;     $Passwd = read-host &quot;Password&quot; -assecurestring | convertfrom-securestring     $PasswdPathFile = $CurrentDirectory + $PasswdFilename + &quot;-Pass.txt&quot;     $Passwd | Out-File $PasswdPathFileGrüße    dn\",\n  \"url\": \"https://onprem.wtf/post/vbnet-powershell-script-starten/\"\n},{\n  \"id\": \"post-nps-migration-von-server-2003-nach-2008-r2\",\n  \"title\": \"NPS Migration von Server 2003 nach 2008 R2\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008-R2\"],\n  \"content\": \"Den IAS Server von Server 2003 zu Server 2008 R2 zu migrieren ist eine sehr einfache Migration:Zunächst muss das Migrationstool iasmigreader auf den Windows Server 2003 kopiert werden.Das Migrationstool befindet sich entweder auf der Server 2008 R2 CD unter D:\\\\sources\\\\dlmanifests\\\\microsoft-windows-iasserver-migplugin oder auf dem Server 2008 R2 unter C:\\\\Windows\\\\SysWow64Über die Kommandozeile wird das Tool aufgerufen um auf dem 2003 Server die Konfiguration in das vordefinierte Textfile ias.txt zu exportieren.ACHTUNG: Beim Import von 32BIT zu 64BIT Systemen muss folgendes vorher gemacht werden. Sonst gibt es Probleme mit der PEAP Authentifizierungsmethode:Import File öffnen den Wert 0 in SystemInfo auf 0000000009 ändern:  Nun kann das File auf dem 2008 Server importiert werden:    Netsh nps import filename=&quot;paht\\\\ias.txt&quot;Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/nps-migration-von-server-2003-nach-2008-r2/\"\n},{\n  \"id\": \"post-automatic-ios-configuration-backup\",\n  \"title\": \"Automatic IOS configuration backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\"],\n  \"content\": \"If you are like me you frequently forget to backup router and switch configurations before making changes. Ok, maybe not so frequently but it happens… There are some ways to prevent this from happening, we can make manual backups or use the automatic archiving feature which is built into IOS.Manual backupA manual backup can always be taken using the ‘copy startup-config' command, typing a question mark ‘?’ after that command lists possible backup destinations:RT#copy startup-config ?      &#160; archive:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to archive: file system       &#160; flash:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to flash: file system       &#160; ftp:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to ftp: file system       &#160; http:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to http: file systemSo to backup a routers current startup-config to a FTP server you would simply type something like this:RT#copy startup-config ftp://user:pass@10.10.10.1The username and password can also be configured so that you don’t need to type them in every time you are performing a backup.RT(config)#ip ftp username tom      RT(config)#ip ftp password secretOk, that’s better but since the backup still has to be started manually chances are that one could forget it…Automatic archiveThe archive feature allows for automatic configuration backup that is triggered by a timer and the ‘write memory’ command. The following example configures the archive feature on router RT to create a backup once every 24 hours and additionally every time someone enters the ‘write-memory’ command, that is, every time someone makes a configuration change and decides to save that change:RT(config)#archive      path ftp://10.10.10.1/History/rt-config-       write-memory       time-period 1440The time-period keyword simply configures how often a scheduled backup runs, if the write-memory command is configured a configuration backup is performed every time someone saves the config. The ‘show archive’ command displays the 10 latest configuration files:RT#show archive      The maximum archive configurations allowed is 10.       The next archive file will be named ftp://10.10.10.1/History/rt-config--&lt;timestamp&gt;-50       Archive #&#160; Name       &#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-51-57.153-47       &#160;&#160; 2&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48       &#160;&#160; 3&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-53-57.337-49Obviously other backup destinations such as tftp or flash can be configured. IOS does not take care of the removal of old files, so even though only the 10 latest configuration versions are shown in the ‘show archive’ output, there might be more on the server.Restoring configurationIf a configuration change needs to be rolled back the ‘configure replace’ command can be used. So if a configuration change had unintended consequences the ‘configure replace ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48’ command could be used to restore the current running-config from a backup.&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/automatic-ios-configuration-backup/\"\n},{\n  \"id\": \"post-steve-ballmer-on-exciting-times-office-2013\",\n  \"title\": \"Steve Ballmer on Exciting Times–Office 2013\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Update: Beta versions of all Server Products are now available, check out the link on the bottom. Added a link to the webcast.Microsoft hold a live webcast today where they kicked off the new Office 15 wave.Ballmer gave a quick overview of the latest announcements, including Surface, Windows Phones 8, Windows 8 and some Server products, before he gets going with the introduction of Office 2013.He calls the new version of Microsoft Office the “most ambitious release of office” ever. It’s was designed for cloud and touch enabled devices, a full featured version of Office 15 will also be available on ARM devices.View the recorded webcast: http://www.microsoft.com/en-us/news/presskits/office/liveevent.aspxBallmer talked about Microsoft’s recent acquisitions, namely Yammer and PPI. Yammer provides integration to all kind of social media for Office 15 client and Server products. PPI build huge, high definition displays which could be great for meetings and collaboration.One of the most important points Ballmer makes is the ability of ink and touch support in every application, so that one can take digital annotations through the new generation of hardware. It seems like a big effort to finally move away from pen and paper.After that, Ballmer introduced Kirk Koenigsberger for some live demo of the product. Kirk is very excited too and shows some sneak peaks of what is to come with a focus on consumer usage. Office 15 is heavily integrated into Skydrive and stores all content in the cloud by default, if you install the Office preview you will soon notice that you can sign-in with you Windows Live ID directly into Office.Office 15 features integration with social networking, multimedia, Skype and Lync offer presence information for the People Card (kind of an evolution from that thing we know from Outlook 2010).Really neat is the “last location” feature, where a toast notification brings you back to the section of the document that you have been editing when you left one device and switched to another.SharePoint 2013 comes with fully featured enterprise social networking, with mentions, #hashtags and like buttons all packed into a sleek, new design. A Newsfeed will provide the user with “Facebook” style updates from co-workers and friends, again using Yammer to aggregate news from different sources into one feed. Office documents and multimedia content can be previewed directly from the new timeline, the People Card quickly shows all contact information and presence status of the team members.Try it nowThe next generation of Office can be downloaded from Office.com.Server ProductsWhat is at least as exciting as the new version of Office client products is that the Server products are already listed on the website. Can’t wait to get my hands dirty on that stuff… http://www.microsoft.com/office/preview/en/try-more-productsso that’s it for now,    tom\",\n  \"url\": \"https://onprem.wtf/post/steve-ballmer-on-exciting-times-office-2013/\"\n},{\n  \"id\": \"post-why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too\",\n  \"title\": \"Why am I learning PowerShell? And why do I think you should give it a try, too?\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"To be frank, I am kind of a beginner when it comes to PowerShell or scripting in general, I was working for really small businesses for some time and I didn’t really bother scripting. There were simply not too many repeating tasks and so I went and did most everything manually.So obviously things have changed, for starters I’m not working for said small businesses any more. There are now a lot of tasks that would take hours to be completed manually. And there is this shiny, new toy out there, called Windows PowerShell. Ok, it’s not really new, but a lot of people still stick to there old tools as they knew how they worked for years, so why change something that got the job done in the past? Well, here are my key points:Automation prevents errorsThis is the most important point for me, think about some task where you have to repeat a configuration change for like 8 times. It’s not that scripting or automating is that much faster than making the change manually, that would be the case if it were 100 times or more, but 8, come on. The one key thing is, that by using automation the configuration is exactly the same every single time you have to do it. Sure, you have to spend a little more time in planning your steps (instead of just clicking your way through), you have to write a few lines of script, or just chain together some commands. Once your little tool is complete and tested, you can use it over and over again, it will produce the same result every time you run it. So we are getting to my second point.Create reusable toolsPowerShell enables you to create reusable tools very easily, if you are typing some commands into the command line interface, the exactly same commands can be saved to a ps1 file and executed by a co-worker, a scheduled task or... you get the point. The first point still applies here, if you create a tool and share it with your colleagues or co-workers not only are you simplifying certain tasks, you are again eliminating a common source of error.DocumentationThe transcript feature simply writes anything you type and all output of the current command line window to a file, this file can easily be used to document configuration changes.ResourcesSo where do I start? First of all, remember one key command: Get-Help. It’s simple, it comes with PowerShell and the help content is very, very well written! Try this: ‘Get-Command | Get-Random | Get-Help –Full’A good place to start is the Windows PowerShell Survival Guide on the TechNet Wiki.There are some good books on the topic available, I’m looking forward to PowerShell in Depth by three of the most well-known PowerShell gurus: Don Jones, Richard Siddaway, and Jeffery Hicks.&#160;Have fun!   tom\",\n  \"url\": \"https://onprem.wtf/post/why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too/\"\n},{\n  \"id\": \"post-activesync-organization-settings-mobile-device-management\",\n  \"title\": \"ActiveSync Organization Settings–Mobile Device Management\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"The growing number of mobile devices requires some sort of mobile device management policy to be in place. Now there are different approaches to enforce such a policy, there are some software vendors offering more or less sophisticated tools and there is Exchange 2010 which comes with basic device management capabilities built-in.If a mobile device connects to an Exchange Server the following sequence evaluates the access state of the device (from TechNet: http://technet.microsoft.com/en-us/library/ff959225.aspx)   Is the mobile device authenticated?&#160;&#160; If not, challenge the mobile device for the correct credentials. Otherwise, go on to the next step.     Is Exchange ActiveSync enabled for the current user?&#160;&#160; If not, return an &quot;access restricted&quot; error to the device. Otherwise, go on to the next step.     Are the mobile policy enforcement criteria met by the current mobile device?&#160;&#160; If not, block access. Otherwise, go on to the next step.     Is this mobile device blocked by a personal exemption for the user?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device allowed by a personal exemption for the user?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Is this mobile device blocked by a device access rule?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device quarantined by a device access rule?&#160;&#160; If so, quarantine the device. Otherwise, go on to the next step.     Is this mobile device allowed by a device access rule?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Apply the default access state per the Exchange ActiveSync organizational settings.&#160;&#160; This grants access, blocks access, or quarantines the current device, depending on the organizational settings.  Default Access StateThe last step in the above list determines the ‘default access level’ organizational setting. This setting defaults to ‘Allow’ so if no other device access rules are configured, all ActiveSync devices (which meet enforcement criteria) are allowed. That means, any user with an ActiveSync enabled mailbox (another default) is able to connect up to 10 devices using ActiveSync.To change this behavior the ‘default access level’ setting can be modified using the ‘Set-ActiveSyncOrganizationSettings’ cmdlet. Other than ‘Allow’ this can be set to ‘Quarantine’ or ‘Block’. Quarantine: Enables devices to connect to the Server but grants only limited access to the device. Users will be able to add content to their calendar, tasks and notes folders, however no content can be retrieved from the server. The user will receive an email stating that the mobile device has been quarantined, that email can be retrieved by the mobile device and will be available in the users mailbox through Outlook and OWA. If a device is quarantined an administrative email address is notified too, so that they can decide to allow or block the device.An admin (or any user with the required privileges) who receives the notification can use the Exchange Control Panel to allow or block the device:Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.Block: Simply blocks all new or unknown devices. Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.If users are already using ActiveSync to access their mailboxes the Exchange Management Shell can be used to add the DeviceID of currently used ActiveSync devices to the ActiveSyncAllowedDeviceIDs property.Set-ActiveSyncOrganizationSettings The following command sets the recipient of the admin notification to support@ntsystems.local. Every time a device is quarantined that email address is notified.Set-ActiveSyncOrganizationSettings –AdminMailRecipients support@ntsystems.localThe following command sets the ‘default access state’ to quarantine.Set-ActiveSyncOrganizationSettings –DefaultAccessLevel QuarantineNeed to scale? Try Device Access Rules!Manual approval might not work for environments with many users or when users change their mobile devices frequently. Device Access Rules can be used to allow or block devices based on Family or Model so that users can connect approved device types without the need to be manually allowed by an admin:Using Device Access Rules allows for some amount of scalability, even though it’s not perfect – it comes with Exchange.&#160;so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/activesync-organization-settings-mobile-device-management/\"\n},{\n  \"id\": \"post-passing-an-array-to-a-scriptblock\",\n  \"title\": \"Passing an array to a {scriptblock}\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Some Friday PowerShell fun today.I created a PowerShell script the other day where I was passing a variable to a scriptblock. As long as the variable was a simple string everything was just fine, but when the variable was of the type System.Array only the first item would have been passed to the scriptblock.[more]Example 1 shows what I mean.$myArray = \\\"a\\\",\\\"b\\\",\\\"c\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock -ArgumentList $myArrayThis example would produce an output of &ldquo;a&rdquo; even though I assumed it would output &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.So I was scratching my head for a while and then tried to do it that way:$myArray = \\\"a\\\",\\\"b\\\",\\\"c\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock &ndash;ArgumentList (,$myArray)This one works as expected, so it produces an output of &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.&nbsp;have a nice weekend!tom&nbsp;&nbsp;\",\n  \"url\": \"https://onprem.wtf/post/passing-an-array-to-a-scriptblock/\"\n},{\n  \"id\": \"post-we-are-still-out-there-somewhere\",\n  \"title\": \"We are still out there, somewhere…\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"It has been a while since our last post, but then we are both really busy getting our work done and studying for some certification and other stuff. I’d like to promise that we will publish cool stuff on a more regular basis, not sure if we can keep it though. What I DO promise is that I am going to try!&quot;One must have a good memory to be able to keep the promises that one makes&quot; - F. NietzscheSo, having that said, what was going on that we have not been blogging about:Windows 8 and Windows Server 2012 Release Previews are out!Go, give it a try. And check out all the cool content over at Windows Server Blog and Building Windows 8. Really.Windows Phone 8 has been announced.I’m personally looking forward to that, I came to love my Windows Phone 7 and I think this is going to be even better. Read more on the Windows Phone Blog.        Device encryption: To help keep everything from documents to passwords safe, Windows Phone 8 includes built-in technology to encrypt the entire device, including the operating system and data files.       Better security: Windows Phone 8 supports the United Extensible Firmware Interface (UEFI) secure boot protocol and features improved app “sandboxing,” so the phone is better protected from malware with multiple layers of security.       Remote management: With Windows Phone 8, IT departments can manage apps and phones remotely, with tools similar to ones they now employ for Windows PCs.       Company Hub and apps: Companies can create their own Windows Phone 8 Hub for custom employee apps and other critical business info.    Microsoft Surface has been announced.Hm, looks nice… but we will see.Get more (well, not too much more) at surface.comMoving away from MD5 and keys under 1024 bits.Some efforts are made to put more trust into the struggling SSL Certificate business and I guess it also gives us more security. Personally I think that education is the key point when it comes to “trust” and SSL and IT security in general. People should really be aware of what it means to just ignore Certificate warnings… Its up to us IT Pros to make (our) internal servers trustworthy and sort of train users to rely on SSL and watch out for it.Lets get back to MD5. So, recently there has been a some media coverage of the so called “Flame” malware which used phony certificates to make a man-in-the-middle attack against Windows Update possible. Whoever created the malware used a flaw in Microsoft's Terminal Server Licensing certificate infrastructure to create a code signing certificate that chained up to Microsoft's Root CA. In essence this was possible because of the TS Licensing certs using MD5 hashes which are prone to collision attacks.More information about Flame on: NakedSecurity; Remote Desktop Services Blog; Security Research &amp; Defense; the Security Advisory can be found here.Some days after that I (and other customers) received an email from RapidSSL stating that MD5 is to be abandoned by June 1, that is all (RapidSSL) certificates that have been using the MD5 hashing scheme have been revoked. They did also revoke any certificate using a key size under 1024 bits.Microsoft is also going to release an update that blocks certificates with keys less than 1024 bits. More information on this on the Windows PKI Blog.Exchange 15 rumorsExchange 2010 has been available for little more than two years when Microsoft kicked off the “Office 15” technical preview (for few, select people) back in January 2012. Not much information has been published since then, although a beta is expected for “late summer”. Since the Exchange Conference happens to take place by the end of September I suppose we all will know more by then.&#160;That’s it for now. Have a nice weekend!tom\",\n  \"url\": \"https://onprem.wtf/post/we-are-still-out-there-somewhere/\"\n},{\n  \"id\": \"post-wireless-sniffing-mit-netmon-34\",\n  \"title\": \"Wireless Sniffing mit NetMon 3.4\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\"],\n  \"content\": \"Damit mit Wireshark unter Windows Wlan Traffic analysiert werden kann benötigt man einen speziellen Adapter (AirPcap), der auch im Promiscuous Mode (oder Monitor Mode) betrieben werden kann.Mit Microsoft Network Monitor 3.4 und Windows 7 kann man jetzt auch “normale” Adapter im Monitor Mode betreiben um Wireless Frames zu sniffen.NetMonDazu die entsprechende Version von NetMon herunterladen (x86 oder x64) und installieren.NetMon öffnen und unter “Select Networks” den Wireless Adapter auswählen. Alle anderen Adapter deaktivieren.Dann auf “Properties” klicken und die “Scanning Options” konfigurieren.Der “Monitor Mode” muss aktiviert werden, außerdem kann man den Frequenzbereich sowie den Kanal auswählen. Wählt man keinen Kanal aus, scannt NetMon alle Kanäle.Mit “Apply” werden die Einstellungen übernommen, das Fenster “Scanning Options” muss man offen lassen, der “Network Interface Configuration” Dialog kann mit “OK” geschlossen werden.Jetzt kann man auf “New Capture” klicken und mit “Start” einen neuen Trace starten.AnalyseDie Analyse des Traffics ist mit NetMon etwas ungewohnt, es hilft allerdings sehr wenn man sich von&#160; http://nmparsers.codeplex.com/ die aktuellsten Parser installiert.Alternativ kann man das Ergebnis aus NetMon als “.cap” Datei speichern und mit Wireshark öffnen.&#160;btw. das funktioniert genauso mit Windows 8 Beta &#160;have fun!tom\",\n  \"url\": \"https://onprem.wtf/post/wireless-sniffing-mit-netmon-34/\"\n},{\n  \"id\": \"post-windows-server-8-virtualized-domain-controller\",\n  \"title\": \"Windows Server 8–Virtualized Domain Controller\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\"],\n  \"content\": \"In bisherigen Version von Windows Server und Active Directory hatte das Betreiben von virtuellen DCs einige Nachteile im Vergleich zu anderen virtuellen Servern. So konnten Domain Controller z.B. nicht von der Snapshot F&auml;higkeit des Hypervisors profitieren, das zur&uuml;cksetzen eines DCs auf einen Snapshot hatte fatale Auswirkungen auf die Gesamtstruktur.VDC Safe RestoreIm Active Direcotry Replikationsmodell wird jede Transaktion mit einer fortlaufenden Nummer (Update Sequence Number) versehen. Domain Controller &ldquo;merken&rdquo; sich diese Nummern sowie eine eindeutige ID des Replikationspartners (Invocation ID) von dem sie die jeweilige &Auml;nderung erhalten haben. Wird ein DC auf einen fr&uuml;heren Zeitpunkt zur&uuml;ckgesetzt (Snapshot) k&ouml;nnte er bereits verwendete USNs wiederverwenden, seine Replikationspartner akzeptieren diese Transaktionen nicht mehr, sie haben diese bereits erhalten. Der wiederhergestellte DC kann nicht mehr replizieren und wird in den sogenannten &ldquo;USN Rollback Protection&rdquo; Status gesetzt. Der DC muss jetzt manuell aus dem AD entfernt werden.In Windows Server 8 Active Directory gibt es ein Feature das dieses Problem verhindern soll. &Uuml;ber die ACPI Table stellt der Hypervisor die VM-Generation ID zur Verf&uuml;gung, diese wird im RAM des jeweiligen Domain Controllers gespeichert.Wird ein Snapshot angewandt, wird diese VM-Generation ID zur&uuml;ckgesetzt, so merkt der Domain Controller dass er wiederhergestellt wurde.&nbsp;Der wiederhergestellte DC setzt seine Invocation ID zur&uuml;ck und da seine Replikationspartner diese ID noch nicht kennen kann die Replikation wieder aufgenommen werden. Au&szlig;erdem wird der SYSVOL Ordner &ldquo;nicht autorisierend&rdquo; wiederhergestellt und folgendes Ereignis wird im &ldquo;Directory Service&rdquo; Event Log protokolliert.Folgendes Active Directory Attribut wird f&uuml;r die VM-Generation ID verwendet. Hier geht&rsquo;s zum entsprechenden Eintrag im MSDN.ms-DS-Generation-IdVDC Safe Restore muss (und kann) nicht konfiguriert werden, sofern der Hypervisor das VM-Generation ID Feature unterst&uuml;tzt ist es automatisch aktiv. Aktuell unterst&uuml;tzt nur Windows Server 8 Hyper-V dieses Feature, andere Herstellen werden hoffentlich bald nachziehen.Achtung, dieses Feature soll die USN Rollback Problematik l&ouml;sen, es ist auf keinem Fall ein Ersatz f&uuml;r ein konsistentes Backup! Der DC wird &ldquo;nicht autorisierend&rdquo; wiederhergestellt.&nbsp;so long,tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-virtualized-domain-controller/\"\n},{\n  \"id\": \"post-exchange-2010-send-on-behalf-for-distribution-groups\",\n  \"title\": \"Exchange 2010 Send on behalf for distribution Groups\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Tipp: Damit man die “send on behalf” Berechtigung einem Benutzer für eine Verteilergruppe geben kann, ist ein einfacher Powershell Befehl nötig:Set-DistributionGroup GroupName -GrantSendOnBehalfTo UserName&#160;Grüßedn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-send-on-behalf-for-distribution-groups/\"\n},{\n  \"id\": \"post-windows-8-to-go\",\n  \"title\": \"Windows 8 to Go\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"de\"],\n  \"content\": \"Mit Windows 8 kommt ein neues Feature \\\"Windows 8 to Go\\\", welches bereits in der CP verf&uuml;gbar ist. Damit ist es m&ouml;glich die Windows Umgebung per USB-Stick oder anderen Datentr&auml;ger mitzunehmen.Als erstes muss der USB Stick bootf&auml;hig gemacht werden. Diese Prozedur ist dieselbe, die Thomas bereits in folgenden Post erkl&auml;rt um Windows 7/8 vom USB Stick zu installieren.Anbei nochmal kurz die Befehle:- diskpart- list disk- select disk X (USB Datentr&auml;ger ausw&auml;hlen)- create partition primary- format fs=ntfs quick- active&nbsp;Jetzt muss noch der PC neu gestartet werden und Windows 8 installiert werden. Als Datentr&auml;ger empfiehlt sich hier ein USB 3.0 Speichermedium.&nbsp;Gr&uuml;&szlig;edn\",\n  \"url\": \"https://onprem.wtf/post/windows-8-to-go/\"\n},{\n  \"id\": \"post-forefront-tmg-2010-sp2-nlb-kerberos\",\n  \"title\": \"Forefront TMG 2010 SP2–NLB Kerberos\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"Seit kurzem ist das Service Pack 2 f&uuml;r den Nachfolger von ISA 2006 verf&uuml;gbar. Neben Bugfixes und verbesserten Fehlerseiten ist vor allem die M&ouml;glichkeit den Firewall Service als Domain User zu starten interessant. Dadurch erh&auml;lt man die M&ouml;glichkeit den SPN f&uuml;r die virtuelle IP Adresse des NLB Custer auf eine Benutzerkonto zu binden, wenn der Firewall Service dann mit diesem Konto gestartet wird, funktioniert Kerberos Authentifizierung auch im NLB.&nbsp;&nbsp;NLB und KerberosF&uuml;r ein erfolgreiche Kerberos Authentifizierung muss der Service Principal Name den der Client verwendet um sich mit dem Server zu verbinden im Active Directory Account des Servers registriert sein. Der SPN muss im gesamten Forest eindeutig sein, d.h. nur ein Account kann den SPN f&uuml;r die NBL IP Adresse verwenden. Verbinden sich Clients mit anderen Knoten im Cluster schl&auml;gt die Kerberos Authentifizierung fehl, da der SPN nicht stimmt.Bisher konnte der &ldquo;Microsoft Forefront TMG Firewall Service&rdquo; nur als Network Service laufen, d.h. f&uuml;r Kerberos Authentifizierungen wurde das Computerkonto jedes TMG Servers verwendet.Mit Service Pack 2 kann man den Firewall Dienst als Dom&auml;nenbenutzer starten, registriert man auf diesen Dom&auml;nenbenutzer die ben&ouml;tigten SPNs funktioniert die Kerberos Authentifizierung im Clusterbetrieb.Service Account SicherheitAus Sicherheitsgr&uuml;nden sollte man ein eigenes Benutzerkonto f&uuml;r den TMG Service anlegen, dieses Benutzerkonto sollte ausschlie&szlig;lich f&uuml;r TMG verwendet werden und keine weiteren Berechtigungen in der Domain haben. Au&szlig;erdem sollte man das Konto aus der Gruppe &ldquo;Domain Users&rdquo; entfernen, und eine andere Gruppe als prim&auml;re Gruppe definieren. Auch dieses Gruppe sollte kein Berechtigungen in der Domain oder auf einem anderen System haben.Forefront TMG erteilt dem Benutzerkonto automatisch die minimal ben&ouml;tigten Berechtigungen wenn man den Firewall Service f&uuml;r dieses Konto konfiguriert. Auch auf dem TMG ist somit keine Konfiguration von Berechtigungen f&uuml;r das Service Account notwendig.KonfigurationNach der Installation von Service Pack 2 kann man in den Eigenschaften des Arrays, im Reiter &ldquo;Credentials&rdquo; das Konto ausw&auml;hlen unter dem der Firewall Service in Zukunft laufen soll.SPN hinzuf&uuml;genUm einen Serivce Principal Name zum Service Account hinzuzuf&uuml;gen, kann man z.B. das Tool &ldquo;setspn&rdquo; verwenden.Registrierte SPNs anzeigen:setspn &ndash;L benutzername&lt;/p&gt;setspn &ndash;L computername&lt;/code&gt;Neuen SPN registrieren:setspn -S http/myArray.ntsystems.local tmgSvcUsrDer Parameter &ndash;S &uuml;berpr&uuml;ft zuerst ob der SPN nicht bereits von einem anderen Konto verwendet wird, anschlie&szlig;end wird er zum Konto hinzugef&uuml;gt.Verify Kerberos AuthenticationMit einem Netzwerk Analyse Tool sieht man dass vor der Registrierung des SPN NTLM f&uuml;r Proxy Authentifizierung verwendet wird.Wurde der Firewall Service als Domain User gestartet und der ben&ouml;tigte SPN registriert, wird Kerberos verwendet.Der Client verwendet jetzt GSS-API, also Kerberos, um sich zu authentifizieren. Mit &ldquo;klist&rdquo; kann man sehen dass der Client jetzt ein Ticket f&uuml;r den Array Namen hat.Achtung: Es m&uuml;ssen alle Mitglieder im Array aktualisiert werden, bevor der Firewall Service als Domain User gestartet werden kann. Au&szlig;erdem sollte man den SPN erst dann hinzuf&uuml;gen, wenn der Firewall Service als Domain User l&auml;uft da es sonst zu Authentifizierungsproblemen kommt.&nbsp;Weitere Informationen zu &ldquo;Kerberos authentication on an NLB array&rdquo; im TechNet: http://technet.microsoft.com/en-us/library/hh454304.aspxUm Forefront TMG SP2 installieren zu k&ouml;nnen muss Forefront TMG SP1 Update 1 installiert sein, Download: http://www.microsoft.com/download/en/details.aspx?id=11445&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-tmg-2010-sp2-nlb-kerberos/\"\n},{\n  \"id\": \"post-windows-server-8-cp-dhcp-server-failover\",\n  \"title\": \"Windows Server 8 CP–DHCP Server Failover\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"In Windows Server Versionen bis 2008R2 gab es f&uuml;r eine ausfallsichere DHCP Umgebung zwei M&ouml;glichkeiten, ein sogenanntes Split Scope Deployment oder ein Windows Failover Cluster. Beide Varianten haben Nachteile, im Split Scope Deployment teilen sich mehrere DHCP Server einen Bereich. F&auml;llt ein Server aus, gibt es auf den verbleibenden Servern unter Umst&auml;nden nicht genug freie Adressen, auch Leases bzw. Reservierungen sind nicht konsistent. Ein Failover Cluster hat einen gewissen administrativen Aufwand (Shared Storage) und erfordert Windows Server Enterprise Lizenzen f&uuml;r alle Knoten im Cluster.Windows Server 8 DHCP Server FailoverDHCP Server Failover bietet die M&ouml;glichkeit zwei DHCP Server f&uuml;r einen Bereich zu konfigurieren. Es muss sich dabei um Windows 8 DHCP Server handeln, andere Hersteller oder &auml;ltere Server Betriebssysteme werden nicht unterst&uuml;tzt. Im Load Sharing Modus bedienen beide Server Client Anfragen und replizieren die Lease Informationen. F&auml;llt ein Server aus kann der zweite Server bereits bestehende Leases verl&auml;ngern. Au&szlig;erdem verf&uuml;gen beide Server &uuml;ber den gesamten Bereich, Reservierungen und Optionen werden ebenfalls zwischen den Servern repliziert und sind so konsistent.Load Sharing ModeIm Standard Modus wird ein Failover Relationship im Load Sharing betrieben, das bedeuted Clientanfragen werden gleichm&auml;&szlig;ig auf die beiden DHCP Server verteilt. Die Verteilung der Anfragen kann &uuml;ber den Wert load-balancing ratio konfiguriert werden. Der Load Sharing Mode eignet sich f&uuml;r Server im selben Standort.Hot Standby ModeAlternativ k&ouml;nnen die DHCP Server im Hot Standby Mode betrieben werden, dabei ist ein Server &ldquo;aktiv&rdquo; und bedient Clientanfragen. Der zweite Server &uuml;bernimmt diese Aufgabe sobald er erste nicht mehr verf&uuml;gbar ist. Die Entscheidung ob ein Server &ldquo;aktiv&rdquo; oder &ldquo;standby&rdquo; ist, kann f&uuml;r jeden DHCP Bereich getroffen werden, ein Server kann also standby f&uuml;r einen Bereich sein und gleichzeitig aktiv f&uuml;r einen andern. Der Hot Standby Mode eignet sich f&uuml;r Au&szlig;enstellen oder kleinere Standorte an denen kein zweiter Server vor Ort ist und ein Server im entfernten Rechenzentrum nur im Problemfall &uuml;bernehmen soll.DHCP Rolle installierenDie DHCP Server Rolle wird &uuml;ber den Server Manager hinzugef&uuml;gt, dazu verwendet man den Add Roles and Features Wizard.Die entsprechende Rolle ausw&auml;hlen, und entscheiden ob der Server automatisch neustarten soll, das ist f&uuml;r DHCP nicht notwendig.Nach der Installation wei&szlig;t der Post-Install configuration Wizard darauf hin, dass man den Server noch im Active Directory autorisieren muss.Nat&uuml;rlich kann man die Rolle auch mit der PowerShell hinzuf&uuml;gen, verwendet wird dazu das Modul ServerManager (PowerShell v3 importiert Module automatisch, also kein Import-Module):Auch nach dieser Insatllation wei&szlig;t der ServerManager auf notwendige Post-Install Schritte hinEs sind jetzt zwei DHCP Server verf&uuml;gbar, nun geht es an die Failover Konfiguration.DHCP Server Failover Konfiguration&Uuml;ber einen Rechtsklick auf einen DHCP Server im Server Manager &ouml;ffnet man die bekannte dhcpmgmt Konsole (doch nicht &uuml;berall Metro).Ein neuer Bereich wird, wie immer, mit einem Rechtsklick auf den IPv4 Knoten erstellt. Dabei hat sich mit WS8 nichts ge&auml;ndert, man w&auml;hlt einen Namen, das Subnet bzw. den IP Range sowie Optionen wie Gateway und DNS Server.Jetzt kann man entscheiden ob man DHCP Failover f&uuml;r den gesamten Server oder f&uuml;r jeden einzelnen Bereich konfigurieren will. Je nach dem f&uuml;r welche Konfiguration man sich entscheidet, beginnt man mit der Konfiguration auf dem IPv4 Knoten oder auf dem jeweiligen Bereich.Mit &ldquo;Configure Failover&rdquo; wird die Konfiguration gestartet, als ersten Schritt muss man den Partner-Server angeben.Nach der Auswahl des Partner-Servers werden einige Voraussetzungen f&uuml;r eine erfolgreiche Failover Beziehung &uuml;berpr&uuml;ft, unter anderem wird &uuml;berpr&uuml;ft ob der Server erreichbar ist, ob mindestens Windows Server 8 Beta installiert ist, ob der angemeldete Benutzer &uuml;ber ausreichende Rechte verf&uuml;gt (Mitglied der Gruppe DHCP Administrators) und ob auf dem Partner &uuml;berhaupt ein DHCP Server l&auml;uft. Sind die Vorrausetzungen ok, wird ein Dialog f&uuml;r die Konfiguration des Failover Relationships angezeigt.In diesem Dialog wird der Failover Mode konfiguriert. Au&szlig;erdem kann die Load Sharing ratio hier festgelegt werden. Maximum Client Lead Time gibt die tempor&auml;re Lease Zeit f&uuml;r neue Clients an, deren Anfragen der Failover Server bedient. Auch die Zeit nach der ein Server im Partner-Down-State den gesamten Bereich &uuml;bernimmt wird durch die MCLT gesetzt.Wird der Hot Standby Mode gew&auml;hlt, kann anstelle der Load Sharing ratio die Menge an Adressen Konfiguriert werden, welche f&uuml;r den Standby Server reserviert werden. Sollten keine Adressen reserviert werden, kann der Standby Server erst dann neue Clients bedienen, wenn er den gesamten Bereich &uuml;bernommen hat, das dauert standardm&auml;&szlig;ig eine Stunde (MCTLT).Das Auto State Switchover interval gibt an nach welcher Zeit ein Server vom communication interrupted in den partner down state wechselt. Standardm&auml;&szlig;ig passiert das nach 10 Minuten.Hat man die Optionen konfiguriert wird die Partnerschaft konfiguriert. F&uuml;r die Failover Konfiguration wird TCP Port 647 verwendet.In den Eigenschaften des Bereiches gibt es den neuen Reiter Failover, dort kann man den Status der Failover Partnerschaft und die konfigurierten Optionen sehen.Konfiguration &auml;ndern oder l&ouml;schenUm die Konfiguration zu &auml;ndern, &ouml;ffnet man die Eigenschaften des IPv4 Konten und w&auml;hlt dort unter Failover die entsprechende Partnerschaft aus.Mit Edit kann man die ausgew&auml;hlte Partnerschaft &auml;ndern, mit delete wird diese gel&ouml;scht.Verify FailoverMit einem Netzwerk Analyse Tool sieht man die DHCP Kommunikation, hier ist zu beobachten dass der Client zwei DHCP Offers bekommt. Eine von jedem Server in der Failover Konfiguration.Beide DHCP Offers sind bis auf die angebotene Lease Time identisch, der &ldquo;aktive&rdquo; Server bietet eine Adresse mit der im Bereich konfigurierten Lease Time an (8 Tage).W&auml;hrend die Lease Time im Offer des &ldquo;standby&rdquo; Servers der Maximum Client Lead Time entspricht.&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-dhcp-server-failover/\"\n},{\n  \"id\": \"post-wireshark-und-windows-8\",\n  \"title\": \"Wireshark und Windows 8\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"de\",\"Server-2012\"],\n  \"content\": \"Eines der ersten Tools das auf meinen Ger&auml;ten installiert wird ist das Analysetool Wireshark.Nach der Installation auf Windows 8 konnte ich keine neuen Captures starten, es war kein Interface verf&uuml;gbar.Das Problem scheint am WinPCAP Treiber zu liegen, die L&ouml;sung war einfach. Ich habe den WinPCAP im &ldquo;Kompatibilit&auml;tsmodus&rdquo; Windows 7 neu installiert.&nbsp;Download WinPCAP: www.winpcap.orghave fun!\",\n  \"url\": \"https://onprem.wtf/post/wireshark-und-windows-8/\"\n},{\n  \"id\": \"post-windows-server-8-cp-ad-administrative-center\",\n  \"title\": \"Windows Server 8 CP–AD Administrative Center\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2012\",\"Server\"],\n  \"content\": \"Mit Windows Server 2008R2 wurde das Active Directory Verwaltungscenter oder Administrative Center eingeführt. Es sollte das seit Windows 2000 bekannte Active Directory Users and Computers Snap-in ersetzen. Das Verwaltungscenter in Windows 8 Server Beta kommt im Metro Style daher und ist Teil der ADDS Simplified Administration. Es bietet einige sehr nützliche Funktionen, unter anderem endlich eine grafische Oberfläche für PSO und den AD Papierkorb. Außerdem werden die neuen Dynamischen ACLs über das Verwaltungscenter konfiguriert.Da es auf PowerShell aufsetzt, ist ein PowerShell History Viewer integriert.Metro StyleGeöffnet wird das Administrative Center über “Tools” im Server Manager oder man führt “dsac.exe” aus.“Reset Password” und “Global Search” sind schon aus dem ADAC von 2008R2 bekannt, neu ist die PowerShell History im unteren Bereich. Öffnet man diesen sieht man die PowerShell Befehle welche das ADAC zuletzt ausgeführte. Active Directory Recycle BinAuch der AD Papierkorb wurde mit Windows Server 2008R2 eingeführt, die Verwendung war zwar etwas kompliziert (keine grafische Oberfläche), trotzdem war es eine nützliche Erweiterung. Mit Windows Server 8 gibt es ein GUI um gelöschte Objekte einfach zu finden und wiederherzustellen.Sollte der AD Recycle Bin noch nicht aktiv sein, kann man ihn im ADAC gleich aktivieren. Dafür muss sich der Forest im “Windows Server 2008R2” Functional Level befinden.Einfach auf “Enable Recycle Bin…” klicken und den Dialog bestätigen, schon ist der Recycle Bin aktiv. Natürlich muss die Änderung auf alle DCs repliziert werden, erst wenn dieser Vorgang abgeschlossen ist funktioniert er zuverlässig.Im der PowerShell Histroy sieht man sofort welcher Befehl ausgeführt wurde: Enable-ADOptionalFeature -Confirm:$false -Identity:&quot;766ddcd8-acd0-445e-f3b9-a7f9b6744f2a&quot; -Scope:&quot;ForestOrConfigurationSet&quot; -Target:&quot;tomt.local&quot;Löscht man jetzt ein Objetk aus dem AD wird es in den neu erstellten Container “Deleted Objects” verschoben. Dort bleibt es (mit all seinen Attributen und Links) bis die Deleted Objects Lifetime (msDS-DeletedObjectLifetome)abgelaufen ist, dann wird es zum recycled Object. Nach Ablauf der Recylced Object Lifetime (tombstoneLifetime) wird es vom Garbage Collection Process endgültig aus der AD Datenbank gelöscht.Im “Deleted Obejects” Container findet man gelöschte Objekte die nach aktiveren des Recylce Bin Features gelöscht wurden und deren Deleted Objects Lifetime noch nicht abgelaufen ist. Man kann in dem Container suchen und die Ansicht filtern um die gewünschten Objekte zu finden.Hat man die Objekte gefunden kann man diese einzeln oder mehrere zusammen wiederherstellen. Einfach rechts auf das Objekt klicken und “Restore” oder “Restore To…” auswählen.“Restore” stellt die Objekte an ihrem Ursprünglichen Ort wieder her (lastKnownParent), mit “Restore To…” erhält man folgenden Dialog und kann das Ziel auswählen.Auch hier werden in der PowerShell History die ausgeführten Befehle angezeigt:Restore-ADObject -Confirm:$false -Identity:&quot;bb127a94-277f-4a7d-a09b-5893906cb16b&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot;Fine-Grained Password PolicyFine-Grained Password Policies wurden mit Windows Server 2008 eingeführt, sie waren eine wichtige Neuerung und auch sie waren in der Verwendung nicht ganz einfach.Mit dem neuen ADAC gibt es eine GUII für die sogenannten PSOs oder Password Setting Objects. Um ein neues PSO zu erstellen öffnet man den Container Password Settings (“CN=Password Settings Container,CN=System,DC=tomt,DC=local”) und klickt auf New, Password Settings.Im Dialog “Create Password Settings” kann man die Fine-Grained Password Policy konfigurieren und diese gleich einer Gruppe oder einem Benutzer zuweisen. Ist ein Benutzer Mitglied in mehreren Gruppen auf die ein PSO angewendet wird, hat jenes mit dem niedrigerem Precedence Wert (msDS-PasswordSettingsPrecedence) Vorrang.Und auch hier wieder die entsprechenden PowerShell Befehle:Add-ADFineGrainedPasswordPolicySubject -Identity:&quot;CN=pso_group1,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot; -Subjects:&quot;CN=group1,OU=groups,OU=tomt,DC=tomt,DC=local&quot;      &lt;/p&gt;    New-ADFineGrainedPasswordPolicy -ComplexityEnabled:$true -LockoutDuration:&quot;00:30:00&quot; -LockoutObservationWindow:&quot;00:30:00&quot; -LockoutThreshold:&quot;0&quot; -MaxPasswordAge:&quot;42.00:00:00&quot; -MinPasswordAge:&quot;1.00:00:00&quot; -MinPasswordLength:&quot;7&quot; -Name:&quot;pso_group2&quot; -PasswordHistoryCount:&quot;24&quot; -Precedence:&quot;20&quot; -ReversibleEncryptionEnabled:$false -Server:&quot;WIN8CP-DC1.tomt.local&quot;          Set-ADObject -Identity:&quot;CN=pso_group2,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -ProtectedFromAccidentalDeletion:$true -Server:&quot;WIN8CP-DC1.tomt.local&quot;&lt;/code&gt;  Durch diese neuen grafischen Oberflächen wird das ADAC wahrscheinlich mehr Verwendung finden als sein Vorgänger. Auch an den Metro Style wird man sich gewöhnen (müssen).  &#160;  so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-ad-administrative-center/\"\n},{\n  \"id\": \"post-windows-server-8-cp-remote-group-policy-refresh\",\n  \"title\": \"Windows Server 8 CP–Remote Group Policy refresh\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"Mit Windows Server 8 kann man einen Group Policy refresh auf remote Computern initiieren. Verwendet wird dazu die GPMC oder natürlich PowerShell.Group Policy Management ConsoleMan wählt die OU aus in der sich die Computerkonten befinden auf denen man das Update ausführen möchte. Achtung: Man kann das GP Update nur auf Computerkonten initiieren, es werden aber Computer und Benutzerrichtlinien aktualisiert.Mit einem Rechtsklick auf die OU kann man “Group Policy Update…” auswählen. Der Dialog um das Update zu bestätigen zeigt an um wie viele Computer es sich handelt.Klickt man auf “Yes” wird “gpupdate /force” auf den erreichbaren Computern ausgeführt.Ein kurzer Report wird angezeigt, in dem evtl. Fehler sichtbar sind.PowerShellMit dem cmdlet “Invoke-GPUpdate” aus dem Modul “GroupPolicy” kann man das GP Update auch per PowerShell starten.Invoke-GPUpdate –Computer “win8cp-dc1”FirewallDamit das Remote GP Update funktioniert müssen folgende Windows Firewall Regeln aktiviert sein (Verbindungen akzeptieren)   Remote Scheduled Tasks Management (RPC)    Remote Scheduled Tasks Management (RPC-EPMAP)    Windows Management Instrumentation (WMI-IN) &#160;tom\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-remote-group-policy-refresh/\"\n},{\n  \"id\": \"post-windows-server-8-cp-servermanager\",\n  \"title\": \"Windows Server 8 CP –ServerManager\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2012\"],\n  \"content\": \"Seit kurzem die Beta des neuen Servers verfügbar, natürlich musste mal wieder ein neuer Name her: Windows Server “8” Consumer Preview.Der neue Server Manager ist natürlich im Metro Style und ist über die RSAT (Remote Server Administration Tools) auch für das neue Client OS (Windows 8 Consumer Preview) verfügbar.Download RSAT (Beta/CP): http://www.microsoft.com/download/en/details.aspx?id=28972DashboardÜber das Dashboard sieht man eine Zusammenfassung der verwalteten Server und Rollen. Der Status wird automatisch aktualisiert, standardmäßig alle 10 Minuten. Man wird so auf evtl. Probleme hingewiesen.Über “Manage” kann man Server hinzufügen oder Rollen und Features auf bereits verwalteten Server installieren.Fügt man einen Server hinzu, kann man diese aus dem Active Directory suchen oder den DNS Namen angeben, außerdem kann man Textdateien die Servernamen enthalten importieren.Damit man einen Server hinzufügen kann muss die Remoteverwaltung (WinRM) dort aktiviert werden, DCOM wird nicht mehr benötigt.Server GroupsMit Server Gruppen können mehrere Server die z.B. dieselbe Aufgabe erfüllen zu einer Gruppe hinzugefügt werden.&#160;&lt;h1&gt;Add Roles and Features&lt;/h1&gt;  &lt;p&gt;Über den Server Manager können Rollen und Features auf allen verwalteten Server hinzugefügt oder entfernt werden. In folgendem Beispiel füge ich einen weiteren Domain Controller hinzu. Alle Schritte führe ich auf meinem Windows 8 CP Client mit RSAT aus.&lt;/p&gt;  &lt;p&gt;Unter “Manage” klicke ich auf “Add Roles and Features” um den Wizard zu starten.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_377.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_375.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle die Art der Installation und den Zielserver aus.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_378.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_376.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle Active Directory Domain Services aus und bestätige dass ich die nötigen Rollen sowie die Management Tools installieren möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_379.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_377.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_380.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_378.png\\\" width=\\\"234\\\" height=\\\"244\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wurden die ADDS Binaries auf dem Zielserver installiert erhält man eine Notification im Server Manager, hier wird auch gleich der “Task” angezeigt um den Server zum Donain Controller zu machen (zu promoten)&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_381.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_379.png\\\" width=\\\"244\\\" height=\\\"132\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich klicke also auf “Promote this server to a domain controller” und komme so zu folgendem Wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_382.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_380.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wie bereits mit “dcpromo” kann man auch hier auswählen ob man den DC zu einer bestehenden Domain, eine neue Domain in einem bestehenden Forest hinzufügen, oder gleich einen neuen Forest erstellen möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_383.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_381.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Im nächsten Schritt werden die DC Options konfiguriert. Der DC soll DNS sowie Global Catalog sein, außerdem wird hier die Site ausgewählt und das DSRM Passwort gesetzt.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_384.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_382.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Man kann noch die Pfade für die ADDS Datenbank und Log Files sowie den SYSVOL Share setzen.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_385.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_383.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ist die Konfiguration abgeschlossen kommt man zur “Review Options” Seite, man kann die ausgewählten Optionen nochmal überprüfen. Das eigentlich interessante an dieser Seite ist jedoch der Button “View Script” er zeigt das PowerShell Script an, welches auf dem Remote Server ausgeführt wird.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_386.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_384.png\\\" width=\\\"244\\\" height=\\\"211\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der Server Manager erledigt alle Tasks mit PowerShell Befehlen, dcpromo kann noch für “unattended” Insatllationen verwendet werden, die Empfehlung von Microsoft ist es allerdings “dcpromo” nicht mehr zu verwenden.&lt;/p&gt;  &lt;p&gt;Server Manager führt einen prerequisite Check auf dem Zielserver durch, dabei wird überprüft ob der Server zum DC promoted werden kann.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\"/assets/archive/image_387.png\\\"&gt;&lt;img style=\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\" title=\\\"image\\\" border=\\\"0\\\" alt=\\\"image\\\" src=\\\"/assets/archive/image_thumb_385.png\\\" width=\\\"244\\\" height=\\\"180\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nach dem Klick auf “Install” gehts los, der Server wird hochgestuft, und DNS sowie die AD Tools werden installiert. Anschließend wird der Server neu gestartet und ich habe einen neuen DC.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;tom&lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/windows-server-8-cp-servermanager/\"\n},{\n  \"id\": \"post-powershell-loves-wmi-os-info\",\n  \"title\": \"PowerShell loves WMI – OS Info\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Mit dem cmdlet Get-WmiObject kann Windows PowerShell auf WMI Objekte zugreifen. Man kann also z.B. die Eigenschaften der Klasse “Win32_OperatingSystem” anzeigen und daraus Informationen über das Betriebssystem erhalten.Die vollständige Liste der Eigenschaften (und Methoden) gibt es im MSDN. Oder natürlich mit folgendem Befehl:Get-WmiObject -Class win32_OperatingSystem -Property * | select *Interessante EigenschaftenOperatingSystemSKU: Enthält die installierte Version des Betriebssystems, z.B. Ultimate, Enterprise, Datacenter Server EditionProductType: Workstation, Domain Controller, ServerBuildNumber: Enthält die Build Nummer des BetriebssystemsOSArchitecture: 32-Bit oder 64-BitFilterMan kann aufgrund dieser Eigenschaften einfache Filter für Scripts erstellen und so z.B. sicherstellen dass ein bestimmtes Script nur auf einem bestimmten Betriebssystem ausgeführt wird.#Variable OS erstellen, enthält alle Informationen der angegebenen Klasse&lt;/p&gt;    $OS = Get-WMIObject –Class Win32_OperatingSystem    if($OS.OperatingSystemSKU -eq &quot;4&quot; -and $OS.Caption -like &quot;*Windows 7*&quot;) {    #Code für Windows 7 Enterprise    } else {    #Code für jedes andere OS    }    if ($os.OSArchitecture -eq &quot;64-bit&quot;){    #Code für x64     } else {    #Code für x86    }&lt;/code&gt;  Das sind natürlich sehr einfache Beispiele, wie mächtig WMI ist kann man sich am besten in der WMI Reference ansehen. Außerdem enthält das Beispiel keine Fehlerüberprüfung, läuft irgendwas schief, wars das.  Remote  Natürlich kann man auch Informationen über einen oder mehrere remote Computer auswerten. Das cmdlet Get-WmiObject hat den Parameter Computername über den man einen oder mehrere Computernamen (getrennt mit Komma) abfragen kann. Über Pipline Input kann man dem cmdlet Computernamen aus einem Textfile oder dem ActiveDirectory übergeben.  Get-WmiObject –Class win32_OperatingSystem –Computer mypc1,mypc2&lt;/p&gt;    Get-ADComputer -Filter 'Name -like &quot;*Server*&quot;'| Get-WmiObject –Class win32_OperatingSystem&lt;/code&gt;  &#160;  so long,  tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-loves-wmi-os-info/\"\n},{\n  \"id\": \"post-powershell-implicit-remoting\",\n  \"title\": \"PowerShell Implicit Remoting\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Eine der wichtigsten Funktionen der PowerShell ist die M&ouml;glichkeit cmdlet&rsquo;s (ScriptBlocks) auf remoten System auszuf&uuml;hren. Dazu wird eine PowerShell Sesion mit dem Remote Computer erstellt, die Befehle werden remote ausgef&uuml;hrt und das Ergebnis lokal angezeigt.Nun gibt es verschiedene Module f&uuml;r das Verwalten von Serverrollen wie z.B. Active Directory, Exchange 2010 oder Lync 2010. Will ich von meinem Client aus diese cmdlet&rsquo;s verwenden muss ich die Module installieren. Oder?Session erstellen und Modul LadenMan erstellt eine neue PSSessoin mit einem Computer auf dem das entsprechende Modul installiert ist.$ADSession = New-PSSession &ndash;ComputerName dc01.domain.localDann wird das Modul in der gerade erstellten Session geladen:Invoke-Command {Import-Module ActiveDirectory}&nbsp; -Session $ADSessionImport-PSSessionBefehle aus einer Session k&ouml;nnen mit Import-PSSession in die aktuelle PowerShell Sitzung &uuml;bernommen werden, man kann entweder alle Verf&uuml;gbaren cmdlet&rsquo;s importieren oder nur einen Teil. In diesem Beispiel interessieren mich die cmdlets aus dem ActiveDirectory Modul, die entsprechenden Nouns beginnen mit AD, ich kann also auf *-AD* Filtern und so nur ActiveDirectory cmdlet&rsquo;s &uuml;bernehmen.Import-PSSession -Session $ADSession-CommandName *-AD*So kann ich in meiner aktuellen PS Sitzung die AD cmdlet&rsquo;s wie Get-ADUser verwenden. Schlie&szlig;e ich das aktuelle PS Fenster wars das mit den AD cmdlet&rsquo;s.Export-PSSessionDamit man sich diese Befehle nicht merken muss und die cmdlet&rsquo;s einfach wiederverwendet kann, erstellt Export-PSSession automatisch ein Modul mit den gew&uuml;nschten remote cmdlet&rsquo;s.Export-PSSession $ADSession -OutputModule AD -CommandName *-AD* &ndash;AllowClobberJetzt kann man das aktuelle PowerShell Fenster schlie&szlig;en, ein Modul wurde erstellt das wie gewohnt geladen werden kann.Import-Module ADDie Befehle aus dem Modul sind jetzt verf&uuml;gbar, allerdings gibt es noch keine PSSession. Diese muss jedoch nicht manuell erstellt werden, f&uuml;hrt man den ersten Befehl aus dem Modul aus (Get-ADUser username) wird automatisch eine PS Session mit dem remote Computer erstellt und das cmdlet ausgef&uuml;hrt.So kann man also auf jedem beliebigen Client (auf dem nur PowerShell v2 installiert ist) cmdlet&rsquo;s ausf&uuml;hren die auf dem Server laufen.Exchange und LyncExchange und Lync bieten einen eigenen Endpoint f&uuml;r PowerShell Verbindungen, man gibt diesen bei der Erstellung der PSSession als ConnectionURI an.$exSession = New-PSSession -ConnectionUri 'http://ex14.domain.local/powershell/&rsquo; -ConfigurationName Microsoft.Exchange -Authentication Kerberos&lt;/p&gt;$lyncSession = New-PSSession &ndash;ConnectionUri &lsquo;https://lync.domain.local/ocspowershell&rsquo;&lt;/code&gt;Hat man die gew&uuml;nschte Session erstellt kann man sie wie gehabt mit Import-PSSession gleich verwenden oder mit Export-PSSession ein Modul erstellen.PrefixDamit man die lokalen und remoten cmdlet&rsquo;s unterscheiden kann, gibt es den Parameter &ndash;Prefix f&uuml;r die cmdlet&rsquo;s Import-Module und Import-PSSession.Import-Module AD &ndash;Prefix &lsquo;r&rsquo;So wird jedem Noun ein &lsquo;r&rsquo; vorgestellt, ich verwende also z.B. Get-rMailbox, Get-rADUser usw.&nbsp;Ich denke diese wenig bekannte Funktionalit&auml;t zeigt wie genial das Konzept der PowerShell ist, mit Windows 8 sollen jede Menge weitere cmdlet&rsquo;s dazukommen. PowerShell wird das ultimative Admin Werkzeug werden.&nbsp;so long, happy hacking!tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-implicit-remoting/\"\n},{\n  \"id\": \"post-exchange-2010-sp2-installation\",\n  \"title\": \"Exchange 2010 SP2 Installation\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Service Pack 2 für Exchange 2010 ist seit über zwei Monaten verfügbar,langsam Zeit sich ernsthaft gedanken über ein Update zu machen. Dabei gibt es ein paar Dinge zu berücksichtigen, hier eine kurze Zusammenfassung.Active Directory SchemaEs gibt ein neues Active Directory Schema, ein paar Infos dazu hier: http://blogs.technet.com/b/exchange/archive/2012/01/17/custom-aka-extension-attributes-in-exchange-2010-sp2-and-their-use.aspxUm das AD Schema zu aktualisieren benötigt man “Schema Admin” Berechtigungen, installiert man Exchange 2010 SP2 mit einem Benutzer der diese Rechte hat wird das Schema automatisch erweitert. Alternativ kann man die Setup Files von SP2 auf den Schema-Master kopieren und mit setup.com /prepareAD das Update durchführen.Die aktuelle Schema Version findet man folgendermaßen:Active Directory Schema:Get-ADObject &quot;cn=schema,cn=configuration,dc=ath,dc=int&quot; -Properties ObjectVersionExchange Schema:Get-ADObject &quot;cn=ms-Exch-Schema-Version-Pt,cn=schema,cn=configuration,dc=domain,dc=local&quot; -Properties RangeUpperGenauere Infos und die genauen Schema Versionsnummern gibt es im TechNet Wiki.Client Access Sever PrerequisiteDie Systemvoraussetzungen für die Client Access Rolle wurden geändert, hinzugefügt wurde IIS 6 Wmi Compatibility oder “web-wmi”. Das Feature kann automatisch installiert werden wenn die entsprechende Option beim Setup aktiviert wird, alternativ kann man es im Servermanager oder per Powershell installieren.Import-Module Servermanager&lt;/p&gt;    Add-WindowsFeature Web-WMI&lt;/code&gt;  Execution Policy GPO  In vielen Umgebungen werden Einstellungen wie z.B. die PowerShell Execution Policy über Gruppenrichtlinien gesteuert. Diese Gruppenrichtlinie führt zu einem Problem bei der Installation des Service Packs das den Server in einem Status zurücklässt in dem Exchange nicht mehr läuft und die Installation nicht fortgesetzt werden kann. Der Fehler “AuthorizationManager check failed” wird angezeigt. Klingt nach Restore.  Um das zu verhindern muss man die Gruppenrichtlinie vor dem Update deaktivieren, überprüft werden kann das so:  Get-ExecutionPolicy –List    Wichtig ist hierbei dass MachinePolicy und UserPolicy auf “Undefined” stehen.  Genaueres gibt es in der Knowledge Base.  Release Notes  Wie vor jedem Update empfehle ich hier auf jeden Fall einen Blick auf die Release Notes zu werfen.  &#160;  so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-sp2-installation/\"\n},{\n  \"id\": \"post-windows-powershell-v30\",\n  \"title\": \"Windows PowerShell v3.0 (CTP 2)\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Schon seit einiger Zeit ist das Community Technology Preview 2 vom Windows Management Framework 3.0 verfügbar, unter anderem enthält es die Windows PowerShell v3.Um in den Genuss der neue Features wie “automatic module loading” und “robust sessions” zu kommen benötigt man ein englisches Windows 7 und das .NET Framework 4. Ist das Betriebssystem in einer anderen Sprache installiert muss man vor der Installation des Management Frameworks das englische Sprachpaket installieren.DownloadAchtung: Es handelt sich um pre-release Code, sollte natürlich nur in Testumgebungen verwendet werden!.NET Framework 4 - http://go.microsoft.com/fwlink/?LinkID=212547Windows Management Framework 3.0 - Community Technology Preview (CTP) #2 - http://www.microsoft.com/download/en/details.aspx?id=27548InstallationDie Installation ist denkbar einfach, zuerst wird das .NET Framework installiert, anschließend je nach Platform WINDOWS6.1-KB2506143-x64.msu oder WINDOWS6.1-KB2506143-x86.msu. Nach einem neustart ist die neue PS verfügbar.Einige FeaturesWie bereits erwähnt enthält die neue PowerShell eineige neue Features sowie jede Menge neue cmdlets. Besonders gut gefallen mir die “Robusten Sessions”, verliert man die Netzwerkverbindung ist eine PowerShell Session mit einem remoten Host für gewöhnlich weg. Mit PS v3 wird die Session automatisch wieder hergestellt.Außerdem angenehm ist das autmatische Laden von Modulen, wer z.B. diverse Admin-Tools (Active Directory, Exchange) installiert hat muss in einer neuen PowerShell Session immer Module nachladen (oder ein entsprechendes Profil erstellen). Mit v3 wird ein Modul automatisch geladen wenn ein cmdlet aus dem Modul verwendet wird.PowerShell v2Man kann natürlich auch mit installierter PS v3 die Version 2 verwenden, da es sich um pre-release Code handelt kann es durchaus zu Problemen kommen. Um v2 zu starten wird die powershel.exe mit dem Parameter “-version 2” gestartet.Weitere InformationenEin guter Start ist das TechNet Wiki: http://social.technet.microsoft.com/wiki/contents/articles/4741.powershell-v3-featured-articles-en-us.aspx&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/windows-powershell-v30/\"\n},{\n  \"id\": \"post-exchange-2010-recovery\",\n  \"title\": \"Exchange 2010–Restore Mailbox Content\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber ein anderes mal mehr.Restore FilesDie Datenbank wird von der Sicherung zurück geholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Wiederherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die .edb Datei (Datenbank) und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Recovery DatabaseIst die Wiederherstellung abgeschlossen wird mit der Exchange Management Shell eine Recovery Database erstellt, diese verwendet die wiederhergestellte .edb Date sowie die wiederhergestellten Log Files. Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server MBX01, X:\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner wiederhergestellt wurden.New-MailboxDatabase RDB01 –Recovery –Server MBX01 –EdbFilePath x:\\\\restore\\\\db.edb –LogFolderPath x:\\\\restore Die Datenbank wurde also erstellt, allerdings wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.EseutilUm die Datenbank in einen sauberen Status zu bringen wird eseutil.exe verwendet. Dabei ist es wichtig die richtigen Parameter zu verwenden.Als erstes kann man überprüfen in welchen Zustand sich die Datenbank befindet:Eseutil /mh x:\\\\restore\\\\db.edbDie Datenbank ist also im “Dirty Shutdown” State und kann so nicht gemounted werden, mit “eseutil /r” wird die DB ohne Datenverlust in einen “Clean Shutdown” State gebracht. Mit dem Parameter /r wird der Präfix der Logs angegeben, also am besten zuerst den Dateinamen den Logs überprüfen. Die Parameter /l und /d geben den Pfad zu den Logs&#160; bzw. zur Datenbank an.Eseutil /r “E01” /l x:\\\\restore\\\\ /d x:\\\\resotreAchtung: Sollte das nicht funktionieren kann mit eseutil /p ein Hard Repair durchgeführt werden, dabei wird die Datenbank ohne Rücksicht auf Verluste in den “Clean Shutdown” State gebracht. Datenverlust ist möglich!Nachdem Eseutil durchgelaufen ist und sich die Datenbank im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick auf die RDB oder mit der Management Shell und folgendem Befehl:Mount-Database RDB01Mailbox Restore RequestWenn die Recovery Database online ist kann man beginnen Mailbox Inhalte wiederherzustellen, dazu verwendet man das cmdlet New-MailboxResotreRequest. Folgendes Beispiel stellt den Inhalt der Mailbox “Test User” in den Ordner Restore derselben Mailbox wieder her.New-MailboxRestoreRequest –SourceDatabase ‘RDB01’ –SourceStoreMailbox ‘test user’ –TargetMailbox ‘test.user@ntsystems.it’ –TargetRootFolder ‘Restore’Folgendes Beispiel stellt den Inhalt aller Mailboxen der Datenbank DB01 wieder her. Es wird für jede Mailbox ein Restore Request erstellt, auch hier wird der Inhalt in den Ordner Restore der jeweiligen Mailbox wiederhergestellt.Get-Mailbox –Database ‘DB01’ |foreach { New-MailboxRestoreRequest -SourceStoreMailbox $_.Guid –SourceDatabase ‘RDB01’ -TargetMailbox $_.Guid –TargetRootFolder ‘Restore’}Bei diesem cmdlet ist zu beachten dass die Parameter –SourceStoreMailbox und -TargetMailbox verschiedene Eingaben unterstützen, am Besten die Mailbox GUID verwenden, diese wird von beiden unterstützt.Weitere Infos zu New-MailboxRestoreRequest gibt es im TechNet: http://technet.microsoft.com/en-us/library/ff829875.aspx&#160;CleanupWenn der Restore Vorgang abgeschlossen ist kann man die Recovery Database wieder entfernen, dazu muss sie zuerst mit folgendem Befehl dismounted werden:Dismount-Database RDB01Anschließend kann man die RDB löschen, dazu verwendet man folgenden Befehl:Remove-MailboxDatabase RDB01Die Datenbank ist jetzt aus der Konfiguration entfernt, die Files sind jedoch nach wie vor auf dem Server. Diese müssen manuell gelöscht werden.&#160;so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-recovery/\"\n},{\n  \"id\": \"post-exchange-2010-unified-messaging-cisco-call-manager-86\",\n  \"title\": \"Exchange 2010 Unified Messaging–Cisco Call Manager 8.6\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Unified Messaging in Exchange 2010 verbindet E-Mail mit Voice Messaging in einer Messaging Infrastruktur. E-Mail und Voice Mail Nachrichten werden in einer “unified” Mailbox verwaltet und der Benutzer erhält neben Outlook und OWA auch über das Telefon (OVA – Outlook Voice Access) Zugriff auf seine Mailbox.Um die Unified Messaging Rolle mit der “traditionellen” Telefonwelt zu verbinden braucht man ein IP Gateway oder eine IP Telefonzentrale wie den Cisco Call Manager.Exchange Unified MessagingDie Unified Messaging Server Rolle kann auf einem bestehenden Exchange Server hinzugefügt werden, alternativ kann man einen separaten UM Server installieren.PrerequisitesDie notwendigen Voraussetzungen müssen auf einem Windows Server installiert werden, dazu verwendet man am besten die Powershell. Folgendes Beispiel installiert die Voraussetzungen für einen Server der nur die UM Rolle betreibt.Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Desktop-Experience –RestartAchtung: Neustart erfolgt automatisch, sollte das nicht gewünscht sein den Parameter –Restart entfernen.UM Rolle InstallierenUm die Exchange UM Rolle zu installieren wird Setup.exe von einer aktuellen Version der Installationsmedien ausgeführt. Auf einem neuen Server wird dann nur die Unified Messaging Rolle installiert, ein bestehender Server wird über den “Maintenance Mode” um diese Rolle erweitert.Wie nach jeder Installation sollte man auch hier Windows Update ausführen und evtl. Updates installieren.UM KonfigurationNach der Installation der Rolle muss diese konfiguriert werden.Organization ConfigurationEin UM Dial Plan muss erstellt werden, dazu unter Organization Configuration auf Unified Messaging klicken und “New UM Dial Plan” wählen, hier wird der URI Type “Telephone Extension” ausgewählt sowie die länge der internen Telefonnummern (Extension) angegeben.Der UM Dial Plan ist die zentrale Komponente der UM Konfiguration und entspricht der Telefonzentrale bzw. Gruppen von Benutzern mit gleichen Telefonnummern (4 stellig) und dem selben URI Type (Telephone Extension).Der Dial Plan wird im Active Directory unter “CN=My 4 Digit DP, CN=UM DialPlan Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” gespeichert.Gleichzeitig mit dem Dial Plan wird eine UM Mailbox Policy erstellt, auch diese wird im AD unter “CN=My 4 Digit DP Default Policy, CN=UM Mailbox Policies, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain,DC=Local” gespeichert.Über die UM Mailbox Policy werden Einstellungen für UM aktivierte Postfächer konfiguriert.&#160;Als nächstes wird ein UM IP Gateway angelegt, das Gateway ist die SIP Gegenstelle. In diesem Fall gebe ich den Cisco Call Manager an. Um ein UM IP Gateway anzulegen klickt man unter Organization Configuration, Unified Messaging auf “New UM IP Gateway”.Für jedes IP Gateway wird im AD unter “CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” ein neuer Container angelegt.Eine Hunt Group verbindet das IP Gateway mit dem Dial Plan, wird beim erstellen des UM IP Gateways ein Dial Plan angegeben wird automatisch die “Default Hunt Group” erstellt. Dieser Default Hunt Group wird kein Pilot Identifier zugewiesen, d.h. alle eingehenden Calls (SIP Invites) werden angenommen.Wird die Hunt Group manuell erstellt kann ein Pilot Identifier angegeben werden, dadurch antwortet Exchange UM nur mehr auf Calls die eine konfigurierte Nummer anrufen. Ich verwende hier 9999 als Pilot Identifier, d.h. der Call Manager muss Anrufe an 9999 über den SIP Trunk routen.Um eine neue Hunt Group zu erstellen wählt man unter Organization Configuration, Unified Messaging das IP Gateway aus und klickt dann auf “New UM Hunt Group”.Die Hunt Group wird im Container des entsprechenden IP Gateways gespeichert, in diesem Fall unter: “CN=MY_CUCM_HuntGroup, CN=CUCM1, CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local”Die Verbindung zum Dial Plan wird im Attribut msExchUMHuntGroupDialPlanLink gespeichert.Die Exchange Unified Messaging Organisationskonfiguration ist somit abgeschlossen.Server ConfigurationIn der Server Configuration wird der Dial Plan mit einem oder mehreren Exchange UM Servern verbunden. Dazu unter Server Configuration auf Unified Messaging klicken und den entsprechenden Server auswählen. In den Eigenschaften “UM Settings” wählen und den Dial Plan hinzufügen.Die Exchange Unified Messaging Serverkonfiguration ist damit abgeschlossen und die Exchange Umgebung ist bereit für die erste “unified” Mailbox.Recipient ConfigurationUm eine Mailbox für UM zu aktivieren wählt man die Mailbox unter Recipient Configuration, Mailboxes aus und klickt auf Enable Unified Messaging.Jedem Benutzer muss eine UM Mailbox Policy zugewiesen werden, außerdem muss er eine eindeutige “Extension” erhalten. Die Extension ist die Telefonnummer unter der die Voice Mailbox antwortet, also die Interne Telefonnummer des Benutzers.Der Benutzer erhält ein Willkommens-E-mail von Unified Messaging in dem sein PIN und seine Extension mitgeteilt werden.Die Extension wird dem Benutzer als “E-Mail Adresse” vom Typ EUM zugewiesen:ProxyAddressString: EUM:1000;phone-context=CUCM1.domain.localSoll ein Benutzer mehrere Extension erhalten kann man diese einfach als zusätzliche “E-Mail Adressen” hinzufügen.&#160;Cisco Call ManagerDamit der Call Manager mit dem Exchange Server verbunden werden kann wird ein SIP Trunk benötigt. Außerdem muss eine Route erstellt werden über die der Call Manager weiß welche Nummern hinter dem SIP Trunk zu finden sind.SIP TrunkDer SIP Trunk wird unter Device, Trunk “Add New” erstellt.Man muss dem Trunk einen Namen geben, den Device Pool auswählen, die IP Adresse des Exchange UM Servers als Destination angeben und ein SIP Profile sowie das SIP Trunk Security Profile auswählen. Sind mehrere Exchange UM Server vorhanden muss ein Trunk pro Server angelegt werden.Wichtig: Für Outbound Calls muss “Redirecting Diversion Header Delivery – Outbound” aktiviert werden, durch die Informationen im Diversion Header kann der Exchange Server das Postfach aufgrund der Extension zuweisen.Für alle anderen Einstellungen sind die Defaults des Call Managers ok. Je nach Umgebung kann es sein dass man “Media Termination Point Required” aktivieren muss.Route PatternDamit der Call Manager Anrufe an 9999 routen kann muss man eine Route Pattern erstellen, dazu unter Call Routing, Route/Hunt auf Route Pattern klicken. Mit Add New kann eine neue Pattern hinzugefügt werden. Auch hier muss ein Device Pool sowie der SIP Trunk als Gateway angegeben werden. In Umgebungen mit mehrere Exchange UM Servern empfiehlt es sich eine Route List für die SIP Trunks anzulegen und die Pattern auf die Route List zu binden.Die minimale Konfiguration ist dadurch abgeschlossen, wenn der UM aktivierte Benutzer mit der Nummer 1000 jetzt die Nummer 9999 anruft erhält er Zugriff auf sein Postfach über OVA. Wenn derselbe Benutzer eine Umleitung auf 9999 einrichtet werden alle eingehenden Calls auf sein Voicemail Postfach umgeleitet.MWI - Message Waiting IndicatorWenn jemand eine Nachricht hinterlässt wird diese in der Inbox angezeigt, zusätzlich kann am Phone ein MWI Status angezeigt werden (rotes LED). Der Benutzer sieht so sofort dass er eine neue Voicemail hat. Um dieses Feature zu aktivieren muss das “SIP Trunk Security Profile” geändert werden. Dazu unter System, Security auf SIP Trunk Security Profile klicken und das Profil auswählen das dem Trunk zugewiesen wurde. Bei diesem Profil muss die Option “Accept Unsolicited Notification” aktiviert werden.Voice Mail ProfileUm den Voice Mail Button am Phone zu konfigurieren muss ein Voice Mail Pilot sowie ein Voice Mail Profile konfiguriert werden.Dazu unter Advanced Features, Voice Mail auf Voice Mail Pilot klicken und mit Add New einen neuen Voice Mail Pilot erstellen.Unter Advanced Features, Voice Mail, Voice Mail Profile kann ein neues Profil angelegt werden.Achtung: Wird “Make this the default…” ausgewählt wird das Profil automatisch auf allen Phones konfiguriert die keine diesbezügliche Konfiguration haben.Nun kann man unter Device, Phone in der entsprechenden Direct Number Configuration ein Voice Mail Profile konfigurieren.&#160;special thanks to pk :)&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-unified-messaging-cisco-call-manager-86/\"\n},{\n  \"id\": \"post-citrix-sprache-des-ica-client-andern\",\n  \"title\": \"Citrix, Sprache des ICA Client ändern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Citrix\"],\n  \"content\": \"Kleiner Tipp: Das Citrix Online Plug-In (ICA Client) wird standardgemäß in der Betriebssystemsprache ausgeführt. Will man die Sprache manuell ändern, lässt sich das über folgenden Befehl unter C:\\\\Program Files (x86)\\\\Citrix\\\\ICA Client realisieren: WFICA32.EXE /UserUILocale&#160;&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/citrix-sprache-des-ica-client-andern/\"\n},{\n  \"id\": \"post-windows-8-installation-in-vhd\",\n  \"title\": \"Windows 8 - Installation in VHD\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Client\"],\n  \"content\": \"In diesem Post (Windows 7 - Nativer VHD Support) habe ich vor einiger Zeit beschrieben wie man Windows 7 in eine VHD installieren kann.Nun, das funktioniert genau gleich f&uuml;r das&nbsp;Windows 8 Developer Preview! Hier nochmal eine kuze Zusammenfassung:VHD erstellen: Diskpart; create vdisk file=\\\"E:\\\\VHD\\\\win8-1.vhd\\\" type=fixed maximum=20480 erstellt eine 20GB VHD vom Typ \\\"Fixed\\\", die Datei belegt also den vollen Speicher auf der FestplatteVon Windows 8 Installationsmedium bootenmit \\\"Shift\\\"+\\\"F10\\\" eine Eingabeaufforderung &ouml;ffnenVHD ausw&auml;hlen: Diskpart; select vdisk file=\\\"E:\\\\VHD\\\\win8-1.vhd\\\"attach vhdDiskpart und Eingabeaufforderung schlie&szlig;en, Windows 8 installieren.Der neue Bootmanager ist &uuml;brigens auch im Metrostyle ;)Wie Windows 7 kann man auch Windows 8 vom USB Stick installieren, auch diese Anleitung funtioniert weiterhin!enjoy!!\",\n  \"url\": \"https://onprem.wtf/post/windows-8-installation-in-vhd/\"\n},{\n  \"id\": \"post-windows-8-developer-preview\",\n  \"title\": \"Windows 8–Developer Preview\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"In Anaheim, Ca findet zurzeit die BUILD Konferenz statt. Diese mehrtätige Veranstaltung richtet sich vor allem an Entwickler und stellt das neue Betriebssystem Windows 8 vor.Seit dem frühen Morgen kann man sich ein “Developer Preview” Build von Windows 8 herunterladen. Verfügbar sind 32 und 64 Bit Images mit oder ohne Entwicklungstools. Hier der Link zur Seite: http://dev.windows.comEinige Neuerungen im ÜberblickDas neue Startmenü im Metro StyleWindows Explorer mit Ribbon, und den neuen Copy/Cut/Paste DialogenAußerdem kann man jetzt ISO und VHD Files direkt im Windows Explorer mounten/öffnen.Auch der Task Manager wurde erneuertHyper-V Support, der Hammer! Hyper-V für den Client mit 64 Bit Guest Support. Außerdem Support für Standby Mode und WLANPowerShell 3&#160;Das ist nur ein schneller Überblick, in den nächsten Tagen gibt es Details. Sehr Empfehlenswert sind folgenden Links:http://www.buildwindows.comhttp://blogs.msdn.com/b/b8enjoy!   tom\",\n  \"url\": \"https://onprem.wtf/post/windows-8-developer-preview/\"\n},{\n  \"id\": \"post-outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender\",\n  \"title\": \"Outlook 2003 / Exchange 2010 Probleme beim Öffnen freigegebener Kalender\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"In einer Umgebung mit Exchange 2010 und Outlook 2003 als Mail Client kann es beim &Ouml;ffnen freigegebener Kalender zu Problemen kommen. Dabei erscheint folgende Fehlermeldung:&nbsp;Anders als &lt; Office 2007 &ouml;ffnet Outlook 2003 die Verbindung direkt zu den Mailboxserver und nicht &uuml;ber den Address-Book Service. Um dieses Problem zu beheben, muss das Verbindungslimit, welches standardgem&auml;&szlig; 20 betr&auml;gt, angehoben werden. Hierzu erstellen wir eine neue ThrottlingPolicy und weisen diese dem Benutzer zu:&nbsp;New-ThrottlingPolicy &ndash;name Outlook2003CalendarSet-ThrottlingPolicy &ndash;identity Outlook2003Calendar &ndash;RCAMaxConcurrency 100Set-Mailbox &ndash;Identity &ldquo;MAILBOX-USER&rdquo; &ndash;ThrottlingPolicy Outlook2003Calendar&nbsp;Gr&uuml;&szlig;e   dn\",\n  \"url\": \"https://onprem.wtf/post/outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender/\"\n},{\n  \"id\": \"post-powershell-rekursiv-nach-anderungsdatum-sortieren\",\n  \"title\": \"PowerShell–Rekursiv nach Änderungsdatum sortieren\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Ganze Ordnerstrukturen oder Laufwerke nach Dateien zu durchsuchen die zuletzt ge&auml;ndert worden sind kann ganz sch&ouml;n m&uuml;hsam sein. Mit der PowerShell geht das in einem Oneliner.PS X:\\\\&gt; Get-ChildItem C:\\\\Windows\\\\Logs -Recurse | Sort-Object -Property LastWriteTime &ndash;Descending | Where-Object {$_.Mode -notlike \\\"d*\\\"} | Select-Object -First 10 | Format-Table -Property LastWriteTime,FullName &ndash;AutoSizeDieses Beispiel durchsucht C:\\\\Windows\\\\Logs rekursiv und sortiert Absteigend nach &ldquo;LastWriteTime&rdquo;. Ordner werden standardm&auml;&szlig;ig auch zur&uuml;ckgegeben, diese werden mit &ldquo;Where-Object&rdquo; gefiltert. Da mich nur die 10 Dateien interessieren die zuletzt ge&auml;ndert wurden verwende ich &ldquo;Select-Object&rdquo;. Anschlie&szlig;end wird die Ausgabe noch Formatiert. Das Ganze sieht dann so aus:M&ouml;chte man das Ergebnis in eine Datei schreiben, bietet sich das cmdlet &ldquo;Export-CSV&rdquo; an, daf&uuml;r &auml;ndert man die &ldquo;Select-Object&rdquo; Abfrage z.B. folgenderma&szlig;en:PS X:\\\\&gt; Get-ChildItem C:\\\\Windows\\\\Logs -Recurse | Sort-Object -Property LastWriteTime -Descending | Where-Object {$_.Mode -notlike \\\"d*\\\"} | Select-Object &ndash;Property FullName,CreationTime,LastWriteTime,LastAccessTime,Length,Attributes | Export-Csv Report.csvDas Ergebnis sieht dann so aus:Durch &Auml;nderungen der Where, Select, Format cmdlets bzw. Parameter l&auml;sst sich eine Vielzahl von Ausgaben erzeugen, f&uuml;r weitere Informationen und Hilfe zu den einzelnen cmdlets:Get-Help cmdlet &ndash;OnlineAchtung: Der Parameter &ldquo;Recurse&rdquo; geht durch alle untergeordneten Verzeichnisse, das kann je nach Struktur ziemlich lange dauern. Au&szlig;erdem gelten Berechtigungen nat&uuml;rlich auch f&uuml;r die PowerShell, man kann also nicht Ordner durchsuchen auf die man keine Rechte hat, das sieht dann so aus:have fun!    tom\",\n  \"url\": \"https://onprem.wtf/post/powershell-rekursiv-nach-anderungsdatum-sortieren/\"\n},{\n  \"id\": \"post-diginotar-nur-ein-zufall!\",\n  \"title\": \"DigiNotar–nur ein Zufall!?\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Client\",\"Server\"],\n  \"content\": \"Vor einigen Tagen wurde bekannt das bereits Anfang Juni(!!) bei einem Hack der niederl&auml;ndischen Zertifizierungsstelle &ldquo;DigiNotar&rdquo; mehr als 500 &ldquo;gef&auml;lschte&rdquo; Zertifikate ausgestellt wurden.Unter den Zertifikaten befinden sich folgende Wildcard Zertifikate:*.*.com *.*.org *.10million.org *.android.com *.aol.com *.azadegi.com *.balatarin.com *.comodo.com *.digicert.com *.globalsign.com *.google.com *.JanamFadayeRahbar.com *.logmein.com *.microsoft.com *.mossad.gov.il *.mozilla.org *.RamzShekaneBozorg.com *.SahebeDonyayeDigital.com *.skype.com *.startssl.com *.thawte.com *.torproject.org *.walla.co.il *.windowsupdate.comEine vollst&auml;ndige Liste der Zertifikate gibt es hier.&nbsp;Der Angriff wurde entdeckt weil in Googles Chrome Browser die g&uuml;ltigen Zertifikate fix hinterlegt sind, der Browser also beim Anzeigen vermeintlich authentischer Google Inhalte gemeckert hat. Wenn die &ldquo;T&auml;ter&rdquo; den &ldquo;User Agent String&rdquo; von Chrome gefiltert h&auml;tten, wer wei&szlig; wann (und ob) dieser Hack &ouml;ffentlich geworden w&auml;re&hellip;Vermutungen wie viele derartige Angriffe bisher unerkannt geblieben sind und wer dahinter steckt &uuml;berlasse ich anderen. Ich hoffe allerdings dass die Debatte um Sicherheit und das &ldquo;Web of Trust&rdquo; weitergef&uuml;hrt wird und durch solche krassen Vorf&auml;lle mehr Aufmerksamkeit bekommt.&nbsp;&nbsp;Betroffene CAsFolgende Zertifizierungsstellen m&uuml;ssen aus allen Browsern, Applikationen und Betriebssystemen verschwinden, sie gelten als NICHT mehr Vertrauensw&uuml;rdig:CertificateIssued byThumbprintDigiNotar Root CADigiNotar Root CAc0 60 ed 44 cb d8 81 bd 0e f8 6c 0b a2 87 dd cf 81 67 47 8cRoot CA G2DigiNotar Root CA G243 d9 bc b5 68 e0 39 d0 73 a7 4a 71 d8 51 1f 74 76 08 9c c3PKIoverheid CA OverheidStaat der Nederlanden Overheid CAb5 33 34 5d 06 f6 45 16 40 3c 00 da 03 18 7d 3b fe f5 91 56PKIoverheid CA Organisatie - G2Staat der Nederlanden Organisatie CA - G25d e8 3e e8 2a c5 09 0a ea 9d 6a c4 e7 a6 e2 13 f9 46 e1 79PKIoverheid CA Overheid en BedrijvenStaat der Nederlanden Overheid CA40 aa 38 73 1b d1 89 f9 cd b5 b9 dc 35 e2 13 6f 38 77 7a f4Windows UpdateMicrosoft hat inzwischen reagiert und ein Windows Update zur Verf&uuml;gung gestellt, genauere Informationen findet man im Microsoft Security Advisory (2607712).Wie an vielen Stellen zu lesen ist soll es mit diesen Zertifikaten m&ouml;glich sein gef&auml;lschte Windows Updates zu verteilen, das ist laut Microsoft NICHT der Fall. Der Windows Update Client installiert ausschlie&szlig;lich Pakete die mit dem &ldquo;Microsoft Root Certificate&rdquo; signiert sind.&nbsp;FirefoxF&uuml;r Mozilla Firefox wir ein Update in k&uuml;rze erwartet, hier empfiehlt es sich die genannten CAs manuell zu entfernen!Unter Einstellungen, Erweitert, Verschl&uuml;sselung klickt man auf &ldquo;Zertifikate anzeigen&rdquo;. Jetzt bekommt man eine Liste der Zertifizierungsstellen und kann das Vertrauen entziehen.Weitere Infos im Mozilla Security Blog.&nbsp;&nbsp;AppleApple hat wohl zur Zeit andere Priorit&auml;ten, MAC Benutzer sollten auf jeden Fall manuell die oben genannten Zertifikate entfernen. Chester Wisniewski von Sophos beschreibt das Ganze so:What about Apple users? Well, apparently they are too busy playing Angry Birds and making pictures in Photoshop to worry about pesky certificate issues.&lt;/p&gt;My advice if you run a Mac? Use BootCamp and Windows 7 until Apple decides to provide a patch. Or I guess you could use Firefox (not Chome, it also uses Apple's KeyChain)...&lt;/code&gt;Ein erster Bericht der Security Consultants Fox-IT zum Thema ist verf&uuml;gbar:http://www.rijksoverheid.nl/ministeries/bzk/documenten-en-publicaties/rapporten/2011/09/05/diginotar-public-report-version-1.htmlstay secure  tom\",\n  \"url\": \"https://onprem.wtf/post/diginotar-nur-ein-zufall!/\"\n},{\n  \"id\": \"post-esxi-persistent-scratch-location\",\n  \"title\": \"ESXi–Persistent Scratch Location\",\n  \"author\": \"tto\",\n  \"tags\": [\"VMware\",\"Server\"],\n  \"content\": \"In diesem Artikel habe ich beschrieben wie man den ESXi Hypervisor auf einem USB Stick installieren kann. Ein Nachteil dieser Installation ist das Fehlen der Scratch Partition, sie wird nicht automatisch erstellt da Flash Medien eine beschränkte Anzahl von schreib/lese Zyklen haben und sich so nicht besonders als Speicherort für Logfiles eignen.&#160;ESXi Scratch PartitionDie Scratch Partition ist optional und wird standardmäßig während der Installation von ESXi auf lokalem Storage angelegt. Wenn lokaler Storage verfügbar ist wird die Scratch Partition mit 4GB angelegt, sie wird verwendet um den Output von “vm-support” zu speichern, gibt es keine Scratch Partition wird dieser wird dieser Output in den RAM geschrieben.Wird die Scratch Partition automatisch erstellt ist es nicht empfohlen die bestehende Konfiguration zu ändern, wird die Scratch Partition nicht automatisch angelegt (z.B. bei Installation auf USB) ist es empfohlen manuell einen Speicherort für “Scratch” zu konfigurieren.Configure Scratch Location – vSphere ClientUm die Scratch Location manuell zu konfigurieren muss man zuerst einen Ordner auf einem Datastore anlegen, der ESXi Host muss natürlich Zugriff auf diesen Datastore haben. Dazu wechselt man im vSphere Client auf “Configuration” und wählt unter “Storage” einen Datastore aus, mit rechtsklick “Browse Datastore” öffnet man den Datastore Browser und legt einen Ordner an. Achtung: Es muss einen eindeutigen Ordner pro ESXi Host geben, man kann nicht einen Scratch Ordner für mehrere Hosts verwenden!Die Scratch Location wird in den “Advanced Settings” unter “Configuration”, “Software” konfiguriert. Dort gibt es einen Abschnitt “ScratchConfig” welcher ein Textfeld für die Einstellung “ScratchConfig.ConfiguredScratchLocation” anzeigt. In dieses Textfeld muss der vollständige Pfad zum Order eingegeben werden, also z.B: /vmfs/volumes/&lt;myDatastore&gt;/.scratch-esx1Achtung: diese Einstellung wird erst nach einem Neustart des ESXi Hosts wirksam.vSphere Client Login– A general system error occuredWird eine Active Directory Domain zur Authentifizierung angegeben und es ist keine Scratch Partition Konfiguriert kann man sich am vSphere Client nicht anmelden und bekommt eine (sehr vielsagende) Fehlermeldung, entweder: “A general system error occured” oder “gss_acquire_cred failed”Der Grund für den Fehler ist offensichtlich dass ESXi versucht Informationen über die Anmeldung in ein Logfile unter /scratch/var/tmp zu schreiben.Genauere Infos zum Thema gibts hier:http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=1033696http://blogs.vmware.com/esxi/2011/04/scratch-partition-best-practices-for-usbsd-booted-esxi.htmlhttp://blogs.vmware.com/esxi/2011/03/ops-changes-part-5-scratch-partition.htmlso long,   tom\",\n  \"url\": \"https://onprem.wtf/post/esxi-persistent-scratch-location/\"\n},{\n  \"id\": \"post-citrix-ima-dienst-startet-nicht-mehr\",\n  \"title\": \"Citrix IMA Dienst startet nicht mehr\",\n  \"author\": \"dni\",\n  \"tags\": [\"Citrix\"],\n  \"content\": \"Lässt sich der Citrix IMA Dienst nicht mehr starten, können keine eingehende Verbindung zum Citrix Server mehr initiiert werden. Versucht man den IMA Dienst zu starten und erhält folgende Fehlermeldung: Windows could not start Citrix Independent Management Architecture on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code –2147483647&#160;&#160;Opening the Event Viewer of the affected server shows this event on the System Log:&lt;/p&gt;    “Failed to load plugin C:\\\\Prgoram Files (x86)\\\\Citrix\\\\System32\\\\Citrix\\\\IMA\\\\Subsystems\\\\RADESessionsSs.dll with error IMA_RESULT_FAILURE”&lt;/code&gt;  &#160;    &#160;  In den meisten Fällen ist die lokale Streaming Offline Datenbank korrupt. Dies lässt sich meist durch den Befehl dsmaint recreaterade beheben.   Lässt sich der IMA Dienst immer noch nicht starten, sind wahrscheinlich die Verbindungseinstellungen im File C:\\\\Program Files (x86)\\\\Citrix\\\\Independent Management Architecture\\\\RadeOffline.dsn korrupt:  Fehlerhafte Konfiguration:    Diese muss durch eine gültige Konfiguration ersetzt werden:    Nun ist es noch notwendig die Streaming Offline Datenbank neu zu erstellen:  dsmaint recreaterade   Der Citrix IMA Dienst sollte sich jetzt normal starten lassen.  &#160;  Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/citrix-ima-dienst-startet-nicht-mehr/\"\n},{\n  \"id\": \"post-citrix-xenapp6-fehler-beim-starten-des-webservice\",\n  \"title\": \"Citrix XenApp6 Fehler beim starten des Webservice\",\n  \"author\": \"dni\",\n  \"tags\": [\"Citrix\"],\n  \"content\": \"Letztens bin ich auf ein seltsamen Problem in XenApp6 gestoßen:Sobald man den Webservice startet und einen Verbindungsversuch unternimmt, beendet sich der ApplicationPool und Verbindungen werden terminiert.Im EventLog wird folgender Fehler protokolliert:&#160;Log Name: Application&lt;/p&gt;    Source: Microsoft-Windows-IIS-W3SVC-WP    Date: 17/06/2011 09:37:36    Event ID: 2307    Task Category: None    Level: Error    Keywords: Classic    User: N/A    Computer: ts1.ntsystems.it    Description:    The worker process for application pool 'CitrixWebInterface5.3.0AppPool' encountered an error 'Failed to decrypt attribute 'password'    ' trying to read configuration data from file '\\\\\\\\?\\\\C:\\\\inetpub\\\\temp\\\\apppools\\\\CitrixWebInterface5.3.0AppPool.config', line number '150'. The data field contains the error code.&lt;/code&gt;  &#160;  Lösung  Um den Fehler zu beheben und das Webinterface richtig starten zu können, müssen in der Datei C:\\\\Windows\\\\System32\\\\inetsrv\\\\config\\\\applicationHost.config die Zeilen zwischen  &lt;configProtectedData&gt; gelöscht werden. Wichtig ist dabei, dass IIS vorher beendet wurde. Danach muss der Service wieder gestartet, der ApplicationPool lässt sich nun auch normal starten. Eingehende Verbindungen zum Webinterface werden nun auch richtig verarbeitet.  &#160;  Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/citrix-xenapp6-fehler-beim-starten-des-webservice/\"\n},{\n  \"id\": \"post-ex2k10-pst-in-archive-importieren\",\n  \"title\": \"EX2k10 PST in Archive importieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Um PST Files in ein Exchange 2010 SP1 Archive-Mailbox zu verschieben muss zunächst sichergestellt werden, dass der Microsoft Exchange Mailbox Replication Dienst gestartet ist. Zudem muss der Gruppe “Exchange Trusted Subsystem Security Group” NTFS und Freigabeberechtigungen für das PST File gegeben werden.&#160;Um den Import durchzuführen muss jetzt das entsprechende Benutzerkonto der neuen Gruppe “Mailbox Import Export Group” hinzugefügt werden:New-RoleGroup &quot;Mailbox Import Export Group&quot; -Roles &quot;Mailbox Import Export&quot;Add-RoleGroupMember &quot;Mailbox Import Export Group&quot; -Member &quot;Administrator&quot;&#160;Nun kann das PST File über den Befehl New-MailboxImportRequest in das Archiv importiert werden. Anbei ein Script, wo man im File Users.csv PST Files den jeweiligen Benutzern zuweisen und den Import Request generieren kann:import-csv &quot;Users.csv&quot;|ForEach{&lt;/p&gt;    New-MailboxImportRequest -Mailbox $_.user -FilePath $_.Path -BadItemLimit 50 -IsArchive    }&lt;/code&gt;  Bsp für Users.csv:  User,Path   daniel.nitz,\\\\\\\\share\\\\daniel-PST.PST  &#160;  Grüße   dn&lt;/td&gt;&lt;/tr&gt;\",\n  \"url\": \"https://onprem.wtf/post/ex2k10-pst-in-archive-importieren/\"\n},{\n  \"id\": \"post-lync-integration-in-outlook-web-app-2010\",\n  \"title\": \"Lync Integration in Outlook Web App 2010\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Seit einiger Zeit ist der Nachfolger des Office Communication Servers verf&uuml;gbar, Lync 2010 vereint Enterprise Voice, Instant Messaging, Presence sowie Live Meeting, weitere Details gibts hier: http://lync.microsoft.com/en-us/Pages/default.aspxAuch Outlook Web App kann als Lync Client konfiguriert werden, folgende Features werden direkt von OWA unterst&uuml;tzt, es wird daf&uuml;r kein Client auf dem PC ben&ouml;tigt:Presence, der Status anderer wird angezeigt, au&szlig;erdem kann man seinen Status &auml;ndern bzw. sich an- und abmelden Die Lync Kontaktliste wird angezeigt Instant Messaging mit einem Web Client PrerequisitesAuf dem Client Access Server m&uuml;ssen die Komponenten f&uuml;r Microsoft Office Communications Server 2007 R2 Web Service Provider installiert werden. Der Common Name im Zertifikat des Client Access Servers muss der FQDN des Client Access Servers sein. Wenn es sich um ein CAS Array handelt muss der Common Name dem FQDN des CAS Array entsprechen. Instant Messaging muss auf dem Client Access Server aktiviert werden In der Lync Umgebung muss ein Trusted Application Pool und eine Trusted Application erstellt und aktiviert werden. Exchange Client Access Server/Array KonfigurationFolgende Pakete herunterladen:Office Communication Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=2310 Hotfix f&uuml;r den OC Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=797 Hotfix f&uuml;r Unified Communication API:      http://www.microsoft.com/download/en/details.aspx?id=7557 Als erstes wird jetzt CWAOWASSPMain.msi installiert, dieses Paket erstellt einen Ordner (Standard: C:\\\\Web Service Provider Installer Package\\\\) und kopiert die ben&ouml;tigten Installationsdateien f&uuml;r den OC Web Service Provider in diesen Ordner. Jetzt in diesen Ordner wechseln und die Pakete in folgender Reihenfolge installierenvcredist_x64.exe UcmaRedist.msi CWAOWASSP.msi Jetzt fehlen noch die Hotfixes aus den Downloads 2 und 3, auch diese Pakete installierenUcmaRedist.msp CWAOWASSP.msp Die ben&ouml;tigte Software ist somit installiert, jetzt muss Instant Messaging noch aktiviert werden. Die Konfiguration daf&uuml;r wird am OWA Virtual Directory gemacht. Der InstantMessagingType wird auf OCS ge&auml;ndert, als InstantMessagingServerName wird der Lync Server angegeben. Au&szlig;erdem muss der Thumbprint des Zertifikates das f&uuml;r TLS verwendet werden soll angegeben werden und InstantMessaging aktiviert werden. Folgende PowerShell Befehl erledigt dieses Schritte:$iiscert = (Get-ExchangeCertificate | Where {$_.Services -like \\\"*IIS*\\\"}).ThumbprintGet-OWAVirtualDirectory -Server ex14.ntsystems.local | Set-OWAVirtualDirectory -InstantMessagingType OCS -InstantMessagingEnabled:$true -InstantMessagingCertificateThumbprint $iiscert -InstantMessagingServerName lync.ntsystems.localAchtung: Wenn bei Get-OWAVirtualDirectory der Parameter Server weggelassen wird werden alle Virtual Directories der Exchange Umgebung konfiguriert. Bei InstantMessagingServerName muss der FQDN des Lync Servers angegeben werden.In einem CAS Array m&uuml;ssen diese Schritte auf allen Servern wiederholt werden.Lync Server KonfigurationMit dem Lync Server Topology Builder wird jetzt unter &ldquo;Trusted Application Servers&rdquo; ein neuer Application Pool angelegt. Dieser Pool wird als Single Computer Pool angelegt, der FQDN muss dabei entweder dem Namen des Client Access Server oder dem Namen des CAS Arrays entsprechen.Jetzt wird der Lync Server Frontend Pool ausgew&auml;hlt, welcher f&uuml;r diese Applikation verwendet werden soll.Der Server ist jetzt erstellt, Standardm&auml;&szlig;ig ist &ldquo;Enable replication of configuration data to this pool&rdquo; aktiviert, das wird nicht ben&ouml;tigt und kann in den Eigenschaften des soeben erstellten Objektes deaktiviert werden.Jetzt kann die &Auml;nderung der Topologie ver&ouml;ffentlicht werden, dazu klickt auf Action, Topology und Publish.Es fehlt noch die CSTrustedApplication, diese wird &uuml;ber die Lync Server Management Shell angelegt. Auch dabei muss wieder der FQDN des Client Access Servers oder des CAS Arrays angegeben werden, au&szlig;erdem wird ein Port f&uuml;r die Applikation angegeben, nat&uuml;rlich muss ein Port verwendet werden der frei ist. (netstat &ndash;an zeigt verwendete Ports an). Mit folgendem PowerShell Befehl wird die Applikation erstellt:New-CsTrustedApplication -ApplicationID OWA -TrustedApplicationPoolFqdn ex14.ntsystems.local -Port 4999Diese Konfiguration muss noch aktiviert werden, das wird mit folgendem PowerShell cmdlet gemacht:Enable-CsTopologyEnjoyDie Konfiguration ist jetzt abgeschlossen, ab jetzt sind die neuen Features in Outlook Web App aktiv&hellip;TroubleshootingFQDN &ndash; Der CN im Zertifikat des Client Access Servers (oder Arrays) muss passen. Mit Get-CsTrustedApplication bzw. Get-CsTrustedApplicationComputer kann man die Lync Konfiguration nochmal &uuml;berpr&uuml;fen Lync Server Logging Tool &ndash; bei vielen Problemen hilft das Log des SIPStack &nbsp;viel Spa&szlig;    tom\",\n  \"url\": \"https://onprem.wtf/post/lync-integration-in-outlook-web-app-2010/\"\n},{\n  \"id\": \"post-cisco-aaa\",\n  \"title\": \"Cisco AAA\",\n  \"author\": \"tto\",\n  \"tags\": [\"Network\",\"Server\"],\n  \"content\": \"Nachdem der RADIUS Server konfiguriert ist geht es an die Konfiguration des Clients.Bei Cisco muss dazu das “neue” AAA Model aktiviert werden. Das geht einfach mit folgendem Befehl:aaa new-model      Lokale AuthentifizierungAchtung: nach absetzen dieses Befehls ist das neue Model aktiv, d.h. man kann sich nur mehr mit Benutzername und Passwort anmelden. Man sollte jetzt einen lokalen Benutzer angelegen, dieser kann auch im Fallback Fall, also wenn der RADIUS Server nicht erreichbar ist, verwendet werden. Mit folgendem Befehl legt man einen lokalen User cisco mit Passwort cisco an:username cisco secret cisco Radius ServerBevor man RADIUS als Authentifizierung verwenden kann muss ein RADIUS Server konfiguriert werden. Mit folgenden Befehlen konfiguriert man den RADIUS Server 10.1.1.100 und den entsprechendem Pre-Shared Key. RADIUS verwendet standardmäßig die UDP Ports 1812 und 1813 für Authentifizierung und Accounting, Cisco Geräte verwenden die Ports 1645 und 1646, das kann man evtl. mit “auth-port 1812 acct-port 1813” ändern. Der NPS RADIUS Server antwortet auf beide Varianten, man muss das also nicht definieren.radius-server host 10.1.1.100 key PRE_SHARED_KEYMit “radius-server retransmit x” kann man angeben wie oft eine Anfrage gesendet wird wenn innerhalb des Timeouts keine Antwort kommt. Das Zeitfenster für das Timeout kann mit “radius-server timeout x” auf x Sekunden erhöht werden. Das Interface über welches der Cisco Switch die RADIUS Anfrage schickt kann mit “ip radius source-interface x” angegeben werden.AAA ListenDas AAA Authentication Model arbeitet mit Listen, man definiert eine Liste und weißt diese Liste einem Interface zu. Die Liste “default” gilt für alle Interfaces auf denen keine andere Liste gebunden ist. Folgender Befehl setzt die Standardauthentifizierung auf RADIUS, Fallback (RADIUS nicht erreichbar) ist local:aaa authentication login default group radius local      Ab diesem Zeitpunkt muss man sich an allen Interfaces mit Benutzername und Passwort vom RADIUS Server anmelden.Wenn die Netzwerkgeräte in sicheren Serverräumen untergebracht sind kann man sich überlegen die Authentifizierung für den Console Port zu deaktivieren, damit man im Desaster Fall noch eine letzte Hoffnung auf Zugriff hat. Dazu legt man eine Liste an und setzt die Authentifizierung auf “none”, danach bindet man die Liste auf “line con 0”:aaa authentication login liste1 none&lt;/p&gt;    line con 0      &#160; login authentication liste1&lt;/code&gt;  Authorization  Am RADIUS Server habe ich in den Settings das Attribut Service-Type auf “Administrative” gesetzt. Dadurch müsste ich eigentlich im “enable” Mode landen. Das funktionier jedoch erst nachdem auch die Authorization auf RADIUS gesetzt wurde. Folder Befehl legt fest dass RADIUS für alle Interfaces verwendet wird, die Console ist dabei ausgeschlossen:  aaa authorization exec default group radius local  Um Authorization auf der Console über RADIUS zu aktivieren wird folgender Befehl verwendet:  aaa authorization console  Wenn ich mich erneut anmelden lande ich direkt im “Enable” Mode des Switches.  Logging  Am NPS wird im Event Log Security ein Event 6272 aufgezeichnet, außerdem wird im Logfile (D:\\\\NPS\\\\LogFiles) ein Eintrag hinzugefügt.  Sniffing  Mit Wireshark o.ä. sieht man ein RADIUS Access-Request Paket vom Switch zum NPS Server und ein RADIUS Access-Accept Paket vom NPS Server zum Switch.  Das Access-Request Paket enthält unter anderem folgende Informationen:  User-Name: Der Benutzer der sich am RADIUS Client anmeldet  Calling-Station-Id: IP Adresse des Clients (der z.B. die Telnet Session öffnet)  NAS-IP-Address: IP Adresse des RADIUS Clients  Das Access-Accept Paket enthält die AV-Pair Informationen:  AVP: Attribute Value Pair das am NPS konfiguriert wurde (Service-Type: Administrative)    &#160;  tom\",\n  \"url\": \"https://onprem.wtf/post/cisco-aaa/\"\n},{\n  \"id\": \"post-cisco-aaa-nps-radius-server\",\n  \"title\": \"Cisco AAA–NPS RADIUS Server\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Network\"],\n  \"content\": \"In größeren Netzwerken kann es aufgrund der Firmenrichtlinie oder der Gesetzgebung notwendig sein sich an den Netzwerkgeräten mit persönlichen User Accounts anmelden zu müssen. Man kann dafür natürlich für jeden Netzwerkadministrator ein persönliches Account auf allen Geräten anlegen, oder man authentifiziert gegen einen RADIUS Server. Dieser RADIUS Server kann z.B. ein Network Policy Server sein, der seit Windows Server 2008 den IAS abgelöst hat. Der Vorteil so einer Implementierung liegt auf der Hand, die Authentifizierung wird über das Zentrale Active Directory gesteuert und Benutzerkonten müssen nur an einem Ort gepflegt werden.NPSDie NPS Serverrolle muss auf einem Server hinzugefügt werden, ob das ein dedizierter Server ist oder ob man die Rolle auf einem andern mitlaufen lässt hängt von der Größe der Umgebung ab. Die Rolle kann wie jede andere über den Servermanager oder das PowerShell cmdlet Add-WindosFeature hinzugefügt werden. Damit das cmdlet verfügbar ist muss das Modul ServerManager geladen werden.Für RADIUS reicht der NPAS-Policy-Server. Wen die Rolle hinzugefügt wurde kann NPS konfiguriert werden, der erste Schritt ist es den NPS Server im Active Directory zu registrieren. Rechtsklick auf NPS (local) und “Register Server in Active Directory” wählen&quot;Der zweite Schritt ist die Konfiguration des Accounting, bzw. Logging, dafür gibt es in der NPS Konsole unter dem Punkt “Accounting” drei Einstellungsmöglichkeiten.Der “Configure Accounting Wizard” erleichtert einem Konfiguration:Ich entscheide mich für das Logging in ein Textdokument, je nach Umgebung kann man auch einen zentralen SQL Server angeben.Den Ordner für die Log Files lege ich auf eine zweite Partition. Der NPS Server ist nun konfiguriert, es fehlen noch die RADIUS Clients sowie das Regelwerk das definiert wer sich anmelden darf.Radius ClientsJedes Netzwerkgerät das über NPS authentifizieren will muss dort als RADIUS Client angelegt werden, in diesem Schritt werden der Name, die IP Adresse und der Pre-Shared Key für jeden Client festgelegt. Der Pre-Shared Key wird verwendet um den RADIUS Client zu authentifizieren, der Benutzer meldet sich mit seinem Benutzernamen und Passwort an.Um einen RADIUS Client anzulegen erweitert man den Ordner “RADIUS Clients and Servers” in der NPS Konsole, Rechtslick auf “RADIUS Clients” und “New” öffnet den Dialog “New RADIUS Client”.Unter dem Reiter “Settings” wird der Friendly name konfiguriert, dieser ist später wichtig für die Konfiguration der Regeln. Außerdem gibt man hier die IP Adresse des Clients an, der Pre-Shared Key kann manuell eingegeben werden, ich empfehle jedoch ihn automatisch zu generieren. (Achtung: einige alte Geräte unterstützen nur Keys bis zu einer bestimmten Länge)Unter Advanced könnte man noch ein bestimmtes RADIUS Feature Set auswählen, normalerweise reicht aber der Standard aus. Connection Request PolicyÜber die Connection Request Policy wird definiert welcher RADIUS Client wie authentifiziert wird. NPS kann auch als RADIUS Proxy arbeiten und könnte daher anfragen eines Clients selbst authentifizieren und die eines andern an einen Remote RADIUS Server weiterleiten, dieser Server muss zuerst unter “RADIUS Clients and Servers” angelegt werden.Die Standardregel ist so konfiguriert dass alle anfragen Lokal, also gegenüber Active Directory, authentifiziert werden.Network PolicyDie Network Policy definiert wer sich unter welchen Umständen authentifizieren darf. Da beide Standardregeln keinen Zugriff zulassen müssen wir eine neue Network Policy anlegen, Rechtsklick auf “Network Policy” und “New” öffnet den Dialog “New Network Policy”.Auf der ersten Seite wird eine Name für die neue Richtlinie konfiguriert, der Rest bleibt Standard.Auf dieser Seite werden die Konditionen definiert unter welchen die Authentifizierung erfolgreich ist. Man kann z.B. den RADIUS Client und eine bestimmt AD Gruppe hinzufügen, die beiden Kriterien sind “AND” verknüpft, müssen also beide zutreffen. Der Benutzer der sich am Client “cisco_1” anmeldet muss also Mitglied der Gruppe NetworkAdmins sein damit er sich authentifizieren darf.Im nächsten Schritt wird festgelegt ob diese Regel den Zugriff erlaubt oder verweigert.PAP muss als Authentifizierungsmethode hinzugefügt werden, man wird darauf hingewiesen dass diese Methode nicht sicher ist da das Passwort in Clear-Text über die Leitung geht, das muss man wohl oder übel in kauf nehmen.Hier könnte man weitere verbindungsspezifische Einstellungen machen, für die Authentifizierung an Netzwerkgeräte wird das allerdings nicht benötigt.&#160;Im letzten Schritt werden die Einstellungen konfiguriert die der RADIUS Server in der Antwort mitschickt, hier kann man sogenannte Attribute-Value (AV)-Pairs konfigurieren. Diese AV-Pairs sind Herstellerabhängig, bei Cisco z.B. kann man mit Attribut 6 den Service-Type definieren, gibt man “Administrative” an landet ein authentifiziert User direkt im “enable” Mode. Framed-Protcol PPP kann gelöscht werden, Service-Type ändere ich auf “Administrative”&#160;Somit ist der NPS Server fertig konfiguriert und bereit Anfragen von einem RADIUS Client mit der IP 10.1.1.254 und dem richtigen Pre-Shared Key zu beantworten. Nur Benutzer die Mitglied der Gruppe NetworkAdmins sind dürfen sich am RADIUS Client anmelden, ist die Authentifizierung erfolgreich sollte der Benutzer gleich im “enable” Mode sein.&#160;Im nächsten Artikel konfiguriere ich einen Cisco Switch für RADIUS Authentifizierung.tom\",\n  \"url\": \"https://onprem.wtf/post/cisco-aaa-nps-radius-server/\"\n},{\n  \"id\": \"post-one-note-kleiner-tipp\",\n  \"title\": \"One Note–Kleiner Tipp\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Client\"],\n  \"content\": \"Ich werde von Tag zu Tag ein gr&ouml;&szlig;erer Fan von Microsoft OneNote. Dokumentationen und Notizen lassen sich perfekt mit diesen starken Tool verwalten und pflegen. (Ich liebe die eingebaute Funktion &ldquo;Bildschirmausschnitt&rdquo;)Vor ein paar Tagen ist mir aufgefallen, dass die Suche in OneNote ein tolles Feature beinhaltet: Es kann Screenshots nach Text durchsuchen!!Testet es einfach aus, erstellt einen Screenshot und sucht im Suchfeld nach Text, welcher sich im Screenshot befindet. Ihr werdet &uuml;berrascht sein &nbsp;&nbsp;Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/one-note-kleiner-tipp/\"\n},{\n  \"id\": \"post-subdomain-certificate-enrollment\",\n  \"title\": \"Subdomain Certificate Enrollment\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Client\",\"Server\"],\n  \"content\": \"Wenn man f&uuml;r einen Server aus einer Subdomain ein Zertifikat aus der Zertifizierungsstelle in der Root-Domain ausstellen m&ouml;chte, wird das aufgrund fehlender Berechtigungen nicht funktionieren. Um das Zertifikat erfolgreich ausstellen zu k&ouml;nnen muss der Computer bzw. die Dom&auml;nencomputer Mitglieder der Gruppe CERTSVC_DCOM_ACCESS der Root-Domain sein:Danach ist es notwendig den Server neu zu starten, welcher das Zertifikat erhalten soll.Nun kann das Zertifikat ausgestellt werden.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/subdomain-certificate-enrollment/\"\n},{\n  \"id\": \"post-installing-vsphere-powercli\",\n  \"title\": \"Installing vSphere PowerCLI\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"VMware\"],\n  \"content\": \"Mit vSphere PowerCLI bietet VMware ein PowerShell Snapin das mit &uuml;ber 250 cmdlets die Verwaltung der vSphere Umgebung vereinfacht bzw. Automatisierung&nbsp; erm&ouml;glicht.Die aktuelle Version kann unter http://vmware.com/go/powercli heruntergeladen werden.&nbsp;Die Installationsroutine installiert au&szlig;er den PowerShell Snapins die VMware VIX API, die das Management von virtuellen Maschinen erm&ouml;glicht. Diese API erlaubt es Programme direkt im Gastsystem der VM ausf&uuml;hren bzw. Dateien zu manipulieren.Nachdem das License Agreement akzeptiert wurde, kann man den Pfad f&uuml;r die Installation festlegen, jetzt noch auf installieren klicken und das wars.Auf dem Desktop wurde eine Verkn&uuml;pfung zu PowerCLI angelegt, sonst findet man sie unter Start, Programme, VMware, VMware vSphere PowerCLI.Wenn man die PowerCLI startet wird das PSSnapin &ldquo;VMware.VimAutomation.Core&rdquo; geladen, dieses kann nat&uuml;rlich auch in einer &ldquo;normalen&rdquo; PowerShell Session mit Add-PSSnapin hinzugef&uuml;gt werden.Wie in der Titelleist zu erkennen ist, ist die PowerCLI standardm&auml;&szlig;ig &ldquo;not connected&rdquo;, um auf die Virtuelle Umgebung zugreifen zu k&ouml;nnen muss man eine Verbindung mit dem vCenter Server herstellen. Dazu verwendet man das Connect-VIServer cmdlet, z.B.:Connect-VIServer vcenter.ntsystems.local &ndash;credential (Get-Credential)Mit diesem Befehl verbindet man die PowerCLI mit dem vCenter Server und kann alternative Anmeldeinformationen mitgeben, wenn der Benutzer mit dem die PowerCLI gestartet wurde ausreichende Rechte im vCenter hat kann man &ndash;credential nat&uuml;rlich weglassen.Wenn die Verbindung hergestellt wurde kann man mit PowerCLI arbeiten und sich z.B. eine Liste der VMs ausgeben lassen die nicht eingeschaltet sind:Get-VM | ?{$_.PowerState -notlike \\\"*On*\\\"}Alternativ kann man PowerCLI auch direkt mit einem ESX/ESXi Host verbinden, das ist z.B n&ouml;tig um mit Get-ESXTop Performance Informationen &uuml;ber einen Host zu sammeln.&nbsp;Die Hilfe zur PowerCLI kann einfach mit dem cmdlet Get-PowerCLIHelp aufgerufen werden, empfehlenswert ist auch Get-PowerCLICommunity.&nbsp;Hier noch ein kleiner Tipp: Wer die PowerShell ISE verwendet kann eigene Add-Ons hinzuf&uuml;gen. Ich habe ein einfaches Add-On gebastelt um das PowerCLI Snapin in die ISE Session zu laden. Dazu einfach folgendes Script in das ISE Profil kopieren. Um die ISE Profil Datei zu &ouml;ffnen &ldquo;notepad $profile.CurrentUserCurrentHost&rdquo; in der ISE ausf&uuml;hren.&nbsp;$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add(     &nbsp; \\\"Connect to vCenter\\\",      &nbsp;&nbsp;&nbsp; {      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add-PSSnapin VMware.VimAutomation.Core      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $VIServer = Read-Host -Prompt \\\"ESX/ESXi Host or vCenter Server FQDN\\\"      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Test-Connection $VIServer -Quiet) {Connect-VIServer $VIServer}      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {Write-Output \\\"Server not reachable\\\"}      &nbsp;&nbsp;&nbsp; },      &nbsp; \\\"Control+Alt+V\\\"      )Die Profildatei sollte signiert sein, wie man das macht habe ich hier beschrieben.&nbsp;so long   tom\",\n  \"url\": \"https://onprem.wtf/post/installing-vsphere-powercli/\"\n},{\n  \"id\": \"post-upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht\",\n  \"title\": \"Upgrade Windows Server 2008R2 Sp1 - BlackBerry Monitoring Service startet nicht\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Nach dem Update auf Windows Server 2008R2 Sp1 starten die Monitoring Services des BlackBerry Enterprise Servers nicht mehr. Betroffen sind folgende Dienste:BBMonitoringService_APP - BlackBerry Monitoring Service - Application Core&lt;/p&gt;    BBMonitoringService_DCS - BlackBerry Monitoring Service - Data Collection Subsystem    BBMonitoringService_ENG - BlackBerry Monitoring Service - Polling Engine&lt;/code&gt;  Im Eventlog (Application) werden folgende Fehler protokolliert:  Source: BBMonitoringService_ENG Event ID: 3&lt;/p&gt;    Source: BBMonitoringService_DCS Event ID: 3    Source: BBMonitoringService_APP Event ID: 3&lt;/code&gt;  Die Lösung: Im %temp% Verzeichnis gibt es einen Ordner “gen_py”, die Inhalte dieses Ordners müssen gelöscht werden, dann starten die Dienste wieder.  Achtung: Der Ordner “gen_py” muss in allen Temp Verzeichnissen gelöscht werden, also C:\\\\Windows\\\\Temp und im User Verzeichnis des BesAdmin Accounts.  Hier ein Link zum Artikel in der RIM KB.  tom\",\n  \"url\": \"https://onprem.wtf/post/upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht/\"\n},{\n  \"id\": \"post-forefront-tmg-console-error\",\n  \"title\": \"Forefront TMG Console – Script Error\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"de\",\"Security\"],\n  \"content\": \"Seit der Installation von Internet Explorer 9 bekomme ich auf meinem Windows 7 Client folgende Fehlermeldungen beim &Ouml;ffnen der Forefront TMG Management Console:Script Error: An Error has occurred in the script on this page.Forefront TMG Error: Refresh failed Error 0x80020003: Member not foundDieses Problem kann man einfach l&ouml;sen, man schnappt sich ein Notepad (Achtung: mit administrativen Rechten) und &ouml;ffnet die Datei &ldquo;TabsHandler.htc&rdquo;. Diese befindet sich standardm&auml;&szlig;ig unter folgendem Pfad: &ldquo;C:\\\\Program Files\\\\Microsoft Forefront Threat Management Gateway\\\\UI_HTMLs\\\\TabsHandler&rdquo;In dieser Datei gibt es drei Zeilen die mit &ldquo;m_aPages [niPage].m_tdMain.style.paddingTop&rdquo; beginnen. Diese drei Zeilen m&uuml;ssen mit &ldquo;//&rdquo; auskommentiert werden und schon l&auml;uft die Konsole wieder normal. Hier noch ein Beispiel:// m_aPages [niPage].m_tdMain.style.paddingTop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((m_nBoostUp &lt; 0) ? -m_nBoostUp : 0) ;&nbsp;so long, tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-tmg-console-error/\"\n},{\n  \"id\": \"post-remotefx\",\n  \"title\": \"RemoteFX\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\"],\n  \"content\": \"Windows Server 2008 R2 bringt mit dem SP1 ein neues Feature für Remote Desktop mit: RemoteFX. RemoteFX verwendet die Hardware des Servers um die Grafikverarbeitung zu beschleunigen.Für RemoteFX gibt es 2 Verwendungsbereiche:&#160;1) RemoteDesktop Virtualization HostAuf dem Host ist dafür folgendes notwendig:   SLAT-enabled CPU     Zertifizierte Grafikkarte      RemoteFX encoder      Hyper-V INFO: Wenn Live-Migration verwendet wird, müssen alle Server dieselbe Grafikkarte haben.RemoteFX benötigt für die Grafikkarte einen WDDM Treiber, ist dieser nicht verfügbar (z.B. ILO), muss entweder die Grafikkarte im BIOS deaktiviert, oder der RemoteFX CAP-Treiber installiert werden. Bevor aber der RemoteFX CAP Treiber installiert wird, sollte der WDDM Treiber installiert und RemoteFX aktiviert sein. Danach kann der CAP Treiber über folgenden Befehl installiert werden:dism /online /enable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageUm den CAP Treiber zu deinstallieren reicht folgender Befehl: dism /online /disable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageVerwendet der Client mehrere Monitore, so muss folgende Tabelle bezüglich der RAM Benutzung auf der Grafikkarte beachtet werden:&#160;            Maximun resolution        1 monitor        2 monitor        3 monitor        4 monitor                  1024 x 768        75 MB        105 MB        135 MB        165 MB                  1280 x 1024        125 MB        175 MB        225 MB        275 MB                  1600 x 1200        184 MB        257 MB        330 MB        N/A                  1920 x 1200        220 MB        308 MB        N/A        N/A                  &nbsp;        &nbsp;        &nbsp;        &nbsp;        &nbsp;        &#160;2) Remote Desktop Session HostDamit RemoteFX für Remote Desktop Session läuft, muss der Prozessor zwingend das Feature SSE2 unterstützen. Zusätzlich kann noch ein sog. „Remote FX Hardware Decoder“ eingebaut werden um die Leistung zu erhöhen.&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/remotefx/\"\n},{\n  \"id\": \"post-softap-windows-7-wireless-access-point\",\n  \"title\": \"SoftAP - Windows 7 Wireless Access Point\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"de\"],\n  \"content\": \"Hinter dem Namen SoftAp oder Virtual WIFI verbirgt sich ein tolles Feature von Windows 7, es erm&ouml;glicht durch das Erstellen eines virtuellen Netzwerkadapters das Betreiben eines Access Point mit Windows 7. Damit man einen virtuellen Wlan Adapter erstellen kann muss nat&uuml;rlich ein Wlan Adapter installiert und aktiviert sein.Man erstellt den Virtual WIFI Adapter mit Hilfe des Command-Line Tools \\\"netsh\\\", dazu ben&ouml;tigt man eine Administrative Eingabeaufforderung in die man dann folgenden Befehl eintippt:netsh wlan set hostednetwork mode=allow ssid=* key=* keyUsage=persistentAn der Stelle der \\\"*\\\" kommt die SSID (ohne Leerzeichen) und der WPA2 Key, wurde dieser Befehl abgesetzt wird der virtuelle Adapter erstellt.&nbsp;Jetzt muss das Hostednetwork gestartet werden, damit sich Clients verbinden k&ouml;nnen:netsh wlan start hostednetworkInternet Connection SharingWenn man auf dem Windows 7 Rechner eine Internetverbindung hat kann man diese dem Hostednetwork zur Verf&uuml;gung stellen. Dazu &ouml;ffnet man die Eigenschaften des Adapters der die Internetverbindung herstellt und w&auml;hlt \\\"Freigabe\\\". Hier muss man die Checkbox bei \\\"Anderen Benutzern im Netzwerk gestatten....\\\" setzen und darunter den Virtual WIFI Adapter ausw&auml;hlen.Bei einem Neustart des Rechners startet das Wlan nicht automatisch mit. Ohne neustart kann das Hostednetwork mit folgendem Befehl gestoppt werden:netsh wlan stop hostednetworkUm den Status des Hostednetwork zu sehen verwendet man folgenden Befehl:netsh wlan show hostednetworkDaniel Melanchthon beschreibt in diesem Artikel weitere Details zu Virtual WIFI.&nbsp;UpdateDas Ganze funktioniert nat&uuml;rlich auch unter Windows 8 :)Gut zu wissen: Das \\\"hostednetwork\\\" unterst&uuml;tzt leider&nbsp;nur das v&ouml;llig &uuml;berf&uuml;llte 2,4 GHz Band: \\\"Radio types supported (Direct Sequence Spread Spectrum [DSSS], 802.11g, 802.11b)\\\"Hier der Link zur entsprechenden TechNet Seite: http://technet.microsoft.com/en-us/library/cc755301(v=WS.10).aspx&nbsp;Tom\",\n  \"url\": \"https://onprem.wtf/post/softap-windows-7-wireless-access-point/\"\n},{\n  \"id\": \"post-appv-streaming-server\",\n  \"title\": \"AppV Streaming Server\",\n  \"author\": \"tto\",\n  \"tags\": [\"AppV\",\"Client\",\"Server\"],\n  \"content\": \"Verwendet man AppV für Applikationsvirtualisierung mit Clients in Standorten mit langsamer Anbindung (WAN) kann ein Updates eines Paketes ziemlich lange dauern, außerdem wird es von jedem Client einzeln heruntergeladen.Der AppV Streaming Server könnte die Lösung für dieses Problem sein. Mit dem Desktop Optimization Pack kommen neben den Installationsdateien für den AppV Management (Full) Server auch die Dateien für den Streaming Server. Die Installation gestaltet sich einfach, man wählt das Streaming Protokoll, sollte natürlich jenes sein das der Management Server verwendet. Außerdem muss man den Pfad für den “Content” Ordner angeben, diesen muss man manuell anlegen und freigeben (\\\\\\\\servername\\\\Content, Leseberechtigungen für Benutzer reichen aus).Die Installation ist abgeschlossen und der Dienst “Application Virtualization Streaming Server” (AppVirtServer) sollte gestartet sein.Im Application Event Log wird bei jedem Start des AppVirtServer Dienstes folgender Fehler Protokolliert:Error:&lt;/p&gt;    Source: Application Virtualization Server    Event ID: 44937    Empty package map for package content root: [D:\\\\Content\\\\].&lt;/code&gt;  Dieser Fehler wird für jedes Packet das auf dem AppV Management Server verfügbar ist einmal Protokolliert, und zwar so lange bis man die Daten aus dem Content Share des AppV Management Servers auf den Streaming Server kopiert. Es reicht aus die .sft Files zu kopieren, wichtig ist dabei dass eventuelle Unterordner auch angelegt werden.  Sind die Daten kopiert (d.h. beide Content Shares gleich) kann ist der Streaming Server bereit.  &#160;  Die Clients im Remote Netzwerk wissen allerdings nichts von diesem Server, d.h. Updates werden immer noch vom Management Server heruntergeladen. Über folgenden Registry Key gibt man den Clients die Information, in diesem Fall verwendet der Streaming Server RTSP:  HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Wow6432Node\\\\Microsoft\\\\SoftGrid\\\\4.5\\\\Client\\\\Configuration&lt;/p&gt;    REG_SZ ApplicationSourceRoot    rtsp://servername:554/&lt;/code&gt;  Ab jetzt ist es nur mehr Wichtig bei Paket Updates daran zu denken alle Content Shares zu aktualisieren.   &#160;  tomt\",\n  \"url\": \"https://onprem.wtf/post/appv-streaming-server/\"\n},{\n  \"id\": \"post-create-vmware-esxi-flash-drive\",\n  \"title\": \"Create VMWare ESXi Flash Drive\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"VMware\"],\n  \"content\": \"Der Hypervisor von VMWare kann auf einem USB Stick installiert werden, so kann man die vorhandenen Festplatten des Servers als Datastore f&uuml;r Virtuelle Maschinen verwenden oder Server ohne interne Festplatten als ESXi Hosts verwenden.Dazu braucht man:einen USB Stick (min. 2GB)VMWare Workstation (oder Player)VMWare ESXi Installationsimage (VMWare ESXi)Dann kanns losgehen, mit VMWare Workstation (oder Player) wird eine neue Virtuelle Maschine erstellt.Als Pfad f&uuml;r das Installationsimage wird das Image von ESXi 4.1 angegeben.Als Gastbetriebssystem wird VMware ESX ausgew&auml;hlt.Ein Ordner f&uuml;r die Konfigurationsdateien und die virtuelle Festplatte muss angegeben werden, hier kann einfach ein Ordner auf der Lokalen Festplatte verwende werden.Die Gr&ouml;&szlig;e der virtuellen Festplatte kann man so akzeptieren, diese wird nicht verwendet.Die virtuelle Maschine ist eigentlich erstellt, allerdings muss noch ein USB Controller hinzugef&uuml;gt werden, dazu auf &ldquo;Customize Hardware&rdquo; klickenund den USB Controller hinzuf&uuml;gen.Jetzt kann man die virtuelle Maschine starten, und auch gleich &uuml;ber &ldquo;VM&rdquo; und &ldquo;Removable Devices&rdquo; den USB Stick verbinden (muss nat&uuml;rlich am PC angeschlossen sein&hellip;)Bei der Installation des ESXi Servers wird der USB Stick als Ziel angegeben, ACHTUNG: Alle Daten auf dem USB Stick werden gel&ouml;scht, der Stick wird neu formatiert.Sobald die Installation abgeschlossen ist, kann man die VM herunterfahren, auf dem USB Stick ist jetzt VMWare ESXi installiert. Von diesem Stick kann man jeden (unterst&uuml;tzten) Server booten und als ESXi Host verwenden.&nbsp;Achtung: bei der Installation auf USB wird keine Scratch Partition erstellt, Infos dazu hier: /post/ESXi&ndash;Persistent-Scratch-Location.aspx&nbsp;so long,   tom\",\n  \"url\": \"https://onprem.wtf/post/create-vmware-esxi-flash-drive/\"\n},{\n  \"id\": \"post-sharepoint-dienstkonto-wechseln\",\n  \"title\": \"SharePoint–Dienstkonto wechseln, Probleme mit Kerberos\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wird das Dienstkonto f&uuml;r die SharePoint-Webseite vom Netzwerk-Konto auf ein Dom&auml;nen-Konto ge&auml;ndert, und Kerberos in Kombination mit Windows-Authentifizierung verwendet wird, k&ouml;nnen sich die Clients nicht mehr an der Webseite authentifizieren.Der Dialog zum Eingeben der Credentials wird immer wieder angezeigt, die Authentifizierung kann jedoch nicht richtig verarbeitet werden.Um das Problem zu beheben, muss im IIS die Kernelmodus-Authentifizierung aktiviert werden, die standardm&auml;&szlig;ig nach der Installation von SharePoint deaktiviert ist:Nun k&ouml;nnen sich die Clients wieder ganz normal an der SharePoint-Webseite authentifizieren.&nbsp;Gr&uuml;&szlig;e   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-dienstkonto-wechseln/\"\n},{\n  \"id\": \"post-outlook-gesendete-objekte-shared-mailbox\",\n  \"title\": \"Outlook–gesendete Objekte–Shared Mailbox\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Client\"],\n  \"content\": \"Wie in diesem Post beschrieben kann man mit Exchange 2010 einfach Shared Mailboxen verbinden. Wenn ein User Send-As Berechtigungen auf eine solche Mailbox hat und ein Mail schickt, wird das Mail im Ordner “Sent Items” des jeweiligen Users gespeichert. Damit die gesendete Nachricht in den Sent Items der shared Mailbox gespeichert wird muss man folgenden Eintrag in der Registry erstellen (auf den Clients).Unter dem Schlüssel: “HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Office\\\\14.0\\\\Outlook\\\\Preferences” wird ein REG_DWORD mit dem Namen “DelegateSentItemsStyle” und dem Wert “1” erstellt.In einer Active Directory Umgebung bieten sich natürlich die Group Policy Preferences dafür an.\",\n  \"url\": \"https://onprem.wtf/post/outlook-gesendete-objekte-shared-mailbox/\"\n},{\n  \"id\": \"post-tmge28093fehler-beim-ausfuhren-von-abfragen-im-log\",\n  \"title\": \"TMG–Fehler beim Ausführen von Abfragen im Log\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Security\",\"SQL\"],\n  \"content\": \"Letztens hatte ich ein seltsames Problem auf meinen TMG 2010 Server. Ich logge auf die lokale SQL Express Datenbank und konnte keine Abfragen im Log aus der TMG Konsole mehr machen. Nach dem Start einer Abfrage erscheint der folgende Fehler:&nbsp;Daraufhin habe ich den SQL Server &uuml;berpr&uuml;ft, konnte aber keine Probleme feststellen. Im Management Studio lie&szlig;en sich die Logs durch SELECT Anweisung abfragen.Das Problem liegt an der Formatierung des Datums und taucht durch das Service Pack 1 (KB2288910) auf TMG&rsquo;s in deutscher Sprache auf.Das Problem l&auml;sst sich aber relativ einfach beheben: Man verbindet sich mit dem Management Studio auf die SQL Instanz und &auml;ndert die Standard-Sprache des Benutzerkontos &ldquo;NT Authority\\\\NetworkService&rdquo; auf Schwedisch um. Nachdem man nun die SQL Dienste neu startet kann man problemlos wieder das Abfragen im LOG starten.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/tmge28093fehler-beim-ausfuhren-von-abfragen-im-log/\"\n},{\n  \"id\": \"post-zertifizierungsstelle-verschiebene28093neuer-servername\",\n  \"title\": \"Zertifizierungsstelle verschieben–neuer Servername\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"In diesem Beitrag habe ich beschrieben wie man eine Zertifizierungstele sichert, den alten Server abbaut und die CA auf einem neuen Server mit dem selben Namen wiederherstellt. Will man allerdings die CA umziehen und den aktuellen Server nicht abbauen sind ein paar zusätzliche Schritte nötig. Wichtig ist hier zu sagen dass man zwar den Servernamen ändern kann, allerdings nicht den Namen der Zertifizierungsstelle!Tipp: Auch wenn die Microsoft Dokumentation das nicht wirklich bestätigt funktioniert eine Migration von 32Bit auf 64Bit. Also Backup auf x86 Restore auf x64 ist Möglich.Backup   Auf jeden Fall eine komplette Sicherung des Servers erstellen!     CA Datenbank und Key sichern     CA Konfiguration (Registry) sichern             Mit dem Registrierungseditor zu folgendem Schlüssel navigieren, rechtsklick und “Export”         HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration         reg export HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration RegBackup.reg             CA Templates notieren oder mit certutil.exe –catemplates &gt; templates.txt exportieren     CA Deinstallieren             Im Server Manager mit Remove Role die Active Directory Certificate Services deinstallieren         Achtung: wie bereits im alten Beitrag erwähnt bleiben gewisse Daten auf dem Server          Restore   alle Dateien (und Ordner) die von der Sicherung erstellt wurden auf den neuen Server kopieren             Achtung: caname.p12 enthält den private Key der CA!             Private Key importieren             certutil –importpfx caname.p12             CA Dienste installieren             Server Manager                     Im Servermanager mit Add Roles die Active Directory Certificate Services hinzufügen             Bei der Installation den richtigen CA Typ auswählen und das Richtige Zertifikat mit vorhandenem private Key wählen                         setupca.vbs                     auf einem Core Server wird die CA am besten mit diesem Script installiert             Bei der Installation muss der Wert im “Key Container” des installierten private Key angegeben werden, diesen kann man so herausfinden: certutil.exe -store my | find &quot;Key Container&quot;             setupca.vbs hat verschiedene Parameter um den entsprechenden CA Typ auszuwählen, folgendes Beispiel installiert eine Subordinate Enterprise CA: cscript setupca.vbs /IF /RC /SN WertKeyContainer             hier die Wichtigsten Parameter              /IE – Enterprise Root CA Service               /IS – Standalone Root CA Service               /IF – Enterprise Subordinate CA Service               /IT – Standalone Subordinate CA Service               /RC – Reuse Certificate and Key               /SN – CA Name                             CA Datenbank wiederherstellen             dazu muss der Dienst certsvc gestoppt werden, net stop certsvc         Im Server Manager mit rechtsklick, Restore CA kann die Datenbank wiederhergestellt werden         mit certutil –f –restoreDB PfadZumDataBaseOrdner kann man dasselbe erreichen             Konfiguration wiederherstellen: die Sicherung der Registry muss wieder importiert werden, dabei gilt es allerdings einiges zu beachten:             Backup der Registry auf dem neuen Server vor dem Import!         CAServerName anpassen, muss den neuen Servernamen enthalten         Die Pfade für folgende Werte kontrollieren, wenn sie auf dem alten Server nicht geändert wurden sollten kein Anpassungen nötig sein:                     DBDirectory, DBLogDirectory, DBSystemDirectory, DBTempDirectory                         Den Inhalt für folgende Werte zu kontrollieren um sicherzustellen dass CDP und AIA Informationen richtig veröffentlicht werden                     CACertPublicationURLs. CRLPublicationURLs                         Den Wert von CACertHash kontrollieren, wenn das CA Zertifikat erneuert wurde beinhaltet dieser Wert mehrere Thumbprints der CA Zertifikate. Wenn ein Thumbprint importiert wird und das zugehörige Zertifikat nicht installiert ist startet der Zertifikatsdienst (certsvc) nicht und protokollieret folgenden Fehler im Application Log:                     Active Directory Certificate Services did not start: Could not load or verify the current CA certificate.&#160; CAName The system cannot find the file specified. 0x80070002 (WIN32: 2).                             Berechtigungen auf CDP und AIA Container             Das Computerkonto des neuen Servers muss FullControl für die AIA und CDP Objekte des alten Server haben um CRLs und neue Root Zertifikate veröffentlichen zu können.         Berechtigungen werden mit ADSI Edit gesetzt, die Objekte finden sich unter CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local          CheckUm zu überprüfen ob alles läuft kann man ein Zertifikat anfordern. Funktioniert das ausstellen der Zertifikate sollte man noch überprüfen ob der Zugriff auf die Sperrlisten funktioniert. Dazu Exportiert man das Zertifikat (in eine .cer Datei) und führt “certutil –url datei.cer” aus.&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/zertifizierungsstelle-verschiebene28093neuer-servername/\"\n},{\n  \"id\": \"post-signing-powershell-scripts\",\n  \"title\": \"Signing PowerShell Scripts\",\n  \"author\": \"tto\",\n  \"tags\": [\"PowerShell\"],\n  \"content\": \"Damit ein PowerShell Script signiert werden kann muss man im besitz eines Zertifikates mit dem “Intended Purpose” Code Signing sein. So ein Zertifikat kann man sich selbst ausstellen, oder von einer Enterprise CA anfordern. Natürlich kann man es auch kaufen…Wie man ein SelfSigned Zertifikat erstellt ist ausführlich in der Hilfe beschrieben, einfach “Get-Help about_signing” ausführen.Um ein Code Signing Zertifikat von Enterprise Zertifizierungsstelle anzufordern muss man “Enroll” Berechtigungen auf die Zertifikatsvorlage haben, oder man kopiert die Vorlage und erstellt eine eigene, z.B. mit längerer Gültigkeit.Hat man also ein Zertifikat erhalten findet man es mit folgendem cmdlet:Get-ChildItem cert:\\\\CurrentUser\\\\My –codesigningMit Set-AuthenticodeSignature wird ein Script signiert, dieses cmdlet benötigt zwei Parameter, das zu Signierende Script und das Zertifikat.Im Folgenden Beispiel signiere ich die Datei C:\\\\scripts\\\\my-test.ps1 mit dem einzigen Zertifikat das in meinem Zertifikatsstore ist.$cert = Get-ChildItem cert:\\\\CurrentUser\\\\My –codesigning&lt;/p&gt;    Set-AuthenticodeSignature C:\\\\scripts\\\\my-test.ps1 $cert&lt;/code&gt;  Erscheint folgender Fehler, hat man das Script mit PowerShell ISE erstellt. Diese verwendet eine Codierung mit der Set-AuthenticodeSignature nicht zurechtkommt. Man erhält den vielsagenden Fehler: UnknonError.    Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab.    Und schon ist das Script signiert.  Wenn man das Script jetzt auf einem Host ausführt auf dem die ExecutionPolicy auf AllSigned gesetzt ist wird man informiert dass der Herausgeber unbekannt ist. Das Zertifikat welches zum Signieren verwendet wurde muss im TrustedPublisher Zertifikatstore sein.    Um das Zertifikat zu exportieren kann man die MMC Certficates verwenden, das Code Signing Zertifikat auswählen und auf Export klicken. Den Privat Key kann man nicht exportieren, dieser wird auch nicht benötigt um die Signatur zu bestätigen.  Die .cer Datei die man nach dem Export erhält kann man mit Gruppenrichtlinien auf alle Clients/Server verteilen oder manuell in den Store für Vertrauenswürdige Herausgeber importieren.  Gruppenrichtlinie:    Nach dem nächsten GP Refresh läuft das Script ohne Fehlermeldung.      Wird ein Script verändert nachdem es signiert wurde, wird die Ausführung verhindert. Folgende Fehlermeldung erscheint.    &#160;  tom\",\n  \"url\": \"https://onprem.wtf/post/signing-powershell-scripts/\"\n},{\n  \"id\": \"post-powershell-scripts\",\n  \"title\": \"PowerShell Scripts\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Achtung: Diese Scripts sind Beispiele, sie sind nicht f&uuml;r die Verwendung in Produktivsystemen gedacht! Die Autoren von ntSystems.it k&ouml;nnen keine Haftung f&uuml;r eventuelle Sch&auml;den durch diese Scripts &uuml;bernehmen.&nbsp;Exchange: Set SimpleDisplayName on all Mailboxes where this Attribute is empty; change characters like &ouml; to oe; send E-Mail if script fails   1: Import-Module 'C:\\\\Users\\\\daniel nitz\\\\AppData\\\\Roaming\\\\Microsoft\\\\Exchange\\\\RemotePowerShell\\\\ex2k10.domain.local\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.SimpleDisplayName -eq \\\"\\\"}   4: if($Mailboxes -ne $null)   5: {   6:     try {   7:         ForEach ($Mailbox in $Mailboxes)   8:         {   9:             $NameString = $Mailbox.Name  10:             if($NameString -match \\\"&uuml;\\\")  11:                 {  12:                 $NameString = ($NameString -replace \\\"&uuml;\\\",\\\"ue\\\")  13:                 }  14:             if($NameString -match \\\"&auml;\\\")  15:                 {  16:                 $NameString = ($NameString -replace \\\"&auml;\\\",\\\"ae\\\")  17:                 }  18:             if($NameString -match \\\"&ouml;\\\")  19:                 {  20:                 $NameString = ($NameString -replace \\\"&ouml;\\\",\\\"oe\\\")  21:                 }  22:             Set-Mailbox -Identity $Mailbox.Name -SimpleDisplayName ($NameString + \\\" - COMPANY\\\")  23:         }  24:     } Catch {  25:         Send-MailMessage -to daniel.nitz@domain.local -Subject \\\"Exchange Shell Script Error\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  26:     }                 27: }  28:     &nbsp;Exchange: Set Out of Office Assistent on Mailboxes where the &ldquo;Office&rdquo; property isn&acute;t empty   1: Import-Module 'C:\\\\Users\\\\daniel nitz\\\\AppData\\\\Roaming\\\\Microsoft\\\\Exchange\\\\RemotePowerShell\\\\ex2k10.domain.local\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.Office -ne \\\"\\\"}   4: try {   5:     $OOFTextExternal = ${E:\\\\OOF-Text\\\\External-Text.txt}   6:     $OOFTextInternal = ${E:\\\\OOF-Text\\\\Internal-Text.txt}   7:        8:     ForEach ($Mailbox in $Mailboxes)   9:     {  10:         Set-MailboxAutoReplyConfiguration -Identity $Mailbox.Name -AutoReplyState scheduled -StartTime \\\"2011.01.21T07:00\\\" -EndTime \\\"2011.01.21T19:00\\\" -ExternalAudience All -ExternalMessage $OOFTextExternal -InternalMessage $OOFTextInternal     11:     }  12: } Catch { Send-MailMessage -to daniel.nitz@domain.local -Subject \\\"Exchange Shell Script Error\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  13: }\",\n  \"url\": \"https://onprem.wtf/post/powershell-scripts/\"\n},{\n  \"id\": \"post-tmg-2010-unable-to-authenticate-users\",\n  \"title\": \"TMG 2010 unable to authenticate users after reboot\",\n  \"author\": \"dni\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"Nach dem Upgrade von ISA Server 2006 auf TMG 2010 musste ich eine Reihe von Probleme bez&uuml;glich der Authentifizierung feststellen. Nach jedem Neustart des Servers dauerte es zwischen einer halben und 2 Stunden bis der TMG Clients gegen AD erfolgreich authentifizierte. In der Zwischenzeit wurden die Verbindung aufgrund fehlender Authentifizierung abgelehnt.Auch das EventLog protokollierte folgende Fehler:Im ADAM Log wurde folgender Fehler protokolliert:&nbsp;Mein Problem habe ich dadurch gel&ouml;st, indem ich ein Computer-Zertifikat f&uuml;r den FQDN des TMG von meiner Zertifizierungsstelle angefragt und installiert habe. Anschlie&szlig;end habe ich den Netzwerkdienst Lesen-Berechtigungen f&uuml;r das Verzeichnis C:\\\\ProgramData\\\\Microsoft\\\\Crypto\\\\RSA\\\\MachineKeys gegeben (hier werden die Computerzertifikate gespeichert).INFO: Wenn der Request f&uuml;r das Zertifikat fehschl&auml;gt, muss in den Systemregeln der strikte RPC Filter deaktiviert werden:&nbsp;Nachdem diese Schritte abgeschlossen wurden, konnte ich im EventLog sehen wie die SSL-Verbindungen erfolgreich hergestellt wurden:&nbsp;Nach einem Neustart werden Verbindungen nun sofort authentifiziert.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/tmg-2010-unable-to-authenticate-users/\"\n},{\n  \"id\": \"post-exchange-2010-change-display-name-for-outgoing-mails\",\n  \"title\": \"Exchange 2010, change Display Name for outgoing Mails\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Mit Exchange Server 2010 ist es sehr einfach den Display Name für ausgehende Mails zu ändern.Zunächst muss das Feature für die Remote-Domänen aktiviert werden. Mit den folgenden Befehl wird das Feature für alle Remote-Domänen aktiviert:Get-RemoteDomain | Set-RemoteDomain –UseSimpleDisplayName $trueIn den Einstellungen der Mailbox&#160; befindet sich die Eigenschaft Simple display name. Hier lässt sich der angepasste Display Name einfügen. ACHTUNG: Befindet sich kein Wert im Feld Simple Display Name nachdem das Feature aktiviert wurde, sendet Exchange die Mail-Adresse.&#160;Alle Mails, die nun die Organisation verlassen, werden mit den angepassten Display Name versendet:&#160;Anbei noch ein Shell-Beispiel um schnell für eine Liste (CSV-Import Datei) von Benutzern den Simple Display Name mit&#160; Name + Firma GmbH zu setzen.Import-CVS &quot;C:\\\\Import-File.csv&quot; | Foreach {Set-Mailbox -Identity $_.Name -SimpleDisplayName ($_.Name + &quot; - Firma GmbH/Srl&quot;)}           Beispiel für CSV-Import DateiName     Daniel Nitz      Max MustermannGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-change-display-name-for-outgoing-mails/\"\n},{\n  \"id\": \"post-zertifizierung\",\n  \"title\": \"Zertifizierung\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Heute ist ein guter Tag f&uuml;r beide Autoren von ntSystems.it.Nachdem wir &uuml;ber eine halbe Stunde vor dem Prometric Test Centre warten mussten weil es dort Probleme mit den PCs gab konnten wir unsere Examen in Angriff nehmen.Daniel hat erfolgreich das &ldquo;70-432 TS: Microsoft SQL Server 2008, Implementation and Maintenance&rdquo; Examen absolviert und erweitert so seinen MCITP: Enterprise Administrator mit dem&nbsp; MCTS: SQL Server 2008, Implementation and Maintenance.Ich habe mit dem &ldquo;70-663 Pro: Designing and Deploying Messaging Solutions with Microsoft Exchange Server 2010&rdquo; nun den Status MCITP: Enterprise Messaging Administrator 2010 erreicht.In diesem Sinne,    tom\",\n  \"url\": \"https://onprem.wtf/post/zertifizierung/\"\n},{\n  \"id\": \"post-mail-sensitivity-header-exchange-2010-sp1\",\n  \"title\": \"Mail Sensitivity Header Exchange 2010 SP1\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Wer Shared Mailboxes mit Exchange 2010 verwendet kann folgendes Verhalten beobachten:· wird eine Mailbox über das AD Attribut msExchDelegateListLink verbunden sehen Benutzer keine als „Privat“ markierten Mails· verbindet ein User die Mailbox über Datei -&gt; Konto hinzufügen sind alle Objekte sichtbar, auch die als „Privat“ markiertenDie Vertraulichkeit einer Nachricht wird mit dem Sensitivity Header geregelt, dieser wird in dem Fall auf “private” gesetzt. Mit Transportregeln in Exchange kann man Message Header löschen oder bearbeiten. In diesem Fall reicht das Löschen des Headers nicht aus, man muss ihn auf “Normal” ändern. Man erstellt also eine neue Transportregel für alle eingehenden Nachrichten welche an die Shared Mailbox gesendet werden. Diese Regel soll der Wert des Headers “Sensitivity” von “private” auf “normal” ändern.Transportregeln kann man an drei verschiedenen Orten pflegen, EMS, EMC und ECP. Natürlich muss man die entsprechenden Berechtigungen besitzen. Exchange Control PanelDas Exchange Control Panel ist über https://meinexchange/ecp erreichbar, dort muss unter Options “My Organization” ausgewählt werden. Dann kann man unter “Mail Control” Regeln mit Hilfe eines Wizards erstellen.Exchange Management ConsoleIn der Management Console sind die Regeln unter “Organization Configuration” – “Hub Transport” und “Transport Rules” zu finden, auch hier kann man Regeln einfach über einen Wizard erstellen.Exchange Management ShellNatürlich kann man Transportregeln auch mit der Managment Shell erstellen. Dazu am Besten im TechNet vorbeischauen.Hier ein Beispiel:New-TransportRule -Name 'Remove Header' -Comments '' -Priority '0' -Enabled $true -SentTo 'shared.mailbox@domain.com' -HeaderMatchesMessageHeader 'Sensitivity' -HeaderMatchesPatterns 'private' -SetHeaderName 'Sensitivity' -SetHeaderValue 'normal'&#160;so long,    tom\",\n  \"url\": \"https://onprem.wtf/post/mail-sensitivity-header-exchange-2010-sp1/\"\n},{\n  \"id\": \"post-sharepoint-2010-external-list-bcs-sql\",\n  \"title\": \"Sharepoint 2010, external List, BCS, SQL\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\",\"SQL\"],\n  \"content\": \"In diesem Post werde ich die einzelnen Schritte erklären um in Sharepoint eine SQL Tabelle einzubinden. Dazu erforderlich ist:   Sharepoint 2010 Foundation / Server     SQL Server     Sharepoint Designer 2010  Externen Inhaltstyp definierenIn diesem Schritt definieren wir den Inhaltstyp und somit die Verbindung zu SQL Server. Dies kann alles mit dem Sharepoint Designer erledigt werden. Unter Externe Inhaltstypen definieren wir die Verbindung.Nun kann ein Name und die Verbindung zu SQL Server angegeben werden, indem wir auf “Klicken Sie hier, um externe Datenquellen zu ermitteln und Vorgänge zu definieren” klickenWir erstellen eine neue Verbindung vom Typ SQL Server und geben die Datenbankinformationen anNun können wir die Tabellen auswählen, die für diesen Inhaltstyp zur Verfügung stehen. Dabei klicken wir auf die Tabelle und können verschiedene Vorgänge definieren:   Element lesen     Liste lesen     Erstellen     Aktualisieren     Löschen  Nun ist der Inhaltstyp definiert und steht in Sharepoint zur Verfügung.&#160;BCS Berechtigungen definierenStandardmäßig haben wir keine Berechtigung um auf den Inhaltstyp zuzugreifen. Dies müssen wir erst in den BCS Einstellungen definieren. Am schnellsten kann dies über die Zentraladministration erledigt werden.Zentraladministration / Anwendungsverwaltung / Dienstanwendungen verwaltenNun wählen wir den Business Data Connectivity-Dienst und definieren die Berechtigungen für den Inhaltstyp.Info: Mindestens 1 Account muss das Buntzerrecht “Berechtigungen festlegen” haben.Jetzt können wir die externe Liste erstellen und hätten theoretisch Zugriff darauf, wäre da nicht das Double-Hop Problem. Beim Zugriff erhalten wir folgende Fehlermeldung:&#160;Double-Hop Problem behebenUm das Double-Hop Problem zu lösen gehen wir folgendermaßen vor:1. Zunächst erstellen wir einen neuen SPN (Service Principal Name) für unseren SQL Server:setspn –A MSSQLsvc/NETBIOSNAME.DOMAIN:1433 DOMAIN\\\\SQL-Service-AccountDer SQL Service Account kann am schnellsten unter den Diensten ermittelt werden.2. Danach müssen wir in ActiveDirectory die Delegierungen für folgende Objekte aktivieren   Sharepoint Computer-Objekt     SQL-Service Account  Ich empfehle den Sharepoint sowie den SQL Server neu zu starten um sicherzugehen, dass die Konfiguration aktiv ist.Jetzt haben wir Zugriff auf die SQL Tabelle über Sharepoint.&#160;Nähere Informationen zur Double-Hop Problematik unter folgenden Link&#160;Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2010-external-list-bcs-sql/\"\n},{\n  \"id\": \"post-sharepoint-foundation-2010-insufficient-sql-permissions\",\n  \"title\": \"Sharepoint Foundation 2010, insufficient SQL permissions\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\",\"SQL\"],\n  \"content\": \"Wenn man Sharepoint Foundation 2010 mit den integrierten SQL Server 2008 Express installiert, hat man recht wenig Möglichkeiten Eigenschaften für den SQL Server zu definieren (Benutzerkonten, Logs, Backup).Wenn man nun über das Management Studio eine Verbindung mit SQL Server herstellen möchte, kann es vorkommen, dass man selbst mit dem Farm-Administratorkonto keine Änderungen an den entsprechenden Datenbanken vornehmen kann. Ein Blick auf die verbunden Gruppen des Farm-Administratorkontos verrät, dass sich das Benutzerkonto nur in der Gruppe public befindet und somit keine Einstellungen ändern darf.Zudem ist kein Benutzerkonto ersichtlich mit dem man sich anmelden könnte um das Farm-Administratorkonto den entsprechen Gruppen zuzuweisen. Mit dem Benutzer SA kann man sich ebenfalls nicht anmelden, da der “SQL Server- und Windows-Authentifizerungsmodus” nicht aktiviert ist.Der Grund dafür liegt hier: Wenn man Sharepoint Foundation 2010 über den Rechtsklick auf das Setup-File und “Als Administrator ausführen” installiert, wird das Produkt über das lokale Administratorkonto mit logischerweise den entsprechenden Administratorrechten installiert. Das wäre eigentlich auch kein Problem, wäre nicht die folgende Änderung ab SQL Server 2008 fest implementiert:In den Versionen vor SQL 2008 wurde der Gruppe lokale Administratoren (die enthält wiederum den Domain-Admin und geg. andere Benutzer) das SQL Benutzerrecht sysadmin zugewiesen. Folglich konnte jeder Admin,die Datenbanken verwalten. Ab SQL Server 2008 erhält diese Gruppe nicht mehr das sysadmin-Recht. Bei der manuellen Installation von SQL wird man danach gefragt welche Benutzer das sysadmin-Recht erhalten sollen. Als die Installation mit der Option “Als Administrator ausführen” durchgeführt wurde, hat der lokale Administrator die sysadmin-Rechte erhalten.Lösung: Wir erhalten mit dem Farm-Administrator Konto keine Ändern-Rechte in SQL, bis wir uns mit dem lokalen Administrator anmelden, Management Studio öffnen und den Benutzerkonten die entsprechenden Rechte zuweisen.PS: Wenn die Datenbank in den Sinlge User Mode geschalten wird, erhält die Gruppe lokale Administratoren (folglich auch Domain-Admins) die sysadmin-Rechte.Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-2010-insufficient-sql-permissions/\"\n},{\n  \"id\": \"post-migration-isa-server-2k4-2k6-zu-tmg-wpad\",\n  \"title\": \"Migration ISA Server 2k4, 2k6 zu TMG, WPAD\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"de\",\"Server\",\"Security\"],\n  \"content\": \"Wenn der ISA Server zu TMG oder einem anderen physischen Server migriert wird und sich dadurch der Servername &auml;ndert, funktioniert unter Umst&auml;nden die automatische Browserkonfiguration &uuml;ber WPAD bei DHCP Clients nicht mehr.WPADDas Web Proxy Autodiscovery Protocol (WPAD) ist ein Protokoll, mit dem Web-Clients automatisiert zu verwendende Web-Proxies innerhalb eines Computernetzwerkes finden k&ouml;nnen, indem eine Proxy autoconfiguration (PAC)-Datei unter einer erratbaren URL gespeichert wird, beispielsweise http://wpad.example.com/wpad.datWPAD wird in den DHCP Einstellungen sowie in DNS konfiguriert um DHCP Clients und jene Ger&auml;te mit den automatischen Einstellungen zu versorgen, die eine statische IP Adresse besitzen.Das Problem nach Migrationen / Serverumzug des ISA / TMG Servers bei DHCP Clients erkl&auml;rt sich so:Am DHCP Server wird eine neue Option (252) konfiguriert, die den Pfad zur WPAD.dat Datei bereitstellt. Sobald ein neuer DHCP Client sich vom DHCP Server eine IP Adresse holt, bekommt er auch eine Lease-Zeit zugewiesen, wie lange er die Adresse verwenden darf. Die Lease wird standardm&auml;&szlig;ig nach der H&auml;lfte der Lease-Zeit verl&auml;ngert. Solange sich der Client in dieser Lease befindet und die IP Adresse dem DHCP Server anbietet, wird die WPAD Datei nicht aktualisiert.&Auml;ndert sich jetzt der Servername des ISA / TMG Servers und ist in der Option 252 vom DHCP Server der jeweilige Servername eingetragen, so erhalten die DHCP Clients nicht die neue Konfiguration. Man m&uuml;sste bei jedem Client, der sich in einer Lease befindet die Befehle ipconfig /release und ipconfig /renew ausf&uuml;hren um einen manuellen Refresh durchzuf&uuml;hren.Es gibt mehrere Methoden das Problem zu umgehen:Methode 1 &ndash; Option 252 von Anfang an mit dem CNAME WPAD konfigurierenWenn man in den DHCP Einstellungen nicht den FQDN des Servers verwendet, sondern den CNAME WPAD (so wie man es f&uuml;r DNS konfigurieren muss), so wird der CNAME WPAD immer auf den jeweiligen aktuellen Server zeigen. ACHTUNG: Dies muss nat&uuml;rlich von Anfang an so erfolgen!!Methode 2 &ndash; Clients daran hindern die WPAD Option von DHCP zu zeihen.Durch hinzuf&uuml;gen des Registry Keys: AutoProxyDetectType mit dem Wert 2 unter HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settingswerden die Clients angewiesen das WPAD File &uuml;ber DNS anzufragen.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/migration-isa-server-2k4-2k6-zu-tmg-wpad/\"\n},{\n  \"id\": \"post-exchange-2010-pfad-einer-mailboxdatenbank-andern\",\n  \"title\": \"Exchange 2010 Pfad einer Mailboxdatenbank ändern\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Der Pfad zu einer Exchange 2010 Mailboxdatenbank kann geändert werden, die Datenbank muss dazu allerding “dismounted” also offline sein. Das heißt die Benutzer deren Mailbox sich in der betreffenden Datenbank befinden habe für die Zeit der Änderung keinen Zugriff auf ihre Mailbox.Ich werde im Beispiel zwischen einer einzelnen Datenbank und einer Datenbank in einer DAG mit mehreren Kopien unterscheiden. Einzelne DatenbankDer Datenbankpfad kann mit der EMC sowie mit der EMS verschoben werden.Exchange Management Console   Rechtsklick auf Datenbank, Dismount     Wenn die Datenbank offline ist, wieder Rechtsklick und Move Databse Path auswählen.     Exchange Management Shell   Datenbank offline nehmen mit      Dismount-Database DB01     Pfad ändern      Move-DatabaseFilePath DB01 –EdbFilePath M:\\\\db01\\\\db01.edb –LogFolderPath L:\\\\     Datenbank wieder online nehmen      Mount-Database DB01  Datenbank in DAGAchtung:       Wenn Circular Logging für die Datenbank aktiviert ist muss das vor der Änderung deaktiviert werden!      Einstellungen wie ReplayLagTime und TruncationLagTime notieren, durch das entfernen und wieder erstellen der Datenbankkopien gehen diese Einstellungen verloren!   Alle Datenbankkopien entfernen, d.h. Datenbank wird nur auf einem Server belassen, auf diesem wird der Pfad geändert      Remove-MailboxDatabaseCopy     Datenbank offline nehmen (einzige verbleibende Kopie)      Dismount-Database     Datenbankpfad verschieben      Move-DatabasePath –EdbFilePath –LogFolderPath     Auf allen Servern die eine Kopie der Datenbank enthalten sollen muss der neue Pfad existieren, durch kopieren der alten Files an den neuen Pfad kann man zeit und Replikationstraffic sparen, die Datenbank muss so nicht neu geseedet werden     Datenbank wieder online nehmen      Mount-Database     Datenbankkopien wieder erstellen      Add-MailboxDatabaseCopy     Index und Search Dienste neu starten      net stop msftesql-Exchange        net start MSExchangeSearch     Replikation überprüfen      Test-ReplicationHealth        Get-MailboxDatabaseCopyStatus  &#160;Fehler beim entfernen/hinzufügen von KopienBeim entfernen einer Mailboxdatenbankkopie kann es zu einem Fehler mit folgender Meldung kommen: Error:      Registry key has subkeys and recursive removes are not supported by this method.&lt;/p&gt;    Warning:      An unexpected error has occurred and a Watson dump is being generated: Registry key has subkeys and recursive removes are not supported by this method.&lt;/code&gt;  Obwohl der Fehler auftritt wird die Datenbankkopie gelöscht. Allerdings bekommt man beim wiedererstellen der Datenbankkopie den selben Fehler und die Kopie wird nicht erstellt. Es hilft folgender Workaround.     GUID der betreffenden Datenbank herausfinden     Get-MailboxDatabase db01 | fl name,guid     Auf dem Server, auf dem die Datenbankkopie erstellt werden soll muss folgender Registry Key gelöscht werden     HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\ExchangeServer\\\\v14\\\\Replay\\\\State\\\\{GUID}\\\\DumpsterInfo    Jetzt wird das Add-MailboxDatabaseCopy cmdlet erneut ausgeführt und die Kopie wird erstellt.  &#160;  tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-pfad-einer-mailboxdatenbank-andern/\"\n},{\n  \"id\": \"post-exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben\",\n  \"title\": \"Exchange 2010 SP1 Online Archive in eigene Datenbank verschieben\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Mit Exchange 2010 wurden Online Archive eingeführt, mit SP1 hat man die Möglichkeit Archive in einer eigenen Datenbank zu verwalten. Die Vorteile liegen auf der Hand, man kann Archivdaten so auf billigeren, langsamen Storge legen, kann verschiedene Backup/Restore SLAs für Produktiv- und Archivdaten anbieten usw…Wer Online Archive bereits mit Exchange 2010 RTM verwendet hat und diese jetzt auf eine andere Datenbank schieben muss kann wie folgt vorgehen.EMCIn der EMC wurden mit SP1 die Wizards für einen neuen Move Request angepasst, dort kann man das Archiv auswählen und nur dieses verschieben.EMSIn der EMS gibt es neue Parameter für das cmdlet New-MoveRequest, hier ein Beispiel in dem das Archiv des Benutzers test.user in die Datenbank adb01 verschoben wird.new-MoveRequest test.user –ArchiveOnly –ArchiveTargetDatabase adb01tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben/\"\n},{\n  \"id\": \"post-exchange-2010-zertifikat-anfordern\",\n  \"title\": \"Exchange 2010 Zertifikat anfordern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Um OWA, Active Sync usw. betreiben zu können benötigt Exchange ein entsprechendes Zertifikat. Seit Exchange 2010 hat Microsoft hierfür einen komfortablen Wizard zur Verfügung gestellt.Der Wizard befindet sich unter der Serverkonfiguration und wird über den Menüpunkt “New Exchange Certificate” aufgerufen.Sobald der Wizard startet, muss zunächst ein Namen vergeben werden. Auf der nächsten Seite kann das Zertifikat noch für alle Subdomains freigegeben werden.Nun können die Einstellungen gesetzt werden, wie der Certificate-Request erstellt werden soll. Als Beispiel habe ich hier einige Parameter aufgelistet:OWAActiveSyncOutlook Anywhere und AutodiscoverAls Ergebnis werden dann die Domains angezeigt, die im Zertifikat registriert werdenNachdem die Informationen zu Organisation und Standort ausgefüllt wurde, kann der Certficate-Request abgespeichert und bei der CA eingereicht werden. Bevor die CA das Zertifikat ausstellen kann, muss die CA noch für die Registrierung mehrere Subject Names aktiviert werden.Nachdem die CA das Zertifikat ausgestellt hat, muss der Request noch abgeschlossen werden. Hier klickt man rechts auf das Zertifikat in der EMC und wählt die Option “Complete Pending Request”.Sobald das Zertifikat installiert ist, muss es noch mit den jeweiligen Diensten verbunden werden. Hier ist uns wieder ein Wizard behilflich. Rechtslick auf das Zertifikat und “Assign Services to Certificate”Nun kann man sämtliche Services auswählen, für die das Zertifikat zuständig ist.Mit Assign wird das Zertifikat dann hinzugefügt.Grüße   dnlive vom ntSystems techDAY :)\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-zertifikat-anfordern/\"\n},{\n  \"id\": \"post-exchange-2010-san-zertifikate28093server-2008-pki\",\n  \"title\": \"Exchange 2010 SAN Zertifikat–Server 2008 PKI\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Zertifikate f&uuml;r den Exchange 2010 Client Zugriff beinhalteten mehrere Subject Names. Standardm&auml;&szlig;ig werden sogenannte SAN Zertifikate von Server 2008 Certificate Authorities nicht unterst&uuml;tzt.Damit die CA ein SAN Zertifikat ausstellen kann muss folgender Befehl von einer Eingabeaufforderung mit administrativen Rechten ausgef&uuml;hrt werden:certutil &ndash;setreg policy\\\\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2Anschlie&szlig;end m&uuml;ssen die CA Dienste neu gestartet werden. Am besten mit \\\"net stop certsvc &amp;&amp; net start certsvc&rdquo;.Will man jetzt einen Certificate Request &uuml;ber die MMC einreichen erscheint folgender Fehler:&ldquo;The request contains no Certificate template information. 0x80094801 (-2146875391) Denied by Policy Module 0x80094801, the request does not contain a Certificate template extension or the Certificate Template request attribute.&rdquo;Man muss den Request &uuml;ber die Certificate Web Services einreichen, standardm&auml;&szlig;ig l&auml;uft die auf der CA unter /certsrv, in unserem Fall also: http://dc01.ntsystems.local/certsrv. Dort w&auml;hlt man Request a Certificate, advanced certificate request und submit a certificate using a (&hellip;) file. In das Textfeld wird der gesamte Inhalt der .req Datei kopiert, bei Certificate Template wird Web Server ausgew&auml;hlt. Wenn der Request erfolgreich war, kann man die .cer Datei herunterladen und in Exchange den Request fertigstellen (Complete Pending Request).Alternativ kann der Request mit &ldquo;certutil&rdquo; eingereicht werden, wobei mit dem Parameter &ldquo;/attrib&rdquo; das Template gew&auml;hlt wird.Beispiel: certreq.exe -submit -attrib \\\"CertificateTemplate:WebServer\\\" c:\\\\certreq.req&nbsp;tomlive vom ntSystems techDAY :)\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-san-zertifikate28093server-2008-pki/\"\n},{\n  \"id\": \"post-webdav-iis7-publishing-ober-isa-server-part-2\",\n  \"title\": \"WebDav, IIS7 publishing over ISA Server Part 2\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Wie versprochen hier der 2. Teil meiner WebDav Reihe. In diesem Post geht es darum das WebDav Verzeichnis mit dem ISA Server zu veröffentlichen.Als erstes erstellen wir eine neue Webveröffentlichungsregel:Wir geben an, dass wir eine einzelne Webseite veröffentlichen und wählen bei Sicherheit SSL ausNun müssen wir den Sitenamen inkl. IP Adresse (sofern dieser nicht aufgelöst werden kann) vergebenDanach geben wir den Pfad an, für welchen die Veröffentlichungsregel wirken soll, bzw. auf welchen Ordner der externe Zugriff beschränkt werden soll.Nun tragen wir noch den externen Namen einINFO: Sollte euer Pfad Leerzeichen haben, ist das für den ISA Server kein Problem. Man muss die Leerzeichen nicht durch %20 ersetzen, sondern kann die URL ganz normal eingeben.Als nächstes erstellen wir einen neuen Listener und weisen ihn an, dass eine SSL Verbindung erforderlich istJetzt wählen wir IP Adresse und das entsprechende Zertifikat aus. Sofern dies noch nicht auf dem ISA Server installiert wurde, muss es jetzt nachinstalliert werden.Als Authentifizierung wählen wir die HTTP Authentifizierung – StandardAls Authentifizierungsdelegierung nehmen wir NTLMZum Schluss kann man noch eine Gruppe angeben, auf welche die Veröffentlichungsregel beschränkt ist.&#160;Das Standardverhalten des Client ist es, den veröffentlichen Ordner selbst durch die HTTP Methode OPTIONS abzufragen. Damit die Verbindung nicht fehlschlägt, müssen wir dies zulassen und dürfen es nicht wie durch die bereits erstellte Regel mit den zugelassenen Pfaden blockieren. Wir kopieren die neu erstelle Regel und platzieren sie unter der ersten Regel. Danach werden die die HTTP Methode auf OPTIONS beschränken.Nun geben wir der kopierten Regel einen neuen Namen (Bsp: WebDav – OPTIONS) um sie von der ersten Regel zu unterscheiden. Wir löschen zudem unter dem Reiter Pfade die Ordnerbeschränkung.Als nächstes wird die HTTP Methode auf OPTIONS beschränkt. Wir öffnen die HTTP Richtlinie und tragen die Methode ein:&#160;ACHTUNG: Ordner mit UmlauteWenn ihr Ordner mit Umlaute verwendet, wird die Verbindung beim versuch die Ordner zu öffnen, immer zusammenbrechen. Der Grund hierfür liegt darin, dass das High Bit-Zeichen standardmäßig deaktiviert ist. Dieses High Bit-Zeichen lässt Umlaute in der URL zu. Ich empfehle auf beiden Veröffentlichungen WebDav und WebDav Options das High Bit-Zeichen zu erlauben.     Dies kann ebenfalls in der jeweiligen HTTP Richtlinie vorgenommen werden:Nun kann der Client den Ordner via HTTPS von Extern mappen.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/webdav-iis7-publishing-ober-isa-server-part-2/\"\n},{\n  \"id\": \"post-webdav-iis7-publishing-over-isa-server-part-1\",\n  \"title\": \"WebDav, IIS7 publishing over ISA Server Part 1\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Dies ist der erste aus 2 Teilen zum Thema WebDav. WebDav (Web-based Distributed Authoring and Versioning) ist ein offizieller Standard, Dateien im Internet bereitzustellen.&lt;/p&gt;Der Vorteil von WebDav ist, dass es nicht wie FTP oder SSH spezielle Ports verwendet, sondern &uuml;ber HTTP und HTTPS &uuml;bertragen wird und somit durch jede Firewall kommt, welche Port 80 und 443 ge&ouml;ffnet hat.Im ersten Teil werde ich zeigen wie ein Verzeichnis unter IIS7 erstellt und &uuml;ber WebDav freigegeben wird. Im 2. Teil werde ich beschreiben wie man das Ganze &uuml;ber den ISA Server ver&ouml;ffentlicht.&nbsp;ServerSofern IIS nicht installiert ist, besteht der erste Schritt darin den Webserver zu installierenZus&auml;tzlich zum Webserver muss das Feature WebDav hinzugef&uuml;gt werden.Der n&auml;chste Schritt besteht darin, eine neue Webseite in IIS zu erstellen. Als physikalischen Pfad geben wir das Verzeichnis ein, welches &uuml;ber WebDav freigegeben werden soll.Zus&auml;tzlich binden wir die Webseite auf Port 443 HTTPS und w&auml;hlen das jeweilige Zertifikat aus.Als n&auml;chstes m&uuml;ssen unter Authentifizierung die Anonyme Authentifizierung deaktivieren und Windows- und Standardauthentifizierung aktivieren.Bei den Webseiteneinstellung befindet sich das Feature WebDav-Erstellungsregeln.In den Einstellungen muss zun&auml;chst WebDav aktiviert werden und danach eine neue Erstellungsregel erstellt werden. Die Erstellungsregel definiert die jeweiligen Zugriffsrechte.Die Konfiguration ist nun abgeschlossen. Ich empfehle jedoch um Probleme mit&nbsp;Zielpfade auf &nbsp;entfernten Servern zu vermeiden, zus&auml;tzlich unter den Verbindungseinstellungen der Webseite, einen Benutzer anzugeben, der Zugriffsrechte auf die Webseite hat.&nbsp;ClientUm das WebDav-Verzeichnis zu mappen, muss der Client ein neues Netzlaufwerk verbinden und die Option &ldquo;Verbindung mit einer Webseite herstellen, auf der Sie Dokumente und Bilder speichern k&ouml;nnen&rdquo; ausw&auml;hlen.Als Adresse geben wir https://Servername einJetzt k&ouml;nnen wir auf das Verzeichnis &uuml;ber HTTPS zugreifen.Gr&uuml;&szlig;e dn&lt;/code&gt;\",\n  \"url\": \"https://onprem.wtf/post/webdav-iis7-publishing-over-isa-server-part-1/\"\n},{\n  \"id\": \"post-rbac\",\n  \"title\": \"Exchange 2010–Role Based Access Control\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"In Exchange 2010 wurde ein neues Berechtigungsmodell eingef&uuml;hrt, Role Based Access Control. Es basiert auf sogenannten Rollen anstelle von ACLs, diese Rollen (eigentlich die Role Entries) steuern den Zugriff auf cmdlets. Um dieses neue Modell zu verstehen muss man die Grundbausteine verstehen aus denen es besteht. Vereinfacht gesagt wird festgelegt wer was wo machen darf.&nbsp;Scope (wo)Definiert die Objekte im Active Direcotry auf welchen die Rolle Berechtigungen hat. New-ManagementScope Role/Role Entry (was)Eine Rolle ist eine Sammlung von Role Entries, sie definiert welche cmdlets und welche Parameter ausgef&uuml;hrt werden d&uuml;rfen. New-ManagementRole Add-ManagementRoleEntry, Remove-ManagementRoleEntry RoleGroup (wer)Universelle Sicherheitsgruppe deren Mitglieder die Rechte bekommen die in der Role definiert sind. Verkn&uuml;pft Rolle und Scope. New-RoleGroup &ndash;Roles &ldquo;&rdquo; &ndash;CustomRecipientWriteScope &ldquo;&rdquo; Role AssignmentVerbindet die oben genannten Elemente, legt fest wer was wo machen darf. Das cmlet New-RoleGroup erzeugt den ManagementRoleAssignmenteintrag Get-ManagementRoleAssignment Es gibt in Exchange 2010 65 vordefinierte Rollen die man sich mit Get-ManagementRole anzeigen lassen kann.Will man die Role Entries zu einer Rolle sehen f&uuml;hrt man folgendes cmdlet aus: Get-ManagementRoleEntry Rolle\\\\*Beispiel: Get-ManagementRoleEntry \\\"Move Mailboxes\\\\*\\\"&nbsp;Benutzerdefinierte Rolle erstellenSoll eine Benutzerdefinierte Rolle bzw. ein Scope erstellt werde, dann in dieser Reihenfolge:New-ManagementScope \\\"Gruppe1Scope\\\" -RecipientRestrictionFilter {memberofgroup -eq \\\"CN=Gruppe1,OU=users,DC=domain,DC=local} Diese Rolle darf nur Mitglieder der Gruppe1 bearbeiten. New-ManagementRole \\\"Create Move Request Gruppe1\\\" &ndash;Parent &ldquo;Move Mailboxes&rdquo; Eine neue Rolle wird erstellt New-RoleGroup \\\"Gruppe1 Movers\\\" -roles \\\"Create Move Request Gruppe1\\\" -CustomRecipientWriteScope \\\"Gruppe1Scope\\\" Eine neue Gruppe wird erstellt (Universelle Sicherheitsgruppe im AD), die Rolle sowie der Scope werden dieser Gruppe zugewiesen Add-RoleGroupMember \\\"Gruppe1 Movers\\\" -members \\\"username\\\" Benutzer werden der Gruppe hinzugef&uuml;gt, kann auch im AD gemacht werden So sieht die soeben erstellte Rolle aus:Get-ManagementRoleEntry \\\"Create Move Request Gruppe1\\\\*\\\"&nbsp;Benutzerdefinierte Rolle anpassenMeine soeben erstellte Rolle soll nur Berechtigungen haben einen Move Request zu erstellen. Mitglieder sollen den Move Request nicht l&ouml;schen, anhalten oder weiterf&uuml;hren k&ouml;nnen. Also passe ich die RoleEntries entsprechend an.Nicht gew&uuml;nschte cmdlets entfernen mit remove-ManagementRoleEntry remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Remove-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Suspend-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\Resume-MoveRequest&rdquo; Mit add-ManagmentRoleEntry &ldquo;Create Move Request Gruppe1\\\\RoleEntry&rdquo; kann man weitere Eintr&auml;ge erstellen und die Rolle weiter personalisieren. Nachdem die nicht erw&uuml;nschten cmdlets entfernt wurden sieht das Ganze so aus:Get-ManagementRoleEntry \\\"Create Move Request Gruppe1\\\\*\\\"&nbsp;Wichtig: RBAC Rollen sind nicht gleichzusetzen mit ACLs (Sicherheitsberechtigungen), das hei&szlig;t es wird nicht die restriktivste Rolle angewandt. Benutzer erhalten durch alle Rollen die ihnen zugewiesen sind Zugriff auf ein bestimmtes &ldquo;Set&rdquo; an Funktionen. Mehr Rollen = Mehr Funktionen.Wenn man das Prinzip einmal verstanden hat, wird einem schnell bewusst wie m&auml;chtig dieses neue Berechtigungsmodell ist. Da die Exchange Management Konsole auch nichts anderes macht also PowerShell Befehle abzusetzen kann man so wirklich alles genau an seine Bed&uuml;rfnisse anpassen.tom\",\n  \"url\": \"https://onprem.wtf/post/rbac/\"\n},{\n  \"id\": \"post-shared-mailboxes-und-auto-mapping-e14-sp1\",\n  \"title\": \"Shared Mailboxes und Auto Mapping E14 Sp1\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Shared und Ressourcen Postf&auml;cher gibt es schon l&auml;nger. Mit Exchange 2010 SP1 kommt aber ein neues Feature das den Admins das leben um einiges erleichtert. Wie das Kind hei&szlig;t ist noch nicht zu erfahren, es wird in div. Blogs und Foren &ldquo;Auto Mapping&rdquo; genannt.Um dieses neue Feature zu verwenden muss man nur auf einem Exchange 2010 SP1 Server Berechtigungen auf eine Shared Mailbox setzen, existieren die Berechtigungen bereits m&uuml;ssen sie entfern und nochmal gesetzt werden.&nbsp; Beim setzen der Berechtigungen werden n&auml;mlich die Benutzer, die von der Berechtigung profitieren, in das ActiveDirectory Attribut msExchDelegatedListLink aufgenommen.Outlook sucht beim starten nach Mailboxen mit dem DN des Benutzers und verbindet diese automatisch. Ein weiterer Vorteil ist dass die Mailbox vom Benutzer nicht geschlossen oder entfernt werden kann, so werden die Helpdesk Calls weiter reduziert ;)Das Ganze funktioniert &uuml;brigens auch f&uuml;r Ressourcen (Room/Equipment) Mailboxen.tomspecial thanks to: Steve Goodman\",\n  \"url\": \"https://onprem.wtf/post/shared-mailboxes-und-auto-mapping-e14-sp1/\"\n},{\n  \"id\": \"post-e14-sp1-importexport-update\",\n  \"title\": \"E14 SP1 Import/Export Update\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Vor kurzem habe ich in diesem Post &uuml;ber die Import/Export-Mailbox cmdlets geschrieben.Mit Exchange 2010 SP1 wurde die Import/Export Funktionalit&auml;t ge&auml;ndert und die cmdlets werden durch MailboxImportRequest und MailboxExportRequest ersetzt. Die Vorteile die daraus Resultieren sind folgende:Import/Export von Online ArchivenVerwendet Exchange MAPI Provider, Outlook muss nicht mehr auf dem Server installiert werdencmdlets verwenden UNC Pfade (PST Files m&uuml;ssen nicht mehr auf den Server kopiert werden)Beispiel:New-MailboxImportRequest-Mailbox&nbsp;test -IsArchive&nbsp;-FilePath \\\\\\\\server\\\\test.pstDieser Befehl Importiert den Inhalt der Datei test.pst in das Online Archiv der Mailbox \\\"test\\\".\",\n  \"url\": \"https://onprem.wtf/post/e14-sp1-importexport-update/\"\n},{\n  \"id\": \"post-sharepoint-2010-fehler-in-der-sql-datenbank-beheben\",\n  \"title\": \"Sharepoint 2010, Fehler in der SQL Datenbank beheben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Letztens wollte ich einen Test-Restore meiner Sharepoint Datenbank durchführen. Normalerweise hat das immer problemlos funktioniert, jedoch beim letzten Backup gab es große Probleme mit dem Sharepoint-Inhalt. Der Restore-Vorgang wurde erfolgreich beendet, jedoch war lediglich die halbe Sharepoint Struktur und keine Daten enthalten.Nachdem ich das Eventlog des Quellservers durchforstet habe, bin ich auf folgende Fehler im Anwendungs-Log gestoßen:Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 18053    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Fehler: 7884, Schweregrad: 20, Status: 1. (Parameter: ). Der Fehler wird aufgrund eines Formatierungsfehlers im nicht ausführlichen Modus gedruckt. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden ausgelassen.    Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 7105    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Die Datenbank-ID '6', Seite '(0:0)', Slot '0' für den LOB-Datentypknoten ist nicht vorhanden. Dies ist gewöhnlich auf Transaktionen zurückzuführen, die Daten, für die kein Commit ausgeführt wurde, auf einer Datenseite lesen können. Führen Sie DBCC CHECKTABLE aus.    Um den Fehler zu analysieren muss man zunächst das SQL Server 2008 Management Studio Express installieren. Über das Management Studio erhält man Zugriff auf dem SQL Server und kann mit dem Troubleshooting beginnen.    Zunächst meldet man sich am SQL Server an. Als Servername verwenden wir SERVER\\\\SharepointNun ist die Verbindung zum Server hergestellt. Jetzt muss die Datenbank mit der ID ‘6’ (wie in der Fehlermeldung 2) gefunden werden. Als erstes öffnen wir ein Abfragefenster und gehen jede Datenbank mit use NAME-DER-DATENBANK     select db_id()durch, bis uns die entsprechende ID im Fenster “Meldungen” ausgegeben wird. In meinen Fall war das die Datenbank WSS_CONTENT.Nun führen wir den Befehl DBCC CHECKDB (WSS_CONTENT) WITH NO_INFOMSGS, ALL_ERRORMSGS aus und bekommen eine Liste mit den entsprechenden FehlernIn meinem Fall:Meldung 8965, Ebene 16, Status 1, Zeile 1     Tabellenfehler: Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594043760640 (LOB data-Typ). Auf den Datenknoten außerhalb von Zeilen auf Seite (0:0), Slot 0, Text-ID 1759772672 wird von Seite (1:4986), Slot 6 verwiesen, er wurde jedoch im Scan nicht betrachtet.     Meldung 8929, Ebene 16, Status 1, Zeile 1     Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594123255808 (In-row data-Typ): Es wurden Fehler in Daten außerhalb von Zeilen gefunden mit der ID 1759772672, im Besitz von data, Datensatz identifiziert durch RID = (1:4986:6).     Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'AllDocs'-Tabelle (Objekt-ID 69575286) gefunden.    Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'WSS_Content'-Datenbank gefunden.    repair_allow_data_loss ist die minimale Reparaturstufe für die Fehler, die mit DBCC CHECKDB (WSS_Content) gefunden wurden.&#160;Die Meldungen weisen darauf hin, dass eine Inkonsistenz in der Datenbank vorliegt. Höchstwahrscheinlich handelt es sich dabei um eine Datei, die auf dem Sharepoint Server upgeloaded wurde. Um die Inkonsistenz zu beheben muss DBCC CHECKDB mit dem Parameter repair_allow_data_loss ausgeführt werden. Dafür müssen zunächst alle Sharepoint Dienste und der IIS Dienst beendet werden.   Danach müssen die folgenden Kommandos ausgeführt werden:Mit dem Befehl ALTER DATABASE WSS_Content SET SINGLE_USER, wird die Datenbank in den Sinlge_Mode gesetzt, der Befehl DBCC CHECKDB (WSS_Content, REPAIR_ALLOW_DATA_LOSS) startet die Reparatur.Nachdem die Reparatur abgeschlossen wurde und DBCC CHECKDB keine Fehler mehr protokolliert, kann der Modus wieder zu MULTI_USER geändert werden.Jetzt können alle Dienste wieder gestartet werden. Die Datenbank sollte jetzt konsistent sein und die Sicherung vollständig durchlaufen.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-2010-fehler-in-der-sql-datenbank-beheben/\"\n},{\n  \"id\": \"post-appv-46e28093sccm-2007r2-streaming-applications\",\n  \"title\": \"AppV 4.6–SCCM 2007R2 Streaming Applications\",\n  \"author\": \"tto\",\n  \"tags\": [\"AppV\",\"Server\"],\n  \"content\": \"Seit System Center Configuration Manager 2007 R2 kann man Virtuelle Applikationen verteilen. Daf&uuml;r m&uuml;ssen ein paar Einstellungen im SCCM gemacht werden, der SCCM Advanced Client sowie der AppV Client m&uuml;ssen auf den Clients installiert werden.Einstellungen SCCM 2007R2Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Client Agents, Advertised Programs Client Agent&rdquo; &ouml;ffnen unter General muss &ldquo;Allow virtual application package advertisemet&rdquo; muss werden  Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Site Systems, Servername, ConfigMgr distribution point&rdquo; &ouml;ffnen unter General muss &ldquo;Allow Clients to transfer content from this distribution Point using BITS, HTTP, and HTTPS&rdquo; aktiviert werden unter Virtual Application muss &ldquo;Enable virtual application streaming&rdquo; aktiviert werden &nbsp; AppV Client deploymentUnter &ldquo;%ProgramFiles%\\\\Microsoft Configuration Manager\\\\Tools\\\\VirtualApp&rdquo; die Datei &ldquo;AppVirtMgmtClient.sms&rdquo; anpassen. Version=4.6 (wenn AppV Client 4.6 verwendet wird) Commandline=setup.exe /s /v\\\"/quiet /norestart /qn\\\"0\\\\\\\"\\\\\\\" (Application Virtualization Client Installer Command-Line Parameters) Ein neues Paket aus einer Definition erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Package From Definition&rdquo; w&auml;hlen. Mit &ldquo;Browse&rdquo; die Datei AppVirtMgmtClient.sms ausw&auml;hlen  Im n&auml;chten Fenster &ldquo;Always obtain files from a source directory&rdquo; w&auml;hlen  Als Pfad wird ein Netzwerkfreigabe gew&auml;hlt auf welcher der AppV Client entpackt wurde, folgende Dateien und Ordner sollten vorhanden sein: setup.exe setup.msi Support\\\\Watson\\\\dw20shared.msi Auf Finish klicken und das Paket wurde erstellt Jetzt muss noch ein Advertisement f&uuml;r das Paket erstellt werden.Rechtsklick auf &ldquo;Site Database, Computer Management, Software Distribution, Advertisements&rdquo; und New Advertisement w&auml;hlen. Einen Namen eingeben, das Paket ausw&auml;hlen welches im vorigen Schritt erstellt wurde und eine Collection ausw&auml;hlen welche den Client erhalten soll.  Mandatory Assignment hinzuf&uuml;gen  Art der Verteilung w&auml;hlen, in dem Fall &ldquo;Download from distribution point and run locally&rdquo;  An dieser Stelle kann auf Finish geklickt werden, f&uuml;r die &uuml;brigen Einstellungen akzeptiere ich die Standards. Jetzt wurde das Paket und die Zuweisung erstellt, die Clients die in der Collection sind erhalten die Software.Virtuelle Applikation importierenNachdem die Virtuelle Applikation im Sequencer erstellt wurde (wie z.B. hier erkl&auml;rt) muss sie im System Center Configuration Manager importiert werden.Ein neues virtuelles Paket erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Virtual Application Package&rdquo; w&auml;hlen. Im ersten Fenster muss die XML Datei des Pakets angegeben werden.  Das Fenster &ldquo;General&rdquo; ist eigentlich selbsterkl&auml;rend, Name, Hersteller usw. k&ouml;nnen eingegeben werden. Im Fenster &ldquo;Data Source&rdquo; wird eine Netzwerkfreigabe angegeben auf der das Paket erstellt wird, von dieser Freigabe wird das Paket dann auf die Distribution Points verteilt (Achtung: der Angegebene Order muss existieren und vorhandene Daten werden &uuml;berschrieben!)  Jetzt kann wieder auf Finish geklickt werden, die Standards der restlichen Einstellungen sind ok. Das Virtuelle Paket wurde nun also auch erstellt. Jetzt fehlt noch ein Advertisement f&uuml;r dieses.Das Advertisement wird genau gleich erstellt wie jenes f&uuml;r den AppV Client, der einzige unterschied liegt in der Auswahl der Verteilungsmethode hier w&auml;hlt man &ldquo;Stream virtual applications from distribution point&rdquo; &nbsp; Nach kurzer Zeit werden die Clients auch dieses Advertisement erhalten. Sind Desktopverkn&uuml;pfungen oder Dateizuordnungen konfiguriert werden diese auf dem Client bereits angewandt. Das hei&szlig;t ein .pdf File bekommt in diesem Beispiel bereits den virtuellen Adobe Reader zugewiesen. Beim ersten Starten des Programmes wird der Inhalt des Paketes heruntergeladen, d.h. der erste Start dauert ein bisschen, alle weiteren Starts verlaufen wesentlich schneller, dabei wird nur auf Updates &uuml;berpr&uuml;ft, alle anderen Files sind bereits lokal vorhanden.tom\",\n  \"url\": \"https://onprem.wtf/post/appv-46e28093sccm-2007r2-streaming-applications/\"\n},{\n  \"id\": \"post-sharepoint-web-apps-lassen-sich-nicht-installieren\",\n  \"title\": \"Sharepoint Web Apps lassen sich nicht installieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wenn man die Sharepoint Webseite nicht über den default Port 80 betreibt, bricht die Installation der Sharepoint Webservices bei der Erstellung der Beispieldaten ab. &#160;Um das Problem zu umgehen empfiehlt es sich die Sharepoint Webseite während der Installation auf Port 80 zu binden. Dazu sind folgende 2 Schritte notwendig:   In der Sharepoint Zentraladministration muss der alternative Zugriff auf Port 80 gebunden werden    Im IIS Manger muss ebenfalls die Bindung neu festgelegt werden Danach läuft die Installation vollständig durch und die Webseite kann wieder auf den ursprünglichen Port gebunden werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-web-apps-lassen-sich-nicht-installieren/\"\n},{\n  \"id\": \"post-appv-46e28093sccm-2007r2e28093streaming-issue\",\n  \"title\": \"AppV 4.6–SCCM 2007R2–Streaming Issue\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\",\"AppV\"],\n  \"content\": \"Hi, tom here again. Talking about AppV and System Center Configuration Manager 2007R2 today.I was stumbling upon this error while I was trying to stream virtual Applications with SCCM. If I set the advertisement to &ldquo;Stream virtual applications from distribution point&rdquo; the following error occurred, though if I set the advertisement to &ldquo;Download content from distribution point and run locally&rdquo; everything worked without any problem.The problem was caused by the malware inspection feature of my ForeFront TMG Web Proxy Server.If you see &ldquo;an unexpected error&rdquo; with the Error Code like: 0A-400000C8 try to disable the Proxy on the Clients for further research.If you are using Forefront TMG be sure to add the SCCM (streaming enabled) Distribution Point to the Malware Destination Exceptions.You wont see this error with Application Virtualization Management Server when using RTSP or RTSPS as streaming protocol. You wont see it even with SCCM&nbsp;if &ldquo;Download content from distribution point and run locally&rdquo; is selected because this uses BITS to transfer the whole package to the client and run it locally. Since SCCM uses HTTP/HTTPS for streaming the connection will go to the proxy server and will be killed by Malware Inspection.tomps. special thanks go to J.C. Hornbeck (http://blogs.technet.com/b/appvcallback/)\",\n  \"url\": \"https://onprem.wtf/post/appv-46e28093sccm-2007r2e28093streaming-issue/\"\n},{\n  \"id\": \"post-sharepoint-foundation-serach-14\",\n  \"title\": \"Sharepoint Foundation Serach, 14\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wenn ihr auf folgende Fehlermeldung auf eurem Sharepoint 2010 Server stoßt:&#160;Protokollname: Application     Quelle: Microsoft-SharePoint Products-SharePoint Foundation Search      Datum: 09.08.2010 16:51:10      Ereignis-ID: 14      Aufgabenkategorie:Gatherer      Ebene: Warnung      Schlüsselwörter:      Benutzer: LOKALER DIENST      Computer: Miami.domain.local      Beschreibung:      Die Startadresse 'sts4://jobportal:8015/contentdbid={4cee0e9c-fee5-498f-86b7-9855d89539ff}' kann nicht durchforstet werden.Kontext: Anwendung 'Suchabfragen_über_Hilfethemen_bedienen', Katalog 'Search'Details:Zugriff verweigert. Vergewissern Sie sich, dass das Standardkonto für den Inhaltszugriff Zugriff auf dieses Repository hat, oder fügen Sie eine Durchforstungsregel zum Durchforsten dieses Repositorys hinzu. Wenn es sich bei dem zu durchforstenden Repository um ein SharePoint-Repository handelt, vergewissern Sie sich, dass das verwendete Konto über die Berechtigung &quot;Alles lesen&quot; für die durchforstete SharePoint-Webanwendung verfügt. (0x80041205)   bedeutet das, dass ihr eine Webanwendung unter einer URL betreibt, die nicht dem Computername des Server entspricht. Dafür verantwortlich ist das sog. Loopback check security feature, welches ab Windows Server 2003 SP1 implementiert ist. Es lehnt die Authentifizierung ab, wenn die URL nicht mit dem Computernamen übereinstimmt und verhindert somit, dass die Sharepoint Suche die Webseite indiziert.Hier ein Workaround um das Problem zu beheben:In der Registry des Sharepoint Servers muss unter HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Control\\\\Lsader Schlüssel (DWORD) “DisableLoopbackCheck” mit Wert 1 erstellt werden. Nach einem Neustart ist das Security Feature deaktiviert und es werden keine Warnungen mehr ins EventLog geschrieben.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-serach-14/\"\n},{\n  \"id\": \"post-exchange-2010e28093database-restore\",\n  \"title\": \"Exchange 2010–Database Restore\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber mehr in einem anderen Beitrag.Die Datenbank wird also von der Sicherung zurückgeholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Widerherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die *.edb Datei der Datenbank und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Wurden die Files zurückgeholt, kann man die Recovery Database erstellen. Dazu brauchen wir mal wieder die dunkle Seite der Macht, also öffne ich die Exchange Management Shell. Dort wird mit dem cmdlet new-MailboxDatabase eine Recovery Database aus der widerhergestellten *.edb Datei erstellt.Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server mbx01, X:\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner Widerhergestellt wurden.   New-MailboxDatabase –Recovery Rdb01 –Server mbx01 –EdbFilePath x:\\\\restore\\\\db.edb –LogFolderPath x:\\\\restore  Die Datenbank wurde erstellt, jedoch wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.Um die Recovery Datenbank in einen “Clean Shutdown State” zu bringen wird das Tool eseutil.exe verwendet. Dafür öffnet man eine Eingabeaufforderung (oder EMS) und lässt eseutil –p auf die edb Datei los. Der Parameter –p steht hier für Repair. In meinem Beispiel lautet der Befehl:    eseutil.exe –p x:\\\\restore\\\\db.edb  Nachdem Eseutil durchgelaufen ist, die Datenbank sich also im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick oder in der Shell mit Mount-Database RDB01.Die Datenbank wurde erfolgreich gemounted und ich habe jetzt Zugriff auf die Daten.Mit dem cmdlet Export-Mailbox können jetzt einzelne Mails oder ganze Mailboxen widerhergestellt werden, mehr zum cmdlet Export-Mailbox gibt es hier.&#160;tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010e28093database-restore/\"\n},{\n  \"id\": \"post-importexport-mailbox\",\n  \"title\": \"Import/Export Mailbox\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Mit den cmdlets import-Mailbox und export-Mailbox kann Inhalt von einer Mailbox exportiert oder in eine Mailbox importiert werden. Soviel sagt eigentlich der Name auch ;)Diese cmdlets sind standardm&auml;&szlig;ig aber nicht verf&uuml;gbar, bzw. hat ein &bdquo;normaler&ldquo; Exchange Organization Administrator keine Berechtigungen sie zu verwenden. Bevor diese Berechtigungen gesetzt werden sollte man RBAC (Role Based Access Control) verstehen.Man erstellt eine neue Universelle Gruppe im Active Directory, ich gebe ihr einen beschreibenden Namen &bdquo;Enterprise Import Export Users&ldquo;. Jetzt wei&szlig;e ich dieser Gruppe die Management Rolle &bdquo;Mailbox Import Export&ldquo; zu, dazu verwende ich folgendes cmdlet in der Exchange Management Shell:New-ManagementRoleAssignment -Name \\\"Import Export Role\\\" -SecurityGroup \\\"Enterprise Import Export Users\\\" -Role \\\"Mailbox Import Export\\\"Mitglieder dieser Gruppe haben jetzt die notwendigen Berechtigungen um die Import/Export cmdlets zu verwenden, die Exchange Management Shell bzw. Management Konsole m&uuml;ssen neu gestartet werden.Import-MailboxWird verwendet um PST Daten in Mailboxen zu importieren. Wenn die PST Dateien im Format &lt;Exchange Alias&gt;.pst vorhanden sind kann man auch mehrere Imports gleichzeitig machen.Mit diesem Befehlt werden alle Elemente aus c:\\\\pst\\\\test.pst in die Mailbox &ldquo;test&rdquo; importiert.Import-Mailbox &ndash;identity test &ndash;PstFolderPath c:\\\\pst\\\\test.pstMit diesem Befehl werden alle Dateien im Ordner c:\\\\pst in die entsprechenden Mailboxen importiert, wichtig ist dabei der Name der PST Files.Dir c:\\\\pst |Import-MailboxExport-MailboxWird verwendet um Objekte von Mailboxen zu exportieren, als Ziel kann eine andere Mailbox oder eine PST Datei anagegeben werden. H&auml;ufig wird dieses cmdlet verwendet um Objekte aus einer Recovery Datenbank wieder in der urspr&uuml;nglichen Mailbox herzustellen.Mit diesem Befehl werden alle Elemente aus der Mailbox &ldquo;test&rdquo; in den Ordner &ldquo;testdata&rdquo; der Mailbox &ldquo;export&rdquo; kopiert.Export-Mailbox -Identity test -TargetMailbox export -TargetFolder testdataMit diesem Befehl werden alle Element aus der Mailbox \\\"test\\\" in die PST Datei auf C:\\\\pst exportiert. Achtung: F&uuml;r diesen Befehl wird Outlook (x64)&nbsp;auf dem Exchange Server ben&ouml;tigt der den Export durchf&uuml;hren soll. Nach Best Practice sollte das ein separater Server sein der sonst keine Mailboxen h&auml;lt.Export-Mailbox -Identity test -PstFolderPath c:\\\\pst\\\\test.pstGenauere Informationen gibts im Technet: Export-Mailbox, Import-Mailboxtom\",\n  \"url\": \"https://onprem.wtf/post/importexport-mailbox/\"\n},{\n  \"id\": \"post-appve28093adobe-reader-sequencing-receipe\",\n  \"title\": \"AppV–Adobe Reader Sequencing Receipe\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Anhand des Adobe Readers möchte ich hier zeigen wie man eine virtuelle Applikation erstellt.Wie der&#160; Sequencer vorbereitet wird habe ich hier beschrieben.&#160;Der Sequencer wird gestartet und die AppV Sequencer Console wird geöffnet. Man wählt “Paket erstellen” um ein neues Paket zu erstellen.Im nächsten Dialog wird der Name und eventuell eine Beschreibung vergeben.Nachdem man auf “Weiter” geklickt hat kann man mit dem Sequencing beginnen. Durch klicken auf “Überwachung starten” wird man aufgefordert einen Ordner auszuwählen den der Sequencer überwachen soll.Es wird ein Ordner auf dem Q-Drive erstellt, dieser sollte einen Namen im 8.3 Format haben, also maximal acht Zeichen vor dem Punkt und maximal drei danach.Jetzt wird das Setup von Adobe Reader gestartet (nicht der Web Installer, sondern das offline Installationspaket). Wichtig ist dabei das man den eben erstellten Ordner auf dem Q-Drive als Zielordner angibt.Wenn die Installation erfolgreich abgeschlossen ist kann man die Überwachung beenden.Im nächsten Schritt werden Dateizuordnungen und Verknüpfungen konfiguriert, man kann z.B. wählen ob eine Verknüpfung auf dem Desktop der Clients erstellt werden soll oder nicht.Jetzt kann die Applikation personalisiert werden, durch klicken auf “Starten” wird Adobe Reader gestartet und man kann die EULA akzeptieren, dann muss das nicht der Benutzer machen. Außerdem empfiehlt es sich die Automatischen Updates des Readers zu deaktivieren. Wenn man alle Einstellungen gemacht hat wird die Applikation wieder beendet.Noch einmal auf “Weiter” klicken und das Paket ist vorerst fertig.In den folgenden Fenstern können noch diverse Einstellungen getroffen werden, wichtig ist im Reiter “Bereitstellung” das richtige Protokoll zu wählen, für Testumgebungen wird das RTSP sein. Außerdem kann man hier die unterstützten Betriebssysteme und die “Ausgabeoptionen” wählen. Wird das Paket per Streaming verteilt sollte man die Komprimierung aktivieren. Wenn man die Applikation an “Standalone” Clients verteilt dann muss man auch ein MSI File generieren.Eine weitere wichtigie Einstellung ist der Hostname des Servers, standardmäßig wird die Variable %SFT_SOFTGRIDSERVER% verwendet, diese muss auf den Clients als Umgebungsvariable mit dem Hostnamen des Servers konfiguriert werden.Man kann noch mehr personalisieren und sogar die virtuelle Registry bearbeiten, allerdings ist das für Adobe Reader nicht notwendig. Also kann das Paket gespeichert werden.Wurde das Paket gespeichert erhält man folgende Dateien. Diese können mit einem Application Virtualization Management Server, mit System Center Configuration Manager oder direkt per MSI an die Clients verteilt werden.Um die Applikation mit dem AppV Management Server zu verteilen wird in der Management Console mit rechts auf Applications gecklickt, dort kann man die *.sprj Datei auswählen und so die virtuelle Applikation erstellen. Die Dateien die mit dem Sequencer erstellt wurden müssen dazu in den “Content” Ordner des AppV Management Servers kopiert werden. &#160;tom\",\n  \"url\": \"https://onprem.wtf/post/appve28093adobe-reader-sequencing-receipe/\"\n},{\n  \"id\": \"post-appve28093sequencer\",\n  \"title\": \"AppV–Sequencer\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Der Microsoft Application Virtualization Sequencer ist ein Client oder Server der verwendet wird um virtuelle Applikationen zu erstellen.Der Sequencer ist im Idealfall eine virtuelle Maschine, vor jedem „Sequencing“ sollte der Ausgangszustand des Sequencers der Selbe sein.Man erstellt also eine neue virtuelle Maschine und installiert ein Betriebssystem seiner Wahl. Es müssen zwei Partitionen vorhanden sein, eine für das System und eine für das sogenannte Q-Drive.Zu diesem Zeitpunkt sollte man so wenig Software wie möglich installieren, alles was auf dem Sequencer installiert wird muss auch auf den Clients installiert werden damit die virtuellen Applikationen laufen.Es wird also der AppV Sequencer installiert und die zweite Partition mit NTFS Formatiert, dieser Partition weist man den Laufwerksbuchstaben Q: zu. Der Client soll in der Domain hängen und folgende Dienste sollten gestoppt und deaktiviert werden:· Windows Update· Windows SearchJetzt wird die virtuelle Maschine heruntergefahren und das Feature UnDo Disk (VMWare: Nonpersistent Disk) wird aktiviert. Ab jetzt ist die Maschine bei jedem Start auf dem gleichen Stand und bereit ein Paket zu erstellen.Wie ein Paket erstellt wird erkläre ich in diesem Post.tom\",\n  \"url\": \"https://onprem.wtf/post/appve28093sequencer/\"\n},{\n  \"id\": \"post-keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)\",\n  \"title\": \"Keine Mailzustellung auf Öffentliche Ordner nach Exchange 2010 Upgrade (von Exchange 2k3)\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Nachdem der letzte Exchange 2003 Server aus der Struktur entfernt wird, bleiben dennoch die Administrative Gruppe und verschiedene Ordner-Strukturen in der AD Konfiguration zurück.Dies kann unter Umständen den Mailfluss zu den Öffentlichen Ordnern stören. Man erhält dann folgende&#160; Unzustellbarkeitsberichte vom Exchange Server: Um das Problem zu beheben muss zunächst der ADSI Editor geöffnet werden. In der Unterstruktur&#160;Configuration / CN=Configuration,DC=YOURDOMAIN / CN= Services / CN= YOUR ORGANISATION / CN= Administrative Groups / CN= First administrative Group /&#160;der Ordner CN=Servers gelöscht werden (sofern dieser auch leer ist)&#160;Nun werden Mails den Öffentlichen Ordnern wieder zugestelltGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)/\"\n},{\n  \"id\": \"post-appv-46e28093fehler-beim-starten\",\n  \"title\": \"AppV 4.6–Fehler beim Starten\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Heute mal ein neues Thema auf ntSystems, Applikations Virtualisierung. Viele Hersteller setzen auf diese Technologie, unter anderem Microsoft mit SoftGrid bzw. AppV.Erscheint beim Starten der Applikation der Fehler: &ldquo;Auf die Angegebene Instanz von Application Virtualization Server konnte nicht zugegriffen werden&rdquo; mit einem Fehlercode wie &ldquo;xxxxxxx-xxxxxx0A-10000002&rdquo; dann wurde die Umgebungsvariable SFT_SOFTGRIDSERVER am AppV Client nicht gesetzt.Beim Erstellen der virtuellen Applikation (sequencing) wird standardm&auml;&szlig;ig diese Variable verwendet, der Client kann damit allerdings nicht viel anfangen. Also einfach auf den AppV Clients die Variable setzen und als Wert den FQDN des AppV Management Servers eintragen.Tipp: Daf&uuml;r bieten sich nat&uuml;rlich Group Policy Preferences an.Erscheint der Fehler: &ldquo;Die angegeben Anwendung ist nicht vorhanden&rdquo; mit einem Fehlercode wie dem &ldquo;xxxxxxx-xxxxxxxx-00000A09&rdquo; deutet das auf einen falschen Namen hin. Der Fehler kann auch auftreten w&auml;hrend ein Programm l&auml;uft, z.B. wenn es sich bei der Anwendung um einen Proxy des Office Deplyment Kit for AppV handelt. Beim Ausf&uuml;hren von \\\"msiexec /i offvirt.msi\\\" muss auf die richtigen Namen geachtet werden. Mehr dazu in einem separaten Post.&nbsp;Ein weiterer Fehler ist folgender:Am AppV Sequenzer wird standardm&auml;&szlig;ig das RTSPS (322) Protokoll verwendet, das muss allerdings erstmal konfiguriert werden (Zertifikat usw.). Zum Testen eignet sich auch RTSP das Port 554 verwendet. Das kann direkt beim Erstellen des Paketes ausgew&auml;hlt werden, alternativ kann man auch die .osd Datei bearbeiten und den Link anpassen.Anstelle von \\\"RTSPS://%SFT_SOFTGRIDSERVER%:322/DefaultApp.sft\\\" wird also \\\"RTSP://%SFT_SOFTGRIDSERVER%:554/DefaultApp.sft\\\" gesetzt.&nbsp;Soviel zum Thema Applikations Virtualisierung. Ich arbeite an weiteren Posts die den Vorgang des Sequencen und Verteilen von Applikationen beschreiben.stay tuned, tom\",\n  \"url\": \"https://onprem.wtf/post/appv-46e28093fehler-beim-starten/\"\n},{\n  \"id\": \"post-exchange-2010-w3wpexe-belegt-sehr-viel-ram\",\n  \"title\": \"Exchange 2010, w3wp.exe belegt sehr viel RAM\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Heute musste ich auf meinen Exchange Server 2010 feststellen, dass eine Instanz vom w3wp.exe Dienst läuft, die über 1 GB an RAM beansprucht.Um die RAM-Auslastung zu verringern müssen die Recycling Einstellungen für den entsprechenden Applikation Pool im IIS konfiguriert werden.Als erstes öffnet man den IIS Manager und wechselt zu den “Application Pools”&#160;    Um den verantwortlichen Application Pool zu finden kann jeder einzelne Pool durch Rechtsklick / Recycling zum Aufräumen gezwungen werden. Ist der verantwortliche Pool gefunden kann man die Recycling Vorgänge in den Eigenschaften automatisieren. Bsp: Alle 12 Stunden den Recycling-Vorgang starten.&#160; &#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-w3wpexe-belegt-sehr-viel-ram/\"\n},{\n  \"id\": \"post-exchange-2010e28093gal-fotos\",\n  \"title\": \"Exchange 2010–GAL Fotos\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Exchange\",\"Server\"],\n  \"content\": \"Schon in fr&uuml;heren Exchange Versionen wurden Drittherstellertools eingesetzt um ein Foto in der Globalen Adressliste zu ver&ouml;ffentlichen und in diversen Clients anzuzeigen.Exchange 2010 und Outlook 2010 k&ouml;nnen das mit Bordmitteln, das Bild wird dabei in der Active Directory gespeichert.&nbsp;&nbsp; Foto in Active Directory ladenDas Foto wird &uuml;ber die Exchange Management Shell importiert und zwar mit folgendem cmdlet.Import-RecipientDataProperty -Identity user.name -Picture -FileData ([Byte[]]$(Get-Content -Path \\\"C:\\\\path\\\\to\\\\picture.jpg\\\" -Encoding Byte -ReadCount 0))Dieses cmdlet enkodiert das Bild und speichert die Daten im Active Directory Attribute &ldquo;thumbnailPhoto&rdquo;. Wenn man sich dieses Attribut jetzt ansieht (AC Users and Computers, ADSI Edit) dann sieht man die &ldquo;Rohdaten&rdquo;.Achtung: Das Attribut &ldquo;thumbnailPhoto&rdquo; kann eine maximale Gr&ouml;&szlig;e von 10k haben, das Bild sollte 96x96 Pixel messen um in Outlook optimal dargestellt zu werden.Durch die Gr&ouml;&szlig;enbeschr&auml;nkung von 10k wird ein &ldquo;&uuml;berf&uuml;llen&rdquo; der Active Direcotry verhindert, man sollte allerdings die Zunahme des Replikationstraffic bedenken wenn man GAL Fotos einf&uuml;hrt, diese Zunahme ist tempor&auml;r schlie&szlig;lich &auml;ndert man das Foto nicht t&auml;glich.Damit ist das Foto zwar im Active Directory hinterlegt, allerdings ist in Outlook noch nichts davon zu sehen.Schema &Auml;nderungDaf&uuml;r muss man eine kleine Schema&auml;nderung durchf&uuml;hren, und zwar muss das Attribut &ldquo;thumbnailPhoto&rdquo; an den Globalen Catalog Server repliziert werden.Daf&uuml;r &ouml;ffnet man das Active Directory Schema Snap-In in einer MMC und navigiert zum Attribut, in den Eigenschaften wird die Checkbox bei &ldquo;Replicate this Attribute to the Global Catalog&rdquo; gesetzt.Die schmmgmt.dll muss Registriert werden damit das Schema Snap-In zur Verf&uuml;gung steht In einer Administrativen CMD: &ldquo;regsvr32 schmmgmt.dll&rdquo; MMC &ouml;ffnen (Start, Ausf&uuml;hren, mmc) File, Add/Remove Snap-in&hellip;, Active Directory Schema Unter &ldquo;Attributes&rdquo; rechtsklick auf &ldquo;thumbnailPhoto&rdquo; und die oben genannte Checkbox setzenOffline Address Book aktualisierenJetzt muss nur noch das Offline Adressbuch aktualisiert werden um das Ergebnis gleich zu sehen, alternativ kann man auch warten bis das automatisch geschieht (default: 5 Uhr). Das OAB kann einfach &uuml;ber folgendes cmdlet aktualisiert werden:&nbsp;Get-OfflineAddressBook | Update-OfflineAddressBookOutlook l&auml;dt aktualisiert das Offlineadressbuch nur einmal in 24h also muss auch dort noch ein Download durchgef&uuml;hrt werden, dann ist das Foto schlie&szlig;lich sichtbar.Hinweis: Das Offline Adressbuch wird durch die Fotos nicht gr&ouml;&szlig;er, es wird nur ein Pointer auf das Foto im OAB gespeichert, nicht das Foto selbst. Das hei&szlig;t allerdings auch dass ein Offline Client das Foto nicht sieht.tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010e28093gal-fotos/\"\n},{\n  \"id\": \"post-sharepoint-foundation-2010\",\n  \"title\": \"Sharepoint Foundation 2010, Fehler Web.config, requestFiltering\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Wer im Eventlog des Sharepoint-Foundation-Servers auf folgende Fehlermeldung st&ouml;&szlig;t:TEXT:Protokollname: Application Quelle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft-SharePoint Products-SharePoint Foundation Datum:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20.07.2010 00:00:01 Ereignis-ID:&nbsp;&nbsp; 2137 Aufgabenkategorie:Integrit&auml;t Ebene:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fehler Schl&uuml;sselw&ouml;rter: Benutzer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NETZWERKDIENST Computer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miami.**** Beschreibung: SharePoint-Integrit&auml;tsanalyse: Fehler. Die Datei 'Web.config' weist falsche Einstellungen f&uuml;r das Element 'requestFiltering' auf. F&uuml;r das requestFiltering-Element in der Datei 'web.config' muss das Attribut 'allowDoubleEncoding ' auf 'true' festgelegt sein, damit Dateinamen, die das Zeichen + enthalten, unterst&uuml;tzt werden. Au&szlig;erdem muss es &uuml;ber ein untergeordnetes Element 'requestLimits' verf&uuml;gen, dessen Attribute 'maxAllowedContentLength' auf '2147483647' festgelegt ist, um Konflikte mit Dateiuploads zu vermeiden. Stellen Sie sicher, dass das Element 'requestFiltering' in der Datei 'web.config' vorhanden ist, dass das Attribut 'allowDoubleEncoding' auf 'true' festgelegt ist, dass ein untergeordnetes Element 'requestLimits' vorhanden ist und dass der Wert 'maxAllowedContentLength' auf '2147483647' festgelegt ist. Weitere Informationen zu dieser Regel finden Sie unter http://go.microsoft.com/fwlink/?LinkID=163442.dem wird dieser Fix helfen:IIS Manager &ouml;ffnen Zur Sharepoint webseite wechseln Den Konfigurationseditor &ouml;ffnen Abschnitt &ldquo;requestFiltering&rdquo; w&auml;hlen Zu &ldquo;requestLimits&rdquo; wechseln und den Wert maxAllowedContentLenght in 2147483647 &auml;ndern, danach Konfiguration &uuml;bernehmen Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-2010/\"\n},{\n  \"id\": \"post-upgrade-exchange-2k3-2010\",\n  \"title\": \"Upgrade Exchange 2k3 - 2010\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"&#160;In diesem Post werde ich das Upgrade von Exchange 2k3 zu 2010 beschreiben und einige bekannte Fehler und deren Lösung aufzeigen.&#160;Upgrade&#160;Um einen groben Überblick zu bekommen ob die Infrastruktur Exchange 2010 tauglich ist, empfehle ich den “Microsoft Exchange Pre-Deployment Ananlyzer” auszuführen. Dieses Tool führt einige Checks an der Struktur aus.&#160;   Exchange Organisation in native mode setzen &#160;Sofern das nicht schon passiert ist, muss die Organisation im nativen Modus geschalten werden.&#160; &#160;   Active Directory Schema upgrade &#160;Jetzt muss das Schema geupdatet werden. Dazu startet man vom Schema Master folgende Setup Kommandos von der Exchange CD aus:&#160;Setup /PrepareLegacyExchangePermissionsSetup /PrepareSchemaSetup /PrepareAD [/OrganizationName:YOUR_DOMAIN]Setup /PrepareDomain&#160;   Link state suppression deaktivieren &#160;In Exchange Server 2003 wurde für einen Server, der keine Connectoren besitzt ein anderer Pfad für den Versand gesucht. Diese Option wird ab Exchange 2007 nicht mehr unterstützt. Um die Koexistenz zu gewährleisten muss dieses Feature auf allen Exchange 2003 Server deaktiviert werden&#160;   Open Registry Editor.    Locate HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Services\\\\RESvc\\\\Parameters.    Right-click Parameters and select New | DWORD value. Name the new DWORD value SuppressStateChanges.    Double-click SuppressStateChanges.    In the Value data field, enter 1.    Close Registry Editor, and then restart the SMTP service, the Microsoft Exchange Routing Engine service, and the Microsoft Exchange MTA Stacks services for the change to take effect. &#160;   Exchange 2010 System Requirements &#160;Mit folgendem Kommando werden die nötigen Requirements auf dem Exchange Server installiert&#160;Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy –Restart&#160;Zudem beim Dienst NetTCPPortSharing den Starttyp auf Automatisch setzen:&#160;Set-Service NetTcpPortSharing -StartupType Automatic&#160;&#160;Installation Client Access Rolle&#160;Als erstes wird die Rolle “Client Access” installiert&#160; &#160; &#160;Wenn der Server z.B. über OWA erreicht werden soll muss noch die externe Adresse angegeben werden (Bsp: mail.contoso.com)&#160; &#160;Zertifikate installieren&#160;Der nächste Schritt besteht darin die Zertifikate einzufügen und zu registrieren. Über den Exchange Zertifikatwizzard kann ein neues Exchange Zertifikat erstellt werden:&#160; &#160;Jetzt müssen noch alle erforderlichen Optionen angegeben werden bevor die Anforderung erstellt werden kann:&#160; &#160;Die Anforderung kann jetzt gespeichert werden. Diese muss dann über die Zertifizierungsstelle eingereicht werden und man erhält sein Zertifikat. Nachdem das Zertifikat ausgestellt wurde kann es über die Console der Anfrage hinzugefügt werden. Jetzt muss man dem Zertifikat noch die entsprechenden Dienste zuweisen:&#160; &#160;Installation Hub Transport Rolle&#160;Jetzt wird die Rolle “Hub Transport” installiert.&#160; &#160;Das Setup Programm weist darauf hin, dass es einen Connector benötigt um Mails von / zu den Exchange 2003 Servers zu senden. Es muss der Server ausgewählt werden, der zur gleichen Routinggruppe wie der Exchange Server 2010 zählt sofern mehrere 2003 Server in unterschiedlichen Standorten vorhanden sind.&#160;Wenn das Microsoft Filter Pack nicht installiert wurde wird man darauf hingewiesen es nach zu installieren:&#160; &#160;Damit Active Sync in einer Exchange 2003 / 2010 Umgebung weiterhin funktioniert, muss die Authentifizierung für die Virtual Directory auf integrierte Windows Authentifizierung geändert werden.Zuerst muss der Hotfix KB937031 auf den Exchange 2003 Servern installiert werden um die entsprechende Einstellung setzen zu können.Nachdem der Hotfix auf dem Exchange Server 2003 installiert wurde, lassen sich die Einstellungen für das ActiveSync virtuelle Verzeichnis ändern. Die Authentifizierung kann jetzt auf &quot;Integrierte Windows-Authentifizierung&quot; geändert werden&#160; &#160;Installation Mailbox Rolle&#160;Jetzt wird die Mailbox Rolle installiert.&#160; &#160;Jetzt verfügt man über ein vollwertige Exchange 2010 Installation. Für den Betrieb des Servers müssen noch einige Einstellungen vorgenommen werden.&#160;Offline Adressbuch&#160;Das offline Adressbuch muss auf den Exchange 2010 verschoben werden. Dies kann über die Console unter den Organisationseinstellungen gemacht werden. Zudem muss die Einstellung für den Webverteilung aktiviert werden. (Ab Outlook 2007 wird das Adressbuch über die Webservices geladen)&#160; &#160;Send Connector erstellen&#160;Es wird ein neuer Send Connector erstellt, der für Exchange 2010 fungiert. Danach wird der alte Exchange 2003 Connector gelöscht.&#160; &#160;Receive Connector konfigurieren&#160;Damit der Exchange Server Mails annimmt, muss ein neuer Connector erstellt werden, der für den anonymen Zugriff freigeschalten wird.&#160; &#160;Kompatibilität Outlook 2003&#160;Outlook 2010, 2007 verwenden Standardmäßig die PRC Verschlüsselung, 2003 nicht. Bei Exchange Server 2010 werden per default nur verschlüsselte RPC Verbindungen angenommen. Dies kann jedoch mit folgendem Befehl über die Shell abgeschaltet werden:&#160;Set-RPCClientAccess – Server –YOURSERVER –EncryptionRequired $false&#160;&#160; Öffentliche Ordner, Free / Busy Informationen synchronisieren&#160;Um die Öffentlichen Ordner auf Exchange 2010 zu verschieben müssen diese repliziert werden. Diese Einstellungen werden auf dem Exchange 2003 vorgenommen. Hierzu wird der Exchange Server 2010 als Replikationspartner den Ordnern “Offline Address Book” und “Schedule + Free Busy” hinzugefügt.&#160; &#160;Nachdem die Informationen repliziert wurden kann das Replikat von den Exchange 2003 Servern entfernt werden.&#160;Adresslisten konvertieren&#160;Um die Exchange 2003 Adresslisten in Exchange 2010 bearbeiten zu können müssen diese erst konvertiert werden (Exchange 2003 benutzte LDAP Filter). Dies wird über die Shell gemacht. &#160;Die Adresslisten können mit den folgenden Kommandos geupdatet werden:&#160;Bsp: Adressliste Verwaltung die auf die Abteilung gefiltert wird&#160;Set-AddressList &quot;Verwaltung&quot; -IncludedRecpients MailboxUsersSet-AddressList &quot;Verwaltung&quot; -ConditionalDepartment Verwaltung&#160;Addresspolicy updaten&#160;Auch die Addresspolicy muss geupdatet werden, sonst erhält man folgende Meldung:&#160; &#160;Das Update kann über folgenden Befehl gemacht werden:&#160;Set-EmailAddressPolicy “Default Policy” –IncludedRecipients AllRecipients&#160;&#160;Die Exchange Installation ist nun komplett und man kann beginnen die Mailboxen zu verschieben.     Wichtig: Nach der Installation sollte der Exchange BPA ausgeführt werden um sämtliche Einstellungen und Funktionen zu verifizieren.&#160;Fehler&#160;Während dem Upgrade bin ich auf mehrere Fehler gestoßen die ich hier kurz samt Lösung erläutere:&#160;Fehler 1&#160;Log Name: ApplicationSource: MSExchange MailTipsDate: 12.07.2010 15:40:53Event ID: 14003Task Category: MailTipsLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Unable to create Group Metrics distribution share.Share: GroupMetricsDirectory: C:\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\GroupMetricsMessage: 00000842&#160;Um diese Fehlermeldung zu beheben habe ich den Starttyp des Dienstes “Microsoft Echange Service Host” auf Automatic (Delayed Start) gesetzt&#160;Fehler 2&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:07:45Event ID: 9323Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Entry 'Benutzer1' has invalid or expired e-mail certificates. These certificates will not be included in the offline address list for '\\\\oGAL'. - \\\\Offline-EX2k10 &#160;Das bedeutet, dass Benutzer1 Fehlerhafte Zertifikate in AD besitzt. Diese müssen gelöscht werden (vorher in AD die erweiterten Eigenschaften einblenden).&#160; &#160;Fehler 3&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:14:01Event ID: 9359Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:OALGen truncated or dropped properties for entry 'Discovery Search Mailbox' in address list '\\\\oGAL’ because they exceeded the configured size limits for the version 4 offline address list. The affected MAPI ids are: 8cd8. - \\\\Offline-EX2k10 &#160;Dieser Fehler kann ignoriert werden, er ist ab Design so.&#160;Fehler 4&#160;Log Name: ApplicationSource: MSExchange ActiveSyncDate: 15.07.2010 09:50:07Event ID: 1053Task Category: ConfigurationLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Exchange ActiveSync doesn't have sufficient permissions to create the &quot;CN=Daniel Nitz,OU=***,OU=****,DC=***,DC=local&quot; container under Active Directory user &quot;Active Directory operation failed on **********. This error is not retriable. Additional information: Access is denied.Active directory response: 00000005: SecErr: DSID-03151E04, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0&quot;.Make sure the user has inherited permission granted to domain\\\\Exchange Servers to allow List, Create child, Delete child of object type &quot;msExchangeActiveSyncDevices&quot; and doesn't have any deny permissions that block such operations.&#160;&#160;Hier gibt es ein Rechte-Problem. Bei den User wurde wahrscheinlich in AD die Vererbung deaktiviert.&#160;Fehler 5&#160;Fehler beim Download des Offline Adressbuches:&#160; &#160;Dieser Fehler kann behoben werden, indem im IIS des Exchange Servers im virtual Directory “OAB” die Einstellung gesetzt wird, dass nicht mehr SSL erzwunden werden muss.&#160; &#160;Viel Spaß bei der Migration zu Exchange Server 2010!&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/upgrade-exchange-2k3-2010/\"\n},{\n  \"id\": \"post-forefront-tmg-2010e28093rsa-authentication-manager-71\",\n  \"title\": \"Forefront TMG 2010–RSA Authentication Manager 7.1\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"&nbsp;Wer das Vergn&uuml;gen hat die beiden genannten Systeme zum kommunizieren zu bewegen wird sich &uuml;ber die &uuml;ppige Dokumentation freuen die es zu den Vorg&auml;ngerprodukten gibt&hellip; die&nbsp;hilft so gut wie gar nicht weiter.&nbsp;Ich gehe davon aus das RSA Authentication Manager 7.1 Sp3 bereits installiert wurde, ein Realm bzw. Security Domain eingerichtet wurde. Man meldet sich also an der RSA Security Console an und erstellt einen neuen &ldquo;Authentication Agent&rdquo;. Dazu klickt man auf Access, Authentication Agents, Add New.&nbsp;&nbsp;Jetzt m&uuml;ssen die Felder ausgef&uuml;llt werden, also der Hostname des TMG Servers (Array), die IP Adressen die dazu geh&ouml;ren (nat&uuml;rlich nur die vom betreffenden Netzwerk). Bei Agent Type habe ich Standard Agent verwendet und das funktioniert, habe leider keine Dokumentation gefunden aus der hervorgeht welchen Typ man verwenden sollte. Bei &ldquo;Agent may be Accessed by&rdquo; kann konfiguriert werden ob sich alle (aktiven) Benutzer &uuml;ber den Authentication Agent anmeldn k&ouml;nnen oder nur Mitglieder bestimmter Gruppen.Anschli&szlig;end muss man nur noch auf Save klicken und der Authentication Agent ist erstellt.&nbsp;Jetzt braucht man eine Konfigurationsdatei f&uuml;r TMG Server. Also wieder auf Access, Authentication Agents klicken und dieses mal &ldquo;Genereate Configuration File&rdquo; w&auml;hlen.&nbsp;&nbsp;Wenn man dann auf &ldquo;Generate Config File&rdquo; klickt, erh&auml;lt man eine Zip Datei die eine Datei sdconf.rec beinhaltet. Diese Datei muss auf allen TMG Array Mitgliedern in folgende Pfade kopiert werden.%windir%\\\\system32%programfiles%\\\\Microsoft Forefront Threat Management Gateway\\\\sdconfig&nbsp;Achtung: Die Datei muss unbedingt an beiden Orten vorhanden sein, sonst kommt es zu Fehlern wie: &ldquo;106: The Web Server is busy. Try again later.&rdquo;&nbsp;Die RSA betreffende Konfiguration ist damit eigentlich schon abgeschlossen. Also sehen wir uns die Ver&ouml;ffentlichung am TMG an.&nbsp;Es wird einfach eine normale Web Ver&ouml;ffentlichung konfiguriert, beim erstellen des Web Listeners ist auf folgendes Acht zu geben:&nbsp;&nbsp;Die Authentifizierung erfolgt &uuml;ber ein HTML Formular, wenn hier noch &ldquo;Collect addinoal delegation in the form&rdquo; ausgew&auml;hlt wird kann der Benutzer zus&auml;tzlich zum Username und RSA Passcode noch sein Active Directory Kennwort eingeben und TMG leitet es an den Web Server weiter. Daf&uuml;r muss dann bei der Ver&ouml;ffentlichungsregel die Authentication Delegation auf Basic gesetzt werden und der Web Server dahinter muss nat&uuml;rlich Basic Authentication akzeptieren.&nbsp;&nbsp;Das Integrierte HTML Formular von TMG sieht dann je nach Einstellung so aus. Will man OWA ver&ouml;ffentlichen kann man verwendet man nat&uuml;rlich besser den Assistant &ldquo;Publish Exchange Web Client Access&rdquo;. Achtung: Auf den Client Access Servern muss Basic Authentication aktiviert werden (Server Configuration, Client Access, owa).&nbsp;&nbsp;Achtung: Mutlihomed TMGForefront TMG wird in den allermeisten Konfigurationen mit mehreren Netzwerkkarten installiert, ist ja schlie&szlig;lich eine Firewall. Dadurch wei&szlig; TMG (genauer gesagt ACEClient) nicht &uuml;ber welche Netzwerkkarte er den RSA Server erreichen kann, man sieht im Event Log die Warnung: &ldquo;Multihomed host detected; Primary IP assumed is : x.x.x.x&rdquo;. Die Event ID ist 1012 die Source ACECLIENT.Das kann man beheben indem man zu Schl&uuml;ssel HKLM\\\\Software\\\\SDTI einen Schl&uuml;ssel ACIClient hinzuf&uuml;gt. Dieser bekommt dann einen String Value mit dem Namen &ldquo;PrimaryInterfaceIP&rdquo;. Der Wert entspricht der IP Adresse, des TMG, &uuml;ber die der RSA Server erreicht werden kann.&nbsp;&nbsp;Viele Gr&uuml;&szlig;etom\",\n  \"url\": \"https://onprem.wtf/post/forefront-tmg-2010e28093rsa-authentication-manager-71/\"\n},{\n  \"id\": \"post-apple-ipad\",\n  \"title\": \"Apple IPad\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Gerade eben hatte ich zum ersten Mal das Vergn&uuml;gen ein IPad zu testen. Es waren zwar nur wenige Minuten aber einen ersten Eindruck habe ich von dem Ding:Die Verarbeitung scheint sehr gut, das Ger&auml;t f&uuml;hlt sich hochwertig an. Mit 730 Gramm ist das 3G Modell allerdings ziemlich schwer.Das Display ist sehr scharf, wie es in der Sonne ist kann ich nicht sagen, im Raum ist es jedoch ausreichend hell und klar. Wird das IPad auf die Seite gedreht, dreht sich das Bild mit, sowas kennt man ja schon.Die Bedienung finde ich innovativ, ist ja auch von Apple ;) Der EBook Reader ist einfach zu bedienen, sonstige Features wie IPod und Web Browser sind nat&uuml;rlich super und bereiten dem Benutzer viel spa&szlig;. Sogar Filme kann man mit dem Ding anschauen.F&uuml;r mich w&auml;re das Ger&auml;t dennoch nichts, ich habe keinen wirklichen Verwendungszweck und nur zum Rumspielen ist Preis (in dem Fall 702&euro;) einfach zu hoch.Das Beste zum Schluss: als ich den Browser &ouml;ffnete kam als Startseite&hellip; na was schon&hellip; Bing zum Vorschein! Da konnte ich mir ein Grinsen nicht verkneifen.so long, tom\",\n  \"url\": \"https://onprem.wtf/post/apple-ipad/\"\n},{\n  \"id\": \"post-exchange-2010-entourage-web-services-edition-ews-attachement-size\",\n  \"title\": \"Exchange 2010 Entourage Web Services Edition- EWS Attachement Size\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"&nbsp;Auch MAC Clients k&ouml;nnen mit Exchange 2010 arbeiten. Daf&uuml;r gibt es entweder den Microsoft Entourage Client oder den integrierten MAC Mail Client. Entourage muss in der Web Services Edition verwendet werden, da Exchange 2010 kein WebDAV mehr unterst&uuml;tzt, die aktuelle Version von MAC Mail (Snow Leopard) macht das von Haus aus.&nbsp;Will man allerdings einen Anhang gr&ouml;&szlig;er als ca. 12MB verschicken meckert sowohl Entourage als auch MAC Mail. Entourage bringt folgende Fehlermeldung: &ldquo;HTTP-Fehler: Die Anforderung kann vom Server nicht verarbeitet werden&rdquo;.&nbsp;&nbsp;Man kontrolliert also erstmal die Gr&ouml;&szlig;enbeschr&auml;nkungen der betreffenden Mailbox, die der Send und Receive Connectoren und in der Transport Konfiguration, am schnellsten geht das wohl in der Management Shell mit folgenden cmdlets:get-TransportConfig | fl maxSendSize get-SendConnector | fl name, maxMessageSize get-ReceiveConnector | fl name, maxMessageSize get-Mailbox name | fl maxSendSize&nbsp;Sind die Werte an diesen Stellen ok, dann kann der User mit dem Microsoft Office Outlook Client den Anhang ohne Probleme senden, nur mit Entourage bzw. Mac Mail tritt das Problem auf.&nbsp;Das Problem liegt am Exchange Web Service, das ist eine ASP.NET Applikation und verwendet daher Konfigurationsdateien aus der IIS Konfiguration. Diese k&ouml;nnen in weder in der EMS noch in EMC gesehen bzw. ge&auml;ndert werden.&nbsp;Nun gibt es leider keine ausreichende Dokumentation von Microsoft, also versuche ich hier alles, was in den tiefen des Internet herumschwirrt, zusammenzufassen.&nbsp;BackupAchtung: Vor der Bearbeitung von Konfigurationsdateien unbedingt ein Backup der Datei erstellen!!&nbsp;EWS Treten die Probleme nur im Zusammenhang mit EWS auf reicht folgende &Auml;nderung der Konfiguration am Client Access Server (bzw. an alles CAS wenn mehrere im Einsatz sind):&nbsp;In der Datei %windir%\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\ClientAccess\\\\exchweb\\\\ews\\\\web.config muss der Wert von &ldquo;maxReceivedMessageSize&rdquo; unter &lt;EWSMessageEncoderSoap11Element /&gt; ge&auml;ndert werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;EWSMessageEncoderSoap11Element /&gt; &lt;httpsTransport maxReceivedMessageSize=\\\"52428800\\\" &hellip;.&gt; &nbsp;Mit appcmd.exe muss noch der Wert von maxAllowedContentLength angepasst werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt appcmd set config \\\"Default Web Site/ews\\\" -section:requestFiltering /requestLimits.maxAllowedContentLength:52428800 &nbsp;In manchen Foren bzw. anderen Blogs findet man immer wieder den Parameter &ldquo;maxRequestLength&rdquo; der auch in der web.config Datei vom EWS angepasst werden soll. Allerdings hat dieser Parameter per Default schon den gr&ouml;&szlig;tm&ouml;glichen Wert eingestellt, ich rate also davon ab diesen Parameter zu ver&auml;ndern.&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;OWADieses Problem gibt es auch in Outlook Web App, man kann standardm&auml;&szlig;ig keine Anh&auml;nge &uuml;ber 30MB hochladen. Auch hier ist wieder eine Einstellung in der web.config schuld. OWA ist eine ASP.NET Anwendung und die maximale Gr&ouml;&szlig;e der zu &uuml;bertragenden Daten wird mit dem Parameter maxRequestLength konfiguriert.Hier wird also diese Einstellung interessant, in der web.config von OWA ist diese n&auml;mlich per Default auf 30000 gesetzt.&nbsp;In der Datei %windir%\\\\Program Files\\\\Microsoft\\\\Exchange Server\\\\V14\\\\ClientAccess\\\\Owa\\\\web.config muss der Wert von maxRequestLength ge&auml;ndert werden, ACHTUNG: Angabe in KiloByte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;httpRuntime maxRequestLength=\\\"51200\\\" /&gt;&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;F&uuml;r dieses Problem gibt es sogar einen Artikel im TechNet: Configure Maximum Message Size in Outlook Web App&nbsp;&nbsp;Tipp: Man kann mit der PowerShell ganz einfach Werte in Byte und wieder Retour konvertieren. Einfach mal 50mb eintippen und versuchen.&nbsp;&nbsp;Naja, ich hoffe ich kann damit einigen weiterhelfen.&nbsp;Gr&uuml;&szlig;etom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-entourage-web-services-edition-ews-attachement-size/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-backup\",\n  \"title\": \"Exchange 2010 – Backup\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Dies ist der erste Teil einer Exchange Backup und Restore Serie.    Der zweite Teil folgt in kürze.Datensicherung ist in Exchange 2010 ein umfangreiches Thema. Für die Widerherstellung von einzelnen Elementen (Mails, Kontakte…) bietet sich z.B. der Dumpster an, dazu aber ein anderes Mal mehr. In diesem Beitrag möchte ich Datensicherung im klassischen Sinn behandeln, also Backup von Servern und Datenbanken.Backup SoftwareExchange 2010 verwendet den Windows eigenen VSS Dienst, kann also nur mit einer Backup Applikation gesichert werden die diesen Service unterstützt. Für Tests eignet sich natürlich Windows Backup von Server 2008R2, will man das Ganze in einer größeren Umgebung betreiben empfiehlt sich der Data Protection Manager.System State BackupJeder Server sollte regelmäßig gesichert werden, dazu gehört ein Backup des System Volumes und des System State. System State Backups enthalten die Registry sowie die Boot Dateien und COM+ Class Registration Datenbank. Je nach installierter Serverrolle (ADDS, IIS…) werden weitere Informationen gesichert.Mit einem System State Backup kann der Zustand des Servers (und der installierten Rollen/Applikationen) zum Zeitpunkt des Backups widerhergestellt werden.Single Server BackupWenn alle Rollen auf einem Server installiert sind müssen der System State sowie die Volumes mit den Datenbanken und Logdateien gesichert werden.Backup von Client Access ServernAuf CA Servern befinden sich keine Daten die speziell gesichert werden müssen, diese Serverrolle sollte ohnehin ausfallsicher designed werden, da der Clientzugriff im Fehlerfall sonst nicht mehr möglich ist. Die Konfiguration kann aus dem System State Backup widerhergestellt werden.Allerdings sollte man nicht vergessen das IIS Log Verzeichnis (C:\\\\inetpub\\\\logs\\\\LogFiles\\\\W3SVC1) zu überwachen bzw. alte Logs kontinuierlich zu löschen.Backup von Hub Transport ServernEs sind keine Daten auf Hub Transport Servern vorhanden ohne die eine Exchange Umgebung nicht widerhergestellt werden könnte, allerdings ist es für spätere Analyse Sinnvoll die Message Tracking Logs sowie die Protocol Logs zu sichern. Diese befinden sich im Exchange Installationsordner unter \\\\Transportroles\\\\Logs und können einfach auf File-Ebene gesichert werden.Die Konfiguration des Transport Servers wird im Active Directory gespeichert, auch diese Serverrolle sollte ausfallsicher designed werden.Backup von Edge Transport ServernEdge Transport Server speicher die Konfiguration im Active Directory, im Fehlerfall kann man einfach den Server neu aufsetzen und die EdgeSync neu einrichten. Alternativ kann man mit Cloned Configuration arbeiten, also die Konfiguration exportieren und auf dem neuen Server wieder importieren, dazu mehr in einem anderen Beitrag. Die Logs die auf Hub Transport Servern gesichert werden sollten befinden sich bei Edge Transport Servern an der selben Stelle und sollten aus dem selben Grund gesichert werden.Backup von Unified Messaging ServernDie für die Konfiguration relevanten Informationen werden in der Active Directory gespeichert, einzig die Audio Prompts können auf File- Ebene gesichert werden, diese befinden sich im Exchange Installationsordner unter \\\\UnifiedMessaging\\\\Prompts.Backup von Mailbox ServernAuf den Servern auf denen die Mailbox Rolle installiert ist befinden sich die Datenbank und Transaction Log Files, diese müssen auf jeden Fall gesichert werden. Wird eine Sicherung mit Windows Backup durchgeführt muss jeweils das gesamte Volume auf dem die Datenbank bzw. Log Files liegen ausgewählt werden. Von diesen Volumes muss ein “Full VSS&quot; Backup gemacht werden, nur so merkt Exchange dass die Daten gesichert wurden und löscht die entsprechenden Log Files.Backup der Active DirectoryExchange Server speichert viele Daten und Einstellungen in der Active Directory und ist extrem Abhängig von einer funktionstüchtigen Umgebung. Daher sollten natürlich auch Domain Controller regelmäßig gesichert werden. Hierfür reicht ein System State Backup aus, dieses enthält alle Daten/Einstellungen der AD.Backups und DAGSind die Exchange Server die gesichert werden sollen Mitglieder einer Database Availability Group (DAG) ändern sich die Gründe für eine Datensicherung. Da es bis zu 16 Kopien einer Mailbox innerhalb der DAG geben kann, ist das Backup nicht mehr der einzige Ausweg wenn die aktive Kopie der Datenbank offline geht. Fällt ein Mitglied einer DAG aus, werden die Datenbanken die auf diesem Server aktiv waren vom Server mit der nächst-höheren Priorität übernommen (natürlich muss es eine Kopie der Datenbank dort geben). So ist man bei einem Ausfall eines Mailboxservers gut gerüstet, allerdings kann es auch zu einem Datenbankfehler kommen, dafür gibt es aber folgende alternative zum Backup.Datenbank Kopien werden standardmäßig aktuell gehalten, d.h. eine Änderung wird sofort an alle Mitglieder der DAG repliziert. Man kann allerdings eine Verzögerung (ReplayLagTime) konfigurieren und so z.B. auf einem Server ältere Versionen der Datenbanken halten. Tritt nun ein Datenbankfehler auf, kann die ältere Datenbank verwendet werden ohne umständliches Restore von Tape oder woher auch immer.Ein weiterer Effekt des Backups ist das löschen der Log Files, sollte man also auf regelmäßige Backups verzichten muss man wohl oder übel Circular Logging für die Datenbanken aktivieren um ein überlaufen der Festplatten zu verhindern.Diese neue Möglichkeit der Hochverfügbarkeit bringt sicher viele Vorteile, jedoch sollte man meiner Meinung nach nicht auf ein Backup verzichten. Ich empfehle regelmäßige System State Backups von allen Servern. Die Datenbanken würde ich auf jeden Fall auch sichern und das Backup und Restore Szenario ausreichend testen und dokumentieren!Soweit mal zum Thema Backup, viele Grüße   tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-backup/\"\n},{\n  \"id\": \"post-migration-sharepoint-services-v3-zu-sharepoint-foundation-2010\",\n  \"title\": \"Migration Sharepoint Services v3 zu Sharepoint Foundation 2010\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Heute habe ich die Migration von den Sharepoint Services 3 auf die Version 2010 Foundation abgeschlossen. Während der Umstellung bin ich auf mehrere Probleme gestoßen, die ich mit diesem Post im einzelnen aufzeigen werden. Vielleicht erspart das dem ein oder anderen von euch Zeit nach einer Lösung zu suchen.Problem 1 – Fehler 7043 (Sharepoint Foundation) im EventLog Anwendung Lösung: Im Ordner C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Web Server Extensions\\\\14\\\\TEMPLATE\\\\CONTROLTEMPLATES befindet sich die Datei SearchArea.ascx. Diese Datei wird in der Version 2010 nicht benötigt und kann umbenannt werden (Bsp: SearchArea.ascx.old)Problem 2 – Fehler 7009 und 7000 (Service Control Manager) im EventLog System  Lösung: Es kann passieren, dass der Dienst “Claim to Windows Token Service” beim Systemstart nicht starten kann. Sobald der Start-Typ von “Automatisch” auf “Automatisch (Verzögerter Start)” gesetzt wird, startet der Dienst normal, jedoch ein wenig später als die anderen Dienste.&#160;Problem 3 – Fehler 6398 und 5586 (Sharepoint Foundation) im EventLog Anwendung  Lösung: Sharepoint Zentraladministration öffnen und zum Punkt Sicherheit wechseln. Im Menüpunkt Dienstkonten konfigurieren den richtigen Webanwendungspool auswählen und das entsprechende Konto angeben. Mit OK bestätigen sodass das Konto nochmal registriert wird.&#160;Problem 4: Backup der Sharepoint FarmWenn ihr Versucht ein Backup der Sharepoint Farm zu erstellen, bekommt ihr den Hinweis, dass der Verwaltungsdienst angehalten wurde. ACHTUNG: Es geht auch noch schlimmer: Wenn ihr wie ich eure Sharepoint Farm über das Befehlszeilentool stsadm.exe sichert, sind die Menüelemente auf der Sharepoint Webseite während und nach der Sicherung gesperrt. Wenn ihr die Berechtigungen prüft werdet ihr sehen, dass ihr nicht mehr über ausreichend Berechtigungen verfügt um irgendwas an der Webseite zu ändern bzw. hochzuladen zu löschen usw. Auch könnt ihr die Eigenschaften der Webseite nicht mehr öffnen oder bearbeiten.Lösung: Das Problem lässt sich durch einen ganz einfachen Handgriff beheben. Nach der Installation ist der Dienst “Sharepoint 2010 Administration” auf Start-Typ Manuell gesetzt und somit nicht aktiv. Ändert das Startverhalten des Dienstes auf Automatisch und ihr könnt wieder normal Backups ziehen und die Steuerelemente aktivieren sich nach der Sicherung wieder.Viel Spaß beim Upgrade auf Foundation 2010, Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/migration-sharepoint-services-v3-zu-sharepoint-foundation-2010/\"\n},{\n  \"id\": \"post-sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen\",\n  \"title\": \"Sharepoint Foundation 2010 Dateien lassen sich nicht öffnen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"Nach einer Standardinstallation von Sharepoint Foundation 2010 lassen sich gewisse Dateien (z.B. PDF) nur downloaden, nicht aber direkt aus der Bibliothek abrufen.&#160;Das ist ein neues Sicherheitsfeature, welches den Browser zwingt die Datei nur zum Download anzubieten. Das Sicherheitsfeature kann in der Sharepoint Zentraladministration deaktiviert werden.Anwendungsverwaltung / Webanwendungen verwalten die entsprechende Webanwendungs auswählen, unter Allgemeine Einstellungen kann nun die Option “Dateiverarbeitung durch den Browser” auf Berechtigt gesetzt werden.  Nun können die Dateien wieder direkt aus der Bibliothek geöffnet werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen/\"\n},{\n  \"id\": \"post-distributedcom-fehler-10016-fehlende-berechtigungen\",\n  \"title\": \"DistributedCOM Fehler 10016, fehlende Berechtigungen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2008-R2\"],\n  \"content\": \"Wenn auf euren Server DistributedCOM Fehler mit der ID 10016 vorkommen, so bedeutet das meist, dass erforderliche Berechtigungen fehlen.Beispiel: Der Benutzer NETZWERKDIENST hat keine Berechtigung die Komponente mit der ID 000C101C-0000-0000-C000-000000000046 zu aktivieren In diesem Fall muss dem Benutzer NETZWERKDIENST lediglich das Benutzerrecht gegeben werden um die jeweilige Komponente zu starten. Als erstes wird die Komponente über das Tool Komponentendienste gesucht. Wenn ihr die Einstellungen der Komponente nicht ändern könnt, habt ihr selbst nicht die notwendigen Berechtigungen.  Die könnt ihr euch aber selber zuweisen indem ihr in der Registry unter HKEY_CLASSES_ROOT\\\\AppID den Schlüssel mit der ID sucht und in den Berechtigungen der Gruppe Administratoren oder euch selbst den Besitz übertragt und das Recht Vollzugriff gebt. Danach lassen sich die Einstellungen der Komponente ändern und ihr könnt den jeweiligen Benutzer die erforderlichen Rechte geben.&#160;Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/distributedcom-fehler-10016-fehlende-berechtigungen/\"\n},{\n  \"id\": \"post-windows-virtual-pc-interner-dhcp-server\",\n  \"title\": \"Windows Virtual PC / interner DHCP Server\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Wenn man mit Windows Virtual PC eine DHCP Infrastruktur virtualisiert, wird der Client keine IP-Adresse bekommen, sofern die Netzwerke auf “Internes Netzwerk” geschalten wurden.    Das Verhalten ist weniger ein Problem, sondern ein Feature, das sich leicht deaktivieren lässt.     Sobald man die Netzwerkeinstellungen des Clients auf “Internes Netzwerk” ändert, erhalt er eine Adresse aus dem Pool 196.254.0.16 – 196.254.10.254 (APIPA ist von 169.254.0.0-196.254.255.255)        Um diesen internen DHCP Server zu deaktivieren müssen zuerst alle VM’s heruntergefahren bzw. gespeichert werden. Dann muss folgende Datei geöffnet werden:%localappdata%\\\\microsoft\\\\Windows Virtual PC\\\\options.xml        In dieser Datei tauschen wir im Abschnitt dhcp enabled den Wert TRUE durch FALSE.         Nach dieser Änderung kann der Client IP Adressen vom aufgesetzten DHCP Server empfangen.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/windows-virtual-pc-interner-dhcp-server/\"\n},{\n  \"id\": \"post-ntsystems-update\",\n  \"title\": \"ntSystems - Update\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Heute habe ich die Blog Platform von ntSystems aktualisiert. Wir verwenden nun die aktuellste Version von BlogEngine.NET.Das neue Theme ist in Bearbeitung, wird in den n&auml;chsten Tagen Online sein.Bis dahin, stay tuned!twitter.com/torgglertwitter.com/nitz_d\",\n  \"url\": \"https://onprem.wtf/post/ntsystems-update/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-safelist-aggregation\",\n  \"title\": \"Exchange 2010 – SafeList Aggregation\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"In Exchange 2010 gibt es viele M&ouml;glichkeiten sich vor Spam zu sch&uuml;tzen, unter anderem kann jeder User seine pers&ouml;nliche Black- und White List in den Outlook Junk-E-Mail Optionen pflegen.Ist ein Edge Transport Server in der Exchange Organisation vorhanden, kann man diese pers&ouml;nlichen Listen direkt an der Edge, also an der ersten M&ouml;glichkeit anwenden und so die Effizienz steigern und false positives verringern. Ist die SafeList Aggregation aktiviert werden sichere Mails dem Empf&auml;nger direkt zugestellt, ohne von weitern Filter Agents gepr&uuml;ft zu werden. Au&szlig;erdem werden die blockierten Absender bei der ersten M&ouml;glichkeit blockiert.Sichere Absender sind alle (E-Mail Adressen oder Domains) die in der entsprechenden Liste eingetragen sind. Outlook Kontakte und E-Mail Adressen an die der Benutzer eine Nachricht sendet k&ouml;nnen optional ausgew&auml;hlt werden. Die Informationen die der Benutzer in Outlook konfiguriert werden als sogenannte SafeList Collection auf dem Mailbox Server des Benutzers gespeichert. Eine SafeList Collection kann bis zu 1024 Eintr&auml;ge beinhalten.Das Update-SafeList cmdlet aktualisiert diese Collection im ActiveDriectory, dort werden die Informationen (Hashes) in den Attributen msExchSafeSenderHash, msExchSafeRecipientHash, und msExchBlockedSendersHash gespeichert.&Uuml;ber den EdgeSync Service werden die Attribute dann mit der ADLDS Instanz am Edge Transport Server synchronisiert (one-way).Will man also die SafeList Collection eines einzelnen Users aktualisieren verwendet man &ldquo;update-safelist mail.box&rdquo;.Sollen die Collections aller Mailboxen aktualisiert werden dann kann man das z.B. so machen: Get-Mailbox | Update-SafeList. Um die Edge Synchronisierung anzusto&szlig;en (Testumgebung) kann man noch Start-EdgeSychronization verwenden.Wenn es sich um eine gr&ouml;&szlig;ere Organisation handelt werden mit Get-Mailbox wom&ouml;glich nicht alle Mailboxen zur&uuml;ckgegeben, daf&uuml;r eignet sich folgende Kommandos.Set-AdServerSettings -ViewEntireForest $true Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Update-SafelistWenn man diese beiden Kommandos in einer Datei speichert kann man einfach einen geplanten Task erstellen der die SafeList automatisch aktualisiert.Achtung: Damit die SafeList Aggregation funktioniert muss der Content Filtering Agent am Edge Transport Server laufen. Das kann mit &ldquo;Get-ContentFilterConfig&rdquo; einfach &uuml;berpr&uuml;ft werden.tomt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-safelist-aggregation/\"\n},{\n  \"id\": \"post-tpm-bitlocker-schlussel-in-ad-ds-speichern\",\n  \"title\": \"TPM / BitLocker Schlüssel in AD DS speichern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"de\",\"Server\",\"Server-2008\",\"Server-2008-R2\"],\n  \"content\": \"Wenn BitLocker im Unternehmen aktiviert wird, empfiehlt es sich die Wiederherstellungsinformationen in Active Directory zu sichern. Diese Anleitung richtet sich an Windows Server 2008 / 2008 R2 und Windows 7 als Client-Betriebssystem. Die Anleitung beschreibt, welche Schritte erforderlich sind um TPM- und BitLocker Schl&uuml;ssel in AD DS zu speichern, als Beispiel wird jenes Volume verschl&uuml;sselt, welches das Betriebssystem enth&auml;lt.  Wir unterscheiden hier zwischen 2 diverse Schl&uuml;ssel:TPM: Hierbei wird der Besitzerschl&uuml;ssel des TPM Bausteins in AD DS gespeichert BitLocker: Hierbei handelt es sich um den Wiederherstellungsschl&uuml;ssel f&uuml;r die betreffende PartitionSchritt 1: AD DS zum speichern von TPM Besitzerschl&uuml;ssel vorbereitenAls erstes muss AD DS f&uuml;r das speichern des TPM Besitzerschl&uuml;ssels konfiguriert werden. Sofern Server 2003 als DC verwendet wird, muss vorher noch ein Schema-Update durchgef&uuml;hrt werden. F&uuml;r die Betriebssysteme Server 2008 und Server 2008 R2 ist dies nicht notwendig, da diese die Erweiterung bereits mitbringen.Damit der Client den TPM Besitzerschl&uuml;ssel in AD DS speichern kann, muss das Script Add-TPMSelfWriteACE.vbs auf dem DC ausgef&uuml;hrt werden. Dieses Script setzt die Berechtigungen des Attributs msTPM-OwnerInformation so, dass der Client seinen TPM Schl&uuml;ssel einf&uuml;gen kann.ACHTUNG: Sollte man nicht das Server-Betriebssystem in englischer Sprachversion verwenden, so muss das Script noch angepasst werden: Anstatt die Berechtigung &ldquo;SELF&rdquo; zu setzen, muss diese z.B. f&uuml;r Deutsch in &ldquo;SELBST&rdquo; ersetzt werden. Sonst l&auml;uft das Script nicht erfolgreich durch.Schritt 2: Setzen der GPO&rsquo;sDa nun Active Directory zum speichern von TPM Schl&uuml;sseln vorbereitet ist, setzten wir die Gruppenrichtlinien und weisen den Client an, die Wiederherstellungsschl&uuml;ssel in Active Directory zu speichern.BitLockerComputerkonfiguration / Administrative Vorlagen / Windows-Komponenten / BitLocker Laufwerksverschl&uuml;sselung / Betriebssystemlaufwerke&rdquo;Festlegen, wie BitLocker-gesch&uuml;tzte Betriebssystemlaufwerke wiederhergestellt werden k&ouml;nnen&rdquo;Anhand dieser Richtlinie wei&szlig;en wir den Client an die Wiederherstellungsinformationen in der Active Directory zu speichern. BitLocker kann erst aktiviert werden, sobald die Widerherstellungsinformationen in Active Directory hinterlegt sind.TPMComputerkonfiguration / Administrative Vorlagen / System / Trusted Platform Module-Dienste&ldquo;TPM-Sicherung in Active-Directory-Dom&auml;nendienste aktivieren&rdquo;Anhand dieser Richtlinie wird der Client angewiesen den TPM Besitzerschl&uuml;ssel in der Active Directory zu speichern.Schritt 3: TPM am Client initialisierenWenn der TPM am Client initialisiert wird, wird ein Besitzerschl&uuml;ssel generiert.In Active Directory werden die Informationen im Attribut msTPM-OwnerInformation mitgeschrieben.Schritt 4: Verwaltungsprogramm f&uuml;r BitLocker-Schl&uuml;ssel installierenServer 2008 liefert eine zus&auml;tzliche Registerkarte f&uuml;r Active Directory um BitLocker-Schl&uuml;ssel anzuzeigen. Vorher muss jedoch das Feature Verwaltungsdienstprogramm f&uuml;r BitLocker aktiviert werden.Nach der Aktivierung findet man eine neue Registerkarte in den Computerkonten.&nbsp;Schritt 5: BitLocker aktivieren und Wiederherstellungsschl&uuml;ssel einsehenNun k&ouml;nnen wir am Client BitLocker f&uuml;r das Volume aktivieren, welches das Betriebssystem enth&auml;lt.Nach der Aktivierung kann der Wiederherstellungsschl&uuml;ssel im jeweiligen Computerkonto in der Registerkarte &ldquo;BitLocker-Wiederherstellung&rdquo; eingesehen werden.Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/tpm-bitlocker-schlussel-in-ad-ds-speichern/\"\n},{\n  \"id\": \"post-wsus-auf-neuen-server-verschieben\",\n  \"title\": \"WSUS auf neuen Server verschieben\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Daniel hat in diesem Artikel bereits dar&uuml;ber geschrieben.Im Gro&szlig;en und Ganzen habe ich die Migration genau gleich gemacht. Also WSUS auf dem neuen Server installiert, WSUS Content kopiert und mit \\\"wsutil export datei.cab datei.log\\\" und \\\"wsutil import datei.cab datei.log\\\" die Updates importiert. Allerdings wollte ich die Einstellungen nicht manuell &uuml;bernehmen, daf&uuml;r gibt es WSUSMigrate.Man findet das Tool im WSUS TechCenter unter API Samples and Tools. Installiert man diese, erh&auml;lt man diverse zus&auml;tzliche Tools f&uuml;r WSUS, unter anderm WSUSMigrationImport und WSUSMigrationExport mitsamt kurzem HowTo.Also habe ich diese Tools auf dem alten sowie auf dem neuen Server installiert und mit \\\"WSUSMigrationExport datei.xml\\\" die Gruppen und Approvals exportiert. Auf dem neuen Server kann man dann mit Parametern entscheiden welche Einstellungen man importieren m&ouml;chte. Die verf&uuml;gbaren Parameter f&uuml;r WSUSMigrationImport sind:TargetGroups -&gt; Importiert nur GruppenApprovals -&gt; Importiert nur Update ApprovalsAll -&gt; Importiert Gruppen und ApprovalsMan kann auch entscheiden was mit den Gruppen passieren soll die es auf dem Zielserver eventuell schon gibt, daf&uuml;r gibt es diese Parameter:None -&gt; Beh&auml;lt die bestehenden GruppenDeleteUnmatchedGroups -&gt; L&ouml;scht Gruppen vom Zielserver die nicht in der XML Datei vorhanden sindNoch ein Beispiel f&uuml;r den Import Befehl:\\\"WSUSMigrationImport datei.xml All None\\\" -&gt; Importiert alle Gruppen und Approvals und ver&auml;ndert bestehende Gruppen auf dem Zielserver nicht.so long!tomt\",\n  \"url\": \"https://onprem.wtf/post/wsus-auf-neuen-server-verschieben/\"\n},{\n  \"id\": \"post-buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3\",\n  \"title\": \"Buchen einer Ressource in Outlook 2010 mit Exchange 2k3\",\n  \"author\": \"dni\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Wenn man mit Outlook 2010 &uuml;ber einen Exchange Server in der Version 2003 eine Ressource buchen m&ouml;chte (z.B. Konferenzraum f&uuml;r eine Besprechung) wird das unter Umst&auml;nden nicht funktionieren. Die Besprechungsanfrage wird zwar allen Teilnehmern gesendet und auch im eigenen Kalender eingetragen, die Ressource jedoch nicht gebucht, sprich im Ressourcenkalender nicht eingetragen.  Dieses Problem tretet nur in der Konstellation von Outlook 2010 auf einem Exchange Server 2003 SP* auf.L&ouml;sung: Damit die Ressource wieder gebucht werden kann, muss in der Registry des PC&rsquo;s wo Outlook 2010 installiert ist, folgender Schl&uuml;ssel angelegt werden:HKCU\\\\Software\\\\Microsoft\\\\Office\\\\14.0\\\\Outlook\\\\Options\\\\CalendarREG_DWORD EnableDirectBooking 1 (HEX)Gr&uuml;&szlig;e dn\",\n  \"url\": \"https://onprem.wtf/post/buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3/\"\n},{\n  \"id\": \"post-nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules\",\n  \"title\": \"NLB – Unicast vs. Multicast, Konfiguration, Port Rules\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"UnicastIm Unicast Mode tauscht jeder NLB Knoten seine MAC Adresse mit der Cluster MAC Adresse aus, d.h. alle Knoten haben die gleiche “virtuelle” MAC Adresse.Dieses Konfiguration zwingt den Switch zu “suboptimalem” Verhalten, da die selbe MAC Adresse über mehrere Switchports erreichbar ist, kann der Switch die Adresse nicht “lernen” also sie nicht in seine MAC Address Table aufnehmen und an ein Switchport binden. Alle Pakete an diese MAC Adresse werden vom Switch über alle Ports geflutet. Das führt zu überflüssiger Last am Switch und im gesamten Netzwerk.Ein weiteres Problem ist dass die einzelnen NLB Knoten so nicht mehr miteinander kommunizieren können, dafür wird eine zusätzliche Netzwerkkarte benötigt. Aus diesem Grund wird Unicast Mode mit nur einer Netzwerkkarte nicht empfohlen.Das Fluten von Paketen kann durch erstellen eines eigenen VLAN für die NLB Knoten vermindert werden. So werden Pakete nur innerhalb dieses VLANs geflutet und nicht über den ganzen Switch. MulticastBeim Multicast Mode wird jedem Konten eine Multicast MAC Adresse hinzugefügt, so dass alle Knoten mit zwei Layer2 Adressen ausgestattet sind. Das ermöglicht dem Switch das “lernen” der echten MAC Adressen und den einzelnen Knoten eine Kommunikation untereinander.Damit ein Multicast Cluster auch erreichbar wird müssen statische ARP Einträge am Switch konfiguriert werden, denn Standardmäßig wird die Auflösung von Unicast IPs in Multicast MAC Adressen blockiert. So werden Pakete an die Multicast Adressen nur an die festgelegten Ports weitergeleitet.Cluster im Multicast Mode können auch mit nur einer Netzwerkkarte betrieben werden, aus Performancegründen und verbessertem Management empfehle ich aber die Verwendung zweier Netzwerkkarten.NLB KonfigurationWie bereits oben beschrieben muss im Unicast Mode jeder Knoten zwei Netzwerkkarten besitzen. Im Multicast Mode reicht eine Karte, allerdings ist es eine “Best Practice” zwei zu verwenden.Als erstes muss das Feature installiert werden, ich habe hier deutsch Server, also heißt das Ding: Netzwerklastenausgleich. Das geht entweder über die GUI, oder mit “servermanagercmd –i nlb”. Auch mit PowerShell kann man Features installieren, und zwar mit dem Add-WindowsFeature cmdlet. Dann werden die beiden Netzwerkkarten konfiguriert. Eine wird die Netzwerkkarte für das LAN, sie wird mit IP, Gateway und DNS Server konfiguriert. Ich habe sie in LAN umbenannt. Die zweite Netzwerkkarte wird der dedizierte Adapter für NLB. Diese wird nur mit einer IP Adresse konfiguriert.Ich verwende im LAB 192.168.1.10 als Cluster Adresse. 192.168.1.11 und 192.168.1.12 als Adressen für die Netzwerkkarten “LAN”. Für die NLB Adapter verwende ich 192.168.1.21 und 192.168.1.22.Wichtig ist dass man auf die Bindings achtet, d.h. der Adapter LAN muss der erste in der Auswahl sein. Die Bindings werden in den Erweiterten Netzwerkeinstellungen konfiguriert. Jetzt wird mit dem NLB-Manager der Cluster erstellt. Dazu wird auf Cluster und Neu geklickt, dann wird der erste Knoten hinzugefügt: Wichtig: Der dedizierte NLB Adapter wird verwendet!Als dedizierte Adresse wird als 192.168.1.21 angezeigt, auf dieser NIC wird NLB aktiviert und die Cluster Adresse gebunden. Im nächsten Fenster wird die Cluster Adresse festgelegt, ich verwende wie oben beschrieben 192.168.1.10/24.Der Modus, also Unicast oder Multicast wird im nächsten Fenster konfiguriert. Außerdem wird der FQDN für den Cluster hier gesetzt. Mein Testcluster heißt nlb.ntsystems.it und läuft im Multicast Mode.&#160;  Jetzt werden noch die Port Rules konfiguriert, ich akzeptiere vorläufig mal die Standardeinstellungen, dazu aber später mehr.So, jetzt habe ich NLB mal soweit eingerichtet. Natürlich muss noch der zweite Knoten hinzugefügt werden. Dazu einfach auf den Clusternamen klicken und Host hinzufügen wählen. Wichtig auch hier wieder dass die Netzwerkkarte NLB verwendet wird, also die dedizierte Adresse 192.168.1.22.Ist der zweite Knoten hinzugefügt und der Status im NLB Manager auf “Converged” oder “Zusammengeführt” ist der Cluster erstellt.Allerdings ist die Konfiguration damit noch nicht fertig. Die Cluster IP ist noch nicht erreichbar. Das hat zwei Gründe, erstens muss am Switch noch der statische ARP Eintrag erstellt werden (Cisco: arp 192.168.1.10 03bf.c08a.010a). Außerdem muss IP Forwarding noch konfiguriert werden, dazu brauchen wir folgenden netsh Befehl: “netsh int ipv4 set int “NLB” forwarding=enabled”NLB Port RulesAls letzter Schritt bei der Konfiguration des Clusters werden die Port Rules konfiguriert. Standardmäßig werden einfach alle Ports (0-65535) egal ob TCP oder UDP an alle Clusterknoten weitergeleitet. Nun um die Angriffsfläche oder( “Attack Surface”) zu verringern und die Konfiguration zu optimieren sollten nur diese Ports weitergeleitet werden die auch wirklich benötigt werden. Ein weiterer Vorteil von einer eigenen Regel für jedes Protokoll ist dass man die Affinität so für jedes Port einstellen kann.Mein NLB Cluster soll ein Webserver werden, also werde ich nur die Ports 80 und 443 weiterleiten, ich möchte die Affinität für beide Ports “Einfach” haben, es wird also die IP Adresse jedes Clients verwendet um die Affinität zu steuern. Ich lösche also die Default Port Rule und erstelle zwei neue. Die Port Rules werden entweder in den Clustereigenschaften konfiguriert, oder direkt beim erstellen des Clusters.Jetzt erkennen wir einen weiteren Vorteil der Konfiguration mit zwei Netzwerkkarten: Der NLB Manager kann weiterhin mit beiden Knoten kommunizieren, obwohl ich für die Protokolle die verwendet keine Port Rules erstellt habe. Der NLB Manager verwendet für die Konfiguration die dedizierten Adressen.ChecklistHier die einzelnen Schritte nochmal im Überblick.        Feature installieren       zusätzliche Netzwerkkarte installieren    Netzwerkkarten konfigurieren (IP, Bindings!)    Cluster erstellen (Unicast/Multicast)    Hosts hinzufügen    evtl. Statische ARP Einträge    IP Forwarding aktivieren (netsh int ipv4 set int “NLB” forwarding=enabled)    Port Rules erstellen &#160;so long!   tomt\",\n  \"url\": \"https://onprem.wtf/post/nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules/\"\n},{\n  \"id\": \"post-installation-der-sharepoint-services-30-auf-server-2008\",\n  \"title\": \"Installation der Sharepoint Services 3.0 auf Server 2008\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2008-R2\",\"Sharepoint\"],\n  \"content\": \"Die Installation der Sharepoint Services kann sich unter Server 2008 / 2008 R2 als schwierig erweisen, wenn der Windows Installer während der Installationsphase einen falsch angegeben Parameter meldet: Das Problem hängt hierbei mit der “Windows Internal Database” zusammen.Lösung: Vor der Installation folgendes Kommando eingeben:    ocsetup.exe &quot;WSSEE&quot; /quiet /norestart /x:&quot; /lv* C:\\\\bak.logGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/installation-der-sharepoint-services-30-auf-server-2008/\"\n},{\n  \"id\": \"post-office-2010-fertig!!\",\n  \"title\": \"Office 2010 fertig!!\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Kurze Info: Office 2010 ist fertig!! Ab sofort ist es für TechNet und MSDN Abonnenten zum Download verfügbar!Lasst die Leitungen glühen!! :)\",\n  \"url\": \"https://onprem.wtf/post/office-2010-fertig!!/\"\n},{\n  \"id\": \"post-programme-vom-server-core-hyper-v-server-deinstallieren\",\n  \"title\": \"Programme vom Server Core / Hyper-V Server deinstallieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\",\"Server\"],\n  \"content\": \"Der Server 2008 Core und der Hyper-V Server haben keine Oberfläche um Programme zu deinstallieren (Add/Remove programs).Um Programme deinstallieren zu können, öffnen wir die Registrierung. (Üblicherweise Remoteregistrierung von einem Client aus). Unter    HKLM\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall    werden die installierten Programme gelistet. Wenn man den Wert im Schlüssel “UninstallString” in der Kommandozeile des Servers eingibt, wird der Windows Installer gestartet und deinstalliert das Programm.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/programme-vom-server-core-hyper-v-server-deinstallieren/\"\n},{\n  \"id\": \"post-exchange-2010-active-sync-funktioniert-nicht\",\n  \"title\": \"Exchange 2010 - Active Sync funktioniert nicht\",\n  \"author\": \"tto\",\n  \"tags\": [\"Events\",\"Exchange\"],\n  \"content\": \"Ja es ist ruhig zur Zeit auf ntSystems&hellip; das liegt daran dass die beiden Autoren zur Zeit ihre MCSA/MCSE Zertifizierungen auf MCITP-EA aktualisieren. Wir sind auch ganz gut im Rennen, aber einige Pr&uuml;fungen fehlen noch. Naja, bald gibt&rsquo;s hoffentlich wieder mehr zum Lesen.Inzwischen die L&ouml;sung f&uuml;r folgendes Problem:ActiveSync funktioniert mit Exchange 2010 nicht, Event ID: 1053 Source: MSExchange ActiveSync wird Protokolliert. Aus der Beschreibung des Fehlers erkennt man auch schon das Problem, fehlende Berechtigungen.Exchange ActiveSync doesn't have sufficient permissions to create the container &ldquo;CN&rdquo; under Active Directory &hellip; &lt;/p&gt;Active directory response: 00000005: SecErr: DSID-03152492, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0 Make sure the user has inherited permission granted to domain\\\\Exchange Servers to allow List, Create child, Delete child of object type \\\"msExchangeActiveSyncDevices\\\" and doesn't have any deny permissions that block such operations.&lt;/code&gt;Also einfach die in der Fehlermeldung beschriebenen Berechtigungen setzen, oder die Vererbung auf dem Active Directory User Objekt wieder aktivieren.Um Berechtigungen im Active Directory zu setzen muss unter &ldquo;View&rdquo; die Option &ldquo;Advanced Features&rdquo; aktiviert werden. Dann&nbsp;wird unter den Eigenschaften des Benutzers der Reiter &ldquo;Security&rdquo; angezeigt.tt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-active-sync-funktioniert-nicht/\"\n},{\n  \"id\": \"post-wds-remoteinstallationsordner-verschieben\",\n  \"title\": \"WDS Remoteinstallationsordner verschieben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Um in den Deployment Services den Installationsorder zu verschieben müssen folgende Befehle ausgeführt werden:wdsutil /uninitialize-serverDann den Ordner an seinen neuen Platz verschiebenwdsutil /initialize-server /reminst:Laufwerksbuchstabe\\\\OrdnerGrüße   dn\",\n  \"url\": \"https://onprem.wtf/post/wds-remoteinstallationsordner-verschieben/\"\n},{\n  \"id\": \"post-wsus-content-auf-anderes-volume-verschieben\",\n  \"title\": \"WSUS content / database auf anderes Volume verschieben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"ContentUm den WSUS content auf einem anderen Volume zu verschieben, reicht es ein einfaches Command auszuführen:wsusutil.exe movecontent “neuer Pfad” “Pfad für das entstehende LogFile”Das Tool wsusutil befindet sich unter Program Files\\\\ Update Services \\\\ ToolsDatabaseUm die Datenbank zu verschieben gibt es 2 Möglichkeiten, einmal über das Management Studio oder über SQLCMD. In diesem Post gehe ich lediglich auf die Methode anhand des Management Studio ein1) Datenbank über folgenden Pfad öffnen\\\\\\\\.\\\\pipe\\\\MSSQL$MICROSOFT##SSEE\\\\sql\\\\query 2) Datenbank trennenBevor die Datenbank getrennt wird, sollte der Dienst “update services” beendet werden. Die Datenbank SUSDB trennen und bei den Optionen muss noch angegeben werden, dass die Verbindungen mit getrennt werden sollen. 3) Datenbank auf neuem Volume kopieren4) Datenbank wieder anfügen&#160; Danach kann der Dienst “update services” wieder gestartet werden.Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/wsus-content-auf-anderes-volume-verschieben/\"\n},{\n  \"id\": \"post-forefront-2010-e28093-dienste-starten-nicht-automatisch\",\n  \"title\": \"Forefront 2010 – Dienste starten nicht automatisch\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Server\",\"Security\"],\n  \"content\": \"Wer Forefront 2010 installiert und das Logging nicht separat konfiguriert wird sich wom&ouml;glich wundern warum bei einem Neustart folgende Dienste nicht starten:Microsoft Forefront TMG ControlMicrosoft Fronfront TMG FirewallMicrosoft Forefront TMG Job SchedulerMicrosoft Forefront TMG Managed ControlForefront beantwortet somit keine Anfragen und jeglicher Zugriff von allen au&szlig;er den Management Computern wird blockiert.Das liegt daran dass Standardm&auml;&szlig;ig eine Lokale SQL Instanz also Logging Ziel konfiguriert ist, der SQL Dienst aber erst nach den Forefront Diensten startet&hellip; Und wenn Forefront nicht Protokollieren kann dann wird der Dienst beendet. Im Eventlog steht:The Microsoft Forefront TMG Control service terminated with service-specific error %%278540.L&ouml;sen l&auml;sst sich das Problem ganz einfach, entweder man stellt auf Logging to File&nbsp;oder man Konfiguriert die vier oben genannten Dienste f&uuml;r verz&ouml;gerten Start.&nbsp;&Uuml;ber die Sinnhaftigkeit dieser Standardkonfiguration muss man wohl nichts mehr sagen&hellip;tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-2010-e28093-dienste-starten-nicht-automatisch/\"\n},{\n  \"id\": \"post-wds-tftp-timeout\",\n  \"title\": \"WDS TFTP TimeOut\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008-R2\",\"Server-2008\",\"Server-2003\"],\n  \"content\": \"Wenn die Windows Deployment Services auf derselben Maschine wie der DNS Server laufen, wird WDS nach der Installation des DNS-Patches KB953230 (wird auch über Windows Updare verteilt) möglicherweise nicht mehr funktionieren. Wenn der Client versucht über PXE zu booten erscheint folgende Meldung: PXE-E32: TFTP open timeoutUm dieses Problem zu beheben muss folgendes an den WDS Diensten verändert werden:Server 2003 – 2008In den Eigenschaften des WDS Servers muss der UDP Portbereich zu den Werten 50000 bis 65000 verändert werden.      Server 2008 R2Wenn als OS Server 2008 R2 verwendet wird, kann auch die Option aktiviert werden, dass WDS automatisch nach verfügbaren WinSock Ports abfragt und nicht den vorkonfigurierten UDP Portbereich verwendet. Dazu muss der Schlüssel UDPPortPolicy unter HKLM\\\\System\\\\CurrentControlSet\\\\Services\\\\WDSServer\\\\Parameters von 1 auf 0 gesetzt werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/wds-tftp-timeout/\"\n},{\n  \"id\": \"post-terminal-lizenzserver-4105\",\n  \"title\": \"Terminal-Lizenzserver, 4105\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Server-2008\",\"Server-2003\"],\n  \"content\": \"Nach der Domänenmigration von 2003 zu 2008 kann es geg. zu Problemen am Terminal-Lizenzserver kommen, dass Lizenzattribute für Benutzer nicht aktualisiert werden können. Das Problem ist, dass nach der Migration der Domäne die Benutzer-Berechtigungen für die Gruppe “Terminalserver-Lizenzserver” nicht aktualisiert werden.Um die Benutzerberechtigungen für die bestehenden Benutzer manuell zu setzen müssen der Gruppe Terminalserver-Lizenzserver folgende Berechtigungen zugewiesen werden: “Terminalserver-Lizenzserver lesen” und ”Terminalserver-Lizenzserver schreiben”  Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/terminal-lizenzserver-4105/\"\n},{\n  \"id\": \"post-bootmgr-is-missing\",\n  \"title\": \"BOOTMGR is missing\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Gestern habe ich meinen Windows Server 2008 R2 für den Cluster vorbereitet. Aus versehen habe ich eine Daten-Partition als aktiv markiert. Das habe ich natürlich sofort rückgängig gemacht.Heute habe ich meinen Server neu gestartet und musste feststellen, dass er nicht mehr bootet. Als Fehlermeldung wurde angezeigt, dass der Bootloader fehlt (BOOTMGR is missing). Nach ein wenig Recherche über Bing (ehemals Google :) ) bin ich auf 2 Methoden gestoßen um das Problem zu beheben:Methode 1: Den BCD Speicher neu erstellen   Server CD in einlegen und Server damit starten     Die Option “Computerreparatur” auswählen     CMD starten und den Befehl Bootrec /RebuildBcd eingeben. Nun sollte das Betriebssystem aufgelistet werden. Nun bestätigt man mit YES, dass der BCD Speicher neu geschrieben wird. Sollte das Betriebssystem nicht aufgelistet werden, so muss folgende durchgeführt werden: Export der Konfiguration: Bcedit /export C:\\\\BCD_Export Alte Konfiguration umbenennen: ren c:\\\\boot\\\\bcd bcd.old Und die Konfiguration nochmal erstellen lassen: Bootrec /RebuidlBcd     Server neu starten  Methode 2: Den BCD Speicher manuell neu erstellenDiese Methode habe ich noch nicht versucht, aber hier der KB-Artikel zum nachlesen.Nachdem Methode 1 bei mir nicht funktionierte und nach mehreren Anläufen über /fixboot usw. sich nichts getan hat, erinnerte ich mich, dass auf der Windows 7 DVD eine Reparaturoption für den Startvorgang enthalten ist. Nachdem ich den Server mit der Windows 7 DVD gestartet hatte, wählte ich die Option “Startup Repair” aus und lies die Diagnose durchlaufen. Nach 1 Minute und einem Neustart später startete der Server wieder ordnungsgemäß.ACHTUNG: Das funktioniert nicht für den Microsoft Hyper-V Server. Dieser hat eine andere Bootkonfiguration, die vor dem Start des Betriebssystems den Hypervisor startet.Grüße    dn\",\n  \"url\": \"https://onprem.wtf/post/bootmgr-is-missing/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-this-attachment-was-removed\",\n  \"title\": \"Exchange 2010 – This Attachment was removed\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\"],\n  \"content\": \"Ich betreibe seit einiger Zeit eine Exchange 2010 Umgebung bestehend aus einem Edge Transport Server und einem Multi-Role Exchange Server im Lan.Standardm&auml;&szlig;ig ist am Edge Transport Server der &ldquo;Attachment Filter Agent&rdquo; aktiv, dieser ist daf&uuml;r verantwortlich, potentiell gef&auml;hrliche Anh&auml;nge zu filtern. Will man also z.B. eine .exe Datei verschicken muss man diesen Agent deaktivieren. Das wird auf dem Edge Transport Server gemacht und zwar per PowerShell.Disable-TransportAgent -Identity \\\"Attachment Filter agent\\\"Ich schlage allerdings vor dieses Sicherheitsfeature nicht auszuschalten. Man kann diverse Einstellungen vornehmen, so kann z.B. festgelegt werden dass ein unsicherer Anhang nicht entfernt wird sondern das Mail direkt &ldquo;rejected&rdquo; wird.Man kann die Attachment Filter Eintr&auml;ge &uuml;ber folgendes cmdlets selbst bearbeiten.Add-AttachmentFilterEntry -Name &lt;FileName&gt; -Type FileNameAdd-AttachmentFilterEntry -Name &lt;MIMEContentType&gt; -Type ContentTypeAu&szlig;erdem kann man das Verhalten des Attachment Filter Agent festlegen und zwar &uuml;ber das set-AttachmentFilterListConfig cmdletSet-AttachmentFilterListConfig -Action -Reject -RejectResponse \\\"Versenden von Mails mit unsicheren Anh&auml;ngen nicht erlaubt!\\\"Genauere Syntax und Infos zu den Parametern findet man im TechNet:Set-AttachmentFilterListConfig Add-AttachmentFilterEntry&nbsp;na dann, sch&ouml;nes Wochenende! tom\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-this-attachment-was-removed/\"\n},{\n  \"id\": \"post-nvspbind-fur-hyper-v\",\n  \"title\": \"NVSPBIND für Hyper-V\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\"],\n  \"content\": \"In einem meiner letzten Posts (Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben) habe ich erklärt, wie man über die Registry die Bindungen an den Netzwerkschnittstellen verändern kann.     Die Microsoft Entwickler haben dazu jetzt ein Tool veröffentlich, mit dem das Ganze etwas komfortabler gemanagt werden kann: NVSPBIND.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/nvspbind-fur-hyper-v/\"\n},{\n  \"id\": \"post-wsus-verschieben\",\n  \"title\": \"WSUS auf anderen Server verschieben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Um den WSUS Server auf einer anderen physischen Maschine zu verschieben müssen folgende Schritte unternommen werden:1) WSUS auf dem Zielserver installieren2) Einstellungen manuell vom Quellserver zum Zielserver übernehmen3) Mit NTBackup das Verzeichnis WSUSContent vom Quellserver sichern (Kopieren ist auch möglich) 4) Daten mit NTBackup auf dem Zielserver in den entsprechenden Ordner wiederherstellen5) Metadaten vom Quellserver exportieren   CMD öffnen und zum Ordner Tools unter C:\\\\Programme\\\\Update Services\\\\ wechseln    Folgenden Befehl eintippen um die Metadaten zu exportieren: wsusutil.exe export export.cab export.log    2 Files wurden erstellt (Export.cab und Export.log)  6) Metadaten zum Zielserver importieren   Mit dem Befhl wsusutil.exe import export.cab import.log werden die zuvor exportierten Metadaten am Zielserver importiert             Info: Es kann einige Zeit vergehen, bis der Import Vorgang vollständig abgeschlossen wurde. 7) GPO abändern und auf den neuen WSUS Server verweisen    Grüße     dn \",\n  \"url\": \"https://onprem.wtf/post/wsus-verschieben/\"\n},{\n  \"id\": \"post-wpad-und-server-2008\",\n  \"title\": \"WPAD und Server 2008\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008\",\"Server-2008-R2\",\"Server\",\"Client\"],\n  \"content\": \"Heute habe ich meinen Windows Server 2008 R2 Server zum Domänencontroller promoted. D.h. Domänendienste, GC und DNS wurden installiert. Zudem habe ich als primären DNS Server die lokale Maschine angegeben.Nach einiger Zeit wunderte ich mich, dass das Internet nicht mehr funktioniert. Als Gateway betreibe ich eine ISA Server 2006, der Proxy wird über WPAD automatisch konfiguriert.Windows Server 2008 besitzt für DNS ein neues Sicherheitsfeature, welches WPAD nicht zulässt (DNS Global Query Blocklist).dnscmd /info /enableglobalqueryblocklist –&gt; zeigt ob das Sicherheitsfeature aktiv ist. 1 = True, 0 Falsednscmd /config /enableglobalqueryblocklist 0 –&gt; schaltet das Sicherheitsfeature ausWenn das Sicherheitsfeature abgeschaltet wird, muss der DNS Server noch neu gestartet werden.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/wpad-und-server-2008/\"\n},{\n  \"id\": \"post-hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben\",\n  \"title\": \"Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\",\"Server\"],\n  \"content\": \"Wenn man den Hyper-V Server bzw. den Server Core verwendet und an den Netzwerkschnittstellen die Bindungen verändern möchte, kommt man um das Editieren der Registry nicht herum.   In meinen Fall möchte ich die “Datei und Druckerfreigabe” von den iSCSI Adaptern loslösen.Als erstes muss die ID der Netzwerkadapter ermittelt werdenwmic nicconfig get Description,SettingIDDanach erhält man eine Liste mit den Adaptern und deren ID Nun beginnt die Arbeit in der Registry: Zunächst muss der Schlüssel Bind unter HKEY_LOCAL_MACHINE\\\\system\\\\currentcontrolset\\\\services\\\\lanmanserver\\\\     linkagegeöffnet werden. Hier erhält man eine Liste mit den Netzwerkadaptern und ihren Bindungen zum Protokoll der “Datei und Druckerfreigabe”. Der nächste Schritt besteht darin, die Bindungen aufzuheben, indem man alle Zeilen wo die entsprechende Adapter-ID vorkommt löscht.   Änderungen werden nach einem Reboot aktiv.Anbei noch eine Liste mit den Protokollen und ihren Schlüsseln:File and Printer Sharing: LanmanServer     Client for MS Networks: LanmanWorkstation      Link-Layer Discovery Mapper I/O Driver: lltdio      Link-Layer Topology Discovery Responder: rspndr      TCP/IP v4: tcpip      TCP/IP v6: tcpip6Grüße   dn    \",\n  \"url\": \"https://onprem.wtf/post/hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben/\"\n},{\n  \"id\": \"post-bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung\",\n  \"title\": \"BlueScreen “Stop 0x0000007E” beim aktivieren der Virtualisierungs-Technologie\",\n  \"author\": \"dni\",\n  \"tags\": [\"Hyper-V\",\"Server-2008-R2\"],\n  \"content\": \"Nachdem im BIOS die Virtualisierungs-Technologie aktiviert wird, kann es zu einem BlueScreen bei starten des Servers kommen. Im BlueScreen wird folgender Fehlercode mitgeteilt: 0x0000007E.Betroffen sind folgende Produkte: Windows Server 2008 R2 Standard  Windows Server 2008 R2 Enterprise  Windows Server 2008 R2 Datacenter Hyper-V Server 2008 R2&#160;Microsoft hat dazu den KB-Artikel 974598 und einen Hotfix veröffentlicht. Um den Server wieder flott zu bekommen, muss die Virtualisierungs-Technologie deaktiviert werden. Danach muss der Server gestartet und der Hitfix installiert werden.   Nachdem der Hotfix installiert wurde, kann die Virtualisierungs-Technologie wieder aktiviert und das System gestartet startet.Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung/\"\n},{\n  \"id\": \"post-server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen\",\n  \"title\": \"Server 2008 Core / Hyper-V Netzwerkschnittstelle umbenennen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Hyper-V\"],\n  \"content\": \"Um auf einem Server Core oder auch Hyper-V Server die Netzwerkschnittstelle umzubenennen, wird das Tool netsh verwendet.Um z.B. “LAN-Verbindung 5” in “iSCSI 10” umzubenennen, muss folgender Befehl ausgeführt werden:netsh interface set interface name=”LAN-Verbindung 5” newname=”iSCSI 10”Grüße   dn\",\n  \"url\": \"https://onprem.wtf/post/server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen/\"\n},{\n  \"id\": \"post-disclaimer\",\n  \"title\": \"disclaimer\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"  &lt;p&gt;1. Inhalt des Onlineangebotes &lt;/p&gt;  &lt;p&gt;Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. &lt;/p&gt;  &lt;p&gt;Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen. &lt;/p&gt;  &lt;p&gt;2. Verweise und Links &lt;/p&gt;  &lt;p&gt;Bei direkten oder indirekten Verweisen auf fremde Webseiten (&quot;Hyperlinks&quot;), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. &lt;/p&gt;  &lt;p&gt;Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist. &lt;/p&gt;  &lt;p&gt;3. Urheber- und Kennzeichenrecht &lt;/p&gt;  &lt;p&gt;Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen. &lt;/p&gt;  &lt;p&gt;Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! &lt;/p&gt;  &lt;p&gt;Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet. &lt;/p&gt;  &lt;p&gt;4. Datenschutz &lt;/p&gt;  &lt;p&gt;Sofern innerhalb des Internetangebotes die Möglichkeit zur Eingabe persönlicher oder geschäftlicher Daten (Emailadressen, Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme und Bezahlung aller angebotenen Dienste ist - soweit technisch möglich und zumutbar - auch ohne Angabe solcher Daten bzw. unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet. Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie Emailadressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstössen gegen dieses Verbot sind ausdrücklich vorbehalten. &lt;/p&gt;  &lt;p&gt;5. Rechtswirksamkeit dieses Haftungsausschlusses &lt;/p&gt;  &lt;p&gt;Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt. &lt;/p&gt;  &lt;p&gt;1. Content&lt;/p&gt;  &lt;p&gt;The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect,will therefore be rejected. &lt;/p&gt;  &lt;p&gt;All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the author without separate announcement. &lt;/p&gt;  &lt;p&gt;2. Referrals and links&lt;/p&gt;  &lt;p&gt;The author is not responsible for any contents linked or referred to from his pages - unless he has full knowledge of illegal contents and would be able to prevent the visitors of his site fromviewing those pages. If any damage occurs by the use of information presented there, only the author of the respective pages might be liable, not the one who has linked to these pages. Furthermore the author is not liable for any postings or messages published by users of discussion boards, guestbooks or mailinglists provided on his page. &lt;/p&gt;  &lt;p&gt;3. Copyright&lt;/p&gt;  &lt;p&gt;The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. &lt;/p&gt;  &lt;p&gt;The copyright for any material created by the author is reserved. Any duplication or use of objects such as images, diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's agreement. &lt;/p&gt;  &lt;p&gt;4. Privacy policy&lt;/p&gt;  &lt;p&gt;If the opportunity for the input of personal or business data (email addresses, name, addresses) is given, the input of these data takes place voluntarily. The use and payment of all offered services are permitted - if and so far technically possible and reasonable - without specification of any personal data or under specification of anonymized data or an alias. The use of published postal addresses, telephone or fax numbers and email addresses for marketing purposes is prohibited, offenders sending unwanted spam messages will be punished. &lt;/p&gt;  &lt;p&gt;5. Legal validity of this disclaimer&lt;/p&gt;  &lt;p&gt;This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual terms of this statement are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. &lt;/p&gt;\",\n  \"url\": \"https://onprem.wtf/post/disclaimer/\"\n},{\n  \"id\": \"post-zertifizierungsstelle-verschieben-(backuprestore)\",\n  \"title\": \"Zertifizierungsstelle verschieben (Backup/Restore)\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Eine Zertifizierungsstelle geh&ouml;rt zu den Serverrollen die &uuml;ber viele Jahre gleich bleiben und einige Hardware- bzw. Betriebsystem- Lifecycles &uuml;berdauern. Aus diesem Grund kann es vorkommen dass man eine CA von einem Server auf einen anderen migrieren muss.Wichtig dabei ist dass der Name des Servers sich nicht &auml;ndern sollte, kann man eine &Auml;nderung nicht verhindern gibt es hier einen KB Artikel der die Vorgehensweise beschreibt. Aber wie gesagt, besser/einfacher ist es den Namen nicht zu &auml;ndern.Nun denn, zuerst gilt es eine Strategie zu w&auml;hlen, ich habe es so gemacht dass ich die CA gesichert habe, CA deinstalliert, DC heruntergestuft, Server aus der Domain genommen. Neuen Server mit gleichem Namen installiert, zum DC hochgestuft, CA installiert, CA widerhergestellt und l&auml;uft.Also zum ersten Schritt, Sichern einer Zertifizierungsstelle:Im CA SnapIn auf den CA Namen klicken und All Tasks &ndash;&gt; Backup CA w&auml;hlenBeide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenEinen Ordner angeben wohin das Ganze gesichert wird (sollte leer sein)Ein Kennwort f&uuml;r den Private Key angeben (sollte man sich nat&uuml;rlich merken)regedit &ouml;ffnen und zum Schl&uuml;ssel HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\CertSvc\\\\Configuration wechseln, Rechtsklick auf den Schl&uuml;ssel und Export w&auml;hlen. Wieder einen Ordner w&auml;hlen um den Registry Key abzulegen.Deinstallieren einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Remove Roles w&auml;hlenActive Directory Certificate Services entfernenNeu Starten und fertigfolgende Daten bleiben auf dem Server (Achtung bei Entsorgung!!)CA database, CA public and private keys, CA's certificates in the Personal storeCA chain's root certificate in the Trusted Root Certification Authorities storeCA chain's intermediate certificates in the Intermediate Certification Authorities storeThe CA's CRLWiederherstellen einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Add Roles w&auml;hlenActive Directory Certificate Services hinzuf&uuml;genBei &ldquo;Specify Type&rdquo; den entsprechenden Typ ausw&auml;hlen, Standalone oder EnterpriseBei &ldquo;Set up Private Key&rdquo; muss man &ldquo;Use existing private Key&rdquo; w&auml;hlen, darunter &ldquo;Select a certificate and use its associated private key&rdquo;Jetzt wird das vorher gesicherte Zertifikat (*.p12 Datei) ausgew&auml;hlt und das entsprechende Passwort eingegebenBei &ldquo;Configure Database&rdquo; ist noch darauf zu achten dass der CertLog Ordner im gleichen Pfad liegt wie auf dem alten Server (Standard %systemroot%\\\\system32\\\\CertLog)Jetzt wird die CA installiert Ist die Installation abgeschlossen, die Dienstkonsole &ouml;ffnen (services.msc) und den Dienst &ldquo;Active Directory Certificate Services&rdquo; beendenJetzt das vorher exportierte Registry File doppelklicken und die Einstellungen importierenCA SnapIn &ouml;ffnen und auf den CA Namen klicken, All Tasks &ndash;&gt; Restore CA w&auml;hlenWieder beide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenJetzt kann der Dienst &ldquo;Active Directory Certificate Services&rdquo; wieder gestartet werden und die CA l&auml;uft wiederWeihnachtliche Gr&uuml;&szlig;e tom&nbsp;\",\n  \"url\": \"https://onprem.wtf/post/zertifizierungsstelle-verschieben-(backuprestore)/\"\n},{\n  \"id\": \"post-domain-controller-umbenennen\",\n  \"title\": \"Domain Controller umbenennen\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server-2008-R2\",\"Server-2008\",\"Server\"],\n  \"content\": \"Es kann vorkommen dass man bei der Wahl der Servernamen mal danebengreift oder einfach im Nachhinein einen anderen Namen braucht. Wenn z.B. eine Zertifizierungsstelle wiederhergestellt werden soll dann ist der Computername wichtig.Um also einen Domain Controller (2008, 2008R2) umzubenennen geht man am besten so vor (Achtung: Ein Neustart ist nötig).Zuerst wird ein zusätzlicher DNS-Hostname hinzugefügt.netdom computername altername.domain.local /add:neuername.domain.localWichtig ist nun die Replikation mit allen anderen DCs abzuwarten oder manuell anzustoßen (repadmin, AD Sites and Services). Alle DCs müssen die Änderung im Computerkonto mitbekommen, in allen DNS Servern muss der zusätzliche Namen als Ressource Record aufscheinen. Erst nachdem die Replikation abgeschlossen ist darf man zum nächsten Schritt gehen. Man kann das Ergebnis der Replikation sehen indem man mit ADSI Edit die Eigenschaften des entsprechenden Computerkontos anzeigt, dort muss das Attribut &quot;msDS-AdditionalDnsHostName” den Wert neuername.domain.local haben. Alternativ zu ADSI Edit kann man auch das SnapIn Active Directory Users and Computers verwenden, allerdings muss man dazu unter “View” die “Advanced Features” aktivieren damit man die Attribute sieht.Ist die Replikatoin erfolgt wird der neue Computername als Primärer gesetzt.netdom computername altername.domain.local /makeprimary:neuername.domain.localNach diesem Schritt ist wiederum die Replikation abzuwarten/anzustoßen. Es ändert sich der Name des Computerobjektes und das Attribut “msDS-AdditionalDnsHostName” bekommt den Wert “altername.domain.local”.Jetzt muss der Server neu gestartet werden.Zum Schluss wird der alte Namen noch entfernt.netdom computername neuername.domain.local /remove:altername.domain.localMan kommt nicht um den Neustart herum, so funktioniert aber alles reibungslos.Grüße.   tt\",\n  \"url\": \"https://onprem.wtf/post/domain-controller-umbenennen/\"\n},{\n  \"id\": \"post-forefront-thread-management-gateway-2010\",\n  \"title\": \"Forefront Threat Management Gateway 2010\",\n  \"author\": \"tto\",\n  \"tags\": [\"de\",\"Security\"],\n  \"content\": \"Der Nachfolger des beliebten MS Internet Security and Acceleration Servers (ISA) ist seit Mitte November verf&uuml;gbar. Nat&uuml;rlich wurde der Name ge&auml;ndert&nbsp;sowas ist&nbsp;nach einigen Versionen&nbsp;immer n&ouml;tig ;) Das Ding wurde in die Forefront Produktlinie aufgenommen und hei&szlig;t jetzt Forefront Threat Management Gateway 2010. TMG gibt es wie ISA als Standard und Enterprise Edition, die Unterschiede findet man hier.Wichtig zu erw&auml;hnen ist dass Forefront TMG nur mehr als 64 Bit Version verf&uuml;gbar ist, es gibt eine Testversion f&uuml;r 32 Bit Systeme, ist Produktiv allerdings nicht unterst&uuml;tzt. Die Genauen Systemvoraussetzungen gibt es hier.Die wichtigsten neuen Features kurz im &Uuml;berblick:Web Protection Subscription ServiceBietet HTTP/HTTPS Traffic InspectionURL Filterung in Zusammenarbeit mit MRS (Microsoft&nbsp;Reputation Services) mehr dazu z.B. bei Technet EdgeE-Mail Supportarbeitet mit Exchange Edge Transport zusammenNIS Network Inspection SystemIntrusion PreventionEnhanced NATendlich eine 1-to-1 NAT Funktion, d.h. man kann selbst entscheiden welche interne Adresse auf welche externe &uuml;bersetzt wirdVoIP Support64 Bit SupportStartet man das Setup bekommt man mal etwas wirklich cooles, das Preparation Tool.&nbsp;Dieses Tool installiert alle&nbsp;ben&ouml;tigten Serverrollen und Features. Diese sind je nach Installation unterschiedlich:Forefront TMG servicesWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellWindows Web Services API (WWSAPI)Network Policy Server (NPAS-Policy-Server)NPAS Routing and Remote Access Services (NPAS-RRAS-Services)Active Directory Lightweight Directory Services (ADLDS)Network Load Balancing (NLB)Forefront TMG management onlyWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellForefront TMG EMS (nur Enterprise Version)Windows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellActive Directory Lightweight Directory Services (ADLDS)Ist der Preparation Wizard abgeschlossen, kann mit der Installation des TMG begonnen werden.Die Installation dauert einige Zeit, wenn sie abgeschlossen ist kann man die Management Konsole &ouml;ffnen und mit der Konfiguration beginnen. Zuerst sind noch mit einfachen Wizards die Netzwerkeinstellungen, Updates und URL Filtering bzw. Web Protection Subscription zu konfigurieren.Wenn jetzt noch der Web Access Wizard ausgef&uuml;hrt wird kann man gleich noch eine erste Regel erstellen. Man kann ausw&auml;hlen welche URL Kategorien man sperren m&ouml;chte, ob man Web und HTTPS inspection aktivieren m&ouml;chte und wenn ja mit welchem Zertifikat. Au&szlig;erdem kann hier gleich das Caching aktiviert werden.Alles in allem scheint TMG wirklich ein sehr interessantes Produkt zu werden, das deutlich mehr kann als nur den ISA Server zu ersetzen. In n&auml;chster Zeit werde ich sicher noch einiges dar&uuml;ber berichten.viele Gr&uuml;&szlig;e.tom\",\n  \"url\": \"https://onprem.wtf/post/forefront-thread-management-gateway-2010/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-anonymous-relay\",\n  \"title\": \"Exchange 2010 – Anonymous Relay\",\n  \"author\": \"tto\",\n  \"tags\": [\"Exchange\",\"Server\"],\n  \"content\": \"Immer wieder gibt es Gründe (z.B. SharePoint) um bestimmten Hosts anonymes Relaying über Exchange zu erlauben. Man muss sich so eine Konfiguration natürlich gut überlegen und die entsprechenden Hosts müssen vertrauenswürdig bzw. sicher sein.Man erstellt also einen neuen “Custom” Receive Conenctor, dem man erst mal einen Namen geben muss (Server Configuration, Hub Transport). Unter “Local Network Settings” kann man die IP Adresse angeben über welche der Exchange Server am besten mit dem Host reden kann. Wenn man nur eine Netzwerkkarte im Hub Transport Server hat kann man sich diese Einstellung schenken und einfach alle verfügbaren IPv4 Adressen verwenden. Außerdem kann man noch den FQDN eingeben mit dem sich der Exchange Server melden soll. Unter “Remote Network Settings” wird jetzt der Host (bzw. die Hosts) hinzugefügt der anonym über den Exchange Relayen darf. Wichtig: der Host muss wirklich vertrauenswürdig sein und AntiVirus bzw. Firewall sollen laufen, damit man nicht selbst zur Spamschleuder wird. Man kann einzelne Hosts, IP Bereiche oder ganze Subnets angeben. Durch klicken auf weiter und wird der Connector erstellt. Jetzt muss man noch die benötigten Berechtigungen setzen. Dazu Rechtsklick auf den Connector und die Eigenschaften öffnen. Unter “Authentication” werden alle Felder deaktiviert, unter “Permission Groups” wird die Gruppe Anonymous Users hinzugefügt.   Das Ganze kann man natürlich auch wieder mit der PowerShell machen, dazu einfach das New-ReceiveConnector cmdlet verwenden. Hier ein Beispiel:New-ReceiveConnector -Name &quot;SharePoint Relay&quot; -Usage Custom -PermissionGroups AnonymousUsers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.1.10,192.168.1.15-192.168.1.18Jetzt gibt es also den Connector und die angegeben Hosts verwenden diesen, das Relaying funktioniert allerdings noch nicht.    Dazu muss man dem User “NT AUTHORITY\\\\ANONYMOUS LOGON” die Berechtigung “Ms-Exch-SMTP-Accept-Any-Recipient” geben. Diese Aktion kann man nur in der EMS (Exchange Management Shell) durchführen.Get-ReceiveConnector &quot;SharePoint Relay&quot; | Add-ADPermission -User &quot;NT AUTHORITY\\\\ANONYMOUS LOGON&quot; -ExtendedRights &quot;Ms-Exch-SMTP-Accept-Any-Recipient&quot;Hat man auch das gemacht funktioniert das Realying.tt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-anonymous-relay/\"\n},{\n  \"id\": \"post-ersten-ws08r2-dc-im-vorhandenen-forest-installieren\",\n  \"title\": \"Ersten WS08R2 DC im vorhandenen Forest installieren\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Server-2008-R2\"],\n  \"content\": \"Neue Features wie das AD Administrative Center (hat Daniel hier&nbsp;schon&nbsp;vorgestellt)&nbsp;oder der AD Recycle Bin erfordern Windows Server 2008 R2 Domain Controller. Das Administrative Center braucht nur einen neuen DC, f&uuml;r den Recycle Bin muss das Forest Functional Level auf WS08R2 gestuft werden, mehr dazu in einem n&auml;chsten Beitrag.Um die Domain auf den ersten 2008 R2 DC vorzubereiten muss wie auch schon bei fr&uuml;heren Updates zuerst das AD Schema aktualisiert werden (auf Version 47). Dazu wird auf einem bestehenden DC die Windows Server 2008 R2 CD eingelegt, man muss nat&uuml;rlich mit einem Benutzer mit Schema Admin Rechten anmelden. Im Ordner Support\\\\adprep befinden sich die Dateien adprep.exe und adprep32.exe. Wie der Dateiname schon sagt wird mit adprep.exe die Schemaerweiterung bei x64 Systemen durchgef&uuml;hrt, mit adprep32.exe wird das Schema auf x86 DCs erweitert.Folgende Parameter werden ben&ouml;tigt:adprep[32].exe /forestprep Bereitet den gesamten Forest auf WS08R2 voradprep[32].exe /domainprep /gpprep Muss auf dem Infrastruktur Master ausgef&uuml;hrt werdenBereitet die Domain vor und setzt Berechtigungen auf Sysvol Share f&uuml;r RSoP Planning Modeadprep[32].exe /rodcprep Muss nur ausgef&uuml;hrt werden wenn ein RODC vorhanden ist, bzw. installiert werden sollJetzt sind Domain und Forest bereit f&uuml;r den neuen DC und der Windows Server 2008R2 kann mit dcpromo hochgestuft werden.viele Gr&uuml;&szlig;e tt\",\n  \"url\": \"https://onprem.wtf/post/ersten-ws08r2-dc-im-vorhandenen-forest-installieren/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-edge-subscription\",\n  \"title\": \"Exchange 2010 – Edge Subscription\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Exchange\"],\n  \"content\": \"Exchange 2010 bringt wie sein Vorg&auml;nger die Edge Transport Rolle mit. In Exchange 2007 wurde bei jeder Synchronisation die gesamte Konfiguration repliziert, dieser Prozess wurde mit Exchange 2010 verbessert, jetzt ist die erste Replikation vollst&auml;ndig, bei allen weiteren werden nur noch die &Auml;nderungen repliziert (incremental updates).Diese Serverrolle kann als einzige nicht mit anderen Rollen auf einem Server installiert werden, der Grund daf&uuml;r ist auch einfach erkl&auml;rt: der Edge Transport Server wird als Mail Relay in der DMZ eingesetzt und ist kein Dom&auml;nenmitglied bzw. hat nur sehr eingeschr&auml;nkten Zugriff auf das LAN.Vor der Installation des Edge Transport Servers muss die interne Hub Transport Rolle konfiguriert werden. Das hei&szlig;t Accepted Domains und die Connectoren m&uuml;ssen konfiguriert werden. Hier ein Link zur entsprechenden Technet Seite.Die Installation des Edge Transport Servers gestaltet sich sehr einfach. Man braucht einen x64 Server 2008 (am besten R2) in der Standard Edition. Dort wird das .net Framework installiert. Au&szlig;erdem wird ein Verzeichnisdienst ben&ouml;tigt, der Edge Transport Server muss ja wissen welche Empf&auml;nger es im Active Directory gibt. Active Direcotry Lightweight Directory Services (ADLDS), der Nachfolger des ADAM, und die entsprechende Verwaltungskonsole werden also auch installiert.Am schnellsten geht das wohl &uuml;ber die PowerShell:Import-Module ServerManagerAdd-WindowsFeature NET-Framework,RSAT-ADDS,ADLDS &ndash;RestartNach dem Neustart muss noch der Starttyp eines Dienstes ge&auml;ndert werden, auch wieder in der PowerShell:Set-Service NetTcpPortSharing -StartupType AutomaticDer Server ist jetzt soweit vorbereitet, man muss (wenn nicht schon passiert) noch den DNS Suffix der internen Domain (z.B: domain.local) eintragen.Da der Server in der DMZ stehen soll, muss auf der Firewall folgendes konfiguriert werden:DNS: Port 53 (tcp/udp) Richtung interne DNS ServerSMTP:&nbsp;Port 25 (tcp)&nbsp;Richtung interner Hub Transport ServerEdgeSync:&nbsp;Port 50636 (tcp)&nbsp;Richtung interner Hub Transport Server (Replikationspartner)Jetzt kann das Exchange 2010 Setup ausgef&uuml;hrt werden, bei dem die &ldquo;Custom Installation&rdquo; gew&auml;hlt wird und dort nur die Edge Transport Rolle und die Management Tools installiert werden. Die Installation ist schnell abgeschlossen, was jetzt noch ben&ouml;tigt wird ist die Synchronisation zwischen Edge Transport und internem Exchange (HUB) Server. Wichtig: Auf dem Edge Transport Server ist keine Konfiguration (Accepted Domains usw.) n&ouml;tig, diese Einstellungen werden mit der Edge Synchronisierung &uuml;bernommen.Auf dem Edge Transport Server ein neues Subscription File erstellt. Es wird einfach New-EdgeSubscription -FileName \\\"C:\\\\filename.xml\\\" in der EMS eingegeben. Die eben erstellte Datei wird auf den Hub Transport Server &uuml;bertragen, dort wird&nbsp;mit dem selben cmdlet die EdgeSync erstellt. New-EdgeSubscription -FileName \\\"C:\\\\EdgeSubscriptionInfo.xml\\\" -Site \\\"Name-der-AD-Site\\\". Nat&uuml;rlich kann man die EdgeSync auch in der EMC erstellen, dazu in der Organization Configuration die Hub Transport Rolle ausw&auml;hlen, dort auf den Edge Subscription Tab wechseln und New Edge Subscription w&auml;hlen. Jetzt muss noch der Active Directory Standort gew&auml;hlt werden und das xml File angegben werden. Auch hier k&ouml;nnen die Connectoren auf Wunsch automatisch erstellt werden.Wichtig: Der interne Hub Transport Server muss den Edge Transport Server per DNS Name aufl&ouml;sen k&ouml;nnen!Durch die EdgeSync werden die ben&ouml;tigten Connectoren erstellt und die relevanten Einstellungen &uuml;bernommen. So wird z.B. die Konfiguration des Default Recipient Connector sowie die Accepted Domains vom internen Server &uuml;bernommen.Weiterf&uuml;hrend kann ich das Exchange 2010 TechCenter empfehlen.Sehr lesenswert ist auch der Exchange Team Blog, zu finden in der Blogroll.viele Gr&uuml;&szlig;ett\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-edge-subscription/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-get-owavirtualdirectory-access-denied\",\n  \"title\": \"Exchange 2010 – Get-OwaVirtualDirectory Access Denied\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\",\"Exchange\"],\n  \"content\": \"Wird Exchange 2010 Server in einer Exchange 2007 Umgebung installiert erscheint folgender Fehler wenn man in der Exchange Management Console unter “Server Configuration” die Client Access Rolle verwalten möchte. “An IIS directory entry couldn't be created. The error message is Access is denied. HResult = -2147024891. It was running the command 'Get-OwaVirtualdirectory'”Den selben Fehler erhält man wenn man in der Exchange Management Shell den Befehl “Get-OwaVirtualDirectory” ausführt, macht die EMC eigentlich auch, nur mit Bild drum herum :).Der Grund dafür ist wohl dass Exchange 2010 keine Berechtigungen auf der entsprechenden Website im IIS auf dem 2007 Client Access Server erhält.Die Lösung: Alle Exchange 2010 Server sollen Mitglied der lokalen Administratoren auf allen Exchange 2007 Servern sein. Also am besten die Gruppe “Exchange Trusted Subsystems” zu den Lokalen Admins auf den Exchange 2007 Server hinzufügen.Alternativ kann man der Gruppe “Exchange Trusted Subsystems” auch Berechtigungen (Full Control) auf der entsprechenden Website (Default Website) im direkt im IIS geben.viele Grüße   tt\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-get-owavirtualdirectory-access-denied/\"\n},{\n  \"id\": \"post-dhcp-fehler-1003\",\n  \"title\": \"DHCP Fehler 1003\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"Letztens konnte ich auf mehreren meiner Client-PC’s Fehlermeldungen im Eventlog bezüglich fehlerhafter Anmeldungen feststellen:Ereignistyp:&#160;&#160;&#160; Warnung   Ereignisquelle:&#160;&#160;&#160; Dhcp    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 1003    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:25    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****    Beschreibung:    Der Computer konnte die Netzwerkadresse, die durch den DHCP-Server für die Netzwerkkarte mit der Netzwerkadresse ******A98F0 zugeteilt wurde, nicht erneuern. Der folgende Fehler ist aufgetreten:     Das Zeitlimit für die Semaphore wurde erreicht. . Es wird weiterhin im Hintergrund versucht, eine Adresse vom Netzwerkadressserver (DHCP) zu erhalten. Ereignistyp:&#160;&#160;&#160; Fehler   Ereignisquelle:&#160;&#160;&#160; NETLOGON    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 5719    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:33    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****Beschreibung:   Es steht kein Domänencontroller für die Domäne ***** aus folgendem Grund zur Verfügung:     Es sind momentan keine Anmeldeserver zum Verarbeiten der Anmeldeanforderung verfügbar.    Stellen Sie sicher, dass der Computer mit dem Netzwerk verbunden ist, und versuchen Sie es erneut. Wenden Sie sich an den Domänenadministrator, wenn das Problem weiterhin besteht. Als erstes habe ich die DNS Struktur gecheckt. Danach mit den beiden Tools dcdiag und netdiag mehrfach Diagnosen gestartet und ausgewertet. Laut den Diagnosetools war alles OK.    Nach ein wenig Recherche habe ich das Problem entdeckt: Es war der Switch.     Auf den Switch ist das STP Protokoll aktiv. Dieses braucht üblicherweise 30-60 Sekunden um den Switchport von Listening und Learning Status auf Forwarding zu bringen. Da die PC’s schneller starten als der Switchport aktiv ist, kann der PC seine IP nicht erneuern bzw. anfordern.Das Problem kann man umgehen indem man die Client-Switchports auf “PortFast” stellt und somit der Switchport sofort in den Forwarding-Status geht.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/dhcp-fehler-1003/\"\n},{\n  \"id\": \"post-windows-7-usbdvd-download-tool\",\n  \"title\": \"Windows 7 USB/DVD Download Tool\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Microsoft hat nun ein kostenloses Tool zur Verfügung gestellt um einen USB Stick Bootfähig zu machen, die Windows 7 Installationsdateien darauf zu kopieren und damit die Windows 7 Installation durchzuführen.Windows 7 USB/DVD Download ToolDer USB Stick muss mindestens 4 GB groß sein. Wie ein USB Stick manuell für die Installation präpariert werden kann, hat Thomas in einen vorhergehenden Post erklärt.Viel Spaß beim installieren!!    Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-usbdvd-download-tool/\"\n},{\n  \"id\": \"post-microsoft-techday-dezember-2009\",\n  \"title\": \"Microsoft TechDay Dezember 2009\",\n  \"author\": \"dni\",\n  \"tags\": [\"Events\"],\n  \"content\": \"Die jährlichen Microsoft Techdays stehen wieder vor der Tür. Vorgestellt werden folgende Produkte: Office, Sharepoint und Exchange in der Version 2010.   Steffen Krause und Daniel Melanchton präsentieren alle wesentlichen Neuerungen anhand von vielen Demos.Termine:     08.12.2009: Stuttgart    09.12.2009: München    15.12.2009: Düsseldorf    16.12.2009: BerlinZur Anmeldung und Agenda über den LinkGrüße, dn\",\n  \"url\": \"https://onprem.wtf/post/microsoft-techday-dezember-2009/\"\n},{\n  \"id\": \"post-microsoft-hyper-v-server-2008-v1-vs-v2\",\n  \"title\": \"Microsoft Hyper-V Server 2008 V1 vs. V2\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Hyper-V\"],\n  \"content\": \"Der neue Microsoft Hyper-V Server 2008 R2 steht ja nun seit einigen Wochen auf TechNet zum downloaden bereit. Hier erkläre ich nochmal kurz alle Neuerungen.In der folgenden Tabelle werden die Features von Hyper-V V1 und V2 gegenübergestellt. Neu in V2 ist außerdem:   Hochverfügbarkeit und Live-Migration (nettes Feature)    Bis zu 384 virtuelle Maschinen und 512 virtuelle Prozessoren werden unterstützt    Virtuelle Festplatten können ab jetzt im laufenden Betrieb hinzugefügt bzw. entfernt werden. Ein Neustart ist nicht mehr nötig    Für die Netzwerkunterstützung: VMQ, TOE, Jumbo Frames    Möglichkeit von einem Flash-Speicher zu booten Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/microsoft-hyper-v-server-2008-v1-vs-v2/\"\n},{\n  \"id\": \"post-netlogon-fehler-5719-auf-server-(nicht-dc)\",\n  \"title\": \"Netlogon Fehler 5719 auf Server (nicht DC)\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Wenn der Fehler NETLOGON 5719 direkt nach dem starten des Servers (nicht DC) protokolliert wird, bedeutet das folgendes: Die Netlogon-Prozess hat stattgefunden bevor das Netzwerk bereit war und somit standen beim Anmeldeprozess keine Domänencontroller für die Authentifizierung zur Verfügung.Es gibt 2 Möglichkeiten das Problem zu beheben:1) Update des NetzwerkkartentreibersAls allererstes sollte der Netzwerkkartentreiber geupdated werden. In den meisten Fällen erledigt sich das Problem damit. Ich empfehle den Treiber immer von der Support-Webseite des Servers herunterzuladen, nicht vom NIC-Hersteller direkt (Bsp: Server von HP und Netzwerkkarte von Intel). Diese Treiber auf der Support-Webseite des Servers sind getestet und für das System freigegeben.2) Den Netlogon Service zwingen auf das Netzwerk zu wartenWenn der aktuelle Netzwerkkartentreiber nichts bringt, kann man den Netlogon-Prozess so zum warten zwingen:In der Registry muss der Eintrag “TermService” dem Schlüssel “DependOnService” hinzugefügt werden.    HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\NetlogonNachdem der Server neu gestartet wurde, sollte das Problem behoben sein.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/netlogon-fehler-5719-auf-server-(nicht-dc)/\"\n},{\n  \"id\": \"post-windows-7-e28093-update-von-rc-auf-rtm\",\n  \"title\": \"Windows 7 – Update von RC (7100) auf RTM (7600)\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Es ist zwar nicht wirklich empfohlen, gewünscht oder supported aber es geht. Windows 7 RTM Installationsdateien auf einen (vorbereiteten) USB Stick kopieren. In der Datei \\\\Sources\\\\cversion.ini muss der Wert MinClient auf 7100.0 (die entsprechende Build Nr. von der man updaten will) gesetzt werden. Man sollte für so ein Update einige Zeit einplanen, bei mir dauerte es ca. zwei Stunden. Das gilt übrigens auch für unterstützte Updates. Eine normale Windows 7 Installation ist bekanntlich in 20 Minuten abgeschlossen.Ein Update von x86 auf x64 oder umgekehrt lässt sich so natürlich auch nicht machen, dafür ist immer eine neuinstallation nötig. In diesem Post erklärt Daniel nochmal genau welche Updates unterstützt werden.Nochmal: ich empfehle dieses Workaround nicht für produktive Systeme, ich habe mein Notebook so aktualisiert und alles läuft wunderbar, aber es ist wie gesagt kein produktiv genutzter PC.Gruß    tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-update-von-rc-auf-rtm/\"\n},{\n  \"id\": \"post-windows-7-bootloader-os-hinzufugen\",\n  \"title\": \"Windows 7 Bootloader, OS hinzufügen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Der Windows Vista / 7 Bootloader hat sich ja im vergleich zu Windows XP geändert. In den früheren Windows Version konnte man die Datei Boot.ini bearbeiten um den Bootloader zu sagen was er tun soll. Ab der Version Vista nutzt man das Commandline-Tool bcdedit.exe.     Auf meinen Computer habe ich 2 Windows 7 Installationen. Auf C:\\\\befindet sich die erste, die zweite auf der Partition D:\\\\     Da ich das zweite Windows 7 durch den Restore eines Images aufgespielt habe, erscheint dies natürlich nicht automatisch in der Betriebssystemauswahl. Um das zweite Betriebssystem dem Bootloader hinzuzufügen, müssen folgende Schritte durchgeführt werden:1) Commandline mit Administratorrechte öffnen2) Einen neuen Eintrag dem Bootloader hinzufügenbcdedit /create /d “Windows 7 zweite Installation” /application osloader            Nachdem dieser Befehl ausgeführt wurde, bekommen wir eine ID       Bsp: {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395}3) Nun müssen wir den Bootloader noch sagen wo sich das zweite Betriebssystem befindet (D:)bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} device partition=C:      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} osdevice partition=D:4) Nun fügen wir den Pfad für den Bootloader und dem System Root Verzeichnis hinzubcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} path \\\\Windows\\\\system32\\\\winload.exe      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} systemroot \\\\Windows5) Als letztes stellen wir noch die Reihenfolge der Auflistung der Betriebssysteme festbcdedit /displayorder {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} /addlastNoch zur Info: Den Namen, der bei der Betriebssystemauswahl angezeigt wird, könnt ihr mit diesen Command ändern:bcdedit /set {current} description &quot;Windows 7 erste Installation&quot;Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-bootloader-os-hinzufugen/\"\n},{\n  \"id\": \"post-servergespeicherte-ts-profile-fehler-1543\",\n  \"title\": \"Servergespeicherte TS-Profile, Fehler 1543\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Client\",\"Server-2008\",\"Server-2003\"],\n  \"content\": \"Auf meinem Terminalserver-Cluster 2008 habe ich mehrere EventLog Warnungen mit der ID 1543 (User Profile Service) bemerkt. Die Einträge deuten darauf hin, dass das UserProfil nicht synchronisiert werden konnte. Die Einträge konnte man auf allen Servern im TS Cluster finden. Etwas zur Struktur: Als Server setze ich Windows Server 2008 ein, die Server sind auf Hyper-V Servern virtualisiert. Als Speicherort für die Profile benutze ich das DSF Feature von Server 2003 R2.Zuerst dache ich mir, dass es da Probleme mit dem Netzwerk gibt. Eines wollte ich aber noch versuchen bevor ich mit der Analyse des Netzwerkes starte: Windows-Defender.Nachdem ich den Windows-Defender auf allen Terminalservern deaktiviert hatte, konnte das Problem nicht mehr reproduziert werden. Anscheinend blockiert der Windows-Defender bei der Anmeldungen bestimmte Vorgänge, die der Server braucht um das User-Profil herunterzuladen. Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/servergespeicherte-ts-profile-fehler-1543/\"\n},{\n  \"id\": \"post-netzwerkprobleme-lassen-dynamics-absturzen\",\n  \"title\": \"Netzwerkprobleme lassen Dynamics abstürzen\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Wie ich in einem meiner letzten Posts versprochen hatte, hier der Post über die Dynamics Netzwerkprobleme.Mein Microsoft Dynamics Server arbeitete immer sehr zuverlässig, das EventLog war frei von den unbeliebten “roten Kreuzen”. Bis an den Tag x, an dem der Dynamics Service seinen Dienst verweigerte und im laufenden Betrieb stoppte. Im EventLog wurden folgende Fehlermeldungen protokolliert: Der Fehler “Error 1450 in module 1..\\\\server.cpp(498) weißt auf zu wenig Server-Ressourcen hin. Dieser Fehler konnte durch die Korrektur nicht optimaler Einstellungen an der Auslagerungsdatei behoben werden.Der Fehler “Error 3 in module 244..\\\\server.cpp(351) weißt auf einen TCP-Fehler hin. Durch die Installation der neuesten Soft- und Firmware der Netzwerkkarte konnte ich das Problem beheben.Nun ist das EventLog wieder sauber und der Server hat bisher seinen Betrieb nicht wieder unterbrochen.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/netzwerkprobleme-lassen-dynamics-absturzen/\"\n},{\n  \"id\": \"post-upgrade-auf-windows-7\",\n  \"title\": \"Upgrade auf Windows 7\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Die beiden Betriebssysteme Windows XP und Vista können durch eine Upgrade-Lizenz auf Windows 7 geupdated werden. Für alle anderen Betriebssysteme braucht es eine Vollversion.Beim Upgrade unterscheiden wir 2 Szenarien:    Custom Install: Das Betriebssystem muss komplett neu installiert werden.    In-Place Upgrade: Das bestehende Betriebssystem kann auf Windows 7 geupdatet werden und übernimmt somit alle vorhandenden Einstellungen bzw. Programme.Anhand dieser Matrix kann man feststellen in welchen Fällen ein In-Place Upgrade möglich ist.&#160; Quelle der Grafik: http://blogs.technet.com/dmelanchthon/Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/upgrade-auf-windows-7/\"\n},{\n  \"id\": \"post-sharepoint-logfiles-verkleinern\",\n  \"title\": \"Sharepoint LogFiles verkleinern\",\n  \"author\": \"dni\",\n  \"tags\": [\"Sharepoint\"],\n  \"content\": \"In letzter Zeit ist mir aufgefallen, dass der freie Speicherplatz auf meinem Sharepoint-Server immer kleiner wird. Nachdem ich mich ein bisschen auf der Partition umgesehen hatte fielen mir die großen LOG Files der Sharepoint Datenbank auf.    Wenn ihr wie ich Sharepoint in den Standardeinstellungen inkl. der Windows Internal Database installiert habt, so legt Sharepoint die Files unter C:\\\\WINDOWS\\\\SYSMSI\\\\SSEE\\\\MSSQL.2005\\\\MSSQL\\\\Data ab.         In meinem Fall hat das Content-Log 8 GB und das Config-Log 5 GB verbraten.         Um die LogFiles nun zu verkleinern muss zunächst SQL Server Management Express installiert werden.Danach muss die Datenbank mit den folgenden Parameter geöffnet werden: \\\\\\\\.\\\\pipe\\\\MSSQL$MICROSOFT##SSEE\\\\sql\\\\query Nachdem die Datenbank geöffnet wurde wählt man die Datenbank aus, deren LogFiles verkleinert werden sollen. Nach einem Rechtsklick auf die Datenbank wählt man Tasks / Verkleinern / DateienNun erscheint das Optionsfenster. Hier muss als Dateityp Protokoll ausgewählt werden. Als Information erhält man hier wie groß das aktuelle LogFile und zu wie viel es belegt ist. Im unteren Bereich kann der Speicherplatz neu organisiert werden. (In meinem Fall 2 GB) Nachdem die Eingaben bestätigt werden, schrumpft das LogFile auf die angegebene Größe zusammen.    Dieser Schritt kann für alle Datenbanken vorgenommen werden, dessen LogFile zu groß ist.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/sharepoint-logfiles-verkleinern/\"\n},{\n  \"id\": \"post-exchange-2010-e28093-dynamic-signature\",\n  \"title\": \"Exchange 2010 – Dynamic Signature\",\n  \"author\": \"tto\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Ein leidiges Thema mit den bisherigen Exchange und Outlook Versionen war die zentrale Verwaltung von Signaturen. Die meisten Administratoren verwendeten Skripts oder dritthersteller Tools um das Problem einigerma&szlig;en in den Griff zu bekommen.Mit Exchange 2010 stellt Microsoft (endlich) eine M&ouml;glichkeit vor um die Signaturen zentral zu verwalten und dynamisch zu erstellen. Verwendet wird dazu der seit Exchange 2007 bekannte Disclaimer, dieser wurde erweitert und kennt jetzt HTML Tags und Attribute aus dem Active Directory.Konfiguriert wird der Disclaimer in der Hub Transport Rolle auf Organisationsebene. Man erstellt eine neue Transport Rule indem man einfach mit rechts auf den Knoten Hub Transport klickt und &ldquo;New Transport Rule&rdquo; ausw&auml;hlt.Nachdem man Namen und Beschreibung vergeben hat, kann per Filter festgelegt werden f&uuml;r welche Mails diese Regel gelten soll. Mehr Details zu den Filterm&ouml;glichkeiten: Exchange 2010 Transport Rule Predicates.&nbsp;Als Action w&auml;hlt man &ldquo;Append disclaimer text and fallback to action if unable to apply&rdquo;. Dort kann ein beliebiger Text eingegeben werden den man mit HTML Tags formatieren und mit Platzhaltern wie %%DisplayName%% personalisieren kann. Neben dem Text kann man auch die Fallback Action festlegen, d.h. was Exchange mit der Nachricht machen soll wenn der Disclaimer nicht angewendet werden kann. Es gibt drei M&ouml;glichkeiten:wrap: die originale Nachricht wird in einen Anhang gepackt, und der Disclaimer wird in die neue Nachricht eingef&uuml;gt.reject: die Nachricht wird nicht &uuml;bermittelt, der Sender erh&auml;lt ein NDR in dem steht warum die Nachricht nicht &uuml;bermittelt werden konnte.ignore: die Nachricht wird unver&auml;ndert &uuml;bermittelt, es wird kein Disclaimer angeh&auml;ngt.Einige Details noch im Technet: Understanding DisclaimersZum Schluss kann man noch Au&szlig;nahmen definieren, f&uuml;r welche die Regel nicht zutreffen soll:Jetzt fehlt noch der klick auf New und die Regel wird erstellt. Es wird ab jetzt also jedem Mail das den Konditionen entspricht der Disclaimer Text angef&uuml;gt, egal ob es von OWA oder Outlook kommt.Eine endg&uuml;ltige L&ouml;sung stellt diese Funktion nicht dar, denn ein Nachteil des Disclaimers ist dass er am Ende der Nachricht eingef&uuml;gt wird. Antwortet man also auf ein Email so steht die Signatur (Disclaimer) ganz unten, unter dem zitiertem Mail. Alles in allem ist das meiner Meinung nach ein Schritt in die richtige Richtung, allerdings fehlt noch einiges bis zum Ziel.\",\n  \"url\": \"https://onprem.wtf/post/exchange-2010-e28093-dynamic-signature/\"\n},{\n  \"id\": \"post-fehler-bei-hp-netzwerkkarten-update\",\n  \"title\": \"Fehler bei HP Netzwerkkarten Update\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Zu Abwechslung mal ein Problem aus der HP Welt:Für heute habe ich das Firmware / Treiber Update meiner HP ML 350 G5 Server geplant. Zuerst habe ich mir die neueste Firmware-CD von HP gezogen und diese dann installieren lassen. Alles verlief ohne Probleme.    Danach wollte ich die Treiber updaten und habe bemerkt, dass jede Komponente geupdated wurde, nur der Treiber der Netzwerkkarte (v. 5.0.16.0) nicht.     Das war sehr ärgerlich, denn dieser Treiber war der Wichtigste, denn es gab Netzwerkprobleme mit Microsoft Dynamics. Folgender Fehler wurde ausgegeben: “HP Virtual Bus Device installation requires a newer version. Version 4.6.16.0 is required.”Um den Treiber dennoch installieren zu können, muss zuerst auf die Version 4.6.16.0 geupdated werden, dann kann man erst die neueste Version installieren: Link zum Treiber v4.6.16.0 Grüße, dnPS: Wenn die Netzwerkprobleme mit Dynamics behoben sind, werde ich dazu noch einen Post veröffentlichen. (kleiner Ausflug in die ERP-Software :) )\",\n  \"url\": \"https://onprem.wtf/post/fehler-bei-hp-netzwerkkarten-update/\"\n},{\n  \"id\": \"post-e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung\",\n  \"title\": \"“DATA ENCRYPTION” Fehler bei RDP Verbindung\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2003\",\"Server\"],\n  \"content\": \"Kürzlich hatte ich ein seltsames Problem mit der RDP Verbindung auf einem meiner Server die im Ausland stehen und nur über RDP erreichbar sind.   Jedes Mal wenn ich eine RDP Verbindung starten wollte, erschien die Fehlermeldung, dass ein Netzwerkfehler vorliegt.Im Eventlog wurde ein Fehler protokolliert, dass die RDP-Protokollkomponente “DATA ENCRYPTION” ein Problem verursachte. Glücklicherweise funktionierte der Zugriff durch AdminMagic noch, sodass ich mit der Fehlerbehebung beginnen konnte.Um die RDP Verbindung wieder flott zu bekommen muss folgender Registry-Eintrag gelöscht werden:HKEY_LOCAL_MACHINE\\\\System\\\\CurrentControlSet\\\\Services\\\\TermService\\\\     Parameters\\\\ CertificateNach einem Neustart des Servers konnte ich mich wieder via RDP auf dem Server verbinden.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung/\"\n},{\n  \"id\": \"post-windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden\",\n  \"title\": \"Windows Server / Hyper-V Server 2008; storflt kann nicht geladen werden\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Nachdem ich alle meine Hyper-V Server 2008&#160; auf SP2 aktualisiert habe, erhalte ich beim Start der Maschinen einen Fehler im Ereignisprotokoll, dass storflt nicht geladen werden konnte. Dieser Fehler ergibt sich aus upgedateten Treibern für den Hypervisor durch SP2 und wird nur auf physischen Maschinen protokolliert. Der Eventlog-Eintrag kann einfach ignoriert werden.Mit dem Befehl sc delete storflt wird der Dienst storflt gelöscht und der Fehler nicht mehr protokolliert. Dies darf jedoch nur für den Windows Server 2008 gemacht werden, nicht für den Hyper-V Server, da dieser den Service für die virtuellen Maschinen braucht.Sollte der Service auf einem Hyper-V Server gelöscht werden, bleibt dieser beim Starten mit einem Bluescreen stehen. Durch die “Letzte bekannte Konfiguration” kann der Server aber wieder gestartet werden.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden/\"\n},{\n  \"id\": \"post-active-directory-verwaltungscenter\",\n  \"title\": \"Active-Directory-Verwaltungscenter\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\"],\n  \"content\": \"Mit dem Windows Server 2008 R2 ist ein neues Verwaltungs-Feature hinzugekommen: “Active-Directory-Verwaltungscenter”. Das neue Verwaltungscenter basiert auf der PowerShell v2 was bedeutet, dass jede Aktion im Hintergrund einen PowerShell Befehl startet.     Durch dieses neue Feature soll dem Administrator die tägliche AD-Objektverwaltung vereinfacht werden. Für folgende Aufgaben kann die neue Konsole verwendet werden (Auszug aus technet.microsoft.com)   Erstellen neuer Benutzerkonten oder Verwalten vorhandener Benutzerkonten     Erstellen neuer Gruppen oder Verwalten vorhandener Gruppen     Erstellen neuer Computerkonten oder Verwalten vorhandener Computerkonten     Erstellen neuer Organisationseinheiten und Container oder Verwalten vorhandener Organisationseinheiten     Herstellen von Verbindungen mit einer oder mit mehreren Domänen bzw. Domänencontrollern in derselben Active Directory-Verwaltungscenterinstanz und Anzeigen oder Verwalten der Verzeichnisinformationen für diese Domänen oder Domänencontroller     Filtern von Active Directory-Daten mithilfe der abfragegenerierenden Suche  Die Oberfläche Die Oberfläche wirkt strukturiert und Übersichtlich. Die Suche Häufig verwendete Kriterien lassen sich schnell der Suche hinzufügen. Neuen Benutzer anlegen Einfache Navigation durch die Container&#160;Auf mich wirkt die Oberfläche sehr übersichtlich und durchdacht. Alle Aufgaben lassen sich jedoch nicht abbilden, sodass man auf die Konsole “Active-Directory-Benutzer und Computer” nicht völlig verzichten kann.    Im täglichen AD-gebrauch spricht einer Verwendung der neuen Konsole jedoch nichts dagegen.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/active-directory-verwaltungscenter/\"\n},{\n  \"id\": \"post-language-pack-fur-windows-7\",\n  \"title\": \"Language Pack für Windows 7\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Für Windows 7 in der Enterprise und Ultimate Edition sind die Language Packs nun verfügbar.Im Windows Update Fenster lassen sich die Pakete herunterladen und installieren. Nachdem das Paket heruntergeladen und installiert wurde, kann es in der Systemsteuerung unter “Region und Sprache” bei “Anzeigesprache” aktiviert werden.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/language-pack-fur-windows-7/\"\n},{\n  \"id\": \"post-hyper-v-server-2008-r2-cluster\",\n  \"title\": \"Hyper-V Server 2008 R2 Cluster\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Hyper-V\",\"Server\",\"Server-2008-R2\"],\n  \"content\": \"Da der Hyper-V Server 2008 R2 und der Windows Server 2008 R2 nun RTM sind, habe ich mir den Hyper-V Cluster näher angeschaut.        Für die Simulation habe ich 3 physische Computer verwendet:2 Hyper-V Server 2008 R2   1 Windows Server 2008 R2 (inkl. iSCSI Target)Das zentrale Storage wird über iSCSI angebunden. Dafür verwenden wir den Windows Server 2008 R2.Topologie&#160; Um den Cluster zu erstellen müssen 8 Schritte durchgeführt werden:Schritt 1 Hyper-V Server und Server 2008 R2 auf den 3 Computern installierenDie beiden Hyper-V Server werden mit der Standard-Installation installiert. Der Windows Server 2008 R2 wird zusätzlich zum DC heraufgestuft um die Domäne hyper.local bereit zu stellen.Schritt 2 Firewall deaktivierenFür den Test habe ich auf den 3 Servern die Firewall deaktiviert, um nicht die entsprechenden Ports öffnen zu müssen.Schritt 3 Hyper-V Server in Domäne aufnehmenAls nächstes werden die Hyper-V Server in die Domäne aufgenommen.Schritt 4 Verwaltungstools auf dem Windows Server installierenUm den Cluster später steuern zu können müssen wir 2 Konsolen installieren: Clusterverwaltung und die Hyper-V Tools. Die Konsolen können unter den Features aktiviert werden. Schritt 5 iSCSI Target installieren und konfigurierenAls iSCSI Target Software habe ich das Tool von StarWind verwendet. Nachdem das Programm installiert wurde, kann man sich unter den Benutzernamen “test”, Password “test” anmelden und das Target entsprechen konfigurieren.Am iSCSI Target erstellen wir zunächst 2 virtuelle Volumes. 1 Volume wird als Quorumdatenträger für den Cluster verwendet, das andere als Storage für die VHD’s. Wichtig ist dabei, dass die Option “Allow multiple concurrent iSCSI connections (clustering)” verwendet wird, somit können beide Hyper-V Knoten gleichzeitig auf die Volumes zugreifen.Schritt 6 Hyper-V Server mit den iSCSI Volumes verbindenJetzt muss noch die Verbindung zwischen den Hyper-V Server und dem iSCSI Target hergestellt werden. In der Version R2 des Hyper-V Servers wurde eine grafische Oberfläche für den iSCSI-Initiator hinzugefügt. Der Initiator wird mit den Command iscsicpl gestartet. Nachdem wir zugestimmt haben den iSCSI Dienst zu starten, erhalten wir die Oberfläche wo wir die IP Adresse des iSCSI Targets eintragen und uns zunächst nur mit dem Quorum Volume verbinden.Jetzt muss das Volume noch entsprechend Formatiert werden.Schritt 7 Cluster einrichtenNun können wir den Cluster erstellen. Wir verbinden uns auf die Hyper-V Server und aktivieren mit Option 11 die Failoverclusterfeatures.Nachdem die Features auf beiden Servern aktiviert sind, öffnen wir den Failovercluster-Manager auf dem Windows Server und starten die Clusterkonfiguration.Nachdem wir beide Hyper-V Server für den Cluster angegeben haben, startet die Konfigurationsüberprüfung. Sofern bis hierhin alle richtig Konfiguriert wurde, sollte der Check keine Fehler aufzeigen.&#160; Nachdem der Cluster vollständig erstellt wurde, werden beide Hyper-V Server im Manager angezeigt.Da wir den Quorumdatenträger bereits mit beiden Cluster-Knoten verbunden haben, wurde dieser erkannt und schon als Quorumdatenträger konfiguriert.Jetzt verbinden wir das Storage-Volume mit den beiden Cluster Knoten um auf die VHD’s zuzugreifen. Bevor das Volume benutzt werden kann, muss es noch formatiert werden.    Jetzt aktivieren wir im Failovercluster-Manager die “Cluster Shared Volumes” und erlauben somit gleichzeitigen Zugriff auf die VHD’s. Um nun das Storage-Volume einzubinden, müssen wir es zunächst dem “Speicher” und dann den “Freigegeben Clustervolumes” (Cluster Shared&#160; Volumes) hinzufügen.Sobald Cluster Shared Volumes verwendet werden, kann man auf diese unter C:\\\\ClusterStorage\\\\ zugreifen. Für jedes Volume wird ein eigener “Ordner” erstellt.Schritt 7 Virtuelle Maschine erstellenAls nächstes erstellen wir eine virtuelle Maschine (z.B. Windows XP) und ein virtuelles Netzwerk über die zuvor installierte Hyper-V Konsole auf einem der Hyper-V Server. Die VHD und entsprechende Konfigurationsdatei wird dabei auf dem Storage-Volume erstellt. Wichtig: Die virtuelle Maschine muss mit dem Netzwerkadapter verbunden werden bevor sie hochverfügbar gemacht wird, sonst kann die Maschine nicht auf den anderen Knoten verschoben werden.Schritt 8 Virtuelle Maschine hochverfügbar machenUm die virtuelle Maschine hochverfügbar zu machen, fügen wir einen neuen Dienst hinzu. Dabei muss geachtet werden, dass sich die Maschine im Status beendet oder gespeichert befindet. Ich empfehle die Maschine komplett herunterzufahren um Probleme zu vermeiden. Wir erhalten danach eine Liste mit den virtuellen Maschinen. Nachdem wir die Testmaschine ausgewählt haben, startet die Konfiguration um den Host hochverfügbar zu machen.Die Konfiguration ist soweit abgeschlossen.Test 1 Quick- und Live-MigrationQuick- und Live-Migration sind beides Verfahren um virtuelle Maschine auf einen anderen Knoten zu verschieben.&#160; Mehr Infos (Whitepapers) zu Live- und Quick-MigrationLive Migration    In meinen Test habe ich für die Live-Migration lediglich 1 Ping verloren.&#160;Quick-Migration     Für den Umzug auf den 2. Knoten durch Quick-Migration gingen 9 Pings an die virtuelle Maschine verloren.&#160; Test 2 Ausfall von einem Hyper-V Server simulierenAls 2. Test habe ich den Stromstecker des Hyper-V Servers gezogen, der aktuell die virtuelle Maschine hostet. Der Failovercluster hat nach wenigen Sekunden die virtuelle Maschine auf dem 2. Konten neu gestartet.   Grüße,dn\",\n  \"url\": \"https://onprem.wtf/post/hyper-v-server-2008-r2-cluster/\"\n},{\n  \"id\": \"post-applocker\",\n  \"title\": \"AppLocker\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\"],\n  \"content\": \"In einem meiner letzten Beiträge habe ich kurz über ein paar Neuerungen von Windows 7 berichtet. Mittlerweile habe ich mir das Feature “AppLocker” näher angeschaut:Mit AppLocker kann man den Clientcomputer noch besser schützen, indem man nun sehr viel genauer vorgeben kann welche Anwendungen ein Benutzer ausführen bzw. installieren darf. AppLocker kann über ein Domänen- oder über die lokale-GPO konfiguriert werden.Wie man AppLocker verwendet zeige ich Anhand von folgendem Beispiel: Benutzern ist es nur erlaubt Applikationen auszuführen, die sich unter %Programfiles% und %Windir% befinden. Benutzer die der Gruppe “Not Restr Access” angehören ist es außerdem erlaubt das Testprogramm “Excel Viewer 2003” aus dem Verzeichnis “C:\\\\Program Files 2” zu starten. Als erstes öffnet man das GPO und wechselt zur Option “AppLocker”&#160;Für die Option Executable Rules lassen wir die Standardregeln generieren (“Create default Rules”). Nachdem diese konfiguriert sind, findet man 3 Regeln vor:        1. Admins dürfen alle Programme aufrufen    2. User dürfen Programme aus %Windir% starten    3. User dürfen Programme aus “%Programfiles% starten Jetzt müssen wir eine neue Regel erstellen, die der Benutzergruppe “Not Restr Access” erlaubt unsere Testapplikation zu starten. Über “Create New Rule” wird der entsprechende Wizard gestartet. Wir wählen die Option “Allow” und beziehen die Regel auf die Gruppe “Not Restr Access”. Jetzt haben wir 3 Möglichkeiten. Über die Option Publisher kann ein einzelnes signiertes Programm freigegeben oder gesperrt werden, über die Option Path ein ganzer Pfad und über die Option File Hash eine nicht-signierte Applikation. Im unseren Beispiel wählen wir die Option Publisher, da der Excel Viewer von Microsoft zertifiziert ist. Nachdem die Applikation ausgewählt wurde, kann über einen Schieberegler die Genauigkeit der Prüfung von AppLocker eingestellt werden. (Bsp. AppLocker soll nur den Dateinamen, nicht die Dateiversion prüfen) Wenn nötig können im nächsten Schritt noch Ausnahmen definiert werden. Somit haben wir unsere Regel definiert.Wichtig: AppLocker ist auf einen Dienst angewiesen der aus Sicherheitsgründen nicht automatisch startet. Damit die Einstellungen greifen, muss der Dienst “Application Identity” gestartet werden. Ich empfehle den Dienst solange im Startmodus “Manuell” zu belassen, bis alle Einstellungen passen. Wenn wir jetzt den Test machen, können Benutzer aus der Gruppe “Not Restr Access” problemlos den Excel Viewer starten. Benutzer, die nicht dieser Gruppe angehören, erhalten eine Fehlermeldung. Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/applocker/\"\n},{\n  \"id\": \"post-windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn\",\n  \"title\": \"Windows 7, Server 2008 R2 und Hyper-V Server 2008 R2 in Deutsch auf TechNet/MSDN\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\",\"Server\",\"Server-2008-R2\",\"Hyper-V\"],\n  \"content\": \"Für TechNet bzw. MSDN Abonnenten stehen nun auch die deutschen ISO’s zu Windows 7 bereit. Zeitgleich wurde der Server 2008 R2 und der Hyper-V Server 2008 R2 zum downloaden bereit gestellt.TechNet    MSDNGrüße, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn/\"\n},{\n  \"id\": \"post-windows-virtual-pc-e28093-undo-und-differencing-disks\",\n  \"title\": \"Windows Virtual PC – UnDo und Differencing Disks\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"In meinem letzen Beitrag über den Windows Virtual PC habe ich die Undo und differenzierenden Festplatten erwähnt, hier die versprochenen Details.UnDo Disks – Snapshots für Virtual PC!?Bei den UnDo Disks handelt es sich um ein Feature das ich in bisherigen Virtual PC Versionen immer vermisste: Man kann den Status einer VM vor einer Änderung sichern und kann auf den Punkt der Sicherung zurückspringen wenn die Änderung nicht so funktioniert wie man sich das vorgestellt hat.UnDo Disks werden in den Einstellungen der VM aktiviert. Die Virtuelle Maschine muss ausgeschaltet (heruntergefahren) sein damit die Option zur Verfügung steht. Beim nächsten Start der VM wird eine .vud Datei erstellt, in dieser werden (wie bei einem Snapshot in der Enterprise Umgebung) ab jetzt&#160; alle Änderungen gespeichert. Die VHD bleibt unverändert. In der Zwischenzeit habe ich um eine Änderung zu simulieren einfach mal ein Programm installiert. Man sieht auch gleich dass die .vud Datei größer wird. Um die Änderungen in die VHD zu übernehmen bzw. diese zu verwerfen muss man die VM wieder schließen (herunterfahren/Ruhezustand) und in den Einstellungen den entsprechenden Punkt auswählen. Ich habe mich entschieden die Änderungen zu verwerfen also wird meine .vud Datei gelöscht. Nach dieser Aktion wird wieder von der VHD gestartet und alles ist so wie es vorher war.     Wenn man Änderungen übernimmt werden diese in die VHD geschrieben.Lässt man die Undo Disk aktiv und startet die Virtuelle Maschine wieder, wird erneut eine .vud Datei erstellt in der alle Änderungen bis zum Übernehmen oder Verwerfen separat gespeichert werden. Um die Undo Disk zu deaktivieren muss die virtuelle Maschine heruntergefahren werden, im Ruhezustand geht das nicht.Insgesamt also ein super Feature, spart einem sicher ‘ne Menge Arbeit.Differencing DisksIm zweiten Beispiel installiere ich mehrere neue VMs in differenzierenden Disks auf Basis einer bereits bestehenden Maschine.Wichtig: Differenzierende Virtuelle Maschinen basieren auf einer bereits installierten VM, wenn ich also für eine Testumgebung mehrere VMs brauche kann ich eine bestehende beliebig oft duplizieren und so Zeit sparen. Ich habe die Quell-VM mit sysprep vorbereitet um Probleme mit gleichen SID und Computernamen zu verhindern. Wichtig ist außerdem dass man die Quell-VHD herunterfährt und auf Schreibgeschützt setzt, denn wenn diese geändert wird sind alle erstellten Differenzierenden Disks ungültig.Update: Wenn man die VMs so dupliziert erhalten alle “Child” VMs die gleiche MAC Adresse. Die einzige Lösung die ich im Moment gefunden habe ist in der .vmc Datei die MAC Adresse zu löschen, dann wird einen neue generiert. Also kann man sagen um die Quell VM richtig vorzubereiten muss man 3 Punkte beachten:   Betriebssystem vorbereiten (sysprep)     Quell VM herunterfahren und VHD als Read-Only markieren     MAC Adresse aus der Konfigurationsdatei der Quell VM löschen     Man erstellt also eine neue VM über den Button “Create virtual machine” und gibt ihr einen Namen. Bei Add Disk wählt man “Create a Virtual Hard Disk using advanced options” und dann “Differencing Hard Disk”. Der neuen HD kann man einen Namen geben und dann muss man die Quell-VHD (parent) angeben. Wenige Sekunden später hat man eine neue VM bei der man nur noch die Windows Einstellungen anpassen muss. Der Vorteil ist dass nicht die ganze Quell-VM kopiert wird, sondern nur der Teil ab dem man die Differenzierende HD erstellt. So spart man neben viel Zeit auch noch einiges an Speicherplatz.viele Grüße!    tt\",\n  \"url\": \"https://onprem.wtf/post/windows-virtual-pc-e28093-undo-und-differencing-disks/\"\n},{\n  \"id\": \"post-windows-virtual-pc\",\n  \"title\": \"Windows Virtual PC\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Mit Windows 7 wurde auch der Windows XP Mode vorgestellt. Dieser basiert auf der neuen Virtualisierungstechnologie Windows Virtual PC.Voraussetzung für die Verwendung des Windows VPC ist dass die CPU Virtualisierungstechnologien unterstützt. Mit diesen Tools kann man überprüfen ob Virtualisierung unterstützt wird: Intel, AMDDie Virtualisierungstechnologien müssen im BIOS noch aktiviert werden, also am besten im Handbuch des Mainboard Herstellers nachschlagen.    Tipp: Bei HP Computern ist die Einstellung unter “Sicherheit” versteckt, nicht unbedingt logisch aber bitte.Auf die Installation des XP-Mode möchte ich nicht weiter eingehen, den kann man sich selbst herunterladen und mit wenigen Klicks installieren.Ich habe die Virtuellen Maschinen selbst installiert und die Integration Features und Auto Publish aktiviert, so kann ich in Windows 7 Programme aus meinen virtuellen Vista und XP Maschinen verwenden. So präsentiert sich der neue Virtual PC, integriert in ein normales Explorer Fenster hat man die Möglichkeit Virtuelle Maschinen und Festplatten zu erstellen, zu bearbeiten oder zu löschen. Durch einen rechtsklick auf die VM kommt man zu den bekannten Einstellungen. Eine neue virtuelle Maschine wird einfach durch klicken auf “Create virtual machine” erstellt, in den folgenden Dialogen wird der Speicherort für VHD und Konfigurationsdateien festgelegt. Im nächsten Dialog kann der Arbeitsspeicher festgelegt werden und Networking für die VM aktiviert oder deaktiviert werden. Abschließend entscheidet man sich für einen VHD Typ (Fix, Dynamisch, Differenzierend) seiner Wahl und klickt auf Create. Ein genauerer Blick lohnt sich auf die Undo Disk Option, bei dieser werden die Änderungen die man in der VM macht in einem separatem File gespeichert. So kann man fehlgeschlagenen Änderungen immer wieder verwerfen. Dazu (und zum Thema Differenzierende Festplatte) gibts einen eigenen Artikel.&#160;Und schon haben wir eine VM erstellt. In den Einstellungen (rechtsklick auf die VM) kann man noch genauere Einstellungen definieren, für mich reicht es aber vorerst das CD Image für die Installation auszuwählen. Wenn man die VM startet wird von “CD” gestartet und die Windowsinstallation beginnt. Hat man das Betriebssystem installiert, sollte man die Integration Features aktivieren (Klick auf Tools, Enable Integration Features). Mit diesen Features kann man Sound, Zwischenablage, Drucker, Smart Cards und die Laufwerke des Lokalen Computers in der VM verwenden.Möchte man außerdem die Programme der VM auf dem physikalischen Computer verwenden muss man noch ein Update Installieren und “Auto publish” in den Einstellungen der VM aktivieren.Update for Windows XP SP3 to enable RemoteApp     Update for Windows Vista SP1 or above to enable RemoteApp Im Startmenü von Windows 7 werden nun die Programme angezeigt die in den Virtuellen Maschinen installiert sind.&#160; Wichtig: Es muss eine Verknüpfung mit dem Programm und All Users/Startmenü erstellt werden, nur dann werden die Programme korrekt angezeigt. Um ein Virtuelles Programm zu starten muss die Virtuelle Maschine geschlossen sein. Wenn sie sich im Ruhezustand befinden wird sie im Hintergrund automatisch gestartet.viele Grüße!   tt\",\n  \"url\": \"https://onprem.wtf/post/windows-virtual-pc/\"\n},{\n  \"id\": \"post-bitlocker-to-go\",\n  \"title\": \"BitLocker To Go\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Mit BitLocker To Go lassen sich lokale / externe Datenträge sowie USB Sticks einfach verschlüsseln. Eine neue Funktion ist zudem, dass die Partition bzw. das Laufwerk nicht nur verschlüsselt, sondern auch mit Passwort geschützt wird. Die Verschlüsselungsstärke kann über eine GPO von 128 auf 256 Bit erhöht werden.Um den mit BitLocker verschlüsselten Datenträger auf Windows Vista bzw. XP verwenden zu können muss der Datenträger zwingend mit FAT formatiert sein. In diesem Legacy-Modus kann mit Vista und XP auf dem Datenträger nur gelesen, nicht geschrieben werden.Anleitung um BitLocker To Go zu aktivieren1) Datenträger mit FAT formatieren   2) BitLocker für den Datenträger aktivieren 3) Art des Schutzes wählen (Passwort oder Smart Card) 4) Nun muss gewählt werden, in welcher Form der Wiederherstellungsschlüssel&#160; gespeichert wird. Der Wiederherstellungsschlüssel dient dazu den Datenträger zu entschlüsseln, sollte man das Passwort vergessen haben. Man hat hier 2 Möglichkeiten: Den Key speichern oder drucken.5) Nun kann das Laufwerk verschlüsselt werden Windows 7    Steckt man den Datenträger nun in den Windows 7 Computer, so erscheint folgende Passwortabfrage bevor auf dem Datenträger lesen und schreiben werden kann. Windows Vista bzw. XP     Steckt man den Datenträger in einem Vista oder XP Rechner startet das “BitLocker To Go-LeseTool”. Nach Eingabe des Passwortes kann auf dem Datenträger gelesen werden.&#160;Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/bitlocker-to-go/\"\n},{\n  \"id\": \"post-windows-7-sicherheitsproblem-in-uac\",\n  \"title\": \"Windows 7 - Sicherheitsproblem in UAC\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Auf diversen Blogs ist zu lesen dass es ein Problem mit der Benutzerkontensteuerung (UAC, User Account Control) in Windows 7 gibt. Das habe ich mir gestern kurz angesehen und hier ist das Ergebnis. (getestet mit Windows 7 RC, 7100)Es war möglich mit dem Tool von Leo Davidson ein beliebiges Programm mit administrativen Rechten zu starten ohne eine UAC abfrage hervorzurufen. Aber ich musste Mitglied einer Gruppe mit administrativen Rechten sein (z.B. Administratoren), als normaler User funktionierte es nicht. Wenn man also mit in der UAC nur noch “Ja ich will&quot; klicken müsste, dann kann man sie mit dem Code Injection Issue umgehen, wird ein Passwort abgefragt funktioniert das Ganze anscheinend nicht.Meiner Meinung nach handelt es sich hier also um ein Problem, jedoch ist es in meinen Augen nicht so dramatisch. Im Enterprise Umfeld sollte eh kein User Mitglied in administrativen Gruppen sein und zu Hause wird man wohl kaum (gewollt) seinen eigenen PC abschießen. Trotzdem sollte sich Microsoft das Problem zu Herzen nehmen, denn der Entwickler hat es genau Dokumentiert und laut eigenen Angaben MS schon seit längerem informiert.Links zu Artikeln Rund um dieses Thema:Long Zheng 1, 2, Video    Leo Davidsonviele Grüße   tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-sicherheitsproblem-in-uac/\"\n},{\n  \"id\": \"post-windows-7-neuerungen-auf-den-ersten-blick\",\n  \"title\": \"Windows 7 Neuerungen auf den ersten Blick\",\n  \"author\": \"dni\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Benutzeroberfl&auml;che Was einem sofort ins Auge sticht ist die v&ouml;llig &uuml;berarbeitete Oberfl&auml;che. Ge&ouml;ffnete Programme scheinen als Icons in der Taskleiste auf und genehmigen Einblicke auf die ge&ouml;ffneten Fenster.WLAN Auf der rechten Seite der Taskleiste findet sich eine &Uuml;bersicht der verf&uuml;gbaren Drahtlosnetzwerke. Die Verbindungen lassen sich mit einen klick auf Connect z&uuml;gig herstellen.BitLocker to Go Mit dieser Erweiterung von BitLocker lassen sich Wechseldatentr&auml;ger verschl&uuml;sseln. Somit sind auch Daten die unterwegs mitgenommen werden gesch&uuml;tzt. Einfach den USB Stick anschlie&szlig;en und im BitLocker Men&uuml; die Verschl&uuml;sselung aktivieren.&nbsp;Oberfl&auml;che Die Verwaltung zu Oberfl&auml;chenanpassung wurde sehr viel &Uuml;bersichtlicher gestaltet. Neue Styles lassen sich einfach ausw&auml;hlen und aktivieren.Media Center + Media Player 12 Das Media Center wurde &uuml;berarbeitet. Die Men&uuml;s sind klarer strukturiert und die Konfiguration l&auml;sst sich in wenigen Schritten beenden.Der Media Player hat auch ein neues Gesicht bekommen. Die Multimedia-Unterst&uuml;tzung wurde durch zus&auml;tzliche Codes f&uuml;r langsame Systeme optimiert.Die Installation vom USB Stick hat keine halbe Stunde gedauert und schon war Windows 7 betriebsbereit. Auf den ersten Blick macht Windows 7 RTM einen sehr guten Eindruck. Was das Betriebssystem in Sachen Performance und Alltagstauglichkeit leisten kann wird sich in den n&auml;chsten Wochen zeigen. Es wird sicher noch der ein oder andere Post von Thomas und mir diesbez&uuml;glich erscheinen.Gr&uuml;&szlig;e, dn\",\n  \"url\": \"https://onprem.wtf/post/windows-7-neuerungen-auf-den-ersten-blick/\"\n},{\n  \"id\": \"post-remoteapp-mit-zertifikat\",\n  \"title\": \"RemoteApp mit Zertifikat\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\",\"Server\",\"Server-2008\"],\n  \"content\": \"Die Sicherheit von RemoteApp Programmen kann erh&ouml;ht werden indem die Echtheit des Servers mit einem Zertifikat best&auml;tigt wird. Daf&uuml;r habe ich ein Computerzertifikat f&uuml;r den Terminal Server ausgestellt der die RemoteApp Programme hosted. Das ausgestellte Zertifikat muss nat&uuml;rlich g&uuml;ltig sein, d.h. Datum und Namen m&uuml;ssen stimmen und die ausstellende CA (Enterprise CA in meinem Fall) muss vertrauensw&uuml;rdig sein.&nbsp;Um RemoteApp Programme mit Zertifikaten zu signieren muss man nicht wie bei den Makros (wie Daniel schreibt) eine Richtlinie f&uuml;r Softwareeinschr&auml;nkung erstellen, sondern man erstellt ein GPO in dem man den Fingerabdruck des Zertifikates zu den Vertrauensw&uuml;rdigen RDP-Herausgebern hinzuf&uuml;gt. Die entsprechende Einstellung findet sich als Computer oder Benutzerkonfiguration unter:Administrative Vorlagen/Windows-Komponenten/Remote Desktop Services/Remotedesktopverbindungs-Client/SHA1-Fingerabdr&uuml;cke von Zertifikaten angeben, die vertrauensw&uuml;rdige RDP-Herausgeber darstellenSo wird die Identit&auml;t des Remotecomputers verifiziert und beim verbinden erh&auml;lt der Benutzer keine Abfrage ob er dem Herausgeber auch wirklich vertraut.\",\n  \"url\": \"https://onprem.wtf/post/remoteapp-mit-zertifikat/\"\n},{\n  \"id\": \"post-doch-kein-windows-7-e\",\n  \"title\": \"Doch kein Windows 7 E\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Nachdem man schon ein paar Tage etwas dar&uuml;ber lesen konnte scheint es nun fix zu sein: Windows 7 kommt mit Internet Explorer f&uuml;r alle, also kein \\\"E\\\" Version f&uuml;r den europ&auml;ischen Markt.Alle die&nbsp;Windows 7 E Vorbestellt haben werden eine Vollversion des jeweiligen Produktes erhalten.Als alternative wird vermutlich eine Browserauswahl beim Start von Windows 7 zur Verf&uuml;gung stehen, so kann der Benutzer sich f&uuml;r seinen bevorzugten Browser entscheiden.Der gr&ouml;&szlig;te Vorteil dieser Aktion ist wohl die Upgrade Funktion die nun auch f&uuml;r uns Europ&auml;er verf&uuml;gbar ist. So kann man von Windows Vista bequem updaten ohne seine Einstellungen zu verlieren. F&uuml;r Windows XP wird es keine Upgrade Funktion geben, man kann jedoch eine g&uuml;nstigere Upgrade Version kaufen und diese installieren.Hier&nbsp;gehts zum Artikel von Daniel Melanchthon wo man genaueres nachlesen kann.\",\n  \"url\": \"https://onprem.wtf/post/doch-kein-windows-7-e/\"\n},{\n  \"id\": \"post-windows-7-joint-launch-roadshow\",\n  \"title\": \"Microsoft Roadshow zu neue Produkte\",\n  \"author\": \"dni\",\n  \"tags\": [\"Events\"],\n  \"content\": \"Microsoft startet Roadshow zu Windows 7, Windows Server 2008 R2, Exchange Server 2010 in f&uuml;nf deutsche St&auml;dte.Steve Ballmer selbst wird in M&uuml;nchen die neuen Produkte vorstellen.Eventtermine07. Oktober 2009 ICM M&uuml;nchen 18. November 2009 Maritim Airport Hotel Hannover20. November 2009 Swiss&ocirc;tel D&uuml;sseldorf23. November 2009 Congress Center Frankfurt am Main25. November 2009 Stadthalle KarlsruheMehr zum Event Agenda Anmeldung Gr&uuml;&szlig;e, dnDanke an Daniel f&uuml;r die Info. \",\n  \"url\": \"https://onprem.wtf/post/windows-7-joint-launch-roadshow/\"\n},{\n  \"id\": \"post-windows-home-server-pp3-(beta)-e28093-windows-7\",\n  \"title\": \"Windows Home Server PP3 (Beta) – Windows 7\",\n  \"author\": \"tto\",\n  \"tags\": [\"Home-Server\",\"Client\"],\n  \"content\": \"Mit dem Power Pack 3 wird Windows 7 besser in den Home Server integriert und man hat folgende Vorteile:   Backup &amp; Restore von Clients mit Windows 7     bessere Integration in das Windows 7 Media Center     Integration in die Bibliotheken (Libraries) von Windows 7     Verbesserungen der Suche     Besserer Support von Netbooks  Um die Beta Version des neuen Power Packs herunterzuladen muss man sich auf der Microsoft Connect Seite Registrieren.Nach dem Download erhält man ein Verzeichnis dass drei Updates, die Release Dokumentation und jeweils eine Batch Datei für Installation und Deinstallation beinhaltet. Die Batch Datei macht nichts anderes als der Reihe nach folgende Updates zu installieren: (es empfiehlt sich die Verwendung der Batch Datei, so erspart man sich einige Reboots :)).   WindowsSearch-KB940157-Srv2K3-x86-enu.exe (Installiert Windows Search 4.0)     WindowsServer2003.WindowsXP-KB969949-x86-ENU.exe (Hotfix für Windows Search 4.0 und WHS)     WHS-KB968349-v1-x86-ENU.exe (WHS Power Pack 3)  Nach der Installation wird der WHS Connector auf den Clients automatisch aktualisiert. Die neuen Features sind nach dem Update verwendbar. Für die Integration in das Media Center muss man den Media Center Connector (Start Menü) ausführen. Nach einem Neustart sind die Bibliotheken des WHS im Media Center verfügbar. Wann die endgültige Version des Power Pack 3 verfügbar sein wird ist noch nicht bekannt, man spekuliert auf eine Veröffentlichung zeitgleich mit Windows 7, also vermutlich im Oktober.Viele Grüße!\",\n  \"url\": \"https://onprem.wtf/post/windows-home-server-pp3-(beta)-e28093-windows-7/\"\n},{\n  \"id\": \"post-server-logs-in-sql-datenbank-importieren\",\n  \"title\": \"Server Logs in SQL Datenbank importieren\",\n  \"author\": \"dni\",\n  \"tags\": [\"Security\",\"SQL\"],\n  \"content\": \"Als ich letztens die &Uuml;berwachungsrichtlinien der Dom&auml;ne &uuml;berarbeitet habe, sind mir mehrfach fehlgeschlagene &ldquo;Objektzugriffe&rdquo; von Clients aufgefallen, die versuchten in Bereiche einzudringen, f&uuml;r die sie keine Berechtigung haben. Da das EventLog am Server jedoch kein dauerhafter Speicher f&uuml;r Log Files und f&uuml;r Auswertungen relativ umst&auml;ndlich ist, schreibe ich die Logs in eine SQL Datenbank. Anschlie&szlig;end werden die Daten so bereinigt, dass nur noch Ereignisse des Typs &ldquo;Objektzugriff&rdquo; enthalten sind.Wie ich dabei vorgegangen bin erkl&auml;rt dieser BeitragSchritt 1 &ndash; SQL Server installieren Als erstes habe ich mir einen neuen Server auf meiner Hyper-V Umgebung bereitgestellt und auf diesen dann Microsoft SQL Server 2008 installiert.Schritt 2 &ndash; Tabellen erstellenUm meine EventLogs zu speichern habe ich 2 gleiche Tabelle erstellt. Eine f&uuml;r das tempor&auml;re Speichern der EventLogs (&ldquo;tblTMPLog&rdquo;) und eine f&uuml;r das dauerhafte Speichern (&ldquo;tblSecurityObject&rdquo;). Die tempor&auml;re Tabelle wird deshalb verwendet, da die Daten vor dem eigentlichen Speichern noch bereinigt werden.Schritt 3 &ndash; EventLogs exportierenUm die Event Logs vom Server zu exportieren hilft uns das Tool &ldquo;DUMPEVT&rdquo;. Es exportiert Logs vom Server und schreibt sie in ein File. Die Logs werden dabei vom Server nicht gel&ouml;scht. Auch merkt sich das Tool welche Logs vom Server schon exportiert wurden, sodass ein Mehrfach-Export nicht passieren kann.DUMPEVT habe ich heruntergeladen, und unter C:\\\\DUMPEVT entpackt.Nun kann man sich schon von der Befehlszeile Logs vom Server holen&ldquo;C:\\\\DUMPEVT\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\DUMPEVT\\\\evtlog.csv /computer=localhostDie Logs werden wie angegeben in die Datei evtlog.csv geschriebenEs ist auch m&ouml;glich DUMPEVT vom SQL Server aus zu steuern. Daf&uuml;r muss als erstes das Feature &ldquo;xp_cmdshell&rdquo; aktiviert werden (sofern nicht nicht geschehen).Mit den folgenden Code kann man sich dann die Logs holenmaster..xp_cmdshell 'C:\\\\DUMPEVT\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\DUMPEVT\\\\evtlog.csv /computer=localhost'Schritt 4 &ndash; Logs in die SQL Datenbank importierenUm die Logs in SQL zu importieren wird zun&auml;chst die tempor&auml;re Tabelle gel&ouml;scht und dann &uuml;ber den BULK INSERT Befehl eingelesen.DELETE FROM tblTMPLog BULK INSERT tblTMPLog FROM 'c:\\\\dumpevt\\\\evtlog.csv' WITH (FIELDTERMINATOR = ',')Schritt 5 &ndash; Tabelle bereinigenWenn ich jetzt ein SELECT * FROM tblTMPLog ausf&uuml;hre, erhalte ich folgende Ausgabe:Um die Daten zu bereinigen, entferne ich alle Ereignisse, die nicht die Kategorie &ldquo;Objektzugriff&rdquo;, ID &ldquo;560&rdquo; aufweisen. Im Field Data werden Sonderzeichen entfernt, die vom Export des Logs entstanden sind.DELETE FROM tblTMPLog WHERE NOT Category = 'Objektzugriff' DELETE FROM tblTMPLog WHERE NOT EventID = '560' Update tblTMPLog Set Data = Replace(Data, ' ', '') Update tblTMPLog Set Data = Replace(Data, '^', '') Update tblTMPLog Set Data = Replace(Data, '`', '')Schritt 6 &ndash; Tempor&auml;re Tabelle &uuml;bertragenNachdem die Daten bereinigt wurden, kann die tempor&auml;re Tabelle in die fixe Tabelle &uuml;bertragen werden. Wenn n&ouml;tig, kann man sich an dieser Stelle die Daten noch ein wenig zurechtr&uuml;cken.Bsp: Nur die Information &ldquo;Objektname&rdquo; wird f&uuml;r das Field Data &uuml;bertragen.&nbsp; &nbsp;&nbsp; UPDATE tblSecurityObject SET Data = SUBSTRING(Data,CHARINDEX('Objektname:', Data)+12,CHARINDEX('Handlekennung:', Data) - CHARINDEX('Objektname:', Data)-12) WHERE CHARINDEX('Objektname:', Data) &gt; 0Schritt 7 &ndash; AuswertungNachdem die Daten sich auf dem SQL Server befinden, kann man diese entsprechend sauber auswerten und speichern.Bsp: Programm in C# um die SQL Daten anzuzeigen&nbsp;Viel Spa&szlig; beim importieren und auswerten, dn- Vielen Dank an Robert van den Berg, der in seinem Blog das Thema bereits &auml;hnlich behandelt hat -\",\n  \"url\": \"https://onprem.wtf/post/server-logs-in-sql-datenbank-importieren/\"\n},{\n  \"id\": \"post-mehrere-externe-ipe28099s-am-isa-server\",\n  \"title\": \"Mehrere externe IP’s am ISA Server\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server\",\"Security\"],\n  \"content\": \"Stellt euch folgende Situation vor:Ihr habt einen ISA Server als Firewall und mehrere öffentliche IP Adressen zur Verfügung. Die Adressen werden dem externen Interface des ISA Servers zugewiesen.    Beispiel:200.200.200.1 –&gt; VPN   200.200.200.2 –&gt; OWA    200.200.200.3 –&gt; Veröffentlichte Webseite    200.200.200.4 –&gt; SonstigesDer MX-Reccord der Domäne leitet Mails der IP Adresse 200.200.200.2 weiter. Von der 200.200.200.2 werden die Mails dem internen Mailserver zugestellt. Der Zielverkehr für das externe Netzwerk wird über die erste IP Adresse am externen Interface geleitet. Folglich wird Internetverkehr, sowie Mails über die öffentliche IP 200.200.200.1 geleitet (nach Standardkonfiguration).Wenn eurer Mailserver selbst die DNS-Auflösung vornimmt und Mails dem Ziel zustellt, tut er das mit der 200.200.200.1Mailserver führen vermehrt ein Reverse-DNS-Lookup durch, um den Versender zu verifizieren. In dieser Konfiguration stellt das aber ein Problem dar, da die Mails über die 200.200.200.1 versendet werden, der MX aber auf die 200.200.200.2 zeigt. Folglich kann es passieren, dass Mails nicht angenommen werden oder man landet gleich direkt auf der Blacklist.Um dieses Problem zu beheben hat man 2 Möglichkeiten:   Mails über einen Smarthost senden    Die öffentliche IP Adresse des Mail Servers am externen Interface des ISA Servers als erste Adresse eintragen &#160;ISA Server unterstützt bis jetzt (aktuelle Version 2006) nicht die Anbindung mehrerer öffentlicher IP Adressen.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/mehrere-externe-ipe28099s-am-isa-server/\"\n},{\n  \"id\": \"post-ein-paar-infos-zu-e2809cdirectaccesse2809d\",\n  \"title\": \"Ein paar Infos zu “DirectAccess”\",\n  \"author\": \"dni\",\n  \"tags\": [\"Server-2008-R2\",\"Client\",\"Server\"],\n  \"content\": \"Mit Windows 7 und Windows Server 2008 R2 kommt ein neues Remote-Verbindungs-Feature: DirectAccess. DirectAccess ist der traditionellen VPN Verbindung sehr ähnlich, bietet jedoch entscheidende Vorteile: Clientcomputer initiieren automatisch eine gesicherte Verbindung zum Ziel. Somit bedarf es keinen Eingriff des Users, denn er ist sofort mit dem Zielnetzwerk verbunden. DirectAcces baut eine IPv6 Verbindung zum DirectAccess Server auf. Sollte die Firewall den IPv6 Verkehr blocken, so wird IP over HTTPS verwendet. Somit kann also jede Firewall mit geöffneten Web-Ports passiert werden.Man kann DirectAccess in 3 verschiedene Modi betreiben:   Full Intranet Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt     Selected Server Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt. Die Verbindung vom Clientcomputer zum internen Netzwerk ist authentifiziert     End-to-End Access: Die Verbindung vom Clientcomputer über das Internet zum internen Netzwerk ist verschlüsselt und authentifiziert   Ein weiterer Vorteil bezieht sich auf das Patch- und Richtlinienmanagement. Befindet sich der Client mehrere Wochen nicht im internen Netzwerk, könnte es unter Umständen sein, dass er in dieser Zeit keine Updates vom Server bezieht. Mit DirectAccess ist der Client ständig in Verbindung mit den internen Servern und kann Updates sowie die aktuellen GPO’s beziehen.Um DirectAccess benutzen zu können ist zwingend Windows 7, Windows Server 2008 R2 und eine PKI nötig. Der Client muss außerdem der Domäne angehören.Grüße, dn\",\n  \"url\": \"https://onprem.wtf/post/ein-paar-infos-zu-e2809cdirectaccesse2809d/\"\n},{\n  \"id\": \"post-windows-7-e28093-nativer-vhd-support\",\n  \"title\": \"Windows 7 – Nativer VHD Support\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Das neue Windows kann von Haus aus VHDs als Festplatten einbinden. So kann man sich z.B. ein Testsystem installieren ohne die Festplatt partitionieren zu m&uuml;ssen.Virtuelle Festplatten k&ouml;nnen direkt in der Datentr&auml;gerverwaltung erstellt werden (rechtsklick auf Datentr&auml;gerverwaltung, neue virtuelle Festplatte).Will man Windows 7 auf der zu erstellenden VHD installieren muss man die Festplatte mit fester Gr&ouml;&szlig;e erstellen.&nbsp;Windows 7 von einem beliebigem Installationsmedium (USB Stick, DVD) starten und mit Shift-F10 eine Eingabeaufforderung starten. Jetzt muss man die vorhin erstellte VHD mit diskpart einbinden. Dazu wird die VHD mit selet vdisk file=c:\\\\pfad\\\\zur\\\\datei.vhd ausgew&auml;lt und mit attach vdisk angebunden.Die Installation von Windows 7 kann jetzt normal fortgesetzt werden, die Warnung dass Windows auf einer virtuellen Festplatte nicht installiert werden kann, ignoriert man einfach.mfg tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-nativer-vhd-support/\"\n},{\n  \"id\": \"post-windows-7-e28093-installation-mit-usb-stick\",\n  \"title\": \"Windows 7 – Installation mit USB Stick\",\n  \"author\": \"tto\",\n  \"tags\": [\"Client\"],\n  \"content\": \"Windows 7 kann von einem USB Wechseldatentr&auml;ger aus installiert werden. So kann es problemlos auf Netbooks und anderen Ger&auml;ten ohne ein optisches Laufwerk installiert werden. Ich verwende eigentlich immer diese Variante da USB Sticks in der Regel schneller sind als DVD Laufwerke.Um den USB Stick vorzubereiten verwendet man das Programm diskpart (standartm&auml;&szlig;ig installiert). Diskpart wird in einer Eingabeaufforderung mit administrativen Rechten gestartet.Wenn Diskpart gestartet wurde \\\"list disks\\\" ausf&uuml;hren, um die installierten Laufwerke anzuzeigen.Mit \\\"select disk\\\" wird der USB Stick ausgew&auml;hlt, dann wird er mit \\\"clean\\\" gel&ouml;scht (ACHTUNG: Alle Daten auf dem Stick gehen verloren)Jetzt wird mit \\\"create partition primary\\\" eine Prim&auml;re Partition erstellt die mit \\\"active\\\" als Aktiv gesetzt wird (damit das BIOS davon booten kann). Jetzt fehlt noch das Dateisystem das mit \\\"format fs=fat32 quick\\\" festgelegt wird. Mit \\\"assign\\\" wei&szlig;t man noch einen Laufwerksbuchstaben zu.Dieser Prozess kann auch &uuml;ber GUI ausgef&uuml;hrt werden, wichtig ist nur dass am Ende eine prim&auml;re, aktive Fat32 Partition auf dem USB Stick vorhanden ist.Zu Schluss kopiert man noch alle Daten von der Windows 7 DVD auf den USB Stick. So erstellt man einen Bootf&auml;higen Stick, man muss nur noch dem BIOS beibringen davon zu starten und schon kann Windows installiert werden.Genauere Details zu Diskpart gibts im entsprechenden KB Artikel.\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-installation-mit-usb-stick/\"\n},{\n  \"id\": \"post-msat-deckt-schwachstellen-in-der-it-umgebung-auf\",\n  \"title\": \"MSAT deckt Schwachstellen in der IT Umgebung auf\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Microsoft bietet das kostenlose Tool MSAT (Microsoft Security Assessment Tool) Unternehmen an, ihre IT-Sicherheitsumgebung zu bewerten. Als erstes wird der aktuelle Stand der IT-Sicherheit ermittelt, das Tool gibt eine nach Priorität geordnete Liste mit Problemen und Verbesserungsmöglichkeiten aus.Folgende Features sind im Tool enthalten:   Einfach zu verwendende, umfassende und kontinuierliche Sicherheitsinformationen     Ein Defense-in-Depth-Framework mit branchenbezogener vergleichender Analyse     Detailliertes, kontinuierliches Reporting mit Vergleich von Ausgangsbasis und Fortschritt     Empfehlungen und nach Priorität geordnete Maßnahmen zur Verbesserung der Sicherheit     Strukturierte Anleitungen von Microsoft und anderen Branchenvertretern   Downloaden kann man das Tool hierGrüße, dn\",\n  \"url\": \"https://onprem.wtf/post/msat-deckt-schwachstellen-in-der-it-umgebung-auf/\"\n},{\n  \"id\": \"post-windows-7-e28093-rtm-verfugbarkeit\",\n  \"title\": \"Windows 7 – RTM Verfügbarkeit\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Wie im Windows 7 Team Blog zu lesen ist steht nun das RTM Datum fest.Die wichtigsten Daten im Überblick:   MSDN &amp; Technet ab 6. August&#160;    Volume License mit SA ab 7. August    Volume License ohne SA ab 1. September    Microsoft Partner Network Portal ab 16. August    Microsoft Action Pack ab 23. August Bei diesen Daten handelt es sich um die englischen Versionen, andere Sprachen folgen am 1. Oktober und in den Regalen steht Windows 7 ab 22. Oktober.viele Grüße    tt\",\n  \"url\": \"https://onprem.wtf/post/windows-7-e28093-rtm-verfugbarkeit/\"\n},{\n  \"id\": \"post-zertifikat-fur-makros-der-domane-bereitstellen\",\n  \"title\": \"Zertifikat für Makros der Domäne bereitstellen\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Letzens habe ich mir vorgenommen alle von mir geschriebenen Makros digital zu signieren, sodass die User beim Öffnen der Dateien keine Abfragen bekommen ob sie den Code aktivieren möchten oder nicht. Um einen Makro digital zu signieren und das Zertifikat der Domäne zur Verfügung zu stellen bedarf es mehrerer Schritte:    Zertifikatdienste auf einem Server installieren     Zertifikat zur Codesignatur ausstellen     Makros digital signieren und die Office-Files ablegen  Nun muss nur mehr das Zertifikat den Usern bereit gestellt werden. Wenn man das mit einem GPO macht, muss darauf geachtet werden, dass man die Einstellungen für Computer vornimmt. Das Zertifikat muss als erstes unter die Vertrauenswürdigen Stammzertifizierungsstellen Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Vertrauenswürdige Stammzertifizierungsstellen  Bis hierher wird das Zertifikat in den lokalen Zertifikat-Speicher “Vertrauenswürdigen Stammzertifizierungsstellen” geschoben. Das Zertifikat muss aber noch in den Speicher für “Vertrauenswürdige Herausgeber”, sonst erscheinen weiterhin Abfragen. Um das Zertifikat da rein zubekommen muss im vorher konfigurierten GPO eine neue “Richtlinie zur Softwareeinschränkung” erstellt werden. Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Richtlinien für Softwareeinschränkung Danach muss unter “Zusätzliche Regeln” eine neue Zertifikatsregel mit den entsprechenden Zertifikat erstellt werden. Wichtig dabei ist, dass die Sicherheitsstufe “Nicht eingeschränkt” lautet. Nun wird das Zertifikat an alle Computer unter dem GPO verteilt. Alle digital signierten Makros werden ohne Abfrage ausgeführt.\",\n  \"url\": \"https://onprem.wtf/post/zertifikat-fur-makros-der-domane-bereitstellen/\"\n},{\n  \"id\": \"post-delta-crl-e2809cunable-to-downloade2809d-iis-7\",\n  \"title\": \"Delta CRL “Unable to Download” IIS 7\",\n  \"author\": \"tto\",\n  \"tags\": [],\n  \"content\": \"Erstmal herzlich willkommen in unserem Blog ;)und zweitens ein Problemchen &uuml;ber das ich in dieser Woche gestolpert bin: IIS 7 blockiert aus Sicherheitsgr&uuml;nden sogenannte Double-Escape Sequenzen (\\\"+\\\" \\\"-\\\"). Da die Delta CRL jedoch standardm&auml;&szlig;ig ein \\\"+\\\" im Namen hat schl&auml;gt der Download fehl. M&ouml;chte man die CRL's bzw. Delta CRL's in seiner PKI &uuml;ber http ver&ouml;ffentlichen kann man sich durch abschalten dieser Sicherheitsfunktion f&uuml;r die betreffenden Virtual Directories helfen:%windir%\\\\system32\\\\inetsrv\\\\appcmd.exe set config \\\"Default Web Site/virtual Directory\\\" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true \\\"virtual Directory\\\" entspricht dem Virtuellen Verzeichnis in dem die Delta CRL ver&ouml;ffentlicht wird.hier der entsprechende KB Artikel: http://support.microsoft.com/kb/942076mfg tt\",\n  \"url\": \"https://onprem.wtf/post/delta-crl-e2809cunable-to-downloade2809d-iis-7/\"\n},{\n  \"id\": \"post-drucken-mit-internet-explorer-8-nicht-mehr-moglich\",\n  \"title\": \"Drucken mit Internet Explorer 8 nicht mehr möglich\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Letztens hatte ich das Problem, dass mein Internet Explorer plötzlich das Drucken verweigerte. Auch ist mir aufgefallen, dass das „Info-Fenster“ nur mehr ein weißes Fenster zeigte. Es scheint Probleme zu geben, wenn zum Internet Explorer 8 der „Microsoft Software Inventory Analyzer“ installiert wird. Deinstallation des Analyzers hat das Problem behoben. \",\n  \"url\": \"https://onprem.wtf/post/drucken-mit-internet-explorer-8-nicht-mehr-moglich/\"\n},{\n  \"id\": \"post-willkommen\",\n  \"title\": \"Willkommen\",\n  \"author\": \"dni\",\n  \"tags\": [],\n  \"content\": \"Willkommen im Blog von ntSystems – info.tech\",\n  \"url\": \"https://onprem.wtf/post/willkommen/\"\n},{\n  \"id\": \".well-known-lnurlp-tto\",\n  \"title\": \"Tomt\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{    \\\"status\\\":\\\"OK\\\",    \\\"tag\\\":\\\"payRequest\\\",    \\\"commentAllowed\\\":255,    \\\"callback\\\":\\\"https://getalby.com/lnurlp/tomt/callback\\\",    \\\"metadata\\\":\\\"[[\\\\\\\"text/identifier\\\\\\\", \\\\\\\"tomt@getalby.com\\\\\\\"], [\\\\\\\"text/plain\\\\\\\", \\\\\\\"Sats for tto\\\\\\\"]]\\\",    \\\"minSendable\\\":1,    \\\"maxSendable\\\":1000000000,    \\\"payerData\\\":    {        \\\"name\\\":{\\\"mandatory\\\":false},        \\\"email\\\":{\\\"mandatory\\\":false}    }}\",\n  \"url\": \"https://onprem.wtf/.well-known/lnurlp/tto\"\n},{\n  \"id\": \"404\",\n  \"title\": \"404\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"404Page not found :(The requested page could not be found.You can search or go back home.\",\n  \"url\": \"https://onprem.wtf/404\"\n},{\n  \"id\": \"500\",\n  \"title\": \"500\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"500Internal Server Error :(The requested page could not be delivered.\",\n  \"url\": \"https://onprem.wtf/500\"\n},{\n  \"id\": \"api-v1-docs\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"[{  \\\"id\\\": \\\"powershell-start-lyncbackup\\\",  \\\"title\\\": \\\"New-SfBBackup\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"OnlineHelp\\\",\\\"Lync\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"This script exports Lync Core Data and Settings according to the documentation availabe on TechNetIt is intended to be run as scheduled task, the Retention parameter can be used to indicate how long to keep existing backup files in the target directory.InputsNone. This script does not take any pipeline input.OutputsNone. This script does not write any output to the pipeline.PermissionsThe Account used to run this script needs to be member of the RTCUniversalServerAdmins group.Example 1.\\\\\\\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\\\\\\\\\\\\\SERVER\\\\\\\\Share\\\\\\\\CSBackupThis example exports Lync config and saves it into a subfolder at \\\\\\\\\\\\\\\\SERVER\\\\\\\\Share\\\\\\\\CSBackupExample 2.\\\\\\\\New-SfBBackup.ps1 -PoolFqdn lyncpool01.example.com -Path \\\\\\\\\\\\\\\\SERVER\\\\\\\\Share\\\\\\\\CSBackup -Retention 10This example exports Lync config and saves it into a subfolder at \\\\\\\\\\\\\\\\SERVER\\\\\\\\Share\\\\\\\\CSBackup. It deletes existing backups in the destination directory if they are older than 10 days.Download &amp; Source for New-SfBBackupThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name New-SfBBackup -Scope CurrentUserSave-Script -Name New-SfBBackup -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/start-lyncbackup/\\\"},{  \\\"id\\\": \\\"powershell-test-groupmembership\\\",  \\\"title\\\": \\\"Test-GroupMembership\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"blog\\\",\\\"archives\\\",\\\"PowerShell\\\",\\\"OnlineHelp\\\"],  \\\"content\\\": \\\"This function uses [ADSI] to test group membership based on the constructed security token of the principal. You can pipe objects to this function. The function writes $true or $false for each tested object.This function makes use of Richard Muellers “PowerShell script to check group membership”. Check the related link.Inputs[Microsoft.ActiveDirectory.Management.ADAccount]You can pipe an ADAccount object, such as returned by Get-AdUser or Get-AdComputer, to Test-GroupMembership.Outputs[bool]Test-GroupMembership returns $true or $false for each tested account.Example 1Get-AdUser -Filter * | Test-GroupMemership -GroupName \\\\\\\"Domain Users\\\\\\\"This example gets users from Active Directory and tests wether or not they are member of the “Domain Users” security group.Example 2Get-AdComputer -Filter * | Test-GroupMemership -GroupName \\\\\\\"Domain Computers\\\\\\\"This example gets computers from Active Directory and tests wether or not they are member of the “Domain Computers” security group.Related LinksRichard Muellers Script in the TechNet ScriptCenter: http://gallery.technet.microsoft.com/scriptcenter/5adf9ad0-1abf-4557-85cd-657da1cc7df4Download &amp; Source for Test-GroupMembershipThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Test-GroupMembership -Scope CurrentUserSave-Script -Name Test-GroupMembership -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-groupmembership/\\\"},{  \\\"id\\\": \\\"powershell-invoke-sefautil\\\",  \\\"title\\\": \\\"Invoke-SEFAUtil\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"OnlineHelp\\\",\\\"Lync\\\"],  \\\"content\\\": \\\"This is a wrapper function for the SEFAUtil.exe tool from the Lync Resource Kit Tools. It’s intended purpose is to make dealing with the cmdline tool easier.SYNTAX.\\\\\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddTeamMember &lt;String&gt;] [-RemoveTeamMember &lt;String&gt;] [-DelayRingTeam &lt;Int32&gt;] [-DisableTeamCall] [-SimulRingTeam] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-AddDelegate &lt;String&gt;] [-RemoveDelegate &lt;String&gt;] [-DelayRingDelegates &lt;Int32&gt;] [-FwdToDelegates] [-SimulRingDelegates] [-DisableDelegation] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableSimulRing &lt;String&gt;] [-DisableSimulRing] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;].\\\\\\\\Invoke-SEFAUtil.ps1 [[-Path] &lt;FileInfo&gt;] [-Server] &lt;String&gt; [-InputObject &lt;Object&gt;] [[-Username] &lt;String[]&gt;] [[-LogFile] &lt;FileInfo&gt;] [-EnableFwdNoAnswer &lt;String&gt;] [-EnableFwdImmediate &lt;String&gt;] [-CallAnswerwaitTime &lt;Int32&gt;] [-DisableFwdImmediate] [-DisableFwdNoAnswer] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThe default Value for the Path parameter assumes Lync 2013 Resource Kit Tools are installed at C:\\\\\\\\Program Files\\\\\\\\Microsoft Lync Server 2013\\\\\\\\ResKit. This function requires version 3 of PowerShell as well as the Lync Module for user validation. Note: Check the related links for a really cool GUI wrapper by MVP Johan Veldhuis.RELATED LINKS  Invoke-SEFAUtil – a PowerShell wrapper function  Updated: Invoke-SEFAUtil  SefaUtil GUI  Skype for Business Server 2015 Resource Kit Tools DocumentationEXAMPLE 1.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\\\\\"OU=users,OU=tomt,DC=tomt,DC=local\\\\\\\" | .\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThis example uses Get-CsUser to get all Lync Users from within the specified Organizational Unit and adds thomas@tomt.it as delegate.Download &amp; Source for Invoke-SEFAUtilThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/invoke-sefautil/\\\"},{  \\\"id\\\": \\\"powershell-restore-vmpermission\\\",  \\\"title\\\": \\\"Restore-VMPermission\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"OnlineHelp\\\",\\\"Hyper-V\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"Adds permissions for the VMId to all assigned disks.SYNTAX.\\\\\\\\Restore-VMPermission.ps1 [-VM] &lt;String[]&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThis script uses the Hyper-V Module to update permissions for all assigned disks on one ore more VMs. This is useful if you move/replace VHDs and the read permission ACE for VMId is missing.PARAMETERS-VM &lt;String[]&gt;    VM, specify the VM that needs permissions fixed.    Required?                    true    Position?                    1    Default value    Accept pipeline input?       true (ByPropertyName)    Accept wildcard characters?  false-WhatIf [&lt;SwitchParameter&gt;]    Required?                    false    Position?                    named    Default value    Accept pipeline input?       false    Accept wildcard characters?  false-Confirm [&lt;SwitchParameter&gt;]    Required?                    false    Position?                    named    Default value    Accept pipeline input?       false    Accept wildcard characters?  false&lt;CommonParameters&gt;    This cmdlet supports the common parameters: Verbose, Debug,    ErrorAction, ErrorVariable, WarningAction, WarningVariable,    OutBuffer, PipelineVariable, and OutVariable. For more information, see    about_CommonParameters (https://go.microsoft.com/fwlink/?LinkID=113216).INPUTSYou can pipe objcets with a VMName property, such as returned by Get-VM, to this script.OUTPUTSNone. This script does not write any objects to the pipeline.EXAMPLE 1PS C:\\\\\\\\&gt;Restore-VMPermission.ps1 -VM dc01This example adds permission for dc01 VMId to the ACL of all assigned disks for dc01.EXAMPLE 2PS C:\\\\\\\\&gt;Get-VM | Restore-VMPermission.ps1This example uses Get-VM to get all VMs on the local machine. It gets all disks for all VMs and adds the required premissions for VMId to the ACL.Download &amp; Source for Restore-VMPermissionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Restore-VMPermission -Scope CurrentUserSave-Script -Name Restore-VMPermission -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/restore-vmpermission/\\\"},{  \\\"id\\\": \\\"powershell-create-ucszoninghints\\\",  \\\"title\\\": \\\"Create-UcsZoningHints\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Cisco\\\",\\\"PowerShell\\\",\\\"OnlineHelp\\\"],  \\\"content\\\": \\\"This script uses the CiscoUcs PowerTool to get information about one or more service profiles and creates SIST zoning configuration for NX-OS. The Target’s device-alias as well as the name for the ZoneSet and the VSAN can be specified with parameters. Zone names will be automatically created.Syntax.\\\\\\\\Create-UcsZoningHints.ps1 -Name &lt;String&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;].\\\\\\\\Create-UcsZoningHints.ps1 -InputObject &lt;Object&gt; [-UcsCentral] [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;].\\\\\\\\Create-UcsZoningHints.ps1 [-UcsCentral] -TemplateName &lt;String&gt; [-TargetAlias &lt;String[]&gt;] [-TargetPwwn &lt;String[]&gt;] [-vsan &lt;Int32&gt;] [-ZoneSet &lt;String&gt;] [-Fabric &lt;String&gt;] [-OutFile &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]Inputs  Cisco.Ucsm.LsServer  Cisco.UcsCentral.LsServerYou can pipe objects of the above types to this script.Outputs  System.Management.Automation.PSObject  System.StringDepending on the parameters used, this script writes a custom PSObject or a System.String to the pipeline. The default behavior is to output a custom PSObject. If the –OutFile parameter is used, a string will be output instead.Example 1PS Scripts:\\\\\\\\&gt; Connect-Ucs 192.168.1.100PS Scripts:\\\\\\\\&gt; Get-UcsServiceProfile -Name HVSV02 | .\\\\\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-aId CommandLine-- -----------0 ! Fabric A1 device-alias database2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:413 device-alias commit4 ! Zones5 zone name HVSV02-vHba-A_vnx-a vsan 16  member device-alias vnx-a7  member device-alias HVSV02-vHba-A8 ! Zoneset9 zoneset name myZoneSet vsan 110  member HVSV02-vHba-A_vnx-a11 ! zoneset activate name myZoneSet vsan 1In this example, we use Connect-Ucs to connect to an instance of UCS Manager. Using Get-UcsServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, creates the output shown above. The –TargetAlias parameter specifies the device-alias to use as zone target.Lines 1-3 create a device-alias for the vHBA of Fabric A in the NX-OS configuration.Lines 5-7 create a zone create a SIST zone and adds the vHBA’s and the target’s device-aliases as members.Lines 9 and 10 add the newly created zone to an existing zoneset configuration.Line 11 can be uncommented to activate the updated zoneset.Example 2PS Scripts:\\\\\\\\&gt; Connect-UcsCentral 192.168.1.102PS Scripts:\\\\\\\\&gt; Get-UcsCentralServiceProfile -Name HVSV02 | .\\\\\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-a -UcsCentralId CommandLine-- -----------0 ! Fabric A1 device-alias database2  device-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:413 device-alias commit4 ! Zones5 zone name HVSV02-vHba-A_vnx-a vsan 16  member device-alias vnx-a7  member device-alias HVSV02-vHba-A8 ! Zoneset9 zoneset name myZoneSet vsan 110  member HVSV02-vHba-A_vnx-a11 ! zoneset activate name myZoneSet vsan 1In this example, we use Connect-UcsCentral to connect to an instance of UCS Central. Using Get-UcsCentralServiceProfile we get the Service Profile with a name of “HVSV02”, piping the Service Profile object to this script, using the Parameter –UcsCentral creates the output shown above.Example 3PS Scripts:\\\\\\\\&gt; Get-UcsServiceProfile -AssignState assigned | .\\\\\\\\Create-UcsZoningHints.ps1 –TargetAlias vnx-b -Fabric B -ZoneSet cfg-prodId CommandLine-- -----------0 ! Fabric B1 device-alias database2  device-alias name ESX01-vHba-B pwwn 20:01:00:25:B5:00:0B:013  device-alias name ESX02-vHba-B pwwn 20:01:00:25:B5:00:0B:024  device-alias name HVSV02-vHba-B pwwn 20:01:00:25:B5:00:0B:415 device-alias commit6 ! Zones7 zone name ESX01-vHba-B_vnx-b vsan 18  member device-alias vnx-b9  member device-alias ESX01-vHba-B10 zone name ESX02-vHba-B_vnx-b vsan 111  member device-alias vnx-b12  member device-alias ESX02-vHba-B13 zone name HVSV02-vHba-B_vnx-b vsan 114  member device-alias vnx-b15  member device-alias HVSV02-vHba-B16 ! Zoneset17 zoneset name cfg-prod vsan 118  member ESX01-vHba-B_vnx-b19  member ESX02-vHba-B_vnx-b20  member HVSV02-vHba-B_vnx-b21 ! zoneset activate name cfg-prod vsan 1This example uses the -AssignState parameter when getting Service Profiles from UCS Manager. This will retrieve all Service Profiles that are assigned to a physical server. Piping the retrieved Service Profile objects to this script, creates zones from each individual vHBA of each server to the device-alias specified using the –TargetAlias parameter.The -Fabric parameter specifies which Cisco UCS SwitchId is used to query vHBA information.The -ZoneSet parameter specifies the name of the zoneset to use in the configuration snippet.Example 4PS Scripts:\\\\\\\\&gt; Get-UcsServiceProfile | .\\\\\\\\Create-UcsZoningHints.ps1 -Fabric B -Vsan 200 -OutFile c:\\\\\\\\temp\\\\\\\\zoneset.txt! Fabric Adevice-alias databasedevice-alias name HVSV02-vHba-A pwwn 20:01:00:25:B5:00:0A:41...This example creates zoning configuration for all configured Service Profiles. The -OutFile parameter specifies a filename where the output is written to. The output is also written to the pipeline.Note: Using the -OutFile parameter does not output an object but a simple string of commands to make copy/pasting easier. (alternatively use “| Select-Object -ExpandProperty CommandLine”)The -Vsan parameter specifies the Id of the vsan to use in the NX-OS configuration.Example 5PS Scripts:\\\\\\\\&gt; Get-UcsServiceProfile | .\\\\\\\\Create-UcsZoningHints.ps1 -TargetAlias vnx-1-a,vnx-2-aThis example creates zoning configuration for all configured Service Profiles to all specified Targets.Download &amp; Source for Create-UcsZoningHintsThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Create-UcsZoningHints -Scope CurrentUserSave-Script -Name Create-UcsZoningHints -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/create-ucszoninghints/\\\"},{  \\\"id\\\": \\\"powershell-start-testwebserver\\\",  \\\"title\\\": \\\"Start-TestWebServer\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"OnlineHelp\\\"],  \\\"content\\\": \\\"Start-TestWebServerSYNOPSISWebserver for load balancer testing.SYNTAXStart-TestWebServer.ps1 [[-Port] &lt;Int32&gt;] [-CreateFirewallRule]DESCRIPTIONStart a web listener that listens on a specified port and simply answers to any request, returning JSON object containing the request.Requires administrative rights to create the listener.EXAMPLES————————– EXAMPLE 1 ————————–.\\\\\\\\Start-TestWebServer -Port 8001Start the test WebServer on port 8001.————————– EXAMPLE 2 ————————–.\\\\\\\\Start-TestWebServer -Port 80 -CreateFirewallRuleInvoke-RestMethod -Uri http://localhost | Select-Object UserAgentStart the test WebServer on port 80 and create a Firewall Rule to allow traffic to the specified port.The Invoke-RestMethod cmdlet is used to send a request to the listener and parse the output.PARAMETERS-PortSpecify a TCP port number for the HTTP listener to use.Defaults to 8000.Type: Int32Parameter Sets: (All)Aliases: Required: FalsePosition: 1Default value: 8000Accept pipeline input: FalseAccept wildcard characters: False-CreateFirewallRuleUse this switch to automatically create a Windows Firewall rule to allow incoming connections on the specified port.Type: SwitchParameterParameter Sets: (All)Aliases: Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseINPUTSNone.OUTPUTSNone.NOTESRELATED LINKShttps://ntsystems.it/PowerShell/start-testwebserver/Download &amp; Source for Start-TestWebServerThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name Start-TestWebServer -Scope CurrentUserSave- -Name Start-TestWebServer -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/start-testwebserver/\\\"},{  \\\"id\\\": \\\"powershell-send-splunkevent\\\",  \\\"title\\\": \\\"Send-SplunkEvent\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"OnlineHelp\\\"],  \\\"content\\\": \\\"SYNOPSISSend events to Splunk’s HTTP Event Collector.SYNTAXSend-SplunkEvent.ps1 [-InputObject] &lt;Object&gt; [[-HostName] &lt;String&gt;] [[-DateTime] &lt;DateTime&gt;] [[-Uri] &lt;String&gt;] [[-Key] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to send structured data to Splunk HTTP Event Collector.Use the HostName and DateTime parameters to control Splunk’s ‘host’ and ‘time’ properties for the generated event.EXAMPLESEXAMPLE 1.\\\\\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\\\\\"Hello Splunk!\\\\\\\"} -Key &lt;token&gt;This example sends a simple event containing “message”: “Hello Splunk!” to the event collector running on the local system.EXAMPLE 2Import-Csv logs.csv | .\\\\\\\\Send-SplunkEvent -Key &lt;token&gt; -HostName SBC1 -Uri \\\\\\\"https://splunk01.example.com:8088/services/collector\\\\\\\"This example imports logs from a CSV file and sends each one of them to event collector running on splunk01.example.com.The HostName parameter specifies which host created the logs.PARAMETERS-InputObjectData object that will be sent to Splunk’s HTTP Event Collector.Type: ObjectParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-HostNameHostName to be used for Splunk’s ‘host’ property.Default’s to name of the local system.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: (hostname)Accept pipeline input: FalseAccept wildcard characters: False-DateTimeDate and Time of the event.Defaults to now() on the local system.Type: DateTimeParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: (Get-Date)Accept pipeline input: FalseAccept wildcard characters: False-UriURI of the Splunk HTTP Event Collector instance.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Http://localhost:8088/services/collectorAccept pipeline input: FalseAccept wildcard characters: False-KeyKey for the Splunk HTTP Event Collector instance.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).INPUTS[psobject]OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKShttps://ntsystems.it/PowerShell/Send-SplunkEvent/Download &amp; Source for Send-SplunkEventThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Send-SplunkEvent -Scope CurrentUserSave-Script -Name Send-SplunkEvent -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/send-splunkevent/\\\"},{  \\\"id\\\": \\\"powershell-remove-logfile\\\",  \\\"title\\\": \\\"Remove-LogFile\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"OnlineHelp\\\"],  \\\"content\\\": \\\"SYNOPSISDeletes log files.SYNTAXRemove-LogFile.ps1 -Path &lt;Object&gt; [-Age &lt;Int32&gt;] [-Filter &lt;String&gt;] [-LogFile &lt;FileInfo&gt;] [-Recurse] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONDeletes log files, parameters can be used to specify the root folder, whether or not to include subfolders, a file extension filter and the age. This is intended to be run as scheduled task to regularly clean-up log files.EXAMPLESExample 1.\\\\\\\\Remove-LogFile.ps1 -Path C:\\\\\\\\inetpub\\\\\\\\logs -Age 7 -RecurseThis example removes all *.log files older than 7 days from C:\\\\\\\\inetpub\\\\\\\\logs and any subfolders.PARAMETERS-AgeSpecify a number of days. Files with a LastWriteTime older than this will be deleted.Type: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-FilterSpecify file extension filter. Defaults to ‘*.log’.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-LogFileSpecify a path to a log file. The script will log information and erros to the file.Type: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathSpecify folder in which logs will be deleted.Type: ObjectParameter Sets: (All)Aliases:Required: TruePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-RecurseInclude subfolders.Type: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable.For more information, see about_CommonParameters (http://go.microsoft.com/fwlink/?LinkID=113216).INPUTSOUTPUTSNOTESRELATED LINKSDownload &amp; Source for Remove-LogFileThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Remove-LogFile -Scope CurrentUserSave-Script -Name Remove-LogFile -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/remove-logfile/\\\"},{  \\\"id\\\": \\\"powershell-psspeech\\\",  \\\"title\\\": \\\"PSSpeech\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"  PSSpeech is a collection of functions to work with Azure Cognitive Services, more specifically the Speech Service.The function  Get-SpeechToken can be used to get an OAuth token for authentication to the service. The function Get-SpeechVoicesList can be use to get a list of available voices and the function Covert-TextToSpeech can be used to convert a given string to speech.Get-SpeechToken -Key &lt;yourkey&gt; Convert-TextToSpeech -Text \\\\\\\"Hi there, how are you doing today?\\\\\\\" -Path hithere.mp3Functions                                Convert-TextToSpeech        Convert a string to audio using Azure Cognitive Services.                                                            Get-SpeechToken        Get OAuth token for authorization to Azure Cognitive Services.                    Get-SpeechTokenResult         Get-SpeechTokenResult                     Get-SpeechVoicesList        Get a list of available voices from the speech service.                                                                                            Download &amp; Source for PSSpeechThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name PSSpeech -Scope CurrentUserSave- -Name PSSpeech -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/psspeech/\\\"},{  \\\"id\\\": \\\"powershell-tak\\\",  \\\"title\\\": \\\"TAK\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"  Tom’s Admin Kit, or TAK, is a PowerShell script module that contains useful tools which I collected or created over the years.The main goal of creating the module and writing the scripts it contains, was learning PowerShell and making my job a little bit easier. As I am currently looking into continuous integration, I used this module to build an example deployment pipeline. You can read more about that here.Functions                Add-EtcHostsEntry        Add an entry to local hosts file.                    Connect-Lync        Connect to Skype for Business Server or Online.                    Connect-SfB        Connect to Skype for Business Server or Online.                    Convert-SubnetMask        Convert a SubnetMask to PrefixLength or vice-versa.                        ConvertFrom-Base64        Convert Base64 to ClearText String                    ConvertFrom-SID        Get the account name for a SID.                    ConvertTo-Base64        Convert a String to Base64                    ConvertTo-SID        Get the SID for an account name                    Edit-EtcHosts        Edit etc hosts file with notepad.                    Get-DKIMRecord        Get DKIM Record for a domain.                    Get-DMARCRecord        Get DMARC Record for a domain.                    Get-MacAddressVendor        Mac Address vendor lookup.                    Get-MxRecord        Get MX Records for a domain.                    Get-SPFRecord        Get SPF Record for a domain. If the include tag is present, recursively get that SPF Record, too.                                Get-TakHash        Get hash for a string.                    Get-WlanProfile         Get-WlanProfile                     Import-Csr        Import certificate signing request from base64 text.                    Import-DhcpServerLog        Import DHCP Server Log files.                    Import-IISLog        Import IIS log files with default header.                    Invoke-WhoisRequest        Wohis request.                    New-FirewallRule        Create a new Windows Firewall Rule.                    New-RgsReport        Gather information about Skype for Business Response Groups, Queues, Agent Groups.                    New-SPFRecord        Create SPF record for a given mail domain.                    Remove-EtcHostsEntry        Remove an entry from local hosts file by it's IP address.                    Show-EtcHosts        Display /etc/hosts file content on Windows or Linux/macOS.                    Show-WlanProfile        Get wlan pre-shared key.                    Test-ExchangeAutodiscover        Test Exchange Autodiscover Web Service.                    Test-FederationService        Test the ADFS web service                    Test-LyncDNS        Test DNS entries for Skype for Business / Lync deployments.                    Test-LyncDiscover        Test the Lyncdiscover service for Skype for Business/Lync deployments                    Test-OOSFarm        Get internal and external URLs for PowerPoint sharing.                    Test-SfBDNS        Test DNS entries for Skype for Business / Lync deployments.                    Test-SfBDiscover        Test the Lyncdiscover service for Skype for Business/Lync deployments                    Test-TCPConnection        Test if a TCP Connection can be established.                    Test-TLSConnection        Test if a TLS Connection can be established.                    Update-FileWriteTime        Touch a file.    Download &amp; Source for TAKThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Module -Name TAK -Scope CurrentUserSave-Module -Name TAK -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/TAK    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/tak/\\\"},{  \\\"id\\\": \\\"powershell-ntsystemspsdrive\\\",  \\\"title\\\": \\\"ntSystemsPSDrive\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"  ntSystemsPSDrive is a SHiPS provider for ntSystems.it.It uses the SHiPS module to create a PSProvider for our blog which exposes our json-api as PSDrive and enables the following:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\\\\\Posts by Category\\\\\\\\PowerShell\\\\\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\\\\\Posts by Category\\\\\\\\ntSystems\\\\\\\\Jekyll Fun: Consuming ntSystems with PowerShell' You can read more about it here.Functions                                                                                                                                                                Download &amp; Source for ntSystemsPSDriveThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Module -Name ntSystemsPSDrive -Scope CurrentUserSave-Module -Name ntSystemsPSDrive -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/ntSystemsPSDrive    \\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/ntsystemspsdrive/\\\"},{  \\\"id\\\": \\\"powershell-add-etchostsentry\\\",  \\\"title\\\": \\\"Add-EtcHostsEntry\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Add-EtcHostsEntrySYNOPSISAdd an entry to local hosts file.SYNTAXAdd-EtcHostsEntry [-IPAddress] &lt;String&gt; [-Fqdn] &lt;String&gt; [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONAdds a lines to the /etc/hosts file of the local computer.Requires write access to /etc/hosts - if running PowerShell Core on  Linux/macOS try “sudo powershell”EXAMPLESEXAMPLE 1Add-EtcHostsEntry -IPAddress 1.1.1.1 -Fqdn test.fqdnThis example adds following line to the hosts file1.1.1.1 test.testPARAMETERS-IPAddressIPAddress of the hosts entry to be addedType: StringParameter Sets: (All)Aliases: ipRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-FqdnFQDN of the hosts entry to be addedType: StringParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/add-etchostsentry/\\\"},{  \\\"id\\\": \\\"powershell-connect-lync\\\",  \\\"title\\\": \\\"Connect-Lync\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Connect-LyncSYNOPSISConnect to Skype for Business Server or Online.SYNTAXDESCRIPTIONThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Serversor Skype for Business Online.The resulting PS Session is then imported and makes cmdlets available in the current session.The Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.This function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6EXAMPLESEXAMPLE 1Connect-SfB -Online -AdminDomain uclabThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.comPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/connect-lync/\\\"},{  \\\"id\\\": \\\"powershell-connect-sfb\\\",  \\\"title\\\": \\\"Connect-SfB\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Connect-SfBSYNOPSISConnect to Skype for Business Server or Online.SYNTAXServerConnect-SfB -Server &lt;Object&gt; [-Credential &lt;PSCredential&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]OnlineConnect-SfB [-AdminDomain &lt;String&gt;] [-Timeout &lt;Int32&gt;] [-ProxyType &lt;ProxyAccessType&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses New-PSSession or New-CsOnlineSession to connect to Skype for Business (or Lync) Serversor Skype for Business Online.The resulting PS Session is then imported and makes cmdlets available in the current session.The Timeout and ProxyType parameters are used to configure the PSSessionOption with respective values.This function requires the MicrosoftTeams Module: https://www.powershellgallery.com/packages/MicrosoftTeams/1.1.6EXAMPLESEXAMPLE 1Connect-SfB -Online -AdminDomain uclabThis example connects to Skype for Business Online setting the OverrideAdminDomain to uclab.onmicrosoft.comPARAMETERS-ServerSpecifies the ServerName that the session will be connected toType: ObjectParameter Sets: ServerAliases:Required: TruePosition: NamedDefault value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-AdminDomainSpecify the admin doamin to connect to (OverrideAdminDomain parameter)Type: StringParameter Sets: OnlineAliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-CredentialCredential used for connection; if not specified, the currently logged on user will be usedType: PSCredentialParameter Sets: ServerAliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-TimeoutSession idle timeout in secondsType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: 3600Accept pipeline input: FalseAccept wildcard characters: False-ProxyTypeProxyAccessType to use for the PsSessionType: ProxyAccessTypeParameter Sets: (All)Aliases:Accepted values: None, IEConfig, WinHttpConfig, AutoDetect, NoProxyServerRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/connect-sfb/\\\"},{  \\\"id\\\": \\\"powershell-convert-subnetmask\\\",  \\\"title\\\": \\\"Convert-SubnetMask\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Convert-SubnetMaskSYNOPSISConvert a SubnetMask to PrefixLength or vice-versa.SYNTAXConvert-SubnetMask [-SubnetMask] &lt;Object&gt; [&lt;CommonParameters&gt;]DESCRIPTIONLong descriptionEXAMPLESEXAMPLE 1Convert-SubnetMask 24255.255.255.0This example converts the PrefixLength 24 to a dotted SubnetMask.EXAMPLE 2Convert-SubnetMask 255.255.0.016This example counts the relevant network bits of the dotted SubnetMask 255.255.0.0.PARAMETERS-SubnetMaskSubnetMask to convertType: ObjectParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string]OUTPUTS[string]NOTESLogic from: https://d-fens.ch/2013/11/01/nobrainer-using-powershell-to-convert-an-ipv4-subnet-mask-length-into-a-subnet-mask-address/RELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/convert-subnetmask/\\\"},{  \\\"id\\\": \\\"powershell-convert-texttospeech\\\",  \\\"title\\\": \\\"Convert-TextToSpeech\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Convert-TextToSpeechSYNOPSISConvert a string to audio using Azure Cognitive Services.SYNTAXConvert-TextToSpeech [-Text] &lt;String&gt; [-Path] &lt;FileInfo&gt; [[-Voice] &lt;String&gt;] [[-OutputFormat] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to call the Azure Cognitive Service Speech Service API, convert a string to speech, and save the resulting audio to a file.EXAMPLESEXAMPLE 1Convert-TextToSpeech -Text \\\\\\\"Hi, this is a test.\\\\\\\" -Path test.mp3This example converts the string “Hi, this is a test.” to speech and saves the audio to the test.mp3 file.PARAMETERS-TextType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathType: FileInfoParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-VoiceType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: En-GB-LibbyNeuralAccept pipeline input: FalseAccept wildcard characters: False-OutputFormatType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Audio-16khz-32kbitrate-mono-mp3Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/convert-texttospeech/\\\"},{  \\\"id\\\": \\\"powershell-convertfrom-base64\\\",  \\\"title\\\": \\\"ConvertFrom-Base64\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"ConvertFrom-Base64SYNOPSISConvert Base64 to ClearText StringSYNTAXConvertFrom-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis Function uses [System.Convert] to convert Base64 encoded String to ClearText.The Encoding parameter can be used to specify which encoding to use.Believe it or not, works on Linux/macOS!EXAMPLESEXAMPLE 1ConvertFrom-Base64 'YXdlc29tZSwgaXNuJ3QgaXQ/'This example converts the given Base64 encoded string to clear text.PARAMETERS-StringOne or more Strings to be convertedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-EncodingThe Encoding to use.Type: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DefaultAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/convertfrom-base64/\\\"},{  \\\"id\\\": \\\"powershell-convertfrom-sid\\\",  \\\"title\\\": \\\"ConvertFrom-SID\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"ConvertFrom-SIDSYNOPSISGet the account name for a SID.SYNTAXConvertFrom-SID [-SID] &lt;SecurityIdentifier&gt; [&lt;CommonParameters&gt;]DESCRIPTIONUse [System.Security.Principal.SecurityIdentifier].Translate() to get the samAccountName for a SIDEXAMPLESEXAMPLE 1ConvertFrom-SID -Sid S-1-5-21-2330142668-2157844774-769409458EXAMPLE 2\\\\\\\"S-1-3-1\\\\\\\" | ConvertFrom-SIDPARAMETERS-SIDSID, specify the SID to translate.Type: SecurityIdentifierParameter Sets: (All)Aliases: ValueRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSYou can pipe input to this function.OUTPUTSReturns string values.NOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/convertfrom-sid/\\\"},{  \\\"id\\\": \\\"powershell-convertto-base64\\\",  \\\"title\\\": \\\"ConvertTo-Base64\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"ConvertTo-Base64SYNOPSISConvert a String to Base64SYNTAXConvertTo-Base64 [-String] &lt;String[]&gt; [[-Encoding] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis Function uses [System.Convert] to convert a ClearText String to Base64.The Encoding parameter can be used to specify which encoding to use.Believe it or not, works on Linux/macOS!EXAMPLESEXAMPLE 1ConvertTo-Base64 'my cleartext'This example converts ‘my cleartext’ to Base64 using ‘Default’ encoding.PARAMETERS-StringOne or more Strings to be convertedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-EncodingThe Encoding to use.Type: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DefaultAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/convertto-base64/\\\"},{  \\\"id\\\": \\\"powershell-convertto-sid\\\",  \\\"title\\\": \\\"ConvertTo-SID\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"ConvertTo-SIDSYNOPSISGet the SID for an account nameSYNTAXConvertTo-SID [-SamAccountName] &lt;NTAccount&gt; [&lt;CommonParameters&gt;]DESCRIPTIONUse [System.Security.Principal.SecurityIdentifier].Translate() to get the SID for a samAccountNameEXAMPLESEXAMPLE 1ConvertTo-SID -SamAccountName ttorgglerEXAMPLE 2\\\\\\\"ntsystems\\\\\\\\ttorggler\\\\\\\" | ConvertTo-SIDPARAMETERS-SamAccountNameSamAccountName, specify the account name to translate.Type: NTAccountParameter Sets: (All)Aliases: ValueRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSYou can pipe input to this function.OUTPUTSReturns string values.NOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/convertto-sid/\\\"},{  \\\"id\\\": \\\"powershell-edit-etchosts\\\",  \\\"title\\\": \\\"Edit-EtcHosts\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Edit-EtcHostsSYNOPSISEdit etc hosts file with notepad.SYNTAXEdit-EtcHostsDESCRIPTIONThis funtion starts notepad.exe as administrator and opens the hosts file for editing.If this function is running on PowerShell Core, it runs “sudo vi /etc/hosts”run notepad as administrator and open the hosts file for editingEXAMPLESExample 1PS C:\\\\\\\\&gt; PARAMETERSINPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/edit-etchosts/\\\"},{  \\\"id\\\": \\\"powershell-get-dkimrecord\\\",  \\\"title\\\": \\\"Get-DKIMRecord\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-DKIMRecordSYNOPSISGet DKIM Record for a domain.SYNTAXGet-DKIMRecord [-DomainName] &lt;String&gt; [[-Selector] &lt;String[]&gt;] [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to get the DKIM Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.The function defaults to “selector1” as thisis typically used with Exchange Online.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-DKIMRecordThis example gets DKIM records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name to use in the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-SelectorSpecify a selector name to use in the query.Type: String[]Parameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: @(\\\\\\\"selector1\\\\\\\",\\\\\\\"selector2\\\\\\\")Accept pipeline input: FalseAccept wildcard characters: False-ServerSpecify a DNS server to query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-dkimrecord/\\\"},{  \\\"id\\\": \\\"powershell-get-dmarcrecord\\\",  \\\"title\\\": \\\"Get-DMARCRecord\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-DMARCRecordSYNOPSISGet DMARC Record for a domain.SYNTAXGet-DMARCRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to get the DMARC Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-DMARCRecordThis example gets DMARC records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name to use for the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-ServerSpecify a DNS server to query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-dmarcrecord/\\\"},{  \\\"id\\\": \\\"powershell-get-macaddressvendor\\\",  \\\"title\\\": \\\"Get-MacAddressVendor\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-MacAddressVendorSYNOPSISMac Address vendor lookup.SYNTAXGet-MacAddressVendor [-MacAddress] &lt;Object&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-WebRequest to look up the vendor of a Mac Address’ Organizationally Unique Identifier (OUI).Works on PowerShell Core for Linux/macOS.EXAMPLESEXAMPLE 1Get-MacAddressVendor -MacAddress '00-50-56-C0-00-01','00:0F:FE:E8:4F:27'This example looks up the vendor for the two specified Mac Addresses.EXAMPLE 2Get-NetAdapter | Get-MacAddressVendorThis example looks up the vendor of all network adapters returned by Get-NetAdapter.EXAMPLE 3Get-NetAdapterConfig -ComputerName Server01.domain.local | Get-MacAddressVendorThis example looks up the vendor of all network adapters returned by Get-NetAdapterConfig which supports remoting.EXAMPLE 4Get-DhcpServerv4Lease -ComputerName DhcpServer -ScopeId 192.168.1.0 | Get-MacAddressVendorThis example looks up the vendor of all currently assigned address leases on a DHCP Server.PARAMETERS-MacAddressSpecifiy a MAC Address to look upType: ObjectParameter Sets: (All)Aliases: ClientId, MARequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.Management.Automation.PSObjectNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-macaddressvendor/\\\"},{  \\\"id\\\": \\\"powershell-get-mxrecord\\\",  \\\"title\\\": \\\"Get-MxRecord\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-MxRecordSYNOPSISGet MX Records for a domain.SYNTAXGet-MxRecord [-Domain] &lt;String&gt; [[-Server] &lt;IPAddress&gt;] [-ResolvePTR] [&lt;CommonParameters&gt;]DESCRIPTIONUses Resolve-DnsName to get MX Records, Priority and the IP Address of the records.EXAMPLESEXAMPLE 1Get-MxRecord ntsystems.itThis example gets the MX record for the domain ntsystems.it.PARAMETERS-DomainSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases: DomainNameRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-ServerSpecify the DNS server to query.Type: IPAddressParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ResolvePTRAlso resolve PTRType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string]OUTPUTS[Selected.Microsoft.DnsClient.Commands.DnsRecord_MX]NOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-mxrecord/\\\"},{  \\\"id\\\": \\\"powershell-get-spfrecord\\\",  \\\"title\\\": \\\"Get-SPFRecord\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-SPFRecordSYNOPSISGet SPF Record for a domain.If the include tag is present, recursively get that SPF Record, too.SYNTAXGet-SPFRecord [-DomainName] &lt;String&gt; [[-Server] &lt;String&gt;] [-Recurse] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DNSName to recursively get the SPF Record for a given domain.Objects with a DomainName property,such as returned by Get-AcceptedDomain, can be piped to this function.EXAMPLESEXAMPLE 1Get-AcceptedDomain | Get-SPFRecordThis example gets SPF records for all domains returned by Get-AcceptedDomain.PARAMETERS-DomainNameSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-ServerSpecify the Domain name for the query.Type: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-RecurseType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-spfrecord/\\\"},{  \\\"id\\\": \\\"powershell-get-speechtoken\\\",  \\\"title\\\": \\\"Get-SpeechToken\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-SpeechTokenSYNOPSISGet OAuth token for authorization to Azure Cognitive Services.SYNTAXGet-SpeechToken [-Region] &lt;String&gt; [-Key] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get a bearer token that can be used in the Authorization header when calling Azure Cognitive Services.This requires access to an Azure subscription and API key for the speech service.EXAMPLESEXAMPLE 1Get-SpeechToken -Region &lt;region&gt; -Key &lt;apikey&gt;This example gets a token using the provided key and region.PARAMETERS-RegionType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-KeyType: StringParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESKey should probably be a secure string, update once secrets management module is released.The token is stored in $script:SpeechToken and can be retrieved with Get-SpeechTokenResultRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-speechtoken/\\\"},{  \\\"id\\\": \\\"powershell-get-speechtokenresult\\\",  \\\"title\\\": \\\"Get-SpeechTokenResult\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-SpeechTokenResultSYNOPSISSYNTAXGet-SpeechTokenResultDESCRIPTIONEXAMPLESExample 1PS C:\\\\\\\\&gt; PARAMETERSINPUTSNoneOUTPUTSSystem.ObjectNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-speechtokenresult/\\\"},{  \\\"id\\\": \\\"powershell-get-speechvoiceslist\\\",  \\\"title\\\": \\\"Get-SpeechVoicesList\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-SpeechVoicesListSYNOPSISGet a list of available voices from the speech service.SYNTAXGet-SpeechVoicesList [[-token] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get a list of available voices from the Azure Cognitive Services Speech Service.Use the Token parameterto specify a token created with Get-SpeechToken and use the Region parameter to specify a region other than the default westeurope.If the Token parameter is not specified, the global variable created by Save-SpeechToken is used.EXAMPLESEXAMPLE 1Get-SpeechVoicesListThis example gets a list of available voices.PARAMETERS-tokenType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: $script:SpeechToken.TokenAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-speechvoiceslist/\\\"},{  \\\"id\\\": \\\"powershell-get-takhash\\\",  \\\"title\\\": \\\"Get-TakHash\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-TakHashSYNOPSISGet hash for a string.SYNTAXGet-TakHash [-String] &lt;String&gt; [[-Algorithm] &lt;Object&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses various various crypto service providers to get the hash value for a given input string.EXAMPLESEXAMPLE 1Get-TakHash \\\\\\\"Hello World!\\\\\\\"This example returns the MD5 hash of “Hello World!”.EXAMPLE 2Get-TakHash \\\\\\\"Hello World!\\\\\\\" -Algorithm Sha256This example gets the SHA256 hash of “Hello World!”.PARAMETERS-StringType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-AlgorithmType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-takhash/\\\"},{  \\\"id\\\": \\\"powershell-get-wlanprofile\\\",  \\\"title\\\": \\\"Get-WlanProfile\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Get-WlanProfileSYNOPSISSYNTAXGet-WlanProfileDESCRIPTIONEXAMPLESExample 1PS C:\\\\\\\\&gt; PARAMETERSINPUTSNoneOUTPUTSSystem.ObjectNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/get-wlanprofile/\\\"},{  \\\"id\\\": \\\"powershell-import-csr\\\",  \\\"title\\\": \\\"Import-Csr\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Import-CsrSYNOPSISImport certificate signing request from base64 text.SYNTAXImport-Csr [[-Path] &lt;FileInfo&gt;] [-ShowText] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses the Windows Subsystem for Linux to invoke `openssl` to decode a certificate signing request.EXAMPLESEXAMPLE 1Import-Csr c:\\\\\\\\temp\\\\\\\\cert.reqThis example imports a CSR located at the given path and decodes it’s contents.PARAMETERS-PathType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ShowTextType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNoneOUTPUTS[psobject]NOTESAuthor: @torgglerDate: 2019-06-14RELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/import-csr/\\\"},{  \\\"id\\\": \\\"powershell-import-dhcpserverlog\\\",  \\\"title\\\": \\\"Import-DhcpServerLog\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Import-DhcpServerLogSYNOPSISImport DHCP Server Log files.SYNTAXImport-DhcpServerLog [[-Path] &lt;Object&gt;] [[-Filter] &lt;Object&gt;] [[-ComputerName] &lt;Object&gt;] [-Latest] [&lt;CommonParameters&gt;]DESCRIPTIONThis function imports DHCP Server Log files from CSV format.EXAMPLESEXAMPLE 1Import-DhcpServerLogImport all logs found in the default log folder.PARAMETERS-PathType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: C:\\\\\\\\Windows\\\\\\\\System32\\\\\\\\dhcpAccept pipeline input: FalseAccept wildcard characters: False-FilterType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: DhcpSrvLog*.logAccept pipeline input: FalseAccept wildcard characters: False-ComputerNameType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-LatestType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/import-dhcpserverlog/\\\"},{  \\\"id\\\": \\\"powershell-import-iislog\\\",  \\\"title\\\": \\\"Import-IISLog\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Import-IISLogSYNOPSISImport IIS log files with default header.SYNTAXImport-IISLog [[-Path] &lt;String&gt;] [[-Filter] &lt;String&gt;] [[-Line] &lt;Object&gt;] [[-Tail] &lt;Int32&gt;] [[-Count] &lt;Int32&gt;] [-Wait] [&lt;CommonParameters&gt;]DESCRIPTIONThis function imports IIS log files from CSV format.EXAMPLESEXAMPLE 1Import-IISLogImport the latest log found in the default log folder.EXAMPLE 2Import-IISLog -Tail 10 -WaitImport the latest 10 lines of the latest log found in the default log folder and wait for new lines until stopped with ctrl-c.PARAMETERS-PathType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: C:\\\\\\\\inetpub\\\\\\\\logs\\\\\\\\LogFiles\\\\\\\\*Accept pipeline input: FalseAccept wildcard characters: False-FilterType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: *.logAccept pipeline input: FalseAccept wildcard characters: False-LineType: ObjectParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-TailType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: -1Accept pipeline input: FalseAccept wildcard characters: False-CountType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: 1Accept pipeline input: FalseAccept wildcard characters: False-WaitType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[IISLogEntry]NOTESGeneral notesRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/import-iislog/\\\"},{  \\\"id\\\": \\\"powershell-invoke-whoisrequest\\\",  \\\"title\\\": \\\"Invoke-WhoisRequest\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Invoke-WhoisRequestSYNOPSISWohis request.SYNTAXInvoke-WhoisRequest [-DomainName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function creats a New-WebServiceProxy and then uses the GetWhoIs method to query whois information from www.webservicex.netEXAMPLESEXAMPLE 1Invoke-WhoisRequest -DomainName ntsystems.itThis example queries whois information for the domain ntsystems.itPARAMETERS-DomainNameType: StringParameter Sets: (All)Aliases: domainRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/invoke-whoisrequest/\\\"},{  \\\"id\\\": \\\"powershell-new-firewallrule\\\",  \\\"title\\\": \\\"New-FirewallRule\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"New-FirewallRuleSYNOPSISCreate a new Windows Firewall Rule.SYNTAXNew-FirewallRule [[-Port] &lt;Int32&gt;] [[-Protocol] &lt;String&gt;] [[-Store] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function is wrapper for New-NetFirewallRule with the goal of making it easier to create simple firewall rules and have consistent naming.EXAMPLESEXAMPLE 1New-FirewallRule -Port 6060This example creats a new firewall rule to allow connections on tcp/6060.PARAMETERS-PortType: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: 0Accept pipeline input: FalseAccept wildcard characters: False-ProtocolType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: TCPAccept pipeline input: FalseAccept wildcard characters: False-StoreType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: PersistentStoreAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTSNone.NOTESAuthor: @torgglerRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/new-firewallrule/\\\"},{  \\\"id\\\": \\\"powershell-new-rgsreport\\\",  \\\"title\\\": \\\"New-RgsReport\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"New-RgsReportSYNOPSISGather information about Skype for Business Response Groups, Queues, Agent Groups.SYNTAXNew-RgsReport [[-Filter] &lt;String&gt;] [-Path] &lt;FileInfo&gt; [-Html] [-PassThru] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses varios cmdlets of the Lync module (or an appropriate remote session) to gather information about Response Groups.EXAMPLESEXAMPLE 1Get-RgsReport -Filter Office -Path .\\\\\\\\Desktop\\\\\\\\report.csvThis example creates a CSV report for all RGS workflows matching Office.EXAMPLE 2Get-RgsReport -Filter Office -Path .\\\\\\\\Desktop\\\\\\\\report.html -HtmlThis example creates a HTML report for all RGS workflows matching Office.EXAMPLE 3Get-RgsReport -Filter Office -Path .\\\\\\\\Desktop\\\\\\\\report.html -Html -PassThru | Out-GridViewThis example creates a HTML report for all RGS workflows matching Office, because the PassThru switch is present,the collected data will also be written to the pipeline.From there we can use it and pipe it to Out-GridView or do whatever.PARAMETERS-FilterType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PathType: FileInfoParameter Sets: (All)Aliases:Required: TruePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-HtmlType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-PassThruType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSNone.OUTPUTS[psobject]NOTESAuthor: @torgglerRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/new-rgsreport/\\\"},{  \\\"id\\\": \\\"powershell-new-spfrecord\\\",  \\\"title\\\": \\\"New-SPFRecord\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"New-SPFRecordSYNOPSISCreate SPF record for a given mail domain.SYNTAXNew-SPFRecord [[-DomainName] &lt;String&gt;] [-mx] [-a] [-ptr] [[-IncludeIP] &lt;IPAddress[]&gt;] [[-IncludeDomain] &lt;String&gt;] [[-IncludeHost] &lt;String&gt;] [[-Action] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function helps with creating SPF records for mail domains.The SPF record should look something like this:v=spf1 mx a ptr ip4:127.1.1.1/24 a:host.example.com include:example.com -allMore information: https://www.ietf.org/rfc/rfc4408.txtEXAMPLESEXAMPLE 1Get-AcceptedDomain | New-SPFRecord -mx -IncludeDomain spf.protection.outlook.com -IncludeIP 192.0.2.1,2001:DB8::1 -Action FailDomainName : uclab.euRecord     : “v=spf1 mx ip4:192.0.2.1 ip6:2001:DB8::1 include:spf.protection.outlook.com -all”The above example creates SPF records for all accepted domains in Exchange (Online).PARAMETERS-DomainNameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: True (ByPropertyName, ByValue)Accept wildcard characters: False-mxType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-aType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-ptrType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-IncludeIPType: IPAddress[]Parameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-IncludeDomainType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-IncludeHostType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ActionType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 5Default value: FailAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTS[string][AcceptedDomain]This function accepts a string or objects with a DomainName property (such as returned by Get-AcceptedDomain) as input.OUTPUTS[psobject]This function writes a custom object to the pipeline.NOTESAuthor: @torgglerRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/new-spfrecord/\\\"},{  \\\"id\\\": \\\"powershell-remove-etchostsentry\\\",  \\\"title\\\": \\\"Remove-EtcHostsEntry\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Remove-EtcHostsEntrySYNOPSISRemove an entry from local hosts file by it’s IP address.SYNTAXRemove-EtcHostsEntry [[-IPAddress] &lt;String&gt;] [-WhatIf] [-Confirm] [&lt;CommonParameters&gt;]DESCRIPTIONFind an IP address and remove all lines where it appears from the \\\\\\\\etc\\\\\\\\hosts file of the local computer.EXAMPLESEXAMPLE 1Remove-EtcHostsEntry -IPAddress 1.1.1.1This example removes following lines from the hosts file1.1.1.1 test.test1.1.1.1 another.test.comPARAMETERS-IPAddressIPAddress of the hosts entry to be addedType: StringParameter Sets: (All)Aliases: ipRequired: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-WhatIfShows what would happen if the cmdlet runs.The cmdlet is not run.Type: SwitchParameterParameter Sets: (All)Aliases: wiRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ConfirmPrompts you for confirmation before running the cmdlet.Type: SwitchParameterParameter Sets: (All)Aliases: cfRequired: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/remove-etchostsentry/\\\"},{  \\\"id\\\": \\\"powershell-show-etchosts\\\",  \\\"title\\\": \\\"Show-EtcHosts\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Show-EtcHostsSYNOPSISDisplay /etc/hosts file content on Windows or Linux/macOS.SYNTAXShow-EtcHosts [&lt;CommonParameters&gt;]DESCRIPTIONThis funtion gets the content of the hosts file, parses the lines and outputsa custom object with HostName and IPAddress properties.EXAMPLESExample 1PS C:\\\\\\\\&gt; PARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/show-etchosts/\\\"},{  \\\"id\\\": \\\"powershell-show-wlanprofile\\\",  \\\"title\\\": \\\"Show-WlanProfile\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Show-WlanProfileSYNOPSISGet wlan pre-shared key.SYNTAXShow-WlanProfile [[-Name] &lt;String&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function invokes the netsh tool to get the pre-shared key for a given wireless lan profile.EXAMPLESEXAMPLE 1Show-WlanProfile \\\\\\\"my_net\\\\\\\"This example shows the key for the wlan profile “my_net”EXAMPLE 2Get-WlanProfile | Show-WlanProfileThis example shows the keys for all known wlan profiles on the system.PARAMETERS-NameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/show-wlanprofile/\\\"},{  \\\"id\\\": \\\"powershell-test-exchangeautodiscover\\\",  \\\"title\\\": \\\"Test-ExchangeAutodiscover\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-ExchangeAutodiscoverSYNOPSISTest Exchange Autodiscover Web Service.SYNTAXTest-ExchangeAutodiscover [[-EmailAddress] &lt;String&gt;] [[-ComputerName] &lt;String&gt;] [[-Credential] &lt;PSCredential&gt;] [-ExcludeExplicitO365Endpoint] [[-Report] &lt;FileInfo&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function tests the Exchange Autodiscover Web Serivce for a given Emailaddress.If ComputerName is not specified,the function tries to look up the Autodiscover service using the Outlook Clients logic.Locally cached and SCP dataare not evaluated.EXAMPLESEXAMPLE 1Test-ExchangeAutodiscover thomas@ntsystems.it -Credential (Get-Credential)This example tests the Autodiscover service for the given mailbox.It will query dns for autodiscover.ntsystems.it and _autodiscover._tcp.ntsystems.it. It will then try to retrieve an Autodiscover payload from https://ntsystems.it, https://autodiscover.ntsystems.it and the Office 365 endpoint.PARAMETERS-EmailAddressType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ComputerNameType: StringParameter Sets: (All)Aliases:Required: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-CredentialType: PSCredentialParameter Sets: (All)Aliases:Required: FalsePosition: 3Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-ExcludeExplicitO365EndpointType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-ReportType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-exchangeautodiscover/\\\"},{  \\\"id\\\": \\\"powershell-test-federationservice\\\",  \\\"title\\\": \\\"Test-FederationService\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-FederationServiceSYNOPSISTest the ADFS web serviceSYNTAXTest-FederationService [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to test if the federation service metadata can be retrieved from a given server.EXAMPLESEXAMPLE 1Test-FederationService -ComputerName fs.uclab.euThis example gets federation service xml information over the server fs.uclab.euPARAMETERS-ComputerNameSpecifies the name of the federation serverType: StringParameter Sets: (All)Aliases: ServerRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-federationservice/\\\"},{  \\\"id\\\": \\\"powershell-test-lyncdns\\\",  \\\"title\\\": \\\"Test-LyncDNS\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-LyncDNSSYNOPSISTest DNS entries for Skype for Business / Lync deployments.SYNTAXDESCRIPTIONThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.The NameSever parameter can be used to specify a nameserver.EXAMPLESEXAMPLE 1Test-LyncDNS -SipDomain uclab.euThis example queries DNS records for the domain uclab.euPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-lyncdns/\\\"},{  \\\"id\\\": \\\"powershell-test-lyncdiscover\\\",  \\\"title\\\": \\\"Test-LyncDiscover\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-LyncDiscoverSYNOPSISTest the Lyncdiscover service for Skype for Business/Lync deploymentsSYNTAXDESCRIPTIONThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.EXAMPLESEXAMPLE 1Test-LyncDiscover -SipDomain uclab.eu -HttpThis example gets Lyncdiscover information over http for the domain uclab.euPARAMETERSCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-lyncdiscover/\\\"},{  \\\"id\\\": \\\"powershell-test-oosfarm\\\",  \\\"title\\\": \\\"Test-OOSFarm\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-OOSFarmSYNOPSISGet internal and external URLs for PowerPoint sharing.SYNTAXTest-OOSFarm [-ComputerName] &lt;String&gt; [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to get and parse hosting discovery information for Office Online Server farms.If successfull, it returns a custom object with the internal and external URL for PowerPoint sharing.EXAMPLESEXAMPLE 1Test-OOSFarm -Name oos.example.comThis example tries to retrieve information from https://oos.example.com/hosting/discoveryPARAMETERS-ComputerNameSpecifies the name of the OOS server/farmType: StringParameter Sets: (All)Aliases: Server, Farm, NameRequired: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTS[psobject]NOTESGeneral notesRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-oosfarm/\\\"},{  \\\"id\\\": \\\"powershell-test-sfbdns\\\",  \\\"title\\\": \\\"Test-SfBDNS\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-SfBDNSSYNOPSISTest DNS entries for Skype for Business / Lync deployments.SYNTAXTest-SfBDNS [-SipDomain] &lt;String&gt; [[-NameServer] &lt;IPAddress&gt;] [-OpenDNS] [-internal] [-testConnection] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Resolve-DnsName to query well-known DNS records for Skype for Business / Lync deployments.The NameSever parameter can be used to specify a nameserver.EXAMPLESEXAMPLE 1Test-LyncDNS -SipDomain uclab.euThis example queries DNS records for the domain uclab.euPARAMETERS-SipDomainSpecifies the DNS domain name to testType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-NameServerSpecifies the nameserver which is used by Resolve-DnsNameType: IPAddressParameter Sets: (All)Aliases: ServerRequired: FalsePosition: 2Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-OpenDNSA quick way to use OpenDns servers instead of using NameServerType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-internalDo also query for internal records, they should only resolve when testing from the internal networkType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-testConnectionDo also test a TLS connection to the servers received from the queryType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-sfbdns/\\\"},{  \\\"id\\\": \\\"powershell-test-sfbdiscover\\\",  \\\"title\\\": \\\"Test-SfBDiscover\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-SfBDiscoverSYNOPSISTest the Lyncdiscover service for Skype for Business/Lync deploymentsSYNTAXTest-SfBDiscover [-SipDomain] &lt;String&gt; [-Http] [-internal] [-Online] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses Invoke-RestMethod to test if the Lyncdiscover service is responding for a given domain.EXAMPLESEXAMPLE 1Test-LyncDiscover -SipDomain uclab.eu -HttpThis example gets Lyncdiscover information over http for the domain uclab.euPARAMETERS-SipDomainSpecifies a DNS domain name to testType: StringParameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: FalseAccept wildcard characters: False-HttpUse HTTP instead of HTTPSType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-internalUse internal name (lyncdiscoverinternl) instead of the external one (lyncdiscover)Type: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-OnlineTest against Office 365 endpointsType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-sfbdiscover/\\\"},{  \\\"id\\\": \\\"powershell-test-tcpconnection\\\",  \\\"title\\\": \\\"Test-TCPConnection\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-TCPConnectionSYNOPSISTest if a TCP Connection can be established.SYNTAXTest-TCPConnection [-ComputerName] &lt;Object&gt; [[-Port] &lt;Object&gt;] [-Count &lt;Int32&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses System.Net.Sockets.Tcpclient to test if a TCP connection can be established with aComputerName on a given port.Much like “telnet” which is not installed by default.EXAMPLESEXAMPLE 1Test-TcpConnection -ComputerName www.ntsystems.itThis example tests if port 80 can be reached on www.ntsystems.itEXAMPLE 2Test-TcpConnection -ComputerName www.ntsystems.it -Port 25 -Count 4This example tests for 4 times if port 25 can be reached on www.ntsystems.itPARAMETERS-ComputerNameSpecifies the DNS name of the computer to testType: ObjectParameter Sets: (All)Aliases: HostName, Server, RemoteHostRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-PortSpecifies the TCP port to test on the remote computer.Type: ObjectParameter Sets: (All)Aliases: RemotePortRequired: FalsePosition: 2Default value: 80Accept pipeline input: FalseAccept wildcard characters: False-CountSpecifies the number of tests to run, this can be useful when testing load-balanced services; default is 1Type: Int32Parameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: 1Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.BooleanNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-tcpconnection/\\\"},{  \\\"id\\\": \\\"powershell-test-tlsconnection\\\",  \\\"title\\\": \\\"Test-TLSConnection\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Test-TLSConnectionSYNOPSISTest if a TLS Connection can be established.SYNTAXComputerNameTest-TLSConnection [-ComputerName] &lt;Object&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]UriTest-TLSConnection -Uri &lt;Uri&gt; [-IPAddress &lt;IPAddress&gt;] [[-Port] &lt;Object&gt;] [[-Protocol] &lt;SslProtocols[]&gt;] [[-FilePath] &lt;FileInfo&gt;] [-CheckCertRevocationStatus &lt;Boolean&gt;] [-SaveCert] [-Quiet] [&lt;CommonParameters&gt;]DESCRIPTIONThis function uses System.Net.Sockets.Tcpclient and System.Net.Security.SslStream to connect to a ComputerName andauthenticate via TLS.This is useful to check if a TLS connection can be established and if the certificate used onthe remote computer is trusted on the local machine.If the connection can be established, the certificate’s properties will be output as custom object.Optionally the certificate can be downloaded using the -SaveCert switch.The Protocol parameter can be used to specifiy which SslProtocol is used to perform the test.The CheckCertRevocationStatus parametercan be used to disable revocation checks for the remote certificate.EXAMPLESEXAMPLE 1Test-TlsConnection -ComputerName www.ntsystems.itThis example connects to www.ntsystems.it on port 443 (default) and outputs the certificate’s properties.EXAMPLE 2Test-TlsConnection -ComputerName sipdir.online.lync.com -Port 5061 -Protocol Tls12 -SaveCertThis example connects to sipdir.online.lync.com on port 5061 using TLS 1.2 and saves the certificate to the temp folder.EXAMPLE 3Test-TlsConnection -IPAddress 1.1.1.1 -ComputerName whatever.cloudflare.comThis example connects to the IP 1.1.1.1 using a Hostname of whatever.cloudflare.com.This can be useful to test hosts that don’t have DNS records configured.EXAMPLE 4\\\\\\\"host1.example.com\\\\\\\",\\\\\\\"host2.example.com\\\\\\\" | Test-TLSConnection -Protocol Tls11 -QuietThis example tests connection to the hostnames passed by pipeline input.It uses the -Quiet parameter and therefore only returns true/flase.PARAMETERS-ComputerNameSpecifies the DNS name of the computer to testType: ObjectParameter Sets: ComputerNameAliases: Server, Name, HostNameRequired: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-UriType: UriParameter Sets: UriAliases: ExternalUrlRequired: TruePosition: NamedDefault value: NoneAccept pipeline input: True (ByPropertyName)Accept wildcard characters: False-IPAddressSpecifies the IP Address of the computer to test.Can be useful if no DNS record exists.Type: IPAddressParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: NoneAccept pipeline input: FalseAccept wildcard characters: False-PortSpecifies the TCP port on which the TLS service is running on the computer to testType: ObjectParameter Sets: (All)Aliases: RemotePortRequired: FalsePosition: 2Default value: 443Accept pipeline input: FalseAccept wildcard characters: False-ProtocolType: SslProtocols[]Parameter Sets: (All)Aliases:Accepted values: None, Ssl2, Ssl3, Tls, Default, Tls11, Tls12, Tls13Required: FalsePosition: 3Default value: Tls12Accept pipeline input: FalseAccept wildcard characters: False-FilePathSpecifies a path to a file (.cer) where the certificate should be saved if the SaveCert switch parameter is usedType: FileInfoParameter Sets: (All)Aliases:Required: FalsePosition: 4Default value: Temp.cerAccept pipeline input: FalseAccept wildcard characters: False-CheckCertRevocationStatusCheck revocation information for remote certificate.Default is true.Type: BooleanParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: TrueAccept pipeline input: FalseAccept wildcard characters: False-SaveCertSaves the remote certificate to a file, the path can be specified using the FilePath parameterType: SwitchParameterParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: False-QuietOnly returns true or false, instead of a custom object with some information.Type: SwitchParameterParameter Sets: (All)Aliases: SilentRequired: FalsePosition: NamedDefault value: FalseAccept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSSystem.Management.Automation.PSObjectSystem.BooleanNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/test-tlsconnection/\\\"},{  \\\"id\\\": \\\"powershell-update-filewritetime\\\",  \\\"title\\\": \\\"Update-FileWriteTime\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Update-FileWriteTimeSYNOPSISTouch a file.SYNTAXUpdate-FileWriteTime [-Name] &lt;String[]&gt; [-Date &lt;DateTime&gt;] [&lt;CommonParameters&gt;]DESCRIPTIONThis function checks whether a given file exists, and if so, updates the LastWriteTime property of the given file.Should the file not exist, a new, empty file is created.This function works on Linux/macOS.EXAMPLESEXAMPLE 1touch myfileThis example creates myfile if it does not exist in the current directory.If the file does exist, the LastWriteTime property will be updated.PARAMETERS-NameOne or more filenames to be touchedType: String[]Parameter Sets: (All)Aliases:Required: TruePosition: 1Default value: NoneAccept pipeline input: True (ByValue)Accept wildcard characters: False-DateSpecify a specific date for LastWriteTimeType: DateTimeParameter Sets: (All)Aliases:Required: FalsePosition: NamedDefault value: (Get-Date)Accept pipeline input: FalseAccept wildcard characters: FalseCommonParametersThis cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see about_CommonParameters.INPUTSOUTPUTSNOTESRELATED LINKS\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/update-filewritetime/\\\"},{  \\\"id\\\": \\\"tags-adfs\\\",  \\\"title\\\": \\\"ADFS\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/adfs/\\\"},{  \\\"id\\\": \\\"tags-ai\\\",  \\\"title\\\": \\\"AI\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/ai/\\\"},{  \\\"id\\\": \\\"tags-asr\\\",  \\\"title\\\": \\\"ASR\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/asr/\\\"},{  \\\"id\\\": \\\"tags-appv\\\",  \\\"title\\\": \\\"AppV\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/appv/\\\"},{  \\\"id\\\": \\\"tags-audiocodes\\\",  \\\"title\\\": \\\"AudioCodes\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/audiocodes/\\\"},{  \\\"id\\\": \\\"tags-azure\\\",  \\\"title\\\": \\\"Azure\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/azure/\\\"},{  \\\"id\\\": \\\"tags-basics\\\",  \\\"title\\\": \\\"Basics\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/basics/\\\"},{  \\\"id\\\": \\\"tags-cisco\\\",  \\\"title\\\": \\\"Cisco\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/cisco/\\\"},{  \\\"id\\\": \\\"tags-citrix\\\",  \\\"title\\\": \\\"Citrix\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/citrix/\\\"},{  \\\"id\\\": \\\"tags-client\\\",  \\\"title\\\": \\\"Client\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/client/\\\"},{  \\\"id\\\": \\\"tags-cloud\\\",  \\\"title\\\": \\\"Cloud\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/cloud/\\\"},{  \\\"id\\\": \\\"tags-crypto\\\",  \\\"title\\\": \\\"Crypto\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/crypto/\\\"},{  \\\"id\\\": \\\"tags-events\\\",  \\\"title\\\": \\\"Events\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/events/\\\"},{  \\\"id\\\": \\\"tags-exchange\\\",  \\\"title\\\": \\\"Exchange\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/exchange/\\\"},{  \\\"id\\\": \\\"tags-firewall\\\",  \\\"title\\\": \\\"Firewall\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/firewall/\\\"},{  \\\"id\\\": \\\"tags-github\\\",  \\\"title\\\": \\\"GitHub\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/github/\\\"},{  \\\"id\\\": \\\"tags-go\\\",  \\\"title\\\": \\\"Go\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/go/\\\"},{  \\\"id\\\": \\\"tags-help\\\",  \\\"title\\\": \\\"Help\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/help/\\\"},{  \\\"id\\\": \\\"tags-home-server\\\",  \\\"title\\\": \\\"Home-Server\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/home-server/\\\"},{  \\\"id\\\": \\\"tags-hybrid\\\",  \\\"title\\\": \\\"Hybrid\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/hybrid/\\\"},{  \\\"id\\\": \\\"tags-hyper-v\\\",  \\\"title\\\": \\\"Hyper-V\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/hyper-v/\\\"},{  \\\"id\\\": \\\"tags-intune\\\",  \\\"title\\\": \\\"Intune\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/intune/\\\"},{  \\\"id\\\": \\\"tags-jekyll\\\",  \\\"title\\\": \\\"Jekyll\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/jekyll/\\\"},{  \\\"id\\\": \\\"tags-lync\\\",  \\\"title\\\": \\\"Lync\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/lync/\\\"},{  \\\"id\\\": \\\"tags-markdown\\\",  \\\"title\\\": \\\"MarkDown\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/markdown/\\\"},{  \\\"id\\\": \\\"tags-network\\\",  \\\"title\\\": \\\"Network\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/network/\\\"},{  \\\"id\\\": \\\"tags-office365\\\",  \\\"title\\\": \\\"Office365\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/office365/\\\"},{  \\\"id\\\": \\\"tags-onlinehelp\\\",  \\\"title\\\": \\\"OnlineHelp\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/onlinehelp/\\\"},{  \\\"id\\\": \\\"tags-powershell\\\",  \\\"title\\\": \\\"PowerShell\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/powershell/\\\"},{  \\\"id\\\": \\\"tags-rds\\\",  \\\"title\\\": \\\"RDS\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/rds/\\\"},{  \\\"id\\\": \\\"tags-rm\\\",  \\\"title\\\": \\\"RM\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/rm/\\\"},{  \\\"id\\\": \\\"tags-sql\\\",  \\\"title\\\": \\\"SQL\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/sql/\\\"},{  \\\"id\\\": \\\"tags-security\\\",  \\\"title\\\": \\\"Security\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/security/\\\"},{  \\\"id\\\": \\\"tags-server-2003\\\",  \\\"title\\\": \\\"Server-2003\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/server-2003/\\\"},{  \\\"id\\\": \\\"tags-server-2008-r2\\\",  \\\"title\\\": \\\"Server-2008-R2\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/server-2008-r2/\\\"},{  \\\"id\\\": \\\"tags-server-2008\\\",  \\\"title\\\": \\\"Server-2008\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/server-2008/\\\"},{  \\\"id\\\": \\\"tags-server-2012-r2\\\",  \\\"title\\\": \\\"Server-2012-R2\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/server-2012-r2/\\\"},{  \\\"id\\\": \\\"tags-server-2012\\\",  \\\"title\\\": \\\"Server-2012\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/server-2012/\\\"},{  \\\"id\\\": \\\"tags-server\\\",  \\\"title\\\": \\\"Server\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/server/\\\"},{  \\\"id\\\": \\\"tags-sharepoint\\\",  \\\"title\\\": \\\"Sharepoint\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/sharepoint/\\\"},{  \\\"id\\\": \\\"tags-skype4b\\\",  \\\"title\\\": \\\"Skype4B\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/skype4b/\\\"},{  \\\"id\\\": \\\"tags-teams\\\",  \\\"title\\\": \\\"Teams\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/teams/\\\"},{  \\\"id\\\": \\\"tags-update\\\",  \\\"title\\\": \\\"Update\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/update/\\\"},{  \\\"id\\\": \\\"tags-vmware\\\",  \\\"title\\\": \\\"VMware\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/vmware/\\\"},{  \\\"id\\\": \\\"tags-veeam\\\",  \\\"title\\\": \\\"Veeam\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/veeam/\\\"},{  \\\"id\\\": \\\"tags-wsl\\\",  \\\"title\\\": \\\"WSL\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/wsl/\\\"},{  \\\"id\\\": \\\"tags-workplace\\\",  \\\"title\\\": \\\"Workplace\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/workplace/\\\"},{  \\\"id\\\": \\\"tags-zed\\\",  \\\"title\\\": \\\"Zed\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/zed/\\\"},{  \\\"id\\\": \\\"tags-de\\\",  \\\"title\\\": \\\"de\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/de/\\\"},{  \\\"id\\\": \\\"tags-en\\\",  \\\"title\\\": \\\"en\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/en/\\\"},{  \\\"id\\\": \\\"tags-macos\\\",  \\\"title\\\": \\\"macOS\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/macos/\\\"},{  \\\"id\\\": \\\"tags-ntsystems\\\",  \\\"title\\\": \\\"ntSystems\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/ntsystems/\\\"},{  \\\"id\\\": \\\"tags-technology\\\",  \\\"title\\\": \\\"technology\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/technology/\\\"},{  \\\"id\\\": \\\"tags-uag\\\",  \\\"title\\\": \\\"uag\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/uag/\\\"},{  \\\"id\\\": \\\"post-lost-found-ai-highlights\\\",  \\\"title\\\": \\\"lost & found: AI highlights of the week\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"AI\\\"],  \\\"content\\\": \\\"I learned a lot attending AI Lowlands this week and wanted to share some links and highlights.gpt-realtime and vibevoiceOpenAI’s gpt-realtime is available on Microsoft Foundry very fast but quite expensive.Microsoft just launched VibeVoice-Realtime.llms.txt and NLwebllms.txt as a way to provide LLM-friendly content has been around for a little while.Microsoft proposes NLweb as a proof-of-concept for conversational interfaces and a semantic layer for the web.planetary defensehera.space is on a mission to study asteroid deflection. the website is also a super-cool multi-modal AI showcase.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-ai-highlights/\\\"},{  \\\"id\\\": \\\"post-technology-transforms-everything\\\",  \\\"title\\\": \\\"The Ecological Nature of Technological Change\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"technology\\\"],  \\\"content\\\": \\\"  Technological change is not additive; it is ecological. A new medium does not add something; it changes everything.I’ve been thinking about this quote from media theorist Neil Postman lately. Written in the 1990s about television’s impact on society, it feels more relevant than ever as we watch AI reshape our industry.From Smartphones to AI: Patterns of ChangeConsider the smartphone: it didn’t just add a portable phone to our lives - it transformed how we navigate spaces (goodbye paper maps), coordinate socially (from fixed meeting times to fluid arrangements), and process information. This wasn’t simply adding features; it was a fundamental reshaping of our behaviors and capabilities.The AI Transformation in ITToday, we’re witnessing a similar ecological transformation with AI in the IT industry. Like previous technological waves, the initial phase brings a surge of integration work - much as we saw with cloud adoption. But AI isn’t just another tool being added to our stack; it’s reshaping the entire landscape of how we work.The traditional cycle of coding, debugging, and deployment is evolving. But perhaps most intriguingly, while previous technological advances often reduced human interaction, AI might do the opposite. By handling routine tasks, it could create more space for meaningful human collaboration.Looking AheadHowever, this remains largely theoretical. While we’re seeing increased integration work now, the deeper transformation of workplace dynamics will take time. Technology capabilities may advance rapidly, but organizational and human adaptation follows its own pace.The challenge ahead isn’t just technical implementation - it’s about thoughtfully shaping AI’s role to enhance rather than diminish human connection in our work. As with any ecological change, the outcomes will depend not just on the technology itself, but on how we choose to integrate it into our (professional) lives.— TomThis post was generated from a conversation I had with Claude.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/technology-transforms-everything/\\\"},{  \\\"id\\\": \\\"post-zed-pwsh\\\",  \\\"title\\\": \\\"Zed and PowerShell on macOS\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Zed\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"VSCode has been my daily driver pretty much since it launched. It’s got a great community and amazing extensions, but sometimes it’s slow, and it started draining my battery a lot. I began looking for alternatives, and it wasn’t long before I came across Zed. Zed is a relatively new, high-performance code editor. It’s so fast that typing literally feels easier :)Most of my (coding) work revolves around PowerShell, so the lack of support was a problem for me. I followed Zed Industries’ GitHub and noticed that some good soul closed this issue a few days ago. Did they just add support for PowerShell? The answer is yes, as it turns out!The ExtensionFirst of all, we need to install the PowerShell extension. Like in VSCode, press ⌘ ⇧ X (Command + Shift + X) to open the extensions tab. Type “PowerShell” and press install.PowerShell Editor ServicesThen we need a language server to provide common editor features for the PowerShell language. Think tab completion, IntelliSense, best practices, and so on. There’s a PowerShell module that provides just that:             PowerShell/PowerShellEditorServices    Download the latest release and unzip it to a folder on your local device; in my case, it is: /Users/tom/code/PowerShellEditorServices.Zed ConfigurationLastly, we need to tell Zed where to find the language server (LSP). Again, like in VSCode, press ⌘ , (Command + ,) to open settings and configure the LSP. You can also set pwsh as the default shell and much more.\\\\\\\"terminal\\\\\\\": {  \\\\\\\"shell\\\\\\\": {    \\\\\\\"program\\\\\\\": \\\\\\\"pwsh\\\\\\\"  }},\\\\\\\"lsp\\\\\\\": {  \\\\\\\"powershell-es\\\\\\\": {    \\\\\\\"command\\\\\\\": \\\\\\\"pwsh\\\\\\\",    \\\\\\\"args\\\\\\\": [      \\\\\\\"-NoProfile\\\\\\\",      \\\\\\\"-Command\\\\\\\",      \\\\\\\"/Users/tom/code/PowerShellEditorServices/PowerShellEditorServices/Start-EditorServices.ps1\\\\\\\"    ]  }}Have fun!\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/zed-pwsh/\\\"},{  \\\"id\\\": \\\"post-setup-sign-in-with-apple-with-azure-swa\\\",  \\\"title\\\": \\\"Configure Sign in with Apple for Azure Static Web App\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Azure\\\"],  \\\"content\\\": \\\"I’m working on a side project and decided to use Sign in with Apple as an additional authentication provider, next to AAD that I would normally use.As per Microsoft’s documentation, adding apple as custom authentication provider is simple enough, just add the following lines to your staticwebapp.config.json file:\\\\\\\"identityProviders\\\\\\\": {    \\\\\\\"apple\\\\\\\": {    \\\\\\\"registration\\\\\\\": {        \\\\\\\"clientIdSettingName\\\\\\\": \\\\\\\"APPLE_CLIENT_ID\\\\\\\",        \\\\\\\"clientSecretSettingName\\\\\\\": \\\\\\\"APPLE_CLIENT_SECRET\\\\\\\"    }  }}Then we add the two setting names to the Web App’s configuration and we’re done, right? Almost.First we have to take a deep-dive into JWT as the APPLE_CLIENT_SECRET must be a signed JWT. There is no documentation specifically for Static Web Apps but this one for App Service is close enough.I converted the sample C# code to powershell for easier use. The required package have a dependency loop and so, instead of easily installing them with Install-Package I had to use nuget. Follow the documentation above to obtain client id, team id, key id, and the key in pkcs8 format, then use the following snippet to generate the client secret:function Get-AppleClientSecret {    param (        [string]$TeamId,        [string]$ClientId,        [string]$KeyId,        [System.IO.FileInfo]$P8KeyFile    )    $p8Content = Get-Content -Path $p8keyfile    $p8key = $p8Content.where{$_ -notmatch \\\\\\\"^---\\\\\\\"} -join(\\\\\\\"\\\\\\\")    [string]$audience = \\\\\\\"https://appleid.apple.com\\\\\\\"    [string]$issuer = $teamId    [string]$subject = $clientId    [string]$kid = $keyId    $Claims = New-Object -TypeName System.Collections.Generic.List[System.Security.Claims.Claim]    $Claims.Add(        (New-Object -TypeName System.Security.Claims.Claim(\\\\\\\"sub\\\\\\\", $subject))    )        $cngKey = [System.Security.Cryptography.CngKey]::Import(        [Convert]::FromBase64String($p8key),         [System.Security.Cryptography.CngKeyBlobFormat]::Pkcs8PrivateBlob    )    $signingCred = New-Object Microsoft.IdentityModel.Tokens.SigningCredentials(        (New-Object Microsoft.IdentityModel.Tokens.ECDsaSecurityKey(            (New-Object System.Security.Cryptography.ECDsaCng($cngKey)        ))),        \\\\\\\"ES256\\\\\\\" # EcdsaSha256    )    $NotBefore = Get-Date    $Expires = (Get-Date).AddDays(180)    $token = New-Object -TypeName System.IdentityModel.Tokens.Jwt.JwtSecurityToken(        $Issuer,         $Audience,         $Claims,         $NotBefore,         $Expires,         $signingCred    )    $null = $token.Header.Add(\\\\\\\"kid\\\\\\\", $kid)    $null = $token.Header.Remove(\\\\\\\"typ\\\\\\\")    $tokenHandler = New-Object System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler        return $tokenHandler.WriteToken($token)}# install &amp; import requirementsInvoke-WebRequest -Uri 'https://dist.nuget.org/win-x86-commandline/latest/nuget.exe' -OutFile \\\\\\\"$env:USERPROFILE\\\\\\\\Downloads\\\\\\\\nuget.exe\\\\\\\"&amp; \\\\\\\"$env:USERPROFILE\\\\\\\\Downloads\\\\\\\\nuget.exe\\\\\\\" Install System.IdentityModel.Tokens.Jwt -Version 6.32.0 -OutputDirectory \\\\\\\"$env:USERPROFILE\\\\\\\\Downloads\\\\\\\\.nuget\\\\\\\"Add-Type -Path \\\\\\\"$env:USERPROFILE\\\\\\\\.nuget\\\\\\\\packages\\\\\\\\Microsoft.IdentityModel.Tokens\\\\\\\\6.32.0\\\\\\\\lib\\\\\\\\netstandard2.0\\\\\\\\Microsoft.IdentityModel.Tokens.dll\\\\\\\"Add-Type -Path \\\\\\\"$env:USERPROFILE\\\\\\\\.nuget\\\\\\\\packages\\\\\\\\System.IdentityModel.Tokens.Jwt\\\\\\\\6.32.0\\\\\\\\lib\\\\\\\\netstandard2.0\\\\\\\\System.IdentityModel.Tokens.Jwt.dll\\\\\\\"Add-Type -Path \\\\\\\"$env:USERPROFILE\\\\\\\\.nuget\\\\\\\\packages\\\\\\\\Microsoft.IdentityModel.Logging\\\\\\\\6.32.0\\\\\\\\lib\\\\\\\\netstandard2.0\\\\\\\\Microsoft.IdentityModel.Logging.dll\\\\\\\"Add-Type -Path \\\\\\\"$env:USERPROFILE\\\\\\\\.nuget\\\\\\\\packages\\\\\\\\Microsoft.IdentityModel.JsonWebTokens\\\\\\\\6.32.0\\\\\\\\lib\\\\\\\\netstandard2.0\\\\\\\\Microsoft.IdentityModel.JsonWebTokens.dll\\\\\\\"Add-Type -Path \\\\\\\"$env:USERPROFILE\\\\\\\\.nuget\\\\\\\\packages\\\\\\\\microsoft.identitymodel.abstractions\\\\\\\\6.32.0\\\\\\\\lib\\\\\\\\netstandard2.0\\\\\\\\Microsoft.IdentityModel.Abstractions.dll\\\\\\\"# set parameters and get secret$p = @{    TeamId = \\\\\\\"Q847A7FG64\\\\\\\"    ClientId = \\\\\\\"wtf.onprem.appleid\\\\\\\"    KeyId = \\\\\\\"8QKD4J6XDZ\\\\\\\"    P8KeyFile = \\\\\\\".\\\\\\\\AuthKey_8QKD4J6XDZ.p8\\\\\\\"}Get-AppleClientSecret @pOnce we have obtained the APPLE_CLIENT_SECRET, the sign in process with Apple should be successful. However, after signing in, we are redirected to the Static Web App and greeted with a 403: Forbidden:  We need an email address or a handle from your login service. To use this login, please update your account with the missing info.It turns out the identityProviders example given in Microsoft’s documentation is not quite complete. Sign in with Apple only inserts the user’s email address as claim in the authentication token if we specifically ask for it during the sing in process. To do that, we have to add the scopes property to the staticwebapp.config.json file:\\\\\\\"identityProviders\\\\\\\": {    \\\\\\\"apple\\\\\\\": {    \\\\\\\"registration\\\\\\\": {        \\\\\\\"clientIdSettingName\\\\\\\": \\\\\\\"APPLE_CLIENT_ID\\\\\\\",        \\\\\\\"clientSecretSettingName\\\\\\\": \\\\\\\"APPLE_CLIENT_SECRET\\\\\\\"    },    \\\\\\\"login\\\\\\\": {        \\\\\\\"scopes\\\\\\\": [\\\\\\\"email\\\\\\\"]    }  }}Adding the scope will allow new users to sign in successfully. Users that had already signed in must first remove the app from Sign in with Apple in their Apple account.So, after adding the scope and removing the app from Sign in with Apple, we can finally attempt to sign in again and we should see that the user has to consent sharing their email address in the sign in process:                \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/setup-sign-in-with-apple-with-azure-swa/\\\"},{  \\\"id\\\": \\\"post-mastodon-and-webfinger\\\",  \\\"title\\\": \\\"Mastodon and WebFinger\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"ntSystems\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"With the uncertainty surrounding Twitter I have decided to set up an account on Mastodon. If you haven’t heard about it Mastodon is an de-centralized, open-source alternative to centralized social media. It is powered by open protocols such as ActivityPub and WebFinger which allow federation of individual servers (called instances).If a user on one server searches for a user on another server, they will enter the full name, i.e. @user@example.com, into the search field. The server will then look for information about the user at the path https://example.com/.well-known/webfinger. If found, the reply contains information about where the profile of the user can be found.We can use this protocol to be discoverable by servers on our own domain. We are using Bridgetown to build this site so placing a JSON file at this path src/.well-known/webfinger did the trick. So even though my profile is currently hosted at masto.ai you can still find me with @tom@onprem.wtf. And if you do find me, give me a follow :)I used this PowerShell function to test the WebFinger endpoint on our and other sites.function Invoke-WebFinger {    [CmdletBinding()]    param(        [Parameter(ValueFromPipeline)]        [ValidatePattern('^@?[\\\\\\\\d\\\\\\\\w]+@[\\\\\\\\d\\\\\\\\w]+\\\\\\\\.[\\\\\\\\d\\\\\\\\w]+')]        [string]$Uri,        [string]$Server,        [string]$Username    )    process {        if($Uri){            $Username, $server = $uri -replace '^@' -split '@'        }        $webFingerUri = \\\\\\\"https://$server/.well-known/webfinger?resource=acct:$Username@$Server\\\\\\\"        Write-Verbose \\\\\\\"GET $webFingerUri\\\\\\\"        $r = Invoke-RestMethod -Uri $webFingerUri        [PSCustomObject]@{            Uri = $Username,$Server -join '@'            Subject = $r.subject            Aliases = $r.Aliases            ProfilePage = $r.links.where{$_.rel -eq 'http://webfinger.net/rel/profile-page'}.href        }    }}# Examples'tto@masto.ai','@tom@onprem.wtf' | Invoke-WebFingerInvoke-WebFinger -Uri tom@onprem.wtfInvoke-WebFinger -Server onprem.wtf -Username tomOther people wrote about this:  Use your own user @ domain for Mastodon discoverability with the WebFinger Protocol without hosting a server  Mastodon on your own domain without hosting a server  Using Cloudflare to Customize Your Mastodon Username Domain\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/mastodon-and-webfinger/\\\"},{  \\\"id\\\": \\\"post-how-to-connect-exchange-online-managed-identity\\\",  \\\"title\\\": \\\"How to connect to Exchange Online powershell with a managed identity\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Azure\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"The latest preview version of the ExchangeOnlineManagement powershell module includes the following new parameters: -ManagedIdentity and -ManagedIdentityAccountId.As their names imply, they can be used to connect to Exchange Online with a managed identity. According to the documentation this is currently only supported with Azure Virtual Machines and Virtual Machine Scale Sets, however I have used this successfully within Azure Automation runbooks.Create the automation accountIf you have an existing account skip this step. I will be reusing the variables from this first example, so fill in the name of your automation account and the resource group.$accountName = 'azautomation1'$rgName = 'onprem-core'$location = 'West Europe'Connect-AzAccountNew-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -Location $locationGet the moduleThe first step is to add the module to the Automation Account. Installing it through the Azure Portal did not work, as that way only seems to support the latest non-preview version. I used the following commands from the Az powershell module to install the preview version of the module in my automation account:$moduleName = 'ExchangeOnlineManagement'$moduleVersion = '2.0.6-Preview7'New-AzAutomationModule -AutomationAccountName $accountName -ResourceGroupName $rgName -Name $moduleName -ContentLinkUri \\\\\\\"https://www.powershellgallery.com/api/v2/package/$moduleName/$moduleVersion\\\\\\\"Managed IdentityNow it’s time to enable the system assigned managed identity for the automation account. We can do this through the Azure portal by navigating to the automation account and setting the Status to On under Identity. Alternatively, we can use the Az powershell module like this:Set-AzAutomationAccount -Name $accountName -ResourceGroupName $rgName -AssignSystemIdentityNext we will need the id of the managed identity. It will show up in the Azure portal once it has been enabled or it can be retrieved with Az powershell:Get-AzADServicePrincipal -DisplayName $accountNameIn my case the object id is b395da15-4904-490c-9109-2bc91a12a08d. With this id in hand, we use the Microsoft Graph powershell SDK to grant the necessary permissions to the managed identity.Connect-MgGraph$params = @{    ServicePrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    PrincipalId = 'b395da15-4904-490c-9109-2bc91a12a08d' # managed identity object id    ResourceId = (Get-MgServicePrincipal -Filter \\\\\\\"AppId eq '00000002-0000-0ff1-ce00-000000000000'\\\\\\\").id # Exchange online    AppRoleId = \\\\\\\"dc50a0fb-09a3-484d-be87-e023b12c6440\\\\\\\" # Exchange.ManageAsApp}New-MgServicePrincipalAppRoleAssignedTo @paramsLastly we want to assign the role Exchange Administrator to the managed identity. Again, we can do this through the Azure portal or with the following command:$roleId = (Get-MgRoleManagementDirectoryRoleDefinition -Filter \\\\\\\"DisplayName eq 'Exchange Administrator'\\\\\\\").idNew-MgRoleManagementDirectoryRoleAssignment -PrincipalId b395da15-4904-490c-9109-2bc91a12a08d -RoleDefinitionId 29232cdf-9323-42fd-ade2-1d097af3e4de -DirectoryScopeId \\\\\\\"/\\\\\\\"Please assign the role with the least amount of privileges to complete the task you need.Connect to Exchange Online in the runbookAfter completing the steps above we are ready to connect to Exchange Online using the managed identity in the runbook. If you create a new runbook, please make sure to use runtime version 5.1 as the that’s where we have imported the module earlier.Connect-ExchangeOnline -ManagedIdentity -Organization 'onpremwtf.onmicrosoft.com'Get-AcceptedDomainTom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/how-to-connect-exchange-online-managed-identity/\\\"},{  \\\"id\\\": \\\"post-goodbye-jekyll\\\",  \\\"title\\\": \\\"Goodbye Jekyll, hello Bridgetown!\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\"],  \\\"content\\\": \\\"We have been using Jekyll for our little site since 2016. It was fast, simple, it did it’s job nicely. Bridgetown does all the same things, and much more. It’s Jekyll’s modern cousin.We have used GitHub pages to host our site as it integrates nicely with Jekyll. I have long wanted to play with Cloudflare pages, so I decided to upgrade the site and move it over to Cloudflare in the progress.How to run Bridgetown on Cloudflare pages?Well, it’s easy enough, we just have to things to consider:  Include a .node-version file because Cloudflare pages defaults to 12.18.0 and bridgetown requires a version newer than 14  Set the BRIDGETOWN_ENV environment variable to productionTo tell Cloudflare pages to use a newer version of node, I created the file .node-version with the content 16.16.0 in the root directory of my repository. Just like with Jekyll, the base is a GitHub repository. All that’s left to do is sign in to Cloudflare and create a new pages project. I sign in to my GitHub account from Cloudflare, select the repository and enter the following information:Build command: bin/bridgetown deployBuild output directory: outputEnvironment variable: BRIDGETOWN_ENV  productionDone.Cloudflare redirectsWe have used Jekyll’s jekyll-redirect-from plugin to create redirects for some URLs. It seems bridgetown does not yet have a plugin for that, so I used Cloudflare page’s _redirect file instead. I created a file with the name _redirect in the src folder of my bridgetown project. The content of the file is like this:/a/very/long/url/path /shorturl 301You can read more in the docsI used the following few lines of powershell code to find Jekyll’s redirect_from statements in my source folder, convert them into slugs, and add them to the _redirect file.Get-ChildItem ./src/ -Recurse -Filter *.md | Select-String -pattern \\\\\\\"redirect_from\\\\\\\" | ForEach-Object {    $p = $_.path    $n = $_.filename    $l = $_.line    # remove date and extension from filename as slug contains neither    if($n -match \\\\\\\"^\\\\\\\\d{4}-\\\\\\\"){        $n = $n -replace \\\\\\\"\\\\\\\\d{4}-\\\\\\\\d{2}-\\\\\\\\d{2}-\\\\\\\",\\\\\\\"\\\\\\\"     }    $n = $n -replace \\\\\\\".md\\\\\\\",\\\\\\\"\\\\\\\"    $name = $n.ToLower()    # find parent path and create slug    $p = Split-Path -Path $p -Parent | Split-Path -Leaf    switch($p){        \\\\\\\"_OnlineHelp\\\\\\\" { $slug = \\\\\\\"/powershell/$name\\\\\\\" }        \\\\\\\"Archive\\\\\\\" { $slug = \\\\\\\"/post/$name\\\\\\\" }        \\\\\\\"_Modules\\\\\\\" { $slug = \\\\\\\"/powershell/$name\\\\\\\" }        \\\\\\\"_Scripts\\\\\\\" { $slug = \\\\\\\"/powershell/$name\\\\\\\" }        \\\\\\\"_posts\\\\\\\" { $slug = \\\\\\\"/post/$name\\\\\\\" }    }    # write _redirects file    $l -replace \\\\\\\"redirect_from: \\\\\\\",\\\\\\\"\\\\\\\" | ConvertFrom-Json | ForEach-Object {        \\\\\\\"$_ $slug 301\\\\\\\"    } } | Set-Content ./src/_redirects\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/goodbye-jekyll/\\\"},{  \\\"id\\\": \\\"post-sender-authentication-exo-2021\\\",  \\\"title\\\": \\\"How to configure sender authentication for Exchange Online in 2021\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Office365\\\",\\\"Exchange\\\",\\\"Security\\\"],  \\\"content\\\": \\\"The current state of emailThe year is 2021 and, despite many efforts to kill it off, email is still going strong. According to Microsoft’s latest digital defense report Exchange Online Protection processed 6 trillion messages last year, 13 billion of which malicious. 6 trillion, that’s a number with 12 zeros. And that’s just Exchange Online. Worldwide we are sending and receiving over 300 billion emails every day, according to this site. 300 billion. Every day.With these numbers there’s no wonder email is one of the main threat vectors.As many organizations are moving their mailboxes to Exchange Online, I thought I would share my basic setup for new tenants. This will help you getting started with a secure configuration in no time. I have two goals with this basic setup:  Protect your brand (domain) from being spoofed/abused  Protect your users from receiving malicious emailsSender AuthenticationSo you have just signed up for a new tenant with Microsoft 365 and you are adding your custom domains. The wizard will ask you, whether or not you are planning to use Exchange Online and, if you select yes, it will help you setup SPF.Sender policy frameworkEven though it has only been published as proposed standard by the IETF in 2014, SPF has been around since the early 2000’s. Despite it’s age it is still something we regularly find missing or misconfigured in customer environments. SPF gives an administrator of an email domain a way to specify which systems (IP addresses) are allowed to send emails using the domain. The admin publishes a TXT record in the DNS, listing all IP addresses that are allowed to send emails. This would typically be your onprem Exchange servers or email gateways.Receiving systems check the TXT record and see if the system that’s trying to deliver a message is allowed to do so.If you want to start sending emails from Exchange Online, you should add the following line to your existing SPF record.include: include:spf.protection.outlook.comIf you don’t have an SPF record in place, create a new TXT record at the root of your domain with this content:v=spf include:spf.protection.outlook.com -all  If you are not using a domain for outbound email, please publish the following SPF record to make it harder for criminals to abuse your domain:  TXT: v=spf -allThis is how far the wizard goes but we should really always configure the following records as well.DomainKeys Identified MailDKIM has been standardized in 2011 and, in parts thanks to Exchange Online, is being used widely. However, we find SPF is better known and understood by our customers. DKIM leverages digital signatures that let a receiving system cryptographically verify whether an email was sent by an authorized system or not. The signature includes a domain name (d=) that should match the domain in the mail from address. Like SPF, DKIM uses DNS records in the sender’s email domain. The administrator of the domain publishes a TXT record that contains a public key and then configures the email server to sign all outgoing messages with the corresponding private key.Receiving systems see the signature and a so called selector in the header of the email. The selector tells the receiving system where to find the public key to verify the signature. As always with certificates, keys have to be rotated periodically which means DKIM DNS records must be updated accordingly. Sounds like a lot of complicated work, right?With Exchange Online, Microsoft does that work for you. All outgoing emails from Exchange Online are signed with a key that Microsoft manages. The only thing we have to do, is point our DNS to that key and enable the configuration. There is a lengthy docs article about DKIM and how to build the DNS records you have to publish. I am using a few lines of PowerShell to make that process easier.Use the following PowerShell snippet to:  Create a new DKIM signing configuration for your custom domain  Publish DNS records pointing to Microsoft domains  Enable the DKIM signing configuration# Create DKIM signing config for all domains that do not have one$d = Get-DkimSigningConfig$domains = $d.domainGet-AcceptedDomain | % {​​​​​​     if ($_.DomainName -in $domains) {​​​​​​}​​​​​​     else {​​​​​​ New-DkimSigningConfig -KeySize 2048 -DomainName $_.DomainName -Enabled $false}​​​​​​ }​​​​​# Create DNS RecordsGet-DkimSigningConfig | Where-Object Name -NotMatch onmicrosoft | Select-Object Name,*cname*,@{    n=\\\\\\\"Selector1\\\\\\\";    e={($_.Selector1CNAME -split \\\\\\\"-\\\\\\\" | Select-Object -First 1),$_.name -join \\\\\\\"._domainkey.\\\\\\\"}},@{      n=\\\\\\\"Selector2\\\\\\\";    e={($_.Selector2CNAME -split \\\\\\\"-\\\\\\\" | Select-Object -First 1),$_.name -join \\\\\\\"._domainkey.\\\\\\\"}} Once the DNS records are in place, we can go ahead and enable the DKIM configuration:Get-DkimSigningConfig | Set-DkimSigningConfig -Enabled $true  If you are not using a domain for outbound email, you don’t have to worry about DKIM.Domain-based Message Authentication, Reporting and ConformanceDMARC is the new kid on the bloc. Well kind of, the RFC is from 2015. It is yet another DNS record that an administrator can use to tell receiving systems what exactly they should do with emails that fail SPF or DKIM. Essentially DMARC builds on SPF and DKIM and uses both to calculate an authentication result that supports scenarios where SPF alone would fail (forwarding). The DMARC policy is also used to define what should happen with unaligned or failing DKIM signatures as DKIM itself doesn’t really specify that.So, another DNS record you said? Here we go:Name: _dmarc.example.comType: TXTValue: v=DMARC1; p=none; pct=100;  While the SPF record must be published at the root of your domain, the DMARC record must be at _dmarc.With DMARC it is recommended to implement monitoring, so we will have to look at an additional tool. I have found the DMARC Monitor from ValiMail is a good option to get started, it is also free for Microsoft 365 customers. There are many alternatives, please check with your security team if you already have a tool. Whichever tool you end up using, it will ask you to update your DMARC record to include an URI of a mailbox to send reports to. The rua and ruf tags in the TXT record are used for that, in the case of ValiMail the complete record looks like this:v=DMARC1; p=none; pct=100; rua=mailto:dmarc_agg@vali.email;This record tells a receiving system to deliver emails independent of the authentication result (p is set to none) and send aggregated reports (rua) to ValiMail.With this record in place, you are now ready to send emails from Exchange Online. But we’re not completely done with DMARC just yet.The ultimate goal is to set the DMARC policy to p=reject thereby telling any receiving system to reject emails that fail authentication. Before we can do that, we must make sure all legitimate emails pass authentication. The monitoring helps us verify exactly that, the example in the following screenshot shows outbound emails from our systems for the last month. As you can see, all of them authenticated successfully:                  Exchange Online does currently not send DMARC reports, so if you are sending only to Exchange Online recipients, don’t expect much information in your monitoring.Remember that I said from our systems above, now let’s change that filter in ValiMail and look at all emails from our domain. As you can see in the screenshot below, over the same period of time, 90 emails failed DMARC authentication:                In our case, we already have a reject policy in place, so receiving systems should not accept these emails which are spam or worse. So, after setting up DMARC monitoring with a policy of none, observe the situation for some time and, if you are confident your systems are configured correctly, go ahead and update the record:v=DMARC1; p=reject; pct=100; rua=mailto:dmarc_agg@vali.email;  If you are not using a domain for outbound email, please publish the following DMARC record to make it harder for criminals to abuse your domain:  TXT: v=DMARC1; p=reject; pct=100;In the next post we will have a look at preset security policies in Exchange Online Protection.— Tom.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sender-authentication-exo-2021/\\\"},{  \\\"id\\\": \\\"post-why-is-this-website-fast\\\",  \\\"title\\\": \\\"Why is this website so fast?\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"ntSystems\\\",\\\"GitHub\\\"],  \\\"content\\\": \\\"I have recently updated our website and have learned a few things while doing so. As mentioned on the home page, this website is still built with Jekyll. The so-called grandfather of static website generators is maybe not perfect, but the following reasons make it a good option for me.  It just works: I don’t have much time to tinker with this side-project, there are no complicated, always changing dependencies like with newer, javascript-based tools (oh and no gigantic node_modules either)  It’s simple: True how variables are handled is not always intuitive but I have learned enough to use it effectively  GitHub pages: The build process is automated, I just push my changes and the rest is taken care ofYou promised fast, what’s all this?I’m getting there. Fast websites are generally associated with more modern site generators like Gatsby. These typically use a lot of javascript that makes them fast but also more complicated. I wanted to see, if I could get good results with good old Jekyll.This site is fast because it’s small and very simple. I’m not saying bigger sites don’t need all that node_modules goodness, I’m saying small sites - like this one - don’t need it.This site is also fast, because I’ve added a few extra lines to the head section of the html. At the end of every post you can find a next navigation button that brings you to the next post. With a little help from Jekyll, I was able to include the relative URL of the next post as link to the head section with the keyword rel=next. This little keyword tells the browser to download the post whenever it has a free moment:{% if page.next %}&lt;link rel=\\\\\\\"next\\\\\\\" href=\\\\\\\"{{ page.next.url }}\\\\\\\"&gt;{% endif %}The result is a super fast navigation experience because the target has already been downloaded. I’m also preloading fonts with rel=\\\\\\\"preload\\\\\\\" and the little CSS we use is inlined.Service workersAnother thing I learned while looking at modern websites is the concept of service workers. This is a little bit of javascript that can be very powerful indeed. Essentially, a service worker is a script that is installed in the browser when a user opens the website. Once installed it can intercept and handle network requests from the browser to the site. It’s a kind of proxy in your browser just for our site.I’m using a service worker to create a local cache for use with this site. On the first visit, the service downloads a few static files that visitors will definitely need (fonts, main pages). It uses a cache-first strategy, so whenever the browser requests something, the service worker looks in the cache first and returns any results from there. After that it goes out to the site and retrieves the latest version of what the browser was looking for. If there’s no cache-hit, the resource is fetched from the network.The service worker needs a manifest and we have to tell the browser where to find it. We add the manifest to the head section and use a few lines of javascript to trigger the installation of the service worker. This is the pointer to the manifest file:&lt;link rel=\\\\\\\"manifest\\\\\\\" href=\\\\\\\"/manifest.json\\\\\\\"&gt;And this is the code that registers the service worker in your browser after the page is loaded. I have added a condition to skip the registration if the site is accessed through localhost, which is the case when developing locally:if ('serviceWorker' in navigator &amp;&amp; !(/localhost/.test(window.location.href))) {  window.addEventListener('load', function() {    navigator.serviceWorker.register('//serviceworker.js')    console.log('Servie worker registered.');  });}Faster build times with Jekyll on WSLI have used Jekyll on Windows 10 leveraging the Windows Subsystem for Linux since 2017. Today I realized that actually storing the files within WSL makes the build time much (much) faster. Until today I stored the repository in my Windows user profile, something like C:\\\\\\\\users\\\\\\\\tto\\\\\\\\.... In the WSL I happily changed into this directory following /mnt/C/Users... before running jekyll serve. Build time was around 5 minutes. Not great.Today it ocurred to me to clone the repository again, this time into the WSL. So I can access it using a WSL path, something like /home/tto/.... Build time is now less than one minute. Not bad.WebpageTest resultsYou don’t have to take my word for it, webpagetest also thinks this website is pretty fast:                — Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/why-is-this-website-fast/\\\"},{  \\\"id\\\": \\\"post-so-long-2020\\\",  \\\"title\\\": \\\"So long, 2020\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"ntSystems\\\",\\\"GitHub\\\"],  \\\"content\\\": \\\"Goodbye 2020! What a year it has been.True, I had to cancel some trips and I stayed home a lot more than usual, but apart from that, it was a pretty spectacular year for me. I moved to Amsterdam from a smaller city in the outskirts. I was able to go to Zürich, Sardinia, Marbella, Napoli and a few other places. In a prolonged episode of lockdown blues I managed to get about 1000 km on my road bike done. However, that was sometime before the summer, since then I have been (a lot) less active. I worked a lot. I learned a lot.Since a certain global event made more travelling impossible, or at least not very recommendable, I’m staying in Amsterdam for the holiday season and started building this new site.After more than 10 years, it’s now time to say: Goodbye ntSystems.itWelcome onprem.wtfWelcome to our new home. This site is still build with Jekyll and hosted on GitHub pages. I replaced the default minima theme with a custom one, mostly because I wanted to learn and experiment with some CSS features. I also had a good look at some of the more modern static site generators and other alternatives but decided to stick with Jekyll because it is simple and I really don’t need all of that node_modules stuff for just a simple blog.The new site has a simpler layout with less clutter, should be easier to read on any screen, and it also has a dark theme. Actually, unless you select a theme, it will use the same settings that your operating system (or browser) uses. Pretty slick, right?What about the domain name you ask? Well, this one was available and it kind of fits with what we are doing at the moment. If you find a better one, I’m open to suggestions 😉What’s next?Well that’s a good question. For now, like many others, I’ll be watching how the vaccine rollout is going and what’s happening in the US of A. I would like to become a better writer so I will try to publish my thoughts more regularly. We’ll see how that goes.With that I wish you all the best for the new year.— Tom.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/so-long-2020/\\\"},{  \\\"id\\\": \\\"post-converting-powershell-help-to-a-website\\\",  \\\"title\\\": \\\"Convert PowerShell Help to a Website\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Help\\\",\\\"MarkDown\\\"],  \\\"content\\\": \\\"How to use the platyPS PowerShell module to convert comment-based help to markdown and easily host it on GitHub pages.Now you might have read that our blog is powered by Jekyll, which is a static-site generator that turns markdown files into html. So, obviously, if I would be able to convert PowerShell help content to markdown files, I could simply put them into a folder an serve them via the blog.Create markdown filesThe first step is to install platyPS (available on the PS Gallery) and create the markdown files for every function.Install-Module platyPSImport-Module platyPS, TAK, PSSpeechforeach ($cmdlet in (Get-Command -Module PSSpeech)) {     $h = Get-Help $($cmdlet.Name)    $meta = @{        'layout' = 'pshelp';        'author' = 'tto';        'title' = $($cmdlet.Name);        'category' = $($cmdlet.ModuleName.ToLower());        'excerpt' = \\\\\\\"`\\\\\\\"$($h.Synopsis)`\\\\\\\"\\\\\\\";        'date' = $(Get-Date -Format yyyy-MM-dd);        'redirect_from' = \\\\\\\"[`\\\\\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name)/`\\\\\\\", `\\\\\\\"/PowerShell/$($cmdlet.ModuleName)/$($cmdlet.Name.ToLower())/`\\\\\\\", `\\\\\\\"/PowerShell/$($cmdlet.Name.ToLower())/`\\\\\\\"]\\\\\\\"    }    if($h.Synopsis -notmatch \\\\\\\"\\\\\\\\[|\\\\\\\\]\\\\\\\") {        New-MarkdownHelp -Command $cmdlet -OutputFolder .\\\\\\\\_OnlineHelp\\\\\\\\a -Metadata $meta -Force     }}The above example creates a .md help file for every function in the TAK module. The files are almost ready to be used by our Jekyll-powered blog, I’m using the -Metadata parameter to add some additional information to the ‘front matter’ of each file.  I could be using New-MarkdownHelp -Module TAK but that way, I was not able to include the metadata automatically.Rename files for JekyllThe only thing that I have to do now, in order to have Jekyll pick up the files and create websites, is to rename them accordingly.foreach ($file in (Get-ChildItem '.\\\\\\\\tak-md-help\\\\\\\\*.md')) {    $timestamp = (Get-Date -Format 'yyyy-MM-dd')    $NewName = $timestamp, $file.name -join '-'    Rename-Item -Path $file.FullName -NewName $NewName}The above example renames all *.md files in the tak-md-help folder to include a timestamp. This step is not necessary if you are using a collection in Jekyll.Include HelpUriThe Get-Help command has an -Online parameter, that can be used to easily open a related link when looking for help. To include this functionality in my scripts, I just have to put the URL of the online article in the [CmdletBinding()] statement, like so:[CmdletBinding(HelpUri = 'https://ntsystems.it/PowerShell/TAK/test-tlsconnection/')]Links  https://github.com/PowerShell/platyPSThat’s it :)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/converting-powershell-help-to-a-website/\\\"},{  \\\"id\\\": \\\"post-using-powershell-and-azure-cognitive-services-to-convert-text-to-speech\\\",  \\\"title\\\": \\\"Using PowerShell and Azure Cognitive Services to convert text to speech\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Azure\\\"],  \\\"content\\\": \\\"In one of our recent Microsoft Teams projects I needed some voice prompts for a customer service call queue. I figured it would be nice to have Azure’s artificial-intelligence-powered speech service convert my text input to an audio file. Turns out it’s easier than I thought it would be.Azure Cognitive Speech ServiceFirst of all we need an Azure Subscription where we can deploy our Speech Services instance. If you don’t have an Azure subscription, you can sign up for a trial account using the links below. If you already have a subscription, you can easily create a free Speech Services account using the following commands from Azure Cloud Shell:az group create -n ntsystems-speech -l WestEuropeaz cognitiveservices account create -n ntsystems-speech -g ntsystems-speech --kind SpeechServices --sku F0 -l WestEurope --yesNow the account was created and we can start using it right away. To authenticate our calls from PowerShell, we need an API key, again we can use Azure Cloud Shell to retrieve the key:az cognitiveservices account keys list -n ntsystems-speech -g ntsystems-speechPowerShellThe speech service provides a well documented API that can easily be called using PowerShell’s native Invoke-RestMethod command. The required information is available on Microsoft Docs (link below), all I had to do is wrap a little PowerShell around it and I had created a quick module. You can install the module using the following command:Install-Module PSSpeechBefore we can call any of the speech service’s API endpoints, we have to use the API key to get a token and store it in a variable for later use:Get-SpeechToken -Key yourapikey | Save-SpeechTokenNow we should be able to get a list of available voices using Get-SpeechVoicesList | Format-Table.And finally we can convert some input text to speech using one of the voices from the list:Convert-TextToSpeech -Voice en-US-JessaNeural -Text \\\\\\\"Hi Tom, I'm Jessa from Azure!\\\\\\\" -Path jessa.mp3Convert-TextToSpeech -Voice en-GB-HarryNeural -Text \\\\\\\"Hi Tom, I'm Harry from Azure!\\\\\\\" -Path harry.mp3You can find a lot of information about the speech service in the links below, be sure to check out the SSML structure to see how you can customize the voices, introduce pauses to the audio file, and many other things.You can find the code for the module in my GitHub, please let me know if you find it useful and feel free to submit a pull request with your optimizations :)This is the first post in this new year, best wishes and thanks for reading!TomLinks  Speech Services  Speech Synthesis Markup Language (SSML)  Text to Speech REST API  PSSpeech Module\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/using-powershell-and-azure-cognitive-services-to-convert-text-to-speech/\\\"},{  \\\"id\\\": \\\"post-configuring-policy-based-qos-for-teams-with-intune\\\",  \\\"title\\\": \\\"Configuring policy-based QoS for Teams with Intune\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Workplace\\\",\\\"Intune\\\",\\\"Teams\\\"],  \\\"content\\\": \\\"Traditional Active Directory with group policy has no place in the big-picture of the modern workplace, so we need a novel solution to apply policy-based QoS to our Teams clients. One could argue that QoS has no place in the modern workplace either, but that’s a discussion for another day.Configuration Service ProviderSo a CSP or configuration service provider is pretty much exactly what everyone with some traditional enterprise IT background would expect from a group policy object, but delivered from the cloud and, at least in theory, applicable to various types of devices. According to Microsoft Docs it is “an interface to read, set, modify, or delete configuration settings on the device. These settings map to registry keys or files.”You can find a link to the CSP reference below.NetworkQoSPolicy CSPNow it turns out there is a CSP for policy-based QoS but it just applies to Surface Hub devices. If you’re lucky enough to configure QoS on such a device, here is a screenshot of the settings you will most likely use.  The port numbers may be different in your environment.                MSFT_NetQosPolicySettingDataSo here we are trying to configure QoS settings on our Windows 10 clients but CSPs are of no great help. Luckily we can use PowerShell to configure policy-based QoS and Intune provides an easy way to deploy PowerShell scripts to our clients.To configure Windows 10 to tag packets sent by the Teams.exe and on the configured source ports for each modality, we could use three simple commands like in the example below:New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50020 -IPSrcPortEndMatchCondition 50039 -DSCPValue 46 -Name \\\\\\\"Teams Audio\\\\\\\"New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50400 -IPSrcPortEndMatchCondition 50059 -DSCPValue 34 -Name \\\\\\\"Teams Video\\\\\\\" New-NetQosPolicy -NetworkProfile All -AppPathNameMatchCondition Teams.exe -IPSrcPortStartMatchCondition 50069 -IPSrcPortEndMatchCondition 50070 -DSCPValue 28 -Name \\\\\\\"Teams AppSharing\\\\\\\"You can find a link to the cmdlet reference for New-NetQosPolicy below.Save the above commands to a file with ps1 extension and head over to endpoint.microsoft.com. Create a new script for Windows 10, upload the the ps1 file and set it to run in system context and using the 64 bit PowerShell host. Now assign the script to a group that contains your devices.                Once the script was applied you can use Get-NetQosPolicy to verify the policies were applied correctly.Teams Meeting SettingsFor the above configuration to make any sense, we first have to specify a port range for each modality in the Microsoft Teams admin center.You can find a link to the Teams admin center below.The following screenshot shows an example configuration where a distinct port range is used for each type of traffic, this allows us to distinguish the traffic types and apply different DSCP tags using policy-based QoS.                Special thanks to Mr. Workplace Expert Dave Wenger! Check out his blog in the links below.Links  Configuration service provider reference  New-NetQosPolicy  Microsoft Teams admin center  https://blog.contoso-bern.ch/\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/configuring-policy-based-qos-for-teams-with-intune/\\\"},{  \\\"id\\\": \\\"post-send-check-point-logs-to-azure-sentinel-beta\\\",  \\\"title\\\": \\\"Send Check Point Logs to Azure Sentinel (beta)\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Azure\\\",\\\"Cloud\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Azure Sentinel is Microsoft’s new, cloud-native security information and event management (SIEM) tool. In my simplistic point-of-view it is a security-focused, machine-learning-driven add-on for Log Analytics (OMS). Today we will be looking into ingesting Check Point Firewall logs into Log Analytics.Log Analytics Agent (linux)Log Analytics currently lists only linux-based agents for syslog forwarding. In this case I installed Ubuntu Server 18.10, for production it maybe better to stick with 18.04. The following command installs required components:sudo apt install python auditdFrom the Azure Portal, copy the snippet to install the Log Analytics agent (non-Azure Linux VM). It should look something like this and already have the correct values for workspace id and key.sudo wget https://raw.githubusercontent.com/Microsoft/OMS-Agent-for-Linux/master/installer/scripts/onboard_agent.sh &amp;&amp; sh onboard_agent.sh -w &lt;workspace-id&gt; -s &lt;workspace-key&gt; -d opinsights.azure.comFinally, download the security configuration file for OMS agent. This contains the required regular expressions for the oms.security event type:sudo wget -O /etc/opt/microsoft/omsagent/&lt;workspace-id&gt;/conf/omsagent.d/security_events.conf \\\\\\\"https://aka.ms/syslog-config-file-linux\\\\\\\"Syslog (rsyslog.d)Now with the Log Analytics agent ready, we need to configure rsyslog to accept logs from the firewall and forward them to the agent.Uncomment the following lines in the file /etc/rsyslog.conf to enable the rsyslog listener on udp port 514:module(load=\\\\\\\"imudp\\\\\\\")input(type=\\\\\\\"imudp\\\\\\\" port=\\\\\\\"514\\\\\\\")Now lets create a new configuration file to tell rsyslog to forward all events that contain the string “Check Point” to the Log Analytics agent. Azure Sentinel documentation creates the file at /etc/rsyslog.d/security-config-omsagent.conf::msg, contains, \\\\\\\"Check Point\\\\\\\" @127.0.0.1:25226At last it may be a good idea to change the default configuration in such a way that not all logs are written to a file. The default configuration for rsyslog is located at /etc/rsyslog.d/50-default.conf. Just modify the line with *.* accordingly:#*.*;auth,authpriv.none         -/var/log/sysloglocal.*;auth,authpriv.none      -/var/log/syslogWhen we’re done with the configuration we use the following commands to restart the Log Analytics agent and the rsyslog service:sudo /opt/microsoft/omsagent/bin/service_control restart &lt;workspace-id&gt;Sudo service rsyslog restartCheck PointCheck Point publish information about how to configure log export in the article sk122323, see links below. On version R80.20 the required packages are already installed and we just add a log export target like this. Note that this is using export mode shell:cp_log_export add name azsentinel target-server 10.1.1.1 target-port 514 protocol udp format cef read-mode semi-unifiedMake sure to select cef log format and set the read-mode to semi-unified. The existing configuration can be verified with:cp_log_export showname: azsentinel     enabled: true     target-server: 10.1.1.1     target-port: 514     protocol: udp     format: cef     read-mode: semi-unifiedTroubleshootAccording to the Sentinel documentation it can take a while before the first logs show up in Log Analytics, in my case it didn’t take more than five minutes. But if they don’t show up at all, the following steps can be helpful for troubleshooting:Check if syslog services are listening:tom@azsentinel:~$ netstat -anuActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address           Foreign Address         Stateudp        0      0 127.0.0.53:53           0.0.0.0:*udp        0      0 0.0.0.0:514             0.0.0.0:*udp        0      0 127.0.0.1:25224         0.0.0.0:*udp        0      0 127.0.0.1:25226         0.0.0.0:*udp        0      0 0.0.0.0:33569           0.0.0.0:*udp6       0      0 :::514                  :::*Note: rsyslog listens on 514 and the omsagent listens on 25224 and 25226, the latter is of interest in this case.Check if logs are coming in from Check Point:sudo tcpdump -A -ni any port 514 -vvCheck if logs are forwarded to omsagent:sudo tcpdump -A -ni any port 25226 -vvLog Analytics agent log file:sudo tail /var/opt/microsoft/omsagent/log/omsagent.logLinks  Check Point Log Export (sk122323)  Azure Sentinel Documentation\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/send-check-point-logs-to-azure-sentinel-beta/\\\"},{  \\\"id\\\": \\\"post-create-a-sas-token-for-azcopy\\\",  \\\"title\\\": \\\"Create a SAS token for AzCopy\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Cloud\\\",\\\"Azure\\\"],  \\\"content\\\": \\\"I’ve spent way too much time trying to figure this out, so here goes a quick note that hopefully saves someone a minute.AzCopyIs a command-line tool that can be used to copy data to all kinds of Azure storage. In this post I am focusing on the Azure Files service because I want to use AzCopy to copy data from an existing file server to a new file share in Azure.According to the documentation, AzCopy supports authentication via Azure AD (using azcopy login) and SAS-token. For the files part, however, only SAS-token authentication is supported.Shared Access Signatures?A shared access signature, SAS, is a string that can be used to delegate access to resources in Azure. It looks something like that:?sv=2018-11-09&amp;sig=&lt;..key..&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=bfqt&amp;sp=racupwdlThere is some documentation out there on how to create the SAS token with the SDK but I couldn’t find much that I could easily use. So after some searching around I found the New-AzStorageAccountSASToken cmdlet in the Az PowerShell module.PowerShell Az ModuleThe Az module is the latest version (I believe) of the PowerShell module to manage Azure. We are going to use it to create the SAS token, so if you don’t have it already, install via the PowerShell Gallery (requires PowerShell 5.1):Install-Module Az -AllowClobberOnce installed I can login to my Azure subscription and create the token:Connect-AzAccount$StorageContext = New-AzStorageContext -StorageAccountName mystorageaccount -StorageAccountKey \\\\\\\"storageaccountkey==\\\\\\\"New-AzStorageAccountSASToken -Service File -ResourceType Service,Container,Object -Permission racwdlup -Context $StorageContext -ExpiryTime (Get-Date).AddDays(+3)The -ExpiryTime parameter can be used to set an expiration time for the generated token. I believe the default is one hour, so if you expect the copy job to take longer adjust accordingly.Please note: I could also create the storage context without specifying the -StorageAccountKey parameter, but that would lead to the following error message when creating the token:New-AzStorageAccountSASToken : Cannot create Shared Access Signature unless Account Key credentials are used.Copying the dataActually copying files or directories to Azure Files is pretty straight-forward once we have the SAS-token, we just pass it along with the url.To copy a single file:.\\\\\\\\azcopy.exe cp D:\\\\\\\\Data\\\\\\\\file.txt \\\\\\\"https://mystorageaccount.file.core.windows.net/myshare/file.txt?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\\\\\"To copy a directory:.\\\\\\\\azcopy.exe cp D:\\\\\\\\Data \\\\\\\"https://mystorageaccount.file.core.windows.net/myshare?sv=2018-11-09&amp;sig=&lt;key&gt;&amp;se=2019-06-20T13%3A49%3A02Z&amp;srt=sco&amp;ss=f&amp;sp=racupwdl\\\\\\\" --recursiveLinks  https://github.com/Azure/azure-storage-azcopy  https://docs.microsoft.com/en-us/powershell/module/az.storage/new-azstorageaccountsastoken  https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-files  https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/create-a-sas-token-for-azcopy/\\\"},{  \\\"id\\\": \\\"post-ntsystemspsdrive-a-ships-drive-for-the-blog\\\",  \\\"title\\\": \\\"ntSystemsPSDrive: a SHiPS drive for the blog\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Jekyll\\\",\\\"ntSystems\\\"],  \\\"content\\\": \\\"Some time ago I wrote a post about Consuming ntSystems with PowerShell. It boils down to this: we have a json-based API that is available via https://ntsystems.it/api/v1/ and returns json elements for posts and pages on the blog. For more information check out the linked post. Then I wanted play around with the SHiPS module for some time and finally got around to doing it this past weekend. Now I’m happy to be sharing another method do consume ntSystems with PowerShell: It can be mounted as PSDrive.PSProviderPowerShell has always had the concept of providers which serve as a way of accessing and interacting with data that would otherwise not be easily available at the command-line. According to about_Providers they are Microsoft .NET Framework-based programs that make the data in a specialized data store available in PowerShell so that you can view and manage it.There are some built-in providers such as Alias, Certificate, and Registry that you will be familiar with. Essentially they provide a file-system-like view into the data stores, so we can easily see all defined aliases with the following command:Get-ChildItem -Path Alias:We can see installed certificates in the Cert: drive and access the registry via hkcu: and hklm:. Not only can we list the content of the data stores with cmdlets such as Get-ChildItem, we can also modify values with Set-Item or Set-ItemProperty like this:# Create a new REG_SZ New-ItemProperty -Path HKCU:\\\\\\\\Environment\\\\\\\\ -PropertyType string -Name TestPS -Value \\\\\\\"test pwsh\\\\\\\"# Create an aliasNew-Item Alias:\\\\\\\\test -Value \\\\\\\"Get-Process\\\\\\\"# Remove expired CertificatesGet-ChildItem Cert:\\\\\\\\CurrentUser\\\\\\\\my | Where-Object NotAfter -lt (Get-Date) | Remove-ItemWell, you get it by now: providers make it relatively easy to work data stored in certain locations.Some vendors, such as VMware, add providers to their PowerShell tools. So after installing PowerCLI and connecting to a server, we can browse the inventory using:Get-ChildItem vi:Get-ChildItem vmstore:We can see all available drives using Get-PSDrive.There are not too many 3rd-party providers out there, probably because it was quite hard to write them. Enter SHiPS.Simple Hierarchy in PowerShell (SHiPS)According to the SHiPS GitHub repository, “developing PowerShell provider got so much easier”. The module leverages PowerShell classes to create the hierarchy and items that are then exposed as a PS Drive.How easy you ask? Well I gave it a shot the other day and here is the result.ntSystemsPSDriveAs stated above, the module requires the SHiPS module and builds on top of it. So in the code we first declare the following:using namespace Microsoft.PowerShell.SHiPSThen we go ahead and create classes for our navigation nodes, folders (items containing child items) inherit from SHiPSDirectory and leafs (like files) inherit from SHiPSLeaf.In the classes we define constructors and methods as needed, if a folder shall be used as root node, i.e. the entry point used by New-PSDrive, it must have a constructor with the node name as parameter.Home([string]$name): base($name) { }All folder nodes must define a GetChildItem() method that is called when browsing the directory.[object[]] GetChildItem() { }So for example the Home node in the module ntSystemsPSDrive is used as root (entry point) when mounting the PSDrive:New-PSDrive -Name $Name -PSProvider SHiPS -Root \\\\\\\"ntSystemsPSDrive#Home\\\\\\\" -Scope Global -ErrorAction StopTo create such a node and its contents, we define a class like this :class Home : SHiPSDirectory {    # required constructor for root nodes    Home([string]$name): base($name) {    }    # The method GetChildItems is called when listing directory content    [object[]] GetChildItem() {        $obj = @()        $obj += [ntSystemsType]::new(\\\\\\\"Category\\\\\\\")        $obj += [ntSystemsType]::new(\\\\\\\"Tags\\\\\\\")        $obj += [ntSystemsType]::new(\\\\\\\"Author\\\\\\\")        $obj += [ntSystemsType]::new(\\\\\\\"Language\\\\\\\")        return $obj    }}The above example contains the constructor required for root nodes as well as a method GetChildItem that returns an array of objects when it gets called.See it in action:Import-Module ntSystemsPSDriveNew-ntSystemsPSDrivedir ntSystems:dir ntSystems: -Depth 1Get-ChildItem 'ntSystems:\\\\\\\\Posts by Category\\\\\\\\PowerShell\\\\\\\\' | Select-Object -Property name,urlGet-Content 'ntSystems:\\\\\\\\Posts by Category\\\\\\\\ntSystems\\\\\\\\Jekyll Fun: Consuming ntSystems with PowerShell' Pretty cool, right? Thanks for reading, have fun!TomLinks  SHiPS  SHiPS Architecture\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/ntsystemspsdrive-a-ships-drive-for-the-blog/\\\"},{  \\\"id\\\": \\\"post-powershell-script-to-enable-specific-office-365-service\\\",  \\\"title\\\": \\\"Powershell Script to enable specific Office 365 Service\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Azure\\\"],  \\\"content\\\": \\\"Currently I’m in an Exchange Migration project to migrate all mailboxes from Exchange onPremise to Exchange Online. Yeah.. of course.. killing Exchange onPrem… again :)I have the following situation that all users already have Office 365 Licenses assigned like E1 / E3 or E5. There are some users that don’t have all Office 365 services the license includes enabled and so there are some disabled services. The license situation is not really structured.. When I’m going to migrate the mailboxes to Exchange Online I need to enable the Exchange service for every user so they can access the mailbox.It doesn’t sound like a big deal but the tricky part is I want to preserve the disabled services for every user. I cannot apply a default license to all users and I’m too lazy to click through all users and enable the Exchange Online switch manually..So now I want to share with you a script that does all the magic automatically.. Maybe its also helpful for you in some situations.Please consider:I’m not a DEV :)  The Scripts works for one service at a time  The Script works for E1 / E3 / E5 licenses but can easily extend to include other license types  I write out a LOG file with the detail the script does  The user list can also be a CSV file# ConnectConnect-MsolService# Load User List$UserList = \\\\\\\"User1@domain.local\\\\\\\",\\\\\\\"User2@domain.local\\\\\\\",\\\\\\\"User3@domain.local\\\\\\\"$LogFile = \\\\\\\"C:\\\\\\\\Users\\\\\\\\nitz_\\\\\\\\LOG\\\\\\\\LicenseLog.txt\\\\\\\"# Troubleshoot#$UserList = \\\\\\\"user1@domain.com\\\\\\\"#$User = \\\\\\\"user1@domain.com\\\\\\\"ForEach($User in $UserList){    If (Get-MsolUser -User $User)    {        #Variable        $UserLicense = $Null        $ChangeLicense = $false        # Check what License the user has        $LicensesAssigned = (Get-MsolUser -User $User).Licenses.AccountSkuId        If ($LicensesAssigned -like \\\\\\\"*ENTERPRISEPREMIUM*\\\\\\\" -and $LicensesAssigned -notlike \\\\\\\"*STANDARDPACK*\\\\\\\" -and $LicensesAssigned -notlike \\\\\\\"*ENTERPRISEPACK*\\\\\\\"){            Write-Host \\\\\\\"User $User has E5\\\\\\\"            $LicenseToActivate = \\\\\\\"EXCHANGE_S_ENTERPRISE\\\\\\\"            $UserLicense = \\\\\\\"ENTERPRISEPREMIUM\\\\\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\\\\\"User $User has E5\\\\\\\"        }        ElseIf($LicensesAssigned -notlike \\\\\\\"*ENTERPRISEPREMIUM*\\\\\\\" -and $LicensesAssigned -notlike \\\\\\\"*STANDARDPACK*\\\\\\\" -and $LicensesAssigned -like \\\\\\\"*ENTERPRISEPACK*\\\\\\\"){            Write-Host \\\\\\\"User $User has E3\\\\\\\"            $LicenseToActivate = \\\\\\\"EXCHANGE_S_ENTERPRISE\\\\\\\"            $UserLicense = \\\\\\\"ENTERPRISEPACK\\\\\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\\\\\"User $User has E3\\\\\\\"        }        ElseIf($LicensesAssigned -notlike \\\\\\\"*ENTERPRISEPREMIUM*\\\\\\\" -and $LicensesAssigned -like \\\\\\\"*STANDARDPACK*\\\\\\\" -and $LicensesAssigned -notlike \\\\\\\"*ENTERPRISEPACK*\\\\\\\"){            Write-Host \\\\\\\"User $User has E1\\\\\\\"            $LicenseToActivate = \\\\\\\"EXCHANGE_S_STANDARD\\\\\\\"            $UserLicense = \\\\\\\"STANDARDPACK\\\\\\\"            $ChangeLicense = $True            Add-content $Logfile -value \\\\\\\"User $User has E1\\\\\\\"        }        Else{            Write-Host \\\\\\\"User $User has License mismatch, please check\\\\\\\" -ForegroundColor Red            Add-content $Logfile -value \\\\\\\"ERROR -- User $User has License mismatch, please check\\\\\\\"        }        # Change License        If($ChangeLicense)        {            $DisabledLicenses = @()                $License = (Get-MsolUser -User $User).Licenses | where{$_.AccountSkuId -like \\\\\\\"*$UserLicense*\\\\\\\"}                ForEach($LicenseOption in $License.ServiceStatus){                    If($LicenseOption.ProvisioningStatus -eq \\\\\\\"Disabled\\\\\\\"){                        If($LicenseOption.ServicePlan.ServiceName -eq $LicenseToActivate){                            Write-Host \\\\\\\"Skip disabling License $LicenseToActivate for User $User\\\\\\\" -ForegroundColor Green                        }Else{                            If($DisabledLicenses -eq $Null){$DisabledLicenses = $LicenseOption.ServicePlan.ServiceName}                            Else{$DisabledLicenses = $DisabledLicenses + $LicenseOption.ServicePlan.ServiceName}                                        }                    }                }                Add-content $Logfile -value \\\\\\\"User $User has disabled Plans $DisabledLicenses\\\\\\\"                # Assign new License Option                $LicenseOptions = New-MsolLicenseOptions -AccountSkuId $License.AccountSkuId -DisabledPlans $DisabledLicenses                Write-Host \\\\\\\"Applying License Option to User $User\\\\\\\" -ForegroundColor Green                Set-MsolUserLicense -UserPrincipalName $User -LicenseOptions $LicenseOptions                Add-content $Logfile -value \\\\\\\"User $User assigned new License Option\\\\\\\"        }    }else{        Add-content $Logfile -value \\\\\\\"ERROR -- User $User NOT FOUND\\\\\\\"    }}Feel free to use this script or just to take the basic functions and improve it to fulfill your special needs.Daniel\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-script-to-enable-specific-office-365-service/\\\"},{  \\\"id\\\": \\\"post-windows-server-2019-radius\\\",  \\\"title\\\": \\\"Windows Server 2019 and RADIUS\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Security\\\",\\\"Firewall\\\"],  \\\"content\\\": \\\"First of all, happy new year :) Today we will have a quick look at Windows Server 2019, more specifically the Network Policy Server role.BackgroundI was recently asked to help with an enterprise WiFi deployment and decided to use a RADIUS server for authentication purposes. I went on to deploy a new Windows 2019 VM and installed the NPS role. After adding the RADIUS client and configuring the required policies, I added the NPS server’s IP address to the WiFi controller and tried to authenticate. A simple task generally, but this time it did not work.TroubleshootingThe RADIUS server was located behind a NAT device so my first guess was that I had misconfigured a policy or mistyped an address or something. I double checked the configuration and, as it looked ok, started to scratch my head. In order to better understand what was going on, I installed wireshark on the NPS machine and saw packets incoming from the WiFi controller quite happily. But packet were only incoming, I could not find a single response coming from NPS. The Security Event Log on the VM, where you would typically find NPS logs, had no events related to NPS. So basically the NPS was not responding to RADIUS messages at all.SolutionAfter a quick google search for “Windows 2019 NPS” I found an entry in the TechNet Forums (link below) where someone explained the Windows Firewall had to be configured to allow RADIUS (udp/1812, udp/1813) traffic even though such a rule did already exist. Sure enough, after adding the firewall rule, authentication worked.DHCP Relay (update)So today, half a year later, I had a very similar problem with DHCP relay. The Windows 2019 DHCP Server would receive DHCP requests from a relay agent but it would never respond to them. I configured the local firewall to allow traffic on UDP ports 67 and 69 and voilà, DHCP started working.Links  TechNet Forums  User Voice\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-2019-radius/\\\"},{  \\\"id\\\": \\\"post-sending-events-to-splunks-http-event-collector-with-powershell\\\",  \\\"title\\\": \\\"Sending events to Splunk's HTTP Event Collector with PowerShell\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Using Invoke-RestMethod to send events to a Splunk instance.SplunkIf you don’t know Splunk this article is not going to give a thorough introduction. Let’s just say it’s a pretty fancy log collector/analytics tool. According to the company’s profile, Splunk turns machine data into answers. The goal of this article is to demonstrate how to use PowerShell to send events to the HTTP Event Collector which is Splunk’s REST interface to ingest logs.Enable Event Collector and create API Key (Token)Connect to your Splunk’s web interface with appropriate permissions and using Settings, Data inputs, click on HTTP Event Collector. If you are not already using the Event Collector service it has to be enabled using the Global Settings button in the top right corner.Then use the New Token button to create a new API key and configure how Splunk handles data it receives using this token. In the first step, give a name to the token you are about to create.The second step is about handling the data, select an appropriate source type, I use json in this case, and the the right App Context. I select the search app for this example, though it can be any installed Splunk app. At the bottom of step two, select the index where Splunk will store the data. If you are not sure which index to use, create a new one. I created an index with the name of PowerShell and assigned it to the search application as selected before.Review the configuration in the last step and create the new token. Take note of the Token Value, you will need it later.Once the token has been created, you can click on Start Searching and Splunk will automatically create the right search for you. As we have not yet sent data, the search should not return any results.PowerShell Send-SplunkEventI put together a quick wrapper for Invoke-RestMethod that makes sending logs to Splunk relatively easy. All you need is the API key (Token Value) from above and the URI of your event collector service. For this example I am using a Splunk instance on my local machine, so the Uri is “http://localhost:8088/services/collector”, for a production environment, you would probably use https and replace localhost with the name of your instance.The idea behind the script was to sort through logs from different systems in PowerShell, turn them into structured data and send them to Splunk. As logs originate on systems other than the one where this script runs, the HostName parameter can be used to specify the ‘host’ property of the event and the DateTime parameter can be used to set the ‘time’ property.Examples and usageThe script has two required parameters, InputObject and Key. Use the InputObject parameter to pass an object (or hashtable) to the script. This will be turned into json, using PowerShell’s ConvertTo-Json and then sent to the REST API using Invoke-RestMethod.Use the Key parameter to pass the HTTP Event Collector token that we created above to the script..\\\\\\\\Send-SplunkEvent.ps1 -InputObject @{message=\\\\\\\"Hello Splunk!\\\\\\\";severity=\\\\\\\"INFO\\\\\\\"} -Key &lt;token&gt; Get-Service wuauserv | .\\\\\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; -Uri http://localhost:8088/services/collectorThe first example just sends a custom hashtable with the two fields message and severity. The second example gets a service object and converts it into a json object before sending it.Note: The Uri parameter defaults to localhost, you will have to specify it like in the second example, if sending to a remote instance.SearchNow search for the events in the newly created PowerShell index: index=\\\\\\\"powershell\\\\\\\" sourcetype=_jsonPerformanceAs the script is making a new RESTful call for every single event, this is not the fastest way to get logs into Splunk. I have made some tests to compare WindowsPowerSell with the Core edition, here is what I’ve found:Measure-Command { Get-Process | .\\\\\\\\Send-SplunkEvent.ps1 -Key &lt;token&gt; }The above command takes 30 seconds on WindowsPowerShell, while it takes about 280 seconds on Core (tested with 6.1.0 and 6.2.0 preview 2).Download &amp; Source forThe Script is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    Links:  Send-SplunkEvent  Splunk REST API Reference  PowerShell Invoke-RestMethod\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sending-events-to-splunks-http-event-collector-with-powershell/\\\"},{  \\\"id\\\": \\\"post-lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5\\\",  \\\"title\\\": \\\"lost & found: FFmpeg and Skype4B, Security Baseline for RS5\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Skype4B\\\",\\\"WSL\\\",\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"A quick edition of lost &amp; found on how to use FFmpeg on WSL to create audio files that can be used for Skype for Business announcements. And an observation about the recently published security baseline for Windows 10 1809 and Server 2019.FFmpegAccording to it’s website, FFmpeg is the leading multimedia framework, able to decode, encode, transcode, mux, demux, stream, filter and play pretty much anything that humans and machines have created.Packages are available for various operating systems but since Ubuntu runs just fine on Windows 10, I started using linux-style command-line tools in the Windows Subsystem for Linux.Check if you are running the latest version using ffmpeg -version or install to tool using sudo apt-get install ffmpeg.According to @greiginsydney a 16 kHz, mono, 16-bit Wave file is recommended for best performance.To convert an MP3 file to Wave with the above specifications, we can use something like this:ffmpeg -i Downloads/ringtone.mp3 -acodec pcm_s16le -ac 1 -ar 16000 ringtone.wavSecurity BaselineMicrosoft recently released the draft of the security baseline configuration for RS5 builds, that’s Windows 10 v1809 and Windows Server 2019. You can find more information about that on the Security Guidance blog, I just wanted to share a quick note for the Office 365 Admins out there:The security baseline configuration contains a setting to disable Basic Authentication for the WinRM client. After applying the baseline configuration, I was no longer able to connect to Exchange Online or Skype for Business Online remote PowerShell Sessions as they rely on basic authentication.Set the following configuration to Not Configured on your admin machines:Administrative Templates\\\\\\\\Windows Components\\\\\\\\Windows Remote Management (WinRM)\\\\\\\\WinRM Client\\\\\\\\Allow Basic authenticationLinks:  Audio file formats for Lync and Exchange  FFmpeg  Security baseline (DRAFT) for Windows 10 v1809 and Windows Server 2019\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5/\\\"},{  \\\"id\\\": \\\"post-remote-ems-over-ipmi-serial-over-lan\\\",  \\\"title\\\": \\\"Remote EMS over IPMI serial-over-lan\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\",\\\"PowerShell\\\",\\\"Server\\\",\\\"AudioCodes\\\"],  \\\"content\\\": \\\"Using standards-based IPMI to get some sort of out-of-band management for AudioCodes’ embedded server modules.BackgroundWe’ve installed a number of session border controllers with embedded server modules for our international customers. The embedded server modules are typically used to run Skype for Business survivable branch servers which provide limited calling services in case of a connectivity issue with the Front End pools. Because IT personnel is not available in branch sites or the devices are installed in data centres with limited access, we relied upon Intel’s AMT for out-of-band management of the earlier version of the server module.AudioCodes upgraded the embedded server module and it turns out, the new version no longer has an AMT chip. Studying the data sheet of the OEM that builds the module, we found that it Supports IPMI v1.5 and Serial-over-LAN function. The OEM couldn’t help much so I basically googled/tried my way to this solution, maybe my experience saves someone a few hours in the future.Intelligent Platform Management Interface (IPMI)First of all, I had to read up on IPMI. According to Wikipedia it provides management and monitoring capabilities independently of the host system’s CPU, firmware (BIOS or UEFI) and operating system. Windows does implement some basic functionality through CIM and the PcsvDevice PowerShell module, but, apart from that, we have to rely on other tools such as ipmiutil to communicate with this interface.ipmiutil is an open-source utility to manage and interpret IPMI systems with common software. If used inside the OS on the server, it can access and configure the local Baseboard Management Controller (BMC). Once configured, the utility can be used to invoke IPMI functions remotely.IPMI configurationTo show the current configuration of the local BMC we can use the following examples:.\\\\\\\\ipmiutil.exe config.\\\\\\\\ipmiutil.exe lan -lTo set an IP address and the username/password to use for remote connections, we can use something like this:.\\\\\\\\ipmiutil.exe lan -e -I 192.168.120.131 -S 255.255.255.0 -G 192.168.120.254 -L 5 -p ipmipass -u ipmiadminThe above example sets the IP address of the BMC to 192.168.120.131/24 and the default gateway to 192.168.120.254. Additionally, we set the username to ipmiadmin and the password to ipmipass.We verify the configuration using the ipmiutil config from the first example, if it looks good, we can try the same from a remote system:[PS] ~\\\\\\\\ipmiutil&gt; .\\\\\\\\ipmiutil.exe config -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil config ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0### ipmiutil config, GetPefEntry ...# GetPefEntry(1): ret = 193 Invalid Command### ipmiutil config, GetLanEntry for channel 5 ...LanParam 5,0,0:  00LanParam 5,1,0:  14LanParam 5,2,0:  14 14 14 14 00LanParam 5,3,0:  c0 a8 78 83# LanParam(5,3,0) IP address: 192.168.120.131LanParam 5,4,0:  01LanParam 5,5,0:  c4 00 ad 01 f5 73...In the above example, we run ipmiutil config on another machine and use the -N parameter to specify a remote host, -U and -R are used to specify the username and password, respectively. The output shows the connection succeeded and thus, we have remote connectivity.Now we have an way to manage certain features of the remote system independently from the operating system that’s installed on said system. We can, for example, use ipmiutil reset to control the systems power state..\\\\\\\\ipmiutil.exe reset -c -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\\\\\ipmiutil.exe reset -d -N 192.168.120.131 -U ipmiadmin -R ipmipass.\\\\\\\\ipmiutil.exe reset -u -N 192.168.120.131 -U ipmiadmin -R ipmipassThe above lines power cycle, power down or power up the remote system. Use with caution.If the BMC is not reachable from a remote system, I’ve found ipmiutil reset -k useful. This does reset the BMC, without affecting the OS.Serial over LAN (sol) and Emergency Management Services (EMS)Apart from controlling the systems power state, IPMI also implements serial-over-lan connectivity. This can be used to connect to a remote system’s serial console using an IP connection. Now on Windows servers we do not typically use serial connections, at least not for management. But, as it happens, the Emergency Management Services console provides exactly that: a special management console over serial connections. The Emergency Services are not enabled by default, so we have to enable it and make sure it uses our serial-over-lan connection.To do this, we use the bcdedit utility (from an administrative command-line), first to redirect the EMS console to serial port #2, then to enable EMS for the current Windows installation:bcdedit /emssettings EMSPORT:2 EMSBAUDRATE:115200bcdedit /ems on To activate the change and enable EMS, Windows must be rebooted. After that, we can go ahead and start our first sol session using the following command:[PS] ~\\\\\\\\ipmiutil&gt; .\\\\\\\\ipmiutil.exe sol -a -N 192.168.120.131 -U ipmiadmin -R ipmipassipmiutil sol ver 3.10Connecting to node  192.168.120.131-- BMC version 1.08, IPMI version 2.0Opening lanplus connection to node 192.168.120.131 ...[SOL session is running, use '~.' to end, '~?' for help.]SAC&gt;The SAC prompt indicates we are now connected to the special administration console. This console can be used to retrieve information about the system, it’s network interfaces and running processes. We can also connect to the OS via cmd.SAC&gt;cmdSAC&gt;ch -si 1The above example creates a new cmd channel and connects to it. It will prompt for credentials to connect to Windows and, upon success, we have a remote cmd.exe interface. Type in powershell and enjoy :)Finally, we can use -d to disconnect from the sol session:.\\\\\\\\ipmiutil.exe sol -d -N 192.168.120.131 -U ipmiadmin -R ipmipassThis is also useful if the sol session fails with the message: “SOL payload already active on another session”.SecurityNow as you can see, enabling IPMI and making the SAC available over serial-over-lan, adds another way of managing the system. This can be convenient but it also increases the system’s attack surface. Make sure to limit access to IPMI endpoints and don’t use high-privilege accounts when logging into the SAC remotely.Links:  Sourceforge download and man page  AudioCodes 1000 sbc  Boot Parameters to Enable EMS Redirection\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/remote-ems-over-ipmi-serial-over-lan/\\\"},{  \\\"id\\\": \\\"post-network-assessment-with-policy-based-qos-and-iperf3\\\",  \\\"title\\\": \\\"Network assessment with policy-based QoS and iperf3\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\",\\\"Skype4B\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"In Skype for Business and, more recently, Teams deployments, a solid network and a good knowledge of it are fundamentally important.We typically work very closely with the network/security departments and make sure to involve them from the beginning to have their support throughout the project. After deploying QoS, ideally before rolling out voice/video for the end-users, we run some tests to verify the QoS configuration, measure the reserved bandwidth and whether it remains stable over some amount of time. There are various tools available for this task, I mostly use iperf3 to generate traffic and measure basic parameters.iperf3 basicsAccording to the GitHub page, iperf3 is “a tool for active measurements of the maximum achievable bandwidth on IP networks”. It is primarily developed on Linux but Windows executable are available from various sources. I’m using the version 3.6 build that can be found on NeoWin (see below).After copying the files to the machine, we can start the server using the the following command line. This starts a listener at tcp/udp 5201 and waits for iperf clients to connect..\\\\\\\\iperf3.exe -sOn the client side, we have multiple options, as stated above, iperf’s goal is to measure the maximum bandwidth, so if we start the client without parameters, that is what it will do: .\\\\\\\\iperf3.exe -c 192.168.120.185 Connecting to host 192.168.120.185, port 5201[  5] local 192.168.120.160 port 52070 connected to 192.168.120.185 port 5201[ ID] Interval           Transfer     Bitrate[  5]   0.00-1.00   sec   530 MBytes  4.44 Gbits/sec[  5]   1.00-2.00   sec   607 MBytes  5.09 Gbits/sec...Note that in the above example, iperf uses TCP and measures end-to-end available bandwidth between the client and server. This may saturate network links in between. Use with caution.We can also try to simulate RTP media (small UDP packets) by specifying the following parameters: .\\\\\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200Note that with UDP, the target bitrate defaults to 1 Mbit per second, this can be changed with the -b parameter. Also, when using UDP, jitter and packet loss are measured.More information: NeoWin, GitHub, Documentation (outdated)Now that we have a tool to generate traffic and measure bandwidth, we can go ahead and put some DSCP tags on the traffic to see how the network handles quality of service.  iperf has a –dscp parameter, this does not work on Windows as applications are not trusted to set DSCP values. The only way (that I know of) to tag packets with DSCP values is policy-based QoS.Creating the QoS PoliciesWe would typically use group policies to manage policy-based QoS settings but since this is a test, we can go ahead and use the NetQos PowerShell module on the client/server machines to create temporary policies.A quick Get-Command -Module NetQos shows that the module provides four cmdlets, we can Get, Set, Remove, and create New QoS policies with the respective *NetQosPolicy cmdlet.So we create two policies for the iperf server and client applications. The server listens on port 5201 by default, so all traffic originating from the server will use that source port.New-NetQosPolicy -Name \\\\\\\"iperf_server\\\\\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPSrcPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreThe client will communicate with the server by sending to the port 5201, so all traffic originating from the client will use that destination port.New-NetQosPolicy -Name \\\\\\\"iperf_client\\\\\\\" -NetworkProfile All -AppPathNameMatchCondition iperf3.exe -IPDstPort 5201 -DSCPValue 46 -PolicyStore ActiveStoreNote: By specifying ActiveStore as the policy store, the QoS policy will not be persistent. On the next reboot of the system, it will be gone.  We want to measure both directions, so we create both policies on the server and both on the client.Test and traceNow it’s time to start a network trace on the client and the server and run iperf again. If QoS has been configured, we should see packets leaving the client tagged with DSCP 46 and this tag should be preserved and be displayed on the server-side as well. I run the following two tests on the client, the -R parameter reverses the flow, so in the second case, the server sends packets to the client: .\\\\\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -J --logfile send.json .\\\\\\\\iperf3.exe -c 192.168.120.185 -u -b 200k -l 200 -R -J --logfile recv.jsonThe following screenshots show a trace from the above test on the client (1) and on the server (2). We can see that packets from client to the server (source: 192.168.120.160, destination: 192.168.120.185) are tagged on the client…… and the tag is still present when the server receives them.After switching the stream’s direction (with -R), we observe the same: packets leave the server tagged, and are received by the client with the tag still on.With the -J and --logfile parameters we instruct iperf to write output in JSON format and redirect it to a text file. With PowerShell we can now easily work with that data:$send = Get-Content send.json -Raw | ConvertFrom-Json$send.intervals.streams | Out-GridView$send.end.sumAt this point, it’s important to note that until now we have only proved, that the network does not remove the DSCP tags we put on our test packets. Whether the network actually prioritizes such packets is not yet clear. The easy way to verify that, would be to log into the network devices (QoS policies are typically enforced on routers) and get some counters/statistics. If that is not possible, we have to find out how much bandwidth is reserved for a given class empirically. To do that, we need a link that can be saturated (no congestion, no prioritization) and then run the above test again.More about QoS PoliciesWhen configuring policy-based QoS, either by group policy or by PowerShell, check the event log to see if the system refreshed the policy correctly. The following event is logged, when a policy change is detected:Log Name:      Microsoft-Windows-Policy/OperationalSource:        Microsoft-Windows-EQoSEvent ID:      2Level:         InformationDescription:   Computer QoS policies successfully refreshed. Policy changes detected.The NetQos module is a wrapper for the WMI/CIM objects managing the quality of service policies. We can also manipulate the CIM instance directly, e.g. to delete policies:Get-CimInstance -Namespace ROOT/StandardCimv2 -ClassName MSFT_NetQosPolicySettingData | Remove-CimInstanceLinks:  How to validate VPN throughput to a virtual network\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/network-assessment-with-policy-based-qos-and-iperf3/\\\"},{  \\\"id\\\": \\\"post-exchange-hybrid-observations\\\",  \\\"title\\\": \\\"Exchange Hybrid Observations\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Office365\\\",\\\"Hybrid\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Like I did here with Skype for Business, I’m collecting some observations and useful snippets about Exchange in hybrid environments.Completing individual migration usersRecently we have been using the CompleteAfter flag in favour of the older SuspendWhenReadyToComplete to set a date for migration batches to complete. To update this timestamp for a single mailbox in a batch, we can use the following command:Get-MoveRequest tom | Set-MoveRequest -CompleteAfter (Get-Date).AddHours(-1)In the above example, the move request for the mailbox tom will be completed immediately without affecting other mailboxes in the batch.Getting details about BadItemsPart of every migration are mailboxes with items that are either corrupt or cannot be imported to Exchange Online for some reason. Now if we don’t just increase the BadItemLimit counter but want more information about the corrupt items, we can get more information by using the -IncludeReport parameter with the Get-MigrationUser cmdlet:$Stats = Get-MigrationUserStatistics -Identity tom@ntsystems.it -IncludeReport $Stats.Report.BadItemsRecipient PermissionsThe *RecipientPermission cmdlets are used to manage SendAs permissions in Exchange Online. A nice goody of the Get-RecipientPermission cmdlet is the option to find permissions by assignee, i.e. by user to whom the permissions are granted. To get all entries that grant permissions to the user tom we use the -Trustee parameter like this:Get-RecipientPermission -Trustee tomLikewise, we can find all permissions by access right using the -AccessRights parameter. The following example gets all entries that grant SendAs permissions:Get-RecipientPermission -AccessRights SendAsShared MailboxesStarting with the June 2018 quarterly updates (2013 CU21 and 2016 CU10), the management of shared mailboxes in hybrid scenarios got easier. A -Shared parameter got added to the *RemoteMailbox cmdlets, instead creating a shared mailbox on-prem and then moving it to Exchange Online, we can now use New-RemoteMailbox -Name Office -Shared.You have already updated to CU21/CU10 but the Shared parameter is not available? Run .\\\\\\\\setup.exe /PrepareAD /IAcceptExchangeServerLicenseTermsMore Info: KB4133605Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-hybrid-observations/\\\"},{  \\\"id\\\": \\\"post-lost-found-no-tracking-on-ntsystems\\\",  \\\"title\\\": \\\"lost & found: Updates and no more tracking on ntSystems.it\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"ntSystems\\\"],  \\\"content\\\": \\\"I’ve recently updated the sources of the blog and moved to the gem-based version of the minima theme. This should make the site easier to maintain in the future.On the old, blogengine-based site, we used Google Analytics to get some information about our readers.  Since the migration to GitHub pages and Jekyll, I’ve tried to remove external scripts and tracking as much as possible.This is just a static website with some free (as in beer) content we’d like to share. We do no longer inject any tracking code and the few scripts we use are served directly from GitHub pages. But, until recently, there was one last exception to this: the comments. We’ve used Disqus comments for a long time now and I don’t really see a need to change that.However, as the comments iFrame is loaded from an external source (and may include tracking code), I’ve decided to stop automatically loading the iFrame and instead give you, the reader, an option to load it.From now on, you’ll see a “Show comments.” link at the bottom of each post and only after clicking the link, external content is loaded.What do you think? Leave a comment below ;)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-no-tracking-on-ntsystems/\\\"},{  \\\"id\\\": \\\"post-azure-functions-building-a-telegram-bot-with-powershell-2\\\",  \\\"title\\\": \\\"Azure Functions: Building a Telegram Bot with PowerShell 2\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Cloud\\\"],  \\\"content\\\": \\\"Welcome back to the second part of our little fun experiment with Telegram and Azure Functions. In the first part we created the function app and the bot, now let’s hook them up.Connecting the bot with the Azure FunctionWe can get updates from Telegram bots in two ways, there is a getUpdate method that can be polled periodically, or we can use Webhooks. Our HTTP trigger function in Azure will run whenever it receives a http request, so it is just perfect for the latter.To configure our Azure Function as a destination for the bot’s webhook, we use the setWebhook method and pass a hashtable with an URL parameter:Invoke-RestMethod -Uri https://api.telegram.org/bot528059907:AAxxVs/setWebhook -Body @{    \\\\\\\"url\\\\\\\"=\\\\\\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\\\\\"} -Method PostTo verify that the URL has been set correctly, we can call getWebhookInfo:[PS] C:\\\\\\\\&gt; Invoke-RestMethod https://api.telegram.org/bot528059907:AAxxVs/getWebhookInfo  ok result  -- ------True @{url=https://ntsystemsbot.azurewebsites.net/api/Listener?code=Waa...At this point our function will get a http request every time someone writes to the Bot account. So now it’s time to do something with it.OverviewFirst of all: I am sure there are a hundred ways this can be done better… What I am trying to accomplish with this simple example is a demonstration of Azure Functions and the different triggers, inputs, and outputs it provides. That said, here’s what I came up with:Our first function, the Listener, uses a HTTP trigger as input and Azure Queue Storage as output. This function will run, whenever a user sends a message to our bot and it will take the message and write it to a Storage Queue.Another function, I called it UpdateData uses a timer trigger to get information from the blog and write it to Azure Blob Storage.The third function, our Worker, uses Azure Queue Storage as trigger and Azure Blob Storage as input. The trigger is the same Queue that the Listener writes to, so a request coming from Telegram will be written to a Queue by the Listener function and trigger this Worker function.A last function, the Responder, finally sends a POST request to the Telegram bot. This function is triggered by the Worker’s output queue and uses no other inputs or outputs.To summarize, the Storage Queues are connected like this:  Listener &gt; Worker &gt; ResponderThe FunctionsThere are different ways to create or modify functions. The Azure console provides an easy-to-use GUI to configure triggers, inputs and outputs. It even has an editor for the functions’s code :) For the more advanced stuff, we can connect to the functions Kudu Services and upload files directly or use the debug consoles. Each function basically consists of a folder, the folder contains a function.json file which describes the function (type, trigger, input, output) and a run.ps1 file which contains the PowerShell code.The ListenerAs mentioned before, the first function just listens for a http request by the Telegram Bot and writes it to a storage queue.The function.json file defines the trigger httpTrigger and the input/output variables. The following is the actual configuration file for my Listener function:{  \\\\\\\"bindings\\\\\\\": [    {      \\\\\\\"name\\\\\\\": \\\\\\\"req\\\\\\\",      \\\\\\\"type\\\\\\\": \\\\\\\"httpTrigger\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"in\\\\\\\",      \\\\\\\"webHookType\\\\\\\": \\\\\\\"genericJson\\\\\\\"    },    {      \\\\\\\"name\\\\\\\": \\\\\\\"res\\\\\\\",      \\\\\\\"type\\\\\\\": \\\\\\\"http\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"out\\\\\\\"    },    {      \\\\\\\"type\\\\\\\": \\\\\\\"queue\\\\\\\",      \\\\\\\"name\\\\\\\": \\\\\\\"outputQueueItem\\\\\\\",      \\\\\\\"queueName\\\\\\\": \\\\\\\"listenerqueue\\\\\\\",      \\\\\\\"connection\\\\\\\": \\\\\\\"AzureWebJobsDashboard\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"out\\\\\\\"    }  ],  \\\\\\\"disabled\\\\\\\": false}The name defined in each object is made available as variable in the function’s code and contains a file path. That allows us to use Get-Content $req to get the HTTP request’s body. As well as Out-File $outputQueueItem and Out-File $res to write to the Storage Queue or respond to the HTTP request, respectively. How cool is that?!The functions code, in the run.ps1 file is as simple as that:# POST method: $req$requestBody = Get-Content $req -Raw # Wirte input to QueueOut-File -FilePath $outputQueueItem -Encoding Ascii -inputObject $requestBody# Respond to the incoming web requestOut-File -Encoding Ascii -FilePath $res -inputObject $trueThe request body is made available through the $req variable, we read the variable and write it to the $outputQueueItem which represents the Storage Queue listenerqueue\\\\\\\\outputQueueItem in the AzureWebJobsDashboard storage account.We do also respond to the incoming web request by writing to the $res variable.The WorkerThe next function is triggered by the same listenerqueue\\\\\\\\outputQueueItem we write to in the first function, so it will always run, after the first function finished. The content of the storage queue is made available through the $triggerInput variable:{  \\\\\\\"bindings\\\\\\\": [    {      \\\\\\\"name\\\\\\\": \\\\\\\"triggerInput\\\\\\\",      \\\\\\\"type\\\\\\\": \\\\\\\"queueTrigger\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"in\\\\\\\",      \\\\\\\"queueName\\\\\\\": \\\\\\\"listenerqueue\\\\\\\",      \\\\\\\"connection\\\\\\\": \\\\\\\"AzureWebJobsDashboard\\\\\\\"    },    {      \\\\\\\"type\\\\\\\": \\\\\\\"blob\\\\\\\",      \\\\\\\"name\\\\\\\": \\\\\\\"inPosts\\\\\\\",      \\\\\\\"path\\\\\\\": \\\\\\\"outcontainer/posts\\\\\\\",      \\\\\\\"connection\\\\\\\": \\\\\\\"AzureWebJobsStorage\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"in\\\\\\\"    },    {      \\\\\\\"type\\\\\\\": \\\\\\\"queue\\\\\\\",      \\\\\\\"name\\\\\\\": \\\\\\\"outputQueueItem\\\\\\\",      \\\\\\\"queueName\\\\\\\": \\\\\\\"workerqueue\\\\\\\",      \\\\\\\"connection\\\\\\\": \\\\\\\"AzureWebJobsDashboard\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"out\\\\\\\"    }  ],  \\\\\\\"disabled\\\\\\\": false}This function does not send HTTP responses, so there is no need to define an HTTP output. The only output for the Worker is another storage queue.As you’ve noted, we define another input for this function, namely outcontainer/posts, we’ll get to that later.The PowerShell code in run.ps1 does the actual work, so it evaluates the input and decides what to do with it.# Read input from StorageQueue$requestBody = Get-Content $triggerInput -Raw | ConvertFrom-Json$posts = Get-Content $inPosts -Raw | ConvertFrom-Json | Select-Object -Expand items...Out-File -Encoding Ascii -FilePath $outputQueueItem -inputObject ($outObj | ConvertTo-Json)Again, we simply read the input using Get-Content and write the output to the defined variable. I’ve omitted the actual code, to make this readable. You can find the code here:             ntsystemsit/ntsystemsbot    The ResponderThe responder is finally triggered by the workerqueue\\\\\\\\outputQueueItem and sends an http request to the Telegram Bot API, thereby responding to the user. The configuration is basically the same as above, and you can find it in the GitHub repo.To actually send a message to the Telegram Bot, I’ve created the following helper function. It uses Invoke-RestMethod to send a POST request to the /sendMessage API endpoint.function New-TelegramMessage {    [cmdletbinding()]    param(        $ChatId,        $Text,        $Mode = \\\\\\\"Markdown\\\\\\\",        $ReplyId,        $ReplyMarkup    )    $body = @{        \\\\\\\"parse_mode\\\\\\\" = $mode;        \\\\\\\"chat_id\\\\\\\"= $ChatId;        \\\\\\\"text\\\\\\\" = $Text;    }    if($ReplyId) {        $body.Add(\\\\\\\"reply_to_message_id\\\\\\\",$ReplyId)    }    if($ReplyMarkup) {        $body.Add(\\\\\\\"reply_markup\\\\\\\",(ConvertTo-Json $ReplyMarkup -Depth 5))    }    Invoke-RestMethod -Uri https://api.telegram.org/bot$env:TG_Token/sendMessage -Body $body -Method Post}  Note: The URL must contain the Bot’s API key. As I wanted to publish the code, I’ve stored the key in the function’s application settings. These settings are available as environment variables in the code, so I can access the key thorough: $env:TG_Token.Update DataThe last piece we need for our little example is the UpdateData function. This one uses a timer trigger and just gets all posts of our blog and stores them in an Azure Storage Blob.The function definition contains the schedule and the Storage Blob we want to write to:{  \\\\\\\"bindings\\\\\\\": [    {      \\\\\\\"name\\\\\\\": \\\\\\\"myTimer\\\\\\\",      \\\\\\\"type\\\\\\\": \\\\\\\"timerTrigger\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"in\\\\\\\",      \\\\\\\"schedule\\\\\\\": \\\\\\\"0 0 1 * * *\\\\\\\"    },    {      \\\\\\\"type\\\\\\\": \\\\\\\"blob\\\\\\\",      \\\\\\\"name\\\\\\\": \\\\\\\"outPosts\\\\\\\",      \\\\\\\"path\\\\\\\": \\\\\\\"outcontainer/posts\\\\\\\",      \\\\\\\"connection\\\\\\\": \\\\\\\"AzureWebJobsStorage\\\\\\\",      \\\\\\\"direction\\\\\\\": \\\\\\\"out\\\\\\\"    }  ],  \\\\\\\"disabled\\\\\\\": false}The schedule is in a cron-type format, so this function will run at 01:00 hours every day.Again, the PowerShell code is simple enough:(Invoke-WebRequest https://ntsystems.it/api/v1/posts/ -UseBasicParsing).content | Out-File -Encoding ascii -FilePath $outPostsThe Bot in actionOk, so with all of our code in place, we should now be able to communicate with our Bot using the Telegram messenger. Just search for the ntsystemsbot account and try it out :)This turned out to be a long story and there is so much left to explore. I hope the first two posts of this little series helped you understand the basics of Azure Functions, if someone finds a more practical use case a PowerShell-based Chatbot, I’d like to hear about it :)Thanks for reading!TomMore Information:  Telegram Bot Api  Azure Functions Webhooks\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-2/\\\"},{  \\\"id\\\": \\\"post-azure-functions-building-a-telegram-bot-with-powershell-1\\\",  \\\"title\\\": \\\"Azure Functions: Building a Telegram Bot with PowerShell 1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Cloud\\\"],  \\\"content\\\": \\\"Today I’ve got a fun one, we’re going to use Azure Functions to build a Telegram Bot with PowerShell. Sounds interesting? Well here we go. Before diving into the technical details, lets have a quick overview of what we’re trying to do.A Telegram Bot is an application that runs inside Telegram; users can interact with a Bot by sending them messages (or commands). The bot’s administrator controls the bot through a https-based API.Azure Functions is a serverless platform that lets us run pieces of code (functions) without worrying about the infrastructure. It’s called serverless because we just deploy code, no need to install virtual machines or applications. Azure functions support different programming languages, one of them is PowerShell. It’s still in experimental state, but it works just fine for what we’re going to do.So yes, we’re going to hook up our bot with a function app running PowerShell code in Azure.Azure FunctionsIn order to deploy our Azure Function, we have to login to the Azure Portal and create a new resource. Select the “Serverless Function App” which is currently listed in the Popular section of the marketplace, if it doesn’t show up, search for “Function App” and click Create.We’ll have to give a name to our app and select a storage account and location for the deployment. Once the deployment is finished, we can find the application through the All resources button on the left side in the Azure portal. Click the function app and add a new function. As noted before, PowerShell support is still experimental, so we have to create a new custom function, enabling the “Experimental Language Support”.Functions can have different triggers as well as various inputs and outputs. For our example, we’ll go with the “HTTP trigger” function. This function will run whenever it receives a HTTP request. Set the Language to PowerShell and the Authorization level to Function.The function is created with some basic code to get started, I’ve changed it a bit so that it will just return the object we pass to it.# POST method: $req$requestBody = Get-Content $req -Raw | ConvertFrom-Json# Response: $resOut-File -Encoding Ascii -FilePath $res -inputObject ($requestBody | ConvertTo-Json)Please make note of the function URL, right there next to the Run button. Remember that we selected an Authorization level of Function when creating the function, so we need to use a key when calling the function. This makes sure, that only our bot can call the function.To test the function, we can use Invoke-RestMethod to send a POST request:[PS] C:\\\\\\\\&gt; Invoke-RestMethod -Uri \\\\\\\"https://ntsystemsbot.azurewebsites.net/api/Listener?code=WaaxxyA==\\\\\\\" -Body '{\\\\\\\"Name\\\\\\\": \\\\\\\"Tom\\\\\\\"}' -Method PostName----TomOk, so now that we’ve got a working function, let’s go ahead and create the bot.Telegram BotTo create a Telegram bot, well, we use a bot. Look up the @BotFather account and follow the instructions.For this basic example, it was enough to specify a name and account name:The BotFather will guide you through the process and, at the end, give you access token for the http API. To edit the bot after the fact, just use the /myBots command. To test the access token and verify the bot has been created, we can call the following URL:https://api.telegram.org/bot&lt;AccessToken&gt;/getMeReplace &lt;AccessToken&gt; with the actual token, just like that:[PS] C:\\\\\\\\&gt; Invoke-RestMethod -Uri \\\\\\\"https://api.telegram.org/bot528059907:AAxxVs/getMe\\\\\\\"  ok result  -- ------True @{id=550258749; is_bot=True; first_name=ntSystems.it; username=ntsystemsbot}Ok, now we should have a working Azure function app and a barebones Telegram bot. Continue to part two for the next steps.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-1/\\\"},{  \\\"id\\\": \\\"post-lost-found-onion-service-cloudflare-dns\\\",  \\\"title\\\": \\\"lost & found: ntSystems Onion Service, Cloudflare DNS\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"It’s Friday and here’s another edition of lost &amp; found.We’re on torOur few twitter followers may already know it, for the rest of you here’s the news: Our little website is now also available as an Onion Service. Check it out at: ntsystcp…id.onionI’ve made some changes to the site in order to improve our readers privacy. Basically trying to serve all content directly and, for the Onion version, there are no Disqus comments as that requires external content and automatically loads some tracking scripts.Cloudflare launches 1.1.1.1We have been using Cloudflare to enable TLS and IPv6 (and more) for quite some time now. They launched a consumer DNS service on the first day of April. No, it was no joke. The Service is available at 1.1.1.1 and 1.0.0.1 and, interestingly, supports DNS over HTTPS.I have not been aware of DoH until now, and even though there don’t seem to be any existing client implementations, it enables some nice use cases. We can now use PowerShell’s Invoke-RestMethod to make DNS queries :)Here’s a quick function that does it:function Resolve-HttpsDns {    param(        [Parameter(Mandatory=$true)]        [string]        $Name,        [string]        $Type = \\\\\\\"A\\\\\\\",        [ipaddress]        $Server = \\\\\\\"1.1.1.1\\\\\\\"    )    $uri = -join(\\\\\\\"https://\\\\\\\",$Server,\\\\\\\"/dns-query\\\\\\\")    Invoke-RestMethod -Uri $uri -Body @{        ct = \\\\\\\"application/dns-json\\\\\\\"        name = $Name        type = $Type.toUpper()    } | Select-Object -ExpandProperty Answer}And there is a much more advanced module on GitHub and the PowerShell Gallery.Sun’s out, so let’s have a cold one. Nice weekend!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-onion-service-cloudflare-dns/\\\"},{  \\\"id\\\": \\\"post-skype-for-business-hybrid-observations\\\",  \\\"title\\\": \\\"Skype for Business Hybrid Observations\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Office365\\\",\\\"Lync\\\",\\\"Skype4B\\\",\\\"Hybrid\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"A collection of information about Skype for Business in hybrid environments.Hosting ProviderExchange Online Hosted VoiceMailNew-CsHostingProvider -Identity 'ExchangeOnline' -Enabled:1 -EnabledSharedAddressSpace:1 -HostsOCSUsers:0 -ProxyFqdn \\\\\\\"exap.um.outlook.com\\\\\\\" -IsLocal:0 -VerificationLevel UseSourceVerificationSkype for Business OnlineNew-CsHostingProvider -Identity \\\\\\\"SkypeforBusinessOnline\\\\\\\" –Enabled:1 -ProxyFQDN \\\\\\\"sipfed.online.lync.com\\\\\\\" – EnabledSharedAddressSpace:1 -VerificationLevel UseSourceVerification – HostsOCSUsers:1 -AutodiscoverUrl 'https://webdir.online.lync.com/Autodiscover/AutodiscoverService.svc/root'  Note: Make sure the Edge Servers can lookup the _sipfederationtls records for your domains. The targets must be the Edge Server’s external interface.Push NotificationFor the push notification service to work, make sure the Skype for Business Online hosting provider has been configured and add push.lync.com to the allowed domains. Then enable the Push Notification Configuration:New-CsAllowedDomain -Identity \\\\\\\"push.lync.com\\\\\\\"Set-CsPushNotificationConfiguration -EnableMicrosoftPushNotificationService $True – EnableApplePushNotificationService $TrueExchange Online Integration# SFB Online PowerShell: Get Tenant Guid(Get-CsTenant).TenantId.Guid# SFB On-Premises PowerShell: OAuth ConfigurationNew-CsOAuthServer microsoft.sts -MetadataUrl \\\\\\\"https://accounts.accesscontrol.windows.net/&lt;GUID from above&gt;/metadata/json/1\\\\\\\"New-CsPartnerApplication -Identity microsoft.exchange -ApplicationIdentifier 00000002-0000-0ff1-ce00-000000000000 -ApplicationTrustLevel Full -UseOAuthServerSet-CsOAuthConfiguration -ServiceName 00000004-0000-0ff1-ce00-000000000000# SFB On-Premises PowerShell: Export SfB OAuth Certificate (on Front End Server)$thumbprint = (Get-CsCertificate -Type OAuthTokenIssuer).ThumbprintExport-Certificate -Cert Cert:\\\\\\\\localMachine\\\\\\\\my\\\\\\\\$Thumbprint -FilePath C:\\\\\\\\oAuth.cer# SFB On-Premises PowerShell: Point Autodiscover to EXOSet-CsOAuthConfiguration -ExchangeAutodiscoverUrl \\\\\\\"https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc\\\\\\\"# MSOnline PowerShell: Publish OAuth Cert and Add Service Principal Name$certificate = New-Object System.Security.Cryptography.X509Certificates.X509Certificate$certificate.Import(\\\\\\\"C:\\\\\\\\oAuth.cer\\\\\\\")$binaryValue = $certificate.GetRawCertData()$credentialsValue = [System.Convert]::ToBase64String($binaryValue)New-MsolServicePrincipalCredential -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000 -Type Asymmetric -Usage Verify -Value $credentialsValue# Add Service Principal Name (sfb pool web services)$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\\\\\"00000004-0000-0ff1-ce00-000000000000/sfbwebext.uclab.eu\\\\\\\")$MsolSP | Set-MsolServicePrincipalThe Service Principal Names can alternatively be set using the *-AzureRmADServicePrincipal cmdlets from the AzureRM module.Once the configuration is complete, we can test Exchange Storage connectivity with the following command:Test-CsExStorageConnectivity -SipUri \\\\\\\"sip:tom@uclab.eu\\\\\\\" -Verbose  Note: The Front End Servers must be able to communicate with Exchange Online (directly or via proxy), otherwise the “Add Skype meeting” button will not be visible in Exchange Online OWA. This is also required for Modern Hybrid Authentication.To troubleshoot the Exchange Online Integration, run an UCWA (Web Infrastructure) trace on the Front End Servers. You should see incoming requests from Exchange Online and the corresponding responses from the Front End.# Request: Start-Line: POST /ucwa/oauth/v1/applicationsStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/defaultValuesStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/customInvitationStart-Line: GET /ucwa/oauth/v1/applications/103925742291/onlineMeetings/phoneDialInInformation...User-Agent: Exchange/15.20.588.14/OnlineMeetingContent-Type: application/vnd.microsoft.com.ucwa+jsonAccept: application/vnd.microsoft.com.ucwa+jsonX-ExCompId: OnlineMeeting# Response:Start-Line: 200 OKContent-Type: application/vnd.microsoft.com.ucwa+json; charset=utf-8{\\\\\\\"accessLevel\\\\\\\": \\\\\\\"Everyone\\\\\\\",\\\\\\\"entryExitAnnouncement\\\\\\\":\\\\\\\"Enabled\\\\\\\",\\\\\\\"attendees\\\\\\\":[],\\\\\\\"automaticLeaderAssignment\\\\\\\":\\\\\\\"SameEnterprise\\\\\\\",\\\\\\\"description\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"leaders\\\\\\\":[],\\\\\\\"onlineMeetingId\\\\\\\":\\\\\\\"RMANN9FF\\\\\\\",\\\\\\\"onlineMeetingUri\\\\\\\":\\\\\\\"sip:tom@uclab.eu;gruu;opaque=app:conf:focus:id:RMANN9FF\\\\\\\",\\\\\\\"onlineMeetingRel\\\\\\\":\\\\\\\"myOnlineMeetings\\\\\\\",\\\\\\\"organizerUri\\\\\\\":\\\\\\\"sip:tom@uclab.eu\\\\\\\",\\\\\\\"conferenceId\\\\\\\":\\\\\\\"257150\\\\\\\",\\\\\\\"phoneUserAdmission\\\\\\\":\\\\\\\"Enabled\\\\\\\",\\\\\\\"lobbyBypassForPhoneUsers\\\\\\\":\\\\\\\"Disabled\\\\\\\",\\\\\\\"subject\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"joinUrl\\\\\\\":\\\\\\\"https://meet.uclab.eu/tom/RMANN9FF\\\\\\\",\\\\\\\"2c04865e-a621-4a4d-81e0-8047131f87d8\\\\\\\":\\\\\\\"please pass this in a PUT request\\\\\\\",\\\\\\\"_links\\\\\\\":{\\\\\\\"self\\\\\\\":{\\\\\\\"href\\\\\\\":\\\\\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF\\\\\\\"},\\\\\\\"onlineMeetingExtensions\\\\\\\":{\\\\\\\"href\\\\\\\":\\\\\\\"/ucwa/oauth/v1/applications/103925742291/onlineMeetings/myOnlineMeetings/RMANN9FF/extensions\\\\\\\"}},\\\\\\\"rel\\\\\\\":\\\\\\\"myOnlineMeeting\\\\\\\",\\\\\\\"etag\\\\\\\":\\\\\\\"3055269905\\\\\\\"}...Modern AuthenticationTo use modern authentication with Skype for Business, the ADFS Server has to be prepared using the sfbadalscripts. More information about how to use the scripts can be found here. The script has to be run on the ADFS server, be sure to include all internal and external URLs of the Skype deployment in the PoolIds parameter..\\\\\\\\Setup-Adfs2016OAuthTrustForSfB.ps1 -PoolIds 'https://sfbwebext.uclab.eu/','https://sfbwebint.uclab.eu/'When the ADFS Server has been prepared, the following commands can be used to enable modern authentication.  Note: This can only be configured globally, double-check the prerequisites and, even though existing sessions will not be re-authenticated, schedule a maintenance window.# Create new OAuth ServerNew-CsOAuthServer -Identity uclabFS -Type ADFS -MetadataURL \\\\\\\"https://fs.uclab.eu/FederationMetadata/2007-06/FederationMetadata.xml\\\\\\\"# Require Authorization using ADFSSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity uclabFSAfter that just wait for the management store replication to publish the change and test it with a client or the Test-CsRegistration cmdlet.  To roll back the change simply set the ClientAuthorizationOAuthServerIdentity parameter to $null.Hybrid Modern AuthenticationFor hybrid authentication to work, we need to add more SPNs to the MSOL Service Principal. Add all internal and external Web Services URLs of the Skype deployment to the list:# MSOnline PowerShell$MsolSP = Get-MsolServicePrincipal -AppPrincipalId 00000004-0000-0ff1-ce00-000000000000$MsolSP.ServicePrincipalNames.Add(\\\\\\\"https://sfbwebext.uclab.eu\\\\\\\")$MsolSP.ServicePrincipalNames.Add(\\\\\\\"https://sfbwebint.uclab.eu\\\\\\\")$MsolSP | Set-MsolServicePrincipalThen, add the evoSTS (Azure AD Federation Service) to the Skype for Business OAuth configuration and enable it using:# Create new OAuth ServerNew-CsOAuthServer -Name evoSTS -IssuerIdentifier sts.windows.net -MetadataUrl \\\\\\\"https://login.windows.net/common/FederationMetadata/2007-06/FederationMetadata.xml\\\\\\\" -Type AzureAd -AcceptSecurityIdentifierInformation $True# Require Authorization using Azure ADSet-CsOAuthConfiguration -ClientAuthorizationOAuthServerIdentity evoSTSOn the client, make sure to set AllowAdalForNonLyncIndependentOfLync and Enable Modern Authentication if required.$a = New-CsClientPolicyEntry -name AllowAdalForNonLyncIndependentOfLync -value \\\\\\\"True\\\\\\\"Set-CsClientPolicy -Identity Global -PolicyEntry @{Add=$a} HKEY_CURRENT_USER\\\\\\\\Software\\\\\\\\Policies\\\\\\\\Microsoft\\\\\\\\Office\\\\\\\\1x.0\\\\\\\\Lync\\\\\\\"AllowAdalForNonLyncIndependentOfLync\\\\\\\"=dword:00000001Hybrid VoiceIf we move enterprise voice users to the cloud they can still use our on-perm PSTN connectivity to make and receive calls. For that to happen, we need Skype for Business Edge Servers and the edge’s next-hop pool must also be running Skype. Then we configure a PSTN Usage for the online users as well as an Online Voice Routing policy. In it’s most basic form we need the following:# SFB Online PowerShell: Create the PSTN UsageSet-CsOnlinePstnUsage  -Identity Global -Usage @{Add=\\\\\\\"Unrestricted\\\\\\\"}# Create and assign the Voice Routing policyNew-CsOnlineVoiceRoutingPolicy OnlineVRP -OnlinePstnUsages UnrestrictedGrant-CsOnlineVoiceRoutingPolicy -Identity tom@uclab.eu -PolicyName OnlineVRPTo move a user from on-premises to Skype for Business Online, use the following:Move-CsUser -Identity tom@uclab.eu -Target sipfed.online.lync.com -Credential (Get-Credential)To move a user from Skype for Business Online to on-premises, use the following:Move-CsUser -Identity tom@uclab.eu -Target sfb01.uclab.eu -Credential (Get-Credential) -HostedMigrationOverrideUrl https://admin1e.online.lync.com/HostedMigration/hostedmigrationService.svcThe host part of the HostedMigrationOverrideUrl parameter can change based on where your tenant is hosted. To determine the host part, open the legacy Skype for Business admin center and copy the URL. It should look something like this: https://webdir1e.online.lync.com/LSCPThen replace webdir with admin and LSCP with HostedMigration/hostedmigrationService.svc. You think I am making this up, right? Read more here.Skype for Business Online users must be assigned an E5 license or have PSTN calling added to their E1/E3 plans to be able to make and receive calls.To be continued ;)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/skype-for-business-hybrid-observations/\\\"},{  \\\"id\\\": \\\"post-aad-connect-failed-to-load-configuration-information\\\",  \\\"title\\\": \\\"Azure AD Connect: Failed to load configuration information\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Cloud\\\",\\\"Azure\\\",\\\"Office365\\\"],  \\\"content\\\": \\\"When upgrading Azure AD Connect (ADSync), the wizard fails with the error: “Failed to load configuration information from primary ADFS server”.ProblemThis can happen if the federation service was moved to a different machine after installing Azure AD Connect. Subsequent updates to the synchronization service fail with the above error message. This is because AD Connect stores the name of the original ADFS server in the PersistedState XML file.The fils is located at: C:\\\\\\\\ProgramData\\\\\\\\AADConnect\\\\\\\\PersistedState.xmlThe ADFS servername is stored in the IAdfsContext.TargetAdfsServers property, oh and it’s Base64 encoded. PowerShell can be used to easily read the file:[xml]$xml = Get-Content \\\\\\\"C:\\\\\\\\ProgramData\\\\\\\\AADConnect\\\\\\\\PersistedState.xml\\\\\\\"$xml.PersistedStateContainer.Elements.PersistedStateElementSolutionSimply update the value of the IAdfsContext.TargetAdfsServers with the servername of the new ADFS machine, as the servername has to be Base64 encoded, the following PowerShell code can be used to convert a string:$name = \\\\\\\"adfs01.example.com\\\\\\\"[System.Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($name))Cheers,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/aad-connect-failed-to-load-configuration-information/\\\"},{  \\\"id\\\": \\\"post-tunneling-ssh-through-tor\\\",  \\\"title\\\": \\\"Tunneling SSH through Tor\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"WSL\\\",\\\"Cloud\\\"],  \\\"content\\\": \\\"I’ve been using Onion Services aka. Hidden Services to connect to remote machines for some time now. Tor clients can connect to such services through the Tor network, there is no need to know the IP address of the destination machine, likewise there is no need to configure inbound port mappings or firewall rules.Destination (running the Onion Service)On the destination machine, we need to install Tor. For best results follow the instructions here.Once installed, we configure the hidden service in the /etc/tor/torrc configuration file. Find the section dedicated to hidden services in the file and create a new service or uncomment on of the examples.HiddenServiceDir /var/lib/tor/my_hidden_service/HiddenServicePort 80 127.0.0.1:80HiddenServicePort 2244 127.0.0.1:22The above example, creates a service with the name of my_hidden_service which will listen on port 80 and provide whatever runs on 127.0.0.1:80 over the Tor network. It will also listen on port 2244 and provide ssh (which runs on 127.0.0.1:22) as a hidden service.Securing SSHAs you are essentially making your sshd accessible to the whole Tor network, it might be a good idea to disallow password authentication and root access. To do that, make sure your /etc/ssh/sshd_config contains the following lines:PasswordAuthentication noPermitRootLogin prohibit-passwordHostname and KeysAfter configuring the Onion Service, restart the Tor service: sudo service tor restart. After it has started, the hidden service directory (as configured in HiddenServiceDir) will have been created and we can find two files in the directory. The hostname file contains the hostname that we need on the client side in order to connect to the service.sudo cat /var/lib/tor/my_hidden_service/hostnamexxxxxxx.onionClient (accessing the Onion Service)To connect to the first hidden service, a website running on port 80, we can simply use Tor Browser and open the hostname we found in the hidden service directory above. To connect via SSH, there are multiple options but first, we do also need to install Tor. Again for best results follow the official instructions.On WSL I was able to install it by simply using sudo apt-get install tor. We will also need the nc tool from the netcat-openbsd package, if it is not available on your system, install it using: sudo apt-get install netcat-openbsd.Once installed, start tor by typing tor --runasdaemon 1.torifyTorify comes with the installation of the Tor package on the client and is a simple wrapper that tries to connect a given application through Tor.torify ssh tom@xxxxxxx.onion 2244The above example connects ssh to the .onion address on port 2244. On my system, torify throws a few errors but finally works well enough..ssh/configAnother option is to add the destination hostname to the ssh config file of the client. This can typically be found in the users profile directory at .ssh/config.Simply add a line for each destination you want to connect to. The ProxyCommand uses the nc tool, to tunnel the connection through 127.0.0.1:9050 which is the clients Tor endpoint.Host t01 HostName xxxxxxxx.onion port 2244 ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %pPlease note, on Mac OS I had to use ncat instead of nc, so the ProxyCommand looks like:   proxyCommand ncat --proxy rhel01:9050 --proxy-type socks5 %h %p  A final note on privacy: This guide is meant to help connect to remote systems behind NAT routers or firewalls with and changing public IPs. Think connect to your home network from work. It is not meant to provide the best possible privacy. For that, please refer to the official documentation.Have fun!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/tunneling-ssh-through-tor/\\\"},{  \\\"id\\\": \\\"post-testing-coinhive\\\",  \\\"title\\\": \\\"Testing CoinHive\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"ntSystems\\\",\\\"Crypto\\\"],  \\\"content\\\": \\\"I’ve recently stumbled upon coinhive and with all the recent fuzz about crypto currencies, I decided to have a look at it. So what’s that all about?coinhive: A JavaScript Monero MinerMany crypto currencies rely on a https://en.wikipedia.org/wiki/Proof-of-work_system algorithm in order to verify transactions. There are quite a few different algorithms out there, some of them more difficult than others. Bitcoin for example uses hashcash which, at current difficulty levels, can only be feasibly generated on specialized hardware (ASIC).Another one of those PoW algorithms is CryptoNight which has been designed to be ASIC resistant and can feasibly be generated on modern CPUs and GPUs. Monero, a private and censorship-resistant digital currency, happens to use the CryptoNight algorithm, which means it can be mined efficiency on consumer devices.That’s what the coinhive miner does. It essentially runs a JavaScript application in the users web browser and uses the devices CPU to mine Monero. The mined Monero will then be payed out to a wallet we own.ntSystemsNow as this website is a side-project and does not make us any money at all (and we don’t like Ads), we decided to test drive coinhive for a week.  Starting today, by visiting our side your device will be used to mine Monero and, by doing so, help us maintain the site and deliver more awesome content.After the first week’s trial we will publish the stats and discuss the ethics behind “abusing” our visitors spare CPU cycles.The following code has been added to the site’s footer in order to start the miner:/edit: removed codeUpdateAfter one week of testing here are the results of this little experiment. This site has between 300 and 600 active users on a given day, not a lot but it’s something. So with the above code, we are using up to 90% of the visitors CPU cycles to generate Monero using coinhive’s JavaScript miner.This resulted to be about 468 hashes per second totalling about 173.82 million hashes in a week. According to monerobenchmarks.info, these figures can be compared to what a not-very-modern GPU with 4GB of memory would produce.The final balance after the weeks test is 0.02582 xmr, worth about 2€ at the time of this writing.Another UpdateSoon after the last update, ad-blockers started blocking the download of the javascript and the hashrate dropped quite a bit. I’ve since decided to remove the code and stop (ab)using our visitors CPUs.Thanks!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/testing-coinhive/\\\"},{  \\\"id\\\": \\\"post-the-invisible-internet-project-and-wsl\\\",  \\\"title\\\": \\\"The Invisible Internet Project and WSL\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"WSL\\\",\\\"Cloud\\\"],  \\\"content\\\": \\\"The Windows Subsystem for Linux can be used to run quite a few interesting things on Windows, one of them is the Invisible Internet Project or i2p.Install i2pFirst of all we’ll have to install i2p on our system. Before starting the installation, we have to add the required repository:sudo apt-add-repository ppa:i2p-maintainers/i2psudo apt-get updatesudo apt-get install i2pAfter the installation we can start the i2prouter with the following command:i2prouter startAs soon as the service  is running, we can access the homepage using http://127.0.0.1:7657/home likewise the configuration page is available at http://127.0.0.1:7657/configConfigure ProxyFor testing, we don’t have to change anything in the home or configuration pages and we can just point our systems proxy configuration to i2p. The i2prouter listens on ports 4444 and 4445 for http and https traffic, respectively.Now you will soon notice that pointing your system’s proxy to i2p will allow you to browse .i2p sites but the “clear” intertnet will no longer work very well.Unlike tor, i2p is not intended to be used as proxy to the internet, but it’s purpose is to enable secret communication to resources inside the i2p network. Therefore it does not make a lot of sense to route all internet traffic trough i2p, it’s enough if we use the i2prouter to access *.i2p domains.Install PrivoxyTo get that done, i.e. routing only requests to .i2p domains to the i2prouter, we’ll need another small proxy that is capable of routing requests based on pattern. Let’s install privoxy:sudo apt-get install privoxyAfter installing privoxy, we’ll have to configure it so that it routes requests to *.i2p domains to i2prouter which runs at localhost:4444:Use your favorite editor to update the config file at /etc/privoxy/config and add the following line:forward .i2p localhost:4444Now restart privoxy sudo /etc/init.d/privoxy restart and set the systems proxy configuration to 127.0.0.1:8118.Setting the proxy with PowerShell and PACConstantly changing the proxy configuration does not work really well, I forget that I’ve set the proxy and if privoxy is not running, I have to disable the proxy in order to access the internet. In the first iteration, I wrote two quick and dirty PowerShell functions to enable/disable the proxy settings:Function Disable-Proxy {    $reg=\\\\\\\"HKCU:\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\CurrentVersion\\\\\\\\Internet Settings\\\\\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 0    Set-ItemProperty -Path $reg -Name ProxyServer -Value \\\\\\\"\\\\\\\"}Function Enable-Proxy {    param($proxyServer = \\\\\\\"localhost:8118\\\\\\\")    $reg=\\\\\\\"HKCU:\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\CurrentVersion\\\\\\\\Internet Settings\\\\\\\"    Set-ItemProperty -Path $reg -Name ProxyEnable -Value 1    Set-ItemProperty -Path $reg -Name ProxyServer -Value $proxyServer}I put these in my $PROFILE and used them for a few days. It was ok, but there had to be a better solution… So I started to look into PAC or “Proxy auto-config” which is a configuration file that defines how web browsers can automatically choose the appropriate proxy server. Read more on WikipediaLong story short, I ended up using the following configuration file:function FindProxyForURL(url, host) {        // .onion URLs need a proxy:        if (shExpMatch(host, \\\\\\\"*.onion\\\\\\\"))        {                return \\\\\\\"PROXY localhost:8118\\\\\\\";        }        // other requests go directly        return \\\\\\\"DIRECT\\\\\\\";}Save the function above to a text file called proxy (without extension) and put it in C:\\\\\\\\Windows\\\\\\\\system32\\\\\\\\drivers\\\\\\\\etc\\\\\\\\ and set the systems AutoConfigUrl to: file://C:/Windows/system32/drivers/etc/proxyEnjoyTom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/the-invisible-internet-project-and-wsl/\\\"},{  \\\"id\\\": \\\"post-powershell-and-variable-references\\\",  \\\"title\\\": \\\"PowerShell and Variable References\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"I’ve come across an interesting behavior (or feature) of PowerShell the other day. As I don’t really understand what’s going on, I decided to write it up, maybe someone out there can help explaining this.ExpectedI’m writing a script that contains multiple functions and objects get passed from one function to another. As it happens the functions modify the objects that are passed in and output the modified information. So far so good, but what I found is, that the original object gets updated. So in the end I don’t need the function to output anything and can just carry on using the passed-in object.Confused? Well I am, so let’s try it with an example:$var = 1function Update-Value ([int]$InputObject) {    $InputObject++    Write-Output $InputObject}In the above example we define a variable with a value of 1 and a simple function that increases the value by 1 and outputs the increased value. That works as I would have expected, if we run the code, the output is:C:\\\\\\\\&gt; Update-Value $var2C:\\\\\\\\&gt; $var1UnexpectedNow if we do the same exercise with an object instead of a simple integer, the outcome is not exactly as I would have expected it to be. Here goes another example:$obj = New-Object -TypeName psobject -Property ([ordered]@{ a=1; b=2; c=3; })function Update-Value ([psobject]$InputObject) {    $InputObject.a++    Write-Output $InputObject}The idea is basically the same as above, the variable in this case contains a custom object with three properties: a, b, c. The function is still increasing the value on the input object, only that now we access the “a” property and increase it’s value.The output is as follows:C:\\\\\\\\&gt; Update-Value $obja b c- - -2 2 3C:\\\\\\\\&gt; $obja b c- - -2 2 3Now apparently the variable $obj gets updated as well. While in the first example, the integer in $var did not change, i.e. after running the function it was still 1, the value of $obj.a does change when I run the function.In my script I just decided to change the function so that it does no longer output the modified object and instead, I just call the function and carry on with my original variable. I do think the variable referencing in memory might be different when using a single integer vs. an object. It works for now, but as stated above, I don’t understand why and that worries me to some degree…Thanks to anyone who cares to comment and offer an explanation!TomUpdateAfter posting this to /r/PowerShell someone referred me to this thread which explains the behavior quite well.The variable $InputObject in my case does not contain the object but is just a pointer to $obj, which is therefore updated directly.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-and-variable-references/\\\"},{  \\\"id\\\": \\\"post-jekyll-on-wsl\\\",  \\\"title\\\": \\\"Jekyll on WSL\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"WSL\\\",\\\"ntSystems\\\"],  \\\"content\\\": \\\"Today we are looking at running Jekyll on WSL or Bash on Ubuntu on Windows.Install WSLFirst of all we’ll have to make sure our system fulfills the prerequisites to run the “Windows Subsystem for Linux”. We need a 64-bit version of the Windows 10 Anniversary (build 14939) or newer for that. Then we’ll have to enable the “Developer mode” using “Settings”, “Update &amp; Security” and finally “For Developers”.Once the above prerequisites are met, we can go ahead and enable the WSL using the control panel or the following command in an elevated PowerShell session:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-LinuxAnd finally we can type bash into an administrative command prompt to download and install bash.A detailed installation guide is available on MSDNInstall JekyllAfter setting up Bash on Ubuntu on Windows we can now install the required packages for Jekyll using the following commands.sudo apt-add-repository ppa:brightbox/ruby-ngsudo apt-get -y updatesudo apt-get install git build-essential libcurl4-openssl-dev zlib1g-devsudo apt-get install ruby2.4 ruby2.4-devAfter installing ruby verify the the installed version using ruby -v. Jekyll requires a version greater that 2.Now let’s install nodejs and finally Jekyll:curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -sudo apt-get install -y nodejssudo gem install jekyll bundlerServeNow that the prerequisites are installed, we can go ahead and build our static website. To get started with Jekyll, head over to the official documentation page. In my case, I just want to serve up a local copy of this great blog, so I clone the git repository and build the site locally using:git clone https://github.com/ntsystemsit/ntsystemsit.github.iocd ntsystemsit.github.io/bundle installbundle exec jekyll serve -d /tmp/ntsystemsNote: There seems to be a bug related with WSL. I have to use the --force-polling switch with the serve command on Windows 10 1607, on 1703 it works without that switch. Check the  following issue on GitHub.Well, what can I say? I really like the possibility to natively run Linux packages on Windows 10. Even though it doesn’t make the Linux part less complicated, at least I don’t need a VM anymore :)So long,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/jekyll-on-wsl/\\\"},{  \\\"id\\\": \\\"post-keeping-track-of-powershellcore-releases-on-github\\\",  \\\"title\\\": \\\"Keeping track of PowerShellCore releases on GitHub\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"GitHub\\\"],  \\\"content\\\": \\\"I’ve been using PowerShell Core on my MacBook for a while now. As the code is still in its early stages, there’s no way of managing/updating the software one is running, at least none that I would be aware of. I did miss some updates and, as a result, had problems with Visual Studio Code. So I’ve put together a quick function that checks the latest release on GitHub and can conveniently be put into my $PROFILE.GitHub Releases feedPowerShell Core was open-sourced some time ago and the team behind it is using GitHub to manage the code. The latest version for all the supported operating systems can be found in the PowerShell repository. Every so often, a new release is published to the Releases feature of GitHub and it happens that GitHub does provide an atom feed for releases. This feed can be accessed by simply appending “.atom” to the URL.Get-PSVersionGitHubArmed with this information, I wrote the following simple function. It just gets the latest release from the repository’s atom feed and adds the information to a hash table, which is then output as a custom object:Now I just put the function into my $PROFILE and make it run every time PowerShell starts.Easy enough, right?Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/keeping-track-of-powershellcore-releases-on-github/\\\"},{  \\\"id\\\": \\\"post-jekyll-fun-consuming-ntsystems-with-powershell\\\",  \\\"title\\\": \\\"Jekyll Fun: Consuming ntSystems with PowerShell\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"ntSystems\\\"],  \\\"content\\\": \\\"As you might have read before, our little blog is powered by Jekyll. Well I stumbled over the jsonify filter the other day, and so I built a little “kind-of” API :) Sound interesting? Read on.HowIt all started with search, I was looking for a search feature for our blog. After some testing with Algolia I stumbled over this great post by Katy. She’s using lunr.js with Jekyll. I liked the client-side approach of lunr.js and that it has no external dependencies, so I adopted Katy’s implementation for our site and, voilà, we have search. So, why do I keep talking about search? Well lunr.js consumes data in as json objects, so that’s how I learned about the jsonify filter.After some playing around with curly braces and the forloop in liquid I ended up creating the first version of our so-called API.Basically, what I’m doing is looping through the posts and creating json objects.I created a few different folders to expose different information, but more about that in the examples below.Use Invoke-RestMethod to consume the jsonThere are various “endpoints” available, we can get meta information about the site at /meta/ or a list of all pages and posts at /pages/and /posts/, respectively.In the following example, we’re getting all posts with a Category of ntSystems and then just select the tags property:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Where-Object category -eq ntSystems | Select-Object tagstags----{migrate, jekyll}{migrate, jekyll}{update, jekyll}Alternatively, we can get list of all categories, just like that:PS /Users&gt; Invoke-RestMethod https://ntsystems.it/api/v1/posts/ | Select-Object -ExpandProperty items | Select-Object Category -Uniquecategory--------CloudAzureDev...Awesome, right?Well, that’s all for today. Enjoy your weekend!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/jekyll-fun-consuming-ntsystems-with-powershell/\\\"},{  \\\"id\\\": \\\"post-my-takeaways-from-ms-techsummit\\\",  \\\"title\\\": \\\"My takeaways from MS Tech Summit\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Cloud\\\"],  \\\"content\\\": \\\"Daniel and I have attended the Microsoft Tech Summit in Milan earlier this week. Overall it was a pretty good event, especially taking into account that it was free. The keynote was quite interesting, so much so, that I thought I’d share my takeaways.  Focus on solutions (not individual components) and add valueThis, for me, is the message that came across most clearly. Focus on helping your business, brining value by enabling new processes and possibilities. Don’t waste your valuable time upgrading the umpteenth server or migrating from v14 to v15. Move to the cloud where it makes sense and free-up resources.  Infrastructure continues to lose importance and platform services get more importantSure, there is a huge uptake in IaaS but that can only be an interim solution. If any organization is going to really benefit from using cloud services, the managing of virtual machines (just like on-prem) should not be part of the equation.  Skills change!In a modern world, the IT pro’s focus can no longer be a single nitty-gritty technical thing. Many of us almost ignored the business’ evloving needs while pursuing mastery in that single discipline. In this increasingly cloud-first world, we will have to change. Radically.  GDPR: General Data Protection RegulationThis thing is coming and fast. The business must be prepared and IT can should play a key role in implementing the right tools and policies to follow the regulation. Oh, and tell me about changing skills ;)  Cloud adoption in Italy is above average and growingIt was really interesting to see that the economic turbulences were a driver for cloud adoption in Italy. A great customer story with a well-known, Italian media outlet showed how a sensible approach to cloud technologies could both, enable exciting new scenarios and drive down cost.Sessions and slide decks can be downloaded from the Tech CommunityWhat do you think about the changing role of IT? Leave a comment below!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/my-takeaways-from-ms-techsummit/\\\"},{  \\\"id\\\": \\\"post-aure-site-recovery-deployment-planner\\\",  \\\"title\\\": \\\"Azure Site Recovery Deployment Planner\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\",\\\"ASR\\\"],  \\\"content\\\": \\\"Today I was super excited about the first tests with the Azure Site Recovery Deployment Planner. Sometimes calculating the Bandwidth, Storage, local infrastructure needed for Site Recovery can be very tricky. Therefore, I’m happy that Microsoft released a helpful tool to get the right information needed.The planner is a command-line tool in public preview for VMWare only, so the final version is not completed yet. Profiling the environment can be done remotely, so no agents or pieces of software on ESX Server or vCenter is needed. The planner provides following details:  Compatibility assessment  Network bandwidth need versus RPO assessment  Azure infrastructure requirements  On-premises infrastructure requirementsRequirementsThe planner needs following components:  Windows Server 2012 R2  .Net Framework 4.5  VMware vSphere PowerCLI 6.0 R3  Microsoft Visual C++ Redistributable for Visual Studio 2012  Microsoft ExcelProfilingFirst of all, we have to start profiling the VM’s that we want to protect with Azure ASR. The tool connects to the vCenter server (or ESX) to collect performance data. There is no performance impact on the VM’s because the performance data of the vCenter is taken and no data from inside the VM. The tool basically queries every 15 minutes the vCenter to get the performance data.As first step we create a VM list with VM’s we want to profile. Connect to the vCenter with the VMWare CLI:Connect-VIServer -ServerExport the list of all VM’s to a Text FileGet-VM |  Select Name | Sort-Object -Property Name &gt;  C:\\\\\\\\Service\\\\\\\\Output.txtYou should get a list like this. I deleted the not needed VM’s from the Textfile and saved the changes.Now we are ready to start profiling. Microsoft recommends to profile at least 15 days. In our test we will profile 24 hours. From a Powershell window we can start profiling with the following command:.\\\\\\\\ASRDeploymentPlanner.exe -Operation StartProfiling -Directory “C:\\\\\\\\vCenter1_ProfiledData” -Server vCenter1.FQDN -VMListFile “C:\\\\\\\\Service\\\\\\\\Output.txt” -NoOfDaysToProfile 0.04 -User vCenterUser1A complete list of all switches can be seen here.If you see following output in powershell you are all right. In my case, there are some VM’s not running and therefore a warning is displayed because the tool can obviously not collect performance data.Generate reportAfter profiling is completed we can see that the tool created some performance CSV Files:Now we can run the tool in report-generation mode to get the report.\\\\\\\\ASRDeploymentPlanner.exe -Operation GenerateReport -Server vCenter1.FQDN -Directory “C:\\\\\\\\vCenter1_ProfiledData” -VMListFile “C:\\\\\\\\Service\\\\\\\\Output.txt”A complete list of all switches can be seen here.The report is named as “DeploymentPlannerReport” and can be opened with Excel.What we can see from the Excel Report is basically the number of profiled, compatible and incompatible VM’s. If we click on details, we can get the name of the not compatible VM. In my case a VM’s has a Disk with 10TB VMDK attached. (Azure has a limit of 1TB per disk).I selected in the right corner a desired RPO with 15 minutes. Based on this value the report start calculating the Mbit/s needed.In the Required Network Bandwidth section there are 3 graphs:  To meet RPO 100 percent of the time: The recommended bandwidth in Mbps to be allocated to meet the desired RPO 100 percent of the time.  To meet RPO 90 percent of the time: If we cannot set the bandwidth needed to meet your desired RPO 100 percent of the time, we can choose to go with a lower bandwidth setting that can meet a desired RPO 90 percent of the time. (In my case 100 and 90 RPO are both 2 Mbit.. maybe there is still a bug with the calculation. Because the tool is in preview I guess this will be fixed before GA)  Achieved Throughput: This is the real Throughput that can be measured with the following command:ASRDeploymentPlanner.exe -Operation GetThroughputIn my case this is $Null because I have to change the QoS rules and didn’t execute the test acutally.Based on the storage activity the planner recommends the storage accounts needed. I have one VM with heavy storage operations that needs Premium disks (SSD).Very interesting is the recommendation about the local infrastructure. In my case, only one server is needed to replicate the VM’s to Azure.The WhatIf Graph shows what would happen if we decide to use a throughput to meet 90% of the RPO. Actually, I don’t fully understand the sense of the graph. Helpful would be to choose the bandwidth in a combo box or something similar and then see what happens.In the Recommended VM batch size for initial replication section, Microsoft shows the recommendation of number of VMs that can be protected in parallel to complete the initial replication within 72 hours with the suggested bandwidth to meet desired RPO 100 percent of the time being set. The value can be changed using the GoalToCompleteIR parameter during report generation.Let’s switch to the “Input” Tab in Excel. Here we can see some very interesting values. The most interesting values for me is: Total Data to be replicated for initial replicationConclusionSome things don’t work as expected. But we have to consider that the tool is in public preview, so many changes and improvements are expected. Stay tuned for further updates.Daniel\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/aure-site-recovery-deployment-planner/\\\"},{  \\\"id\\\": \\\"post-get-going-with-go\\\",  \\\"title\\\": \\\"Get Going with Go!\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Go\\\",\\\"Basics\\\"],  \\\"content\\\": \\\"Everyone is talking about Go these days so I decided to have a look at it and see what it could do for me.BasicsSo what is Go? Well according to golang.org  Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.Ok, so another programing language, why do I care you ask? Well that’s a story for another day, for now, let’s say that I’m just generally interested in awesome technology.Installing on macOSThe first “Hello World” kind of program can easily be done using tour.golang.org but I wanted to get it up and running on my MacBook so I installed the package using brew, it’s easy enough with: brew install goAfterwards, a quick go version confirmed that the latest and greatest version of Go has been installed. 1.8 at the time of writing.go version go1.8 darwin/amd64Environment VariablesBefore firing up an editor, some environment variables need to be set in order for Go to work and store projects and dependencies in some user-defined path. I’ve added the following to lines to my bash profile:export GOPATH=$HOME/git/goexport GOBIN=$(go env GOPATH)/binexport PATH=$PATH:$GOBINWhat this does, is setting the GOPATH and GOBIN environment variables to a folder in my home directory and adding the GOBIN directory to the systems’ PATH variable. The first variable instructs Go to look for and install sources and packages in the specified folder, the second variable defines where binaries are located and adding this to the systems’ PATH simply makes running Go programs easier.Hello World with Visual Studio CodeOn the Mac, I’m mostly using VS Code to write/edit text files, as it has some extensions for Go, I figured it would do the trick for the beginning. So I opened up my GOPATH directory in VS Code and created a new folder under src, hello in my case. In this folder I created a hello.go file, and at this point, Visual Studio Code recognises the Go language and downloads some required tools to the GOPATH directory.After a restart, I created the following hello world program:package mainimport \\\\\\\"fmt\\\\\\\"// SayHelloTo takes a string and prints it to the console.func SayHelloTo(s string) {\\\\tfmt.Println(\\\\\\\"Hello \\\\\\\" + s + \\\\\\\"!\\\\\\\")}// The main function just invokes SayHelloTo with a stringfunc main() {\\\\tSayHelloTo(\\\\\\\"Tom\\\\\\\")}Run / Build / InstallTo run the above program, just change into the hello folder and run go run hello.go which should result in the following output:ttor$ go run hello.goHello Tom!Now if I wanted to create a binary and install it, I could simply run go build hello.go which leaves me with the executable file. To install it, into Go’s bin directory (GOBIN) I use: go install hello.goAfter that, I can run hello and again get the above output:ttor$ helloHello Tom!Well that was my quick introduction to Go, we’ll soon see if there’s more to come…Nice weekend!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/get-going-with-go/\\\"},{  \\\"id\\\": \\\"post-get-started-with-azure-arm-templates\\\",  \\\"title\\\": \\\"Get started with Azure ARM Templates\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\",\\\"RM\\\"],  \\\"content\\\": \\\"To start with the deployment using Azure ARM Templates is quite easy. A first step can be to deploy an Azure SQL Database. But let’s start with a bit of background information:TemplatesWe can create a template (in JSON format) that defines and configures the Azure solution. When we create a solution from the portal, the solution automatically includes a deployment template. So, we don’t have to create our template from scratch but we can download the templates for the existing deployments. To get the templates open the “Resource Group” section in the Azure Portal and click on DeploymentsClick on “View Templates”What we can see now is the Template and Parameter file. When we start a new deployment, we have to define parameters for the resource template, these needs to be entered in before the deployment can start.You can find other ARM templates on the following Microsoft WebsiteDeploymentWe are going to deploy a new SQL Database, so my template looks like this:{    \\\\\\\"$schema\\\\\\\": \\\\\\\"http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#\\\\\\\",    \\\\\\\"contentVersion\\\\\\\": \\\\\\\"1.0.0.0\\\\\\\",    \\\\\\\"parameters\\\\\\\": {        \\\\\\\"collation\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"databaseName\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"edition\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"requestedServiceObjectiveId\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"maxSizeBytes\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"serverName\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"serverLocation\\\\\\\": {            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"diagnosticStorageAccountId\\\\\\\": {            \\\\\\\"defaultValue\\\\\\\": \\\\\\\"\\\\\\\",            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"diagnosticsTemplate\\\\\\\": {            \\\\\\\"defaultValue\\\\\\\": \\\\\\\"\\\\\\\",            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        },        \\\\\\\"sampleName\\\\\\\": {            \\\\\\\"defaultValue\\\\\\\": \\\\\\\"\\\\\\\",            \\\\\\\"type\\\\\\\": \\\\\\\"String\\\\\\\"        }    },    \\\\\\\"resources\\\\\\\": [        {            \\\\\\\"type\\\\\\\": \\\\\\\"Microsoft.Sql/servers/databases\\\\\\\",            \\\\\\\"name\\\\\\\": \\\\\\\"[concat(parameters('serverName'), '/', parameters('databaseName'))]\\\\\\\",            \\\\\\\"apiVersion\\\\\\\": \\\\\\\"2014-04-01-preview\\\\\\\",            \\\\\\\"location\\\\\\\": \\\\\\\"[parameters('serverLocation')]\\\\\\\",            \\\\\\\"properties\\\\\\\": {                \\\\\\\"collation\\\\\\\": \\\\\\\"[parameters('collation')]\\\\\\\",                \\\\\\\"edition\\\\\\\": \\\\\\\"[parameters('edition')]\\\\\\\",                \\\\\\\"maxSizeBytes\\\\\\\": \\\\\\\"[parameters('maxSizeBytes')]\\\\\\\",                \\\\\\\"requestedServiceObjectiveId\\\\\\\": \\\\\\\"[parameters('requestedServiceObjectiveId')]\\\\\\\",                \\\\\\\"sampleName\\\\\\\": \\\\\\\"[parameters('sampleName')]\\\\\\\"            }        }    ]}Let’s focus on the parameter file that specifies the deployment. It should look like this:{    \\\\\\\"$schema\\\\\\\": \\\\\\\"https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#\\\\\\\",    \\\\\\\"contentVersion\\\\\\\": \\\\\\\"1.0.0.0\\\\\\\",    \\\\\\\"parameters\\\\\\\": {        \\\\\\\"collation\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"SQL_Latin1_General_CP1_CI_AS\\\\\\\"        },        \\\\\\\"databaseName\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"Database3\\\\\\\"        },        \\\\\\\"edition\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"Basic\\\\\\\"        },        \\\\\\\"requestedServiceObjectiveId\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"dd6d99bb-f193-4ec1-86f2-4fe4rscbc49c\\\\\\\"        },        \\\\\\\"maxSizeBytes\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"2147483648\\\\\\\"        },        \\\\\\\"serverName\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"sqllogicalz2010\\\\\\\"        },        \\\\\\\"serverLocation\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"westeurope\\\\\\\"        },        \\\\\\\"diagnosticStorageAccountId\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\"        },        \\\\\\\"diagnosticsTemplate\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"\\\\\\\"        },        \\\\\\\"sampleName\\\\\\\": {            \\\\\\\"value\\\\\\\": \\\\\\\"AdventureWorksLT\\\\\\\"        }    }}I modified that Database Name because I want my new Database to be called “Database3”. Lets save both files to the local machine (or GitHub if you want). Name the template file NewSQLDatabase.json and the parameter file Parameter-NewSQLDatabase.json.The Template and Parameter files are now ready for deployment. Lets fire up Powershell and push the change to Azure. First, we have to connect to the Azure Account and select our subscription# Connect to Azure RM AccountLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId c2a12a42-0179-*************With the “New-AzureRmResourceGroupDeployment” cmdlet we start the deployment process using our template and parameter file as attributes.# ARM Template SQL DatabaseNew-AzureRmResourceGroupDeployment -Name SQLDatabase -ResourceGroupName rg_Z2010 -TemplateFile \\\\\\\"F:\\\\\\\\Templates\\\\\\\\SQL Database\\\\\\\\NewSQLDatabase.json\\\\\\\" -TemplateParameterFile \\\\\\\"F:\\\\\\\\Parameters\\\\\\\\SQL Database\\\\\\\\Parameter-NewSQLDatabase.json\\\\\\\"After we executed the command we should see similar output and the Database is running on Azure :)Stay tuned for further postsDaniel\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/get-started-with-azure-arm-templates/\\\"},{  \\\"id\\\": \\\"post-disable-backup-protection-for-azure-vm\\\",  \\\"title\\\": \\\"Disable Azure Backup Protection for a VM with Azure PowerShell\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Azure\\\",\\\"RM\\\"],  \\\"content\\\": \\\"My Azure credits burn faster than expected :) So I decided to remove some VM’s and Backup that I used for a customer’s demonstration. Since I don’t use the Azure Portal for configuration anymore, I fired up Powershell and did the Job. With the following commands, I show you how to stop the Backup for a Virtual Machine and delete the associated Recovery Points.Disable and delete VM BackupLogin-AzureRmAccount# Select Azure RM SubscriptionSelect-AzureRmSubscription -SubscriptionId ***************$container = Get-AzureRmRecoveryServicesBackupContainer -Name VIRTUAL-MACHINE-NAME  -ContainerType AzureVM$BackupItem = Get-AzureRmRecoveryServicesBackupItem $container -WorkloadType AzureVM Disable-AzureRmRecoveryServicesBackupProtection -Item $BackupItem -RemoveRecoveryPointsI know you may think this is quite simple and why is this guy writing a post with only 3 lines of code.  It’s because Tom moved our blog to Git and this is my first blog post that I try to upload and don’t wanted to wait :)Greetings\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/disable-backup-protection-for-azure-vm/\\\"},{  \\\"id\\\": \\\"post-migrating-blogengine-to-github-pages-2\\\",  \\\"title\\\": \\\"Migrating from BlogEngine to GitHub Pages: Fixing the links\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"ntSystems\\\"],  \\\"content\\\": \\\"In this episode of our little series on migration we are having a look at the URL structure of Jekyll and some of the less visible stuff that was associated with the old ntSystems.All the existing URLs on our BlogEngine-based blog used both, upper- and lowercase letters, and had an filename extension of .aspx. Now Jekyll does not use filename extensions (or at least doesn’t display them) and it uses all lowercase letters in URLs.Additionally we moved from https-enabled to https-only and the usage of a www. hostname was not defined. So all of those URLs would have worked on the old blog:  http://ntsystems.it/CONTACT.aspx  https://ntsystems.it/contact.aspx  http://www.ntsystems.it/contact.aspx  …You see, it was a mess. On the current version of ntSystems, only the following URL will work:  https://ntsystems.it/contact/But what about existing links from social media, other blog posts, or where ever else, you ask? Well the solution is twofold. First, enter…CloudflareWe have been using Cloudflare for a while to easily enable IPv6 and and https even for our old blog. Now another feature, Page Rules, comes in very handy indeed. In fact a single rule is enough to get rid of the .aspx extensions:If the URL matches *ntsystems.it/*.aspx forward the request to https://ntsystems.it/$2 where $2 is the stuff that was matched by the second asterisk * in the matching pattern. Easy enough!Jekyll URL structureThe second part of getting URLs right is instructing Jekyll to make them the same as before, without .aspx. And it turns out, that’s not to hard, either:The following setting in our _config.yml file tells Jekyll to build all posts in the /post/ directory.permalink: /post/:titleThe title property was copied into the front matter by the script we used to migrate the posts. Quite ready, but not yet.We still have to deal with the uppercase/lowercase filenames in the URLs. We ended up using JekyllRedirectFrom to work around that. We just added the 'jekyll-redirect-from' gem to our Gemfile and used the migration script to add an uppercase version of the filename to the front matter like this:redirect_from: [\\\\\\\"/post/Azure-File-Services\\\\\\\", \\\\\\\"/post/azure-file-services\\\\\\\"]URLs. Check.RSSBlogEngine used a number of .axd scripts/handlers as endpoints for things like the RSS feed, the sitemap file, or a metaweblog extension. Obviously, the /syndication.axd URL does no longer work on Jekyll, a simple /feed.xml file is used instead.I tried various redirection methods but found that RSS clients (like The Old Reader) ignored them and the feed would go dead.After some testing I found that I could create a directory with the name of syndication.axd and simply put an index.html into it. Jekyll does not show the index.html in the URL, therefore the URL would still be /syndication.axd. I copied the content of feed.xml into the /syndication.axd/index.html and, voilá, the existing RSS link continued to work.SitemapThe URL of the sitemap.axd file is less important as it’s only used by search engines and not by users. So we just created a new sitemap.xml file and pointed the search engines to this new file. Additionally, we updated the Sitemap property in our robots.txt file.Well, and that’s it for today. Happy Halloween! :)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-blogengine-to-github-pages-2/\\\"},{  \\\"id\\\": \\\"post-introducing-tak\\\",  \\\"title\\\": \\\"Introducing: TAK\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Cloud\\\"],  \\\"content\\\": \\\"Over the years I did create, find, copy, paste, quite a few lines of PowerShell code. Some of which I’m turning into re-usable functions and collecting in a module, creatively called “Tom’s Admin Kit” or TAK. I hope you find it useful.I try to credit the sources for the stuff that I just copied off of the interwebs, even though I don’t actually remember all of them.PesterAs written before, Pester is  a unit testing framework for PowerShell code. So one can write simple tests to verify the code actually does, what it is supposed to do. Not all functions are covered by tests, yet, but I try to be better at that. The existing tests can be found in the GitHub repo for the module.CI&amp;D: GitHub and AppVeyorI read a lot about this continuous integration and delivery and I thought it would be nice to play with some of the involved tools myself. So I created a small-ish release pipeline/workflow for this module using GitHub, AppVeyor and the PowerShell Gallery. Here is how it works: When a new commit is pushed to GitHub, AppVeyor picks up the latest code and deploys it to a test machine. It then runs all the pester tests and, upon success, publishes the module to the PowerShell Gallery.The tests that should be run to verify the code, are defined in the appveyor.yml file in the GitHub repository.test_script:    - ps: |        $testResultsFile = \\\\\\\".\\\\\\\\TestsResults.xml\\\\\\\"        $res = Invoke-Pester -OutputFormat NUnitXml -OutputFile $testResultsFile -PassThru        (New-Object 'System.Net.WebClient').UploadFile(\\\\\\\"https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)\\\\\\\", (Resolve-Path $testResultsFile))        if ($res.FailedCount -gt 0) {            throw \\\\\\\"$($res.FailedCount) tests failed.\\\\\\\"        }Just like the deployment task, that will be invoked if the tests passed.deploy_script:  - ps: |      Install-PackageProvider -Name NuGet -Force      $manifest = Join-Path -Path $pwd -ChildPath \\\\\\\"TAK\\\\\\\\tak.psd1\\\\\\\"      (Get-Content $manifest -Raw) -Replace(\\\\\\\"1\\\\\\\\.0\\\\\\\\.0\\\\\\\\.\\\\\\\\d{1}\\\\\\\", $env:APPVEYOR_BUILD_VERSION) | Out-File $manifest      Publish-Module -NugetApiKey $env:psgkey -Path ($PublishPath = Join-Path -Path $pwd -ChildPath TAK) -Confirm:$falseHelpMost functions include comment-based help and a HelpUri that links to the online version of the help article. Just add the -Online parameter when getting help, like in the following example:Get-Help Test-TCPConnection -OnlineA full list of available help files can be found here: TAKDownload &amp; Source forThe Module is available on the PowerShell Gallery, you can install or download it using the following commands:Install- -Name  -Scope CurrentUserSave- -Name  -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler    More information about the PowerShell Gallery can be found in the FAQGive it a try, and, if you spot a bug or have an idea for improvement, just create in a pull request.So long,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/introducing-tak/\\\"},{  \\\"id\\\": \\\"post-azure-stack-poc-tp2-on-vmware\\\",  \\\"title\\\": \\\"AzureStack POC TP2 on VMware\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"Azure\\\"],  \\\"content\\\": \\\"I’ve been trying to make the Azure Stack Proof-of-Concept (Preview 2) run on VMware and here is what I found. First of all, the documentation to set this stuff up can be found here: Deploy Azure Stack POCPrepare VMAs I currently run VMware in my lab and didn’t want to re-install the physical server, I tried to get the Azure Stack up and running in a VMware VM. Following the recommendation for sizing, I created a VM with 100GB of RAM, 24 vCPUs, one vNIC and 5 hard disks with 200GB each. The many vCPUs are actually not necessary, as the hardware check does fail even though enough cores should be available. More on that later.Additionally, I did enable the “Hardware virtualization” feature in the VM’s CPU settings. You can do this using the vSphere Web Client or use the following quick-and-dirty PowerCLI function for it:As the Virtual Machine will run Hyper-V and some guest VMs, we have to disable the security features on the virtual Port Group where the VM is connected to:Get-VDSecurityPolicy -VDPortgroup VLAN95 |Set-VDSecurityPolicy -AllowPromiscuous:$true -MacChanges:$true -ForgedTransmits:$true  Note in the above example I’m using a distributed virtual Port Group. For a standard virtual Port Group use Set-SecurityPolicy.Prepare WindowsThe next step is to install Windows and the VMware tools, download the Azure Stack TP2 support files (see documentation link above) and copy the CloudBuilder.vhdx file to the root of the C drive of our VM. Then I started .\\\\\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath and was confronted with an error, stating “The server is currently already booted from a virtual hard disk…”Fortunatelly, the fix is easy: Open the PrepareBootFromVHD.ps1 file and find the following section:if ((get-disk | where {$_.isboot -eq $true}).Model -match 'Virtual Disk')     {    Write-Host \\\\\\\"The server is currently already booted from a virtual hard disk, to boot the server from the CloudBuilder.vhdx you will need to run this script on an Operating System that is installed on the physical disk of this server.\\\\\\\"    Exit    }Now either remove the section or just remove the Exit. That way, it will still display a warning but no longer stop the execution of the script.Again, start .\\\\\\\\PrepareBootFromVHD.ps1 -CloudBuilderDiskPath which should now succeed and prompt for a reboot of the machine.Install the CloudThe VM restarts and boots from the CloudBuilder.vhdx file with the typical OOBE asking for an admin password and the product key. Once set, startup continues and we can log-in to the VM. At this point, we’ll have to install the VMware tools again. The next step is to initialize the additional hard disks for the machine. The disks must be “empty” so do not create any volumes. I just run Get-Disk | Initialize-Disk and move on.Now the documentation wants us to open an administrative PowerShell console, change into the C:\\\\\\\\CloudDeployment\\\\\\\\Configuration folder and run the installation script. As a few checks are built-in to prevent this kind of setup (and verify hardware resources) this will fail with the following error message:2016-10-13 08:03:58 Error    Task: Invocation of interface 'Validate' of role 'Cloud\\\\\\\\Infrastructure\\\\\\\\BareMetal' failed: Function 'Test-BareMetalRole' in module 'Roles\\\\\\\\PhysicalMachines\\\\\\\\PhysicalMachines.psd1' raised an exception:One or more validation test failed for Role 'BareMetal' on machine 'WIN-MUTSIQJMO43'For detailed test results look at file '\\\\\\\\\\\\\\\\WIN-MUTSIQJMO43\\\\\\\\C$\\\\\\\\CloudDeployment\\\\\\\\Logs\\\\\\\\Tests\\\\\\\\TestResults_WIN-MUTSIQJMO43_BareMetal_2016-10-13-08-03-44.xml'Test Failed: Validate that the computer 'WIN-MUTSIQJMO43' is a physical machine.Test Failed: Validate that at least 12 cores are available in computer WIN-MUTSIQJMO43.At C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\Common\\\\\\\\RoleHelpers.psm1:875.+         Trace-Error $messageat Trace-Error, C:\\\\\\\\CloudDeployment\\\\\\\\Common\\\\\\\\Tracer.psm1: line 52at Start-Test, C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\Common\\\\\\\\RoleHelpers.psm1: line 875at Test-BareMetalRole, C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\PhysicalMachines\\\\\\\\TestPhysicalMachines.psm1: line 86at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 08:03:58 Verbose  Step: Status of step '(DEP) Validate Physical Machines' is 'Error'.So the two tests that failed use the following CIM Instances (WMI) to query information about the host system: Win32_ComputerSystem, Win32_Processor Now even though I did configure 24 vCPUs for my VM, the NumberOfEnabledCore attribute of Win32_Processor shows a value of “0”.Here too, there’s an easy fix: Find the BareMetal.Tests.ps1 file in the C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\PhysicalMachines\\\\\\\\Tests directory and make the following tests pass:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        $physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        ($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}Again, we could just remove the actual test (the expression inside the It {} statement) or make it a comment or modify the code to make it pass. I ended up with the following, slight modification:# Validate this is not a virtual machine.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestNotVirtualMachine -f @($physicalMachine.ComputerName)) `    {        #$physicalMachine.IsVirtualMachine | Should Be $false    }}...# Validate the number of cores on each of the machines meets the required minimum.foreach ($physicalMachine in $physicalMachines){    It ($BareMetalLocalizedStrings.TestMinimumNumberOfCores -f @($minimumNumberOfCoresPerMachine.ToString(), $physicalMachine.ComputerName)) `    {        #($physicalMachine.Processors.NumberOfEnabledCores | Measure-Object -Sum).Sum | Should Not BeLessThan $minimumNumberOfCoresPerMachine    }}By the way, you’ll see that this script is signed, so in order to make it run, remove the signature and save the script.Install the Cloud #2Now we can go ahead and invoke the install script to actually install Azure Stack inside the virtual machine. As there is no DHCP Server available in the network into which I’m deploying, I specify a few options when invoking the installation script:$installParams = @{    NatIPv4Subnet = \\\\\\\"172.16.8.0/24\\\\\\\";    NatIPv4Address = \\\\\\\"172.16.8.212\\\\\\\";    NatIPv4DefaultGateway = \\\\\\\"172.16.8.254\\\\\\\";    EnvironmentDNS = \\\\\\\"172.16.8.120\\\\\\\";}.\\\\\\\\InstallAzureStackPOC.ps1 @installParamsNote that this script has a rerun parameter, so if execution failes, it can be invoked again and will continue where it left off: .\\\\\\\\InstallAzureStackPOC.ps1 -RerunNote that at some point of the installation, the VM is rebooted and logged in automatically to the account “azurestack\\\\\\\\azurestackadmin”. From that moment on, all installation related tasks (such as a -Rerun) should be performed using this account.I did stumble over another prolem, installation stopped with the following error:2016-10-13 13:48:18 Error    Task: Invocation of interface 'Configure' of role 'Cloud\\\\\\\\Fabric\\\\\\\\NC' failed: Function 'ConfigureNC' in module 'Roles\\\\\\\\NC\\\\\\\\NC.psd1' raised an exception:Task failed with the following error: 'The WinRM client sent a request to the remote WS-Management service and was notified that the request size exceeded the configured MaxEnvelopeSize quota.'.At C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\Common\\\\\\\\RoleHelpers.psm1:83.+         $status.ErrorMessageat Trace-Error, C:\\\\\\\\CloudDeployment\\\\\\\\Common\\\\\\\\Tracer.psm1: line 52at Start-PSScriptUsingTask, C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\Common\\\\\\\\RoleHelpers.psm1: line 83at ConfigureNC, C:\\\\\\\\CloudDeployment\\\\\\\\Roles\\\\\\\\NC\\\\\\\\NC.psm1: line 620at &lt;ScriptBlock&gt;, &lt;No file&gt;: line 182016-10-13 13:48:18 Verbose  Step: Status of step '(NET) Configure NC on VMs' is 'Error'.Apparently the default value of 500 for MaxEnvelopeSize is not enough, I used the following command to increase the size to 8192:winrm set winrm/config '@{MaxEnvelopeSizekb=\\\\\\\"8192\\\\\\\"}'ResultOnce the InstallAzureStackPOC.ps1 script finished running, there will be 13 VMs running on our “Host VM”, consuming about 52GB of RAM:Get-VMName         State   CPUUsage(%) MemoryAssigned(M) Uptime           Status             Version----         -----   ----------- ----------------- ------           ------             -------MAS-ACS01    Running 0           8192              00:46:18.2560000 Operating normally 8.0MAS-ADFS01   Running 0           1164              01:33:39.1820000 Operating normally 8.0MAS-ASql01   Running 0           4096              01:00:02.6710000 Operating normally 8.0MAS-BGPNAT01 Running 0           1460              01:46:26.7640000 Operating normally 8.0MAS-CA01     Running 0           844               01:32:56.9940000 Operating normally 8.0MAS-Con01    Running 0           4096              01:39:16.7620000 Operating normally 8.0MAS-DC01     Running 0           4096              02:09:00.7000000 Operating normally 8.0MAS-Gwy01    Running 0           4096              00:54:18.0770000 Operating normally 8.0MAS-NC01     Running 0           2048              01:19:39.9240000 Operating normally 8.0MAS-SLB01    Running 0           4096              01:04:11.8220000 Operating normally 8.0MAS-SUS01    Running 0           2048              01:37:49.5430000 Operating normally 8.0MAS-WAS01    Running 1           8192              01:36:31.2300000 Operating normally 8.0MAS-Xrp01    Running 0           8192              01:34:04.3710000 Operating normally 8.0If you encounter problems during installation, make sure to check the summary.log.xml file in C:\\\\\\\\CloudDeployment\\\\\\\\Logs.To actually log in to the Azure Stack Portal, open the MAS-Con01 VM’s conole and find a link to the portal on the desktop:Ok, so with that: Have fun with Azure Stack and happy hacking ;)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-stack-poc-tp2-on-vmware/\\\"},{  \\\"id\\\": \\\"post-migrating-blogengine-to-github-pages-1\\\",  \\\"title\\\": \\\"Migrating from BlogEngine to GitHub Pages: BlogML to Markdown\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Jekyll\\\",\\\"ntSystems\\\"],  \\\"content\\\": \\\"As promised here, I’m sharing the first part of our migration process from BlogEngine to GitHub Pages. A major part is, obviously, the migration of the content of the blog itself.BlogMLAccording to Wikipedia “BlogML is an open format derived from XML to store and restore the content of a blog.” Luckily, BlogEngine has an export option that exports all content (posts and pages) to a XML file.  Note: The XML file contains only the text content. So images, files and other assets have to be migrated separately.I downloaded the BlogML file and started to look around for solutions to somehow convert the stuff to something Jekyll could use. After some googling, I found this blog describing something very similar. Apparently he was using a ruby script to create a properly formatted markdown (.md) file for each post in the BlogML file. Thankfully, the script could be found in his GitHub Repo.The script was almost perfectly suited for our purposes after some small modifications I started it like so:$ ruby -r './blogml.rb' -e 'Jekyll::BlogML.process(\\\\\\\"BlogML.xml\\\\\\\")'Note that in my case the BlogML.xml file is located in the same directory as the script and a new directory named “_posts” is created in the same path. Any existing directory with the same name will be deleted.The modified version of the script is available here.WritingOnce the posts (and the rest) was migrated, one has to start writing new stuff. Posts are written in plain text with markdown formatting so no super fancy editor is required and I’m getting along well with VS Code. I’m using the “Spelling and Grammar Checker” extension hoping it catches to most obvious typos ;)Stay tuned for more.Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-blogengine-to-github-pages-1/\\\"},{  \\\"id\\\": \\\"post-welcome-to-the-all-new-ntsystems\\\",  \\\"title\\\": \\\"Welcome to our new blog!\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Update\\\",\\\"Jekyll\\\",\\\"GitHub\\\"],  \\\"content\\\": \\\"This site has been running on Azure Web Sites for some time. As we are doing this for fun and are not making any money with the site (see any ad?) we had to use the “Shared” pricing tier which was economically acceptable but from a performance and feature point-of-view, well, not great. We used Cloudflare to get some caching and enable stuff like https and IPv6 for the site and it was OK :) Then came……JekyllRecently I started publishing some of the PowerShell code I’m writing to GitHub and while browsing around, I stumbled over a static page generator, called Jekyll. I was quite impressed and started hacking around for a little while… after a couple of train rides I was happy with the result and decided to give it a go. So, that’s it:  Welcome to our new home on GitHub!As of 2016-10-02 we moved to Jekyll. The current version of our little blog is hosted on GitHub Pages and uses a slightly modified version of the default Minima theme for Jekyll.ToolsAs this is now, essentially, a static website, we have to use some tools to make it as awesome as possible:  Cloudflare: Security, IPv6, TLSv3, Page Rules… and more awesomeness  Algolia: Search as a Service  lunr.js: Full-text search in your browser  Favicon Generator  Shariff: Share without compromising privacy  Disqus: CommentsWork in progressThis migration is a work in progress and therefore not all features the good, old ntsystems.it are available as of today. I intend publishing a few lines about the migration itself, and keeping it up-to-date as we move along and build new features into the site.We do hope you enjoy our new look. It is all open source, so if you are interested in how we do stuff, just check out our repoOh and if you find any errors you’d wish to correct, please just send us a pull-request :-)So long,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/welcome-to-the-all-new-ntsystems/\\\"},{  \\\"id\\\": \\\"post-powershell-on-macos\\\",  \\\"title\\\": \\\"PowerShell on macOS\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\",\\\"macOS\\\",\\\"GitHub\\\"],  \\\"content\\\": \\\"Just sharing some quick notes on how to run PowerShell (and dotnet core) on macOS Sierra.OpensslPowerShell requires dotnet core which, in turn, requires openssl to be installed (and linked correctly). Using brew, one can easily install openssl, if it is already installed, use brew list to show the installation location:$ brew install openssl$ brew list openssl.../usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib/usr/local/Cellar/openssl/1.0.2j/lib/libssl.1.0.0.dylib...As of 2016-10 it is required to create symlinks for the above listed libraries (libcrypto, libssl) at /usr/local/lib, use ln -s like so:$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/lib$ ln -s /usr/local/Cellar/openssl/1.0.2j/lib/libcrypto.1.0.0.dylib /usr/local/libNote: Make sure that the path used in the link (ln) actually matches the one given by the `brew list` output..NET CoreHead over to https://www.microsoft.com/net/core#macos and download a copy of the installer. Installation is straight-forward, just double-click the .pkg and follow instructions.After installation, verify that dotnet works by creating the “Hello World” app as suggested on the download site:$ mkdir testapp$ cd testapp$ dotnet newCreated new C# project in /Users/tom/testapp.$ dotnet restore$ dotnet runPowerShellGet the latest .pkg at https://github.com/PowerShell/PowerShell/releases. Again, installation is simple, just double-click the .pkg and follow instructions. To verify installation, open a terminal and run powershell`$ powershellPowerShellCopyright (C) 2016 Microsoft Corporation. All rights reserved.PS /Users/tom&gt; $PSVersionTableName                           Value----                           -----PSVersion                      6.0.0-alphaPSEdition                      CorePSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}BuildVersion                   3.0.0.0GitCommitId                    v6.0.0-alpha.10CLRVersionWSManStackVersion              3.0PSRemotingProtocolVersion      2.3SerializationVersion           1.1.0.1Note: It's still early days, the above procedure might be simplified soon Enjoy :)\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-on-macos/\\\"},{  \\\"id\\\": \\\"post-deploying-labs-using-azure-resource-manager\\\",  \\\"title\\\": \\\"Deploying Labs using Azure Resource Manager\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Azure\\\",\\\"Cisco\\\"],  \\\"content\\\": \\\"I did a demo of Cisco CSR 1000v on Azure the other day and the easy deployment of a small test-network was part of that demo. I really enjoyed deploying the lab using ARM templates, so why not share the love?So what’s ARM?Azure Resource Manager is the “new” deployment model for all kinds of resources within Azure. The great thing about it is, that it works with template and parameter files, so we can easily prepare an environment and deploy it over and over again, with either the same or different parameters.CSR 1000v?That’s what the customer wanted to see and why I got do a demo on Azure in the first place. Cisco provides images in the Azure Marketplace (https://azure.microsoft.com/en-us/marketplace/) so that customers can run a fully featured IOS XE router in the cloud.The Lab networkSo as mentioned above, i wanted to demo the setup of a quick lab along with the CSR, having only the router and no endpoints to connect to, doesn’t make to much sense. I used the Azure Resource Manager to create a new resource group and a new virtual network with two subnets. One of which would be CSR’s “public” facing subnet (with a Public IP associated) the other one was my “backend” network for cloud workloads (without Public IPs). A Nano Server was quick to deploy and provided the “backend” for my lab.The templateI did use Visual Studio to modify and adapt the ARM template to my needs, but really any text editor/ISE can be used.The template consists of two files, the template itself and a file for parameters. In my case, I did use the parameter file just for the passwords of the CSR and the Nano Server, the other parameters are assigned directly in the template file. There is room for improvement in this case, as the template would be more flexible if it had less “hardcoded” information.The template specifies how the virtual network, subnets and eventually the CSR and Nano Servers should be deployed.DeployOnce ready, the template can be be deployed to any Azure Subscription using a number of methods: One can deploy directly from Visual Studio or PowerShell or even from the cross-platform CLI on a Mac.Using PowerShellFirst, we have to create a Resource Group to which the template will be deployed:$RGName = 'rg-tomt-lab' $RGLocation = 'westeurope' New-AzureRmResourceGroup -Name $RGName -Location $RGLocation Then we prepare a variable which specifies the resource group, the template file and the parameters file.$Params = @{     'ResourceGroupName' = $RGName    'TemplateFile' = 'C:\\\\\\\\azure\\\\\\\\azure_arm_csr_nano_template.json'    'TemplateParameterFile' = 'C:\\\\\\\\azure\\\\\\\\azure_arm_csr_nano_parameters.json' }Using the Test-* cmdlet we can simulate deployment and verify that all checks out:Test-AzureRmResourceGroupDeployment @Params -VerboseAnd if everything looks good, we can go ahead and finally create the deployment:New-AzureRmResourceGroupDeployment @Params -VerboseUsing the xPlat CLIAlmost the same thing can be be done using the cross-platform CLI, which is what I use on my Mac.Create a Resource Group:azure group create -n rg-csr-lab -l \\\\\\\"West Europe\\\\\\\"Deploy the templateazure group deployment create -f azure_arm_csr_nano_template.json -e azure_arm_csr_nano_parameters.json -g rg-csr-lab -n CSR01Find the template, parameters file and more detailed information for deployment at my GitHub: https://github.com/tomtorgglerSo, once the template is prepared, deployment is just a piece of cake! That’s how deploying labs just got a lot quicker, don’t you think?Enjoy,— Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/deploying-labs-using-azure-resource-manager/\\\"},{  \\\"id\\\": \\\"post-veeam-direct-restore-to-azure\\\",  \\\"title\\\": \\\"Veeam direct restore to Azure\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\",\\\"Veeam\\\"],  \\\"content\\\": \\\"Today I tried to restore a Veeam backed up VM directory to Microsoft Azure. Veeam gives you a free piece of software to get this done quickly with few easy steps. Lets jump into the configuration First of all we deploy the Veeam Direct Restore to Azure preconfigured VM from the Azure marketplaceWhen the VM starts up, we connect and have to specify some configuration parameter. We click on “Configuration”Veeam asks us to specify the configuration File for the subscriptionWe can download the configuration file with the following lines of codeNow the Veeam Part in Azure is configured and ready to convert Veeam Backup files to Azure virtual machines. We create a backup of a machine and upload the files to the Veeam virtual machine in Azure. After the files are available we start the restore process and specify the BackupFile:We can choose which restore point we want to restoreAfter that we can select the region and size of the virtual machine&nbsp;After we specified the Network and storage account the restore begins&nbsp;After few minutes the machine is restored from a Veeam backup and available in Azure. &nbsp;With Veeam Version 9.5 a direct restore to Azure with API and without a convert VM is also possible. Stay tuned for Version 9.5Greetingdn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/veeam-direct-restore-to-azure/\\\"},{  \\\"id\\\": \\\"post-lync-sdn-api-and-cisco-wlc\\\",  \\\"title\\\": \\\"Lync SDN API and Cisco WLC\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"Cisco\\\",\\\"en\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Some days ago I had the chance to test Cisco’s Wireless LAN Controllers with the Lync Software Defined Networking (SDN) API.For those who don’t know what SDN API is, a quick overview: You can basically think of the SDN API as a little add-on, that can be installed on Lync Front End Servers, and that allows Lync to “let the network know” what’s going on from it’s perspective. The SDN API is made up of two components, the Lync Dialog Listener (LDL) and the Lync SDN Manager (LSM). The LDL component is installed on each Front End Server, and sends information to the LSM. The LSM forwards information to a so called SDN Controller, which, in our case, is the Cisco WLC.More information and the API documentation is available on the MSDN: https://msdn.microsoft.com/en-us/library/office/dn387071.aspxThe WLC SideThe SDN Controller has to accept and process information coming from the LSM, Cisco has built this  functionality into it’s Wireless LAN Controller software from 7.6. We used 8.2 in this example. First we need to define a port, protocol, and enable the “Lync Server” option globally. This can be done using the “Lync Server” option in the “Wireless” tab:Now that the WLC listens for information, we’ll have to tell it, what to do with. Using the “WLANs” tab, we created a new SSID, enabled “Lync Server” and selected the appropriate QoS policy for each type of traffic:A quick excerpt from show wlan shows the QoS settings:Local Policy---------------Policy Name                                       Priority---------------                                   --------  Lync State ...................................... EnabledAudio QoS Policy................................. PlatinumVideo QoS Policy................................. GoldApp-Share QoS Policy............................. SilverFile Transfer QoS Policy......................... BronzeThe Lync SideMeanwhile, we’ve installed the Lync SDN Manager on a dedicated server, as it’s not recommended to run it on the Front Ends (and it didn’t work either). The LSM is configured through a configuration file SDNManager.exe.config, which can be found in the LSM’s installation directory: C:\\\\\\\\Program Files\\\\\\\\Microsoft Lync Server\\\\\\\\Microsoft Lync SDN API\\\\\\\\The configuration is quite simple, the value submituri specifies the WLCs IP Address and Port, additionally, the value for backwardcompatibility must be set to true:&lt;appSettings&gt;    &lt;add key=\\\\\\\"submituri\\\\\\\" value=\\\\\\\"http://172.25.81.105:15120\\\\\\\"/&gt;    &lt;add key=\\\\\\\"backwardcompatibility\\\\\\\" value=\\\\\\\"true\\\\\\\"/&gt;With the LSM configured, we installed the Dialog Listener on the Front End Server. During setup, we are asked for the submituri so we don’t even have to edit the config file in this case. Note that the submit URI for the LDL points to the LSM. The configuration file for the LDL can be found here: C:\\\\\\\\Program Files\\\\\\\\Microsoft Lync Server\\\\\\\\Microsoft Lync SDN API\\\\\\\\LyncDialogListener.exe.config:&lt;appSettings&gt;  &lt;add key=\\\\\\\"submituri\\\\\\\" value=\\\\\\\"http://srv01.ccielab.local:9333/LDL/CallInfo\\\\\\\"/&gt;The Client SideNow we were ready for some testing and connected our clients to the new SSID. After signing into Lync and making some calls, we were able to verify that they appeared in the WLC’s “Monitoring” tab.Using Wireshark, we were able to verify the DSCP values for incoming packets from the WLAN:Last but not least, we had a look at the POST requests from the LSM to the WLC. As we are not using https, they are sent in clear-text and can be analyzed using Wireshark’s “Follow TCP stream” feature:POST /LDL/CallInfo HTTP/1.1Content-Type: text/xmlAccept: text/xmlHost: srv01.ccielab.local:9333Content-Length: 2823Expect: 100-continue&lt;/p&gt;HTTP/1.1 100 Continue&lt;LyncDiagnostics Version=\\\\\\\"1.0\\\\\\\"&gt;  &lt;ConnectionInfo&gt;    &lt;FrontEnd&gt;s4b&lt;/FrontEnd&gt;    &lt;CallId&gt;8a5ee59e7f24cc47a8a5e5ef5408164b&lt;/CallId&gt;    &lt;CSEQ&gt;3&lt;/CSEQ&gt;    &lt;ConversationId&gt;AdHItACZ40eYIzsElkmUXxEpJfdLYA==&lt;/ConversationId&gt;    &lt;TimeStamp&gt;2016-06-17T16:36:16.0502033Z&lt;/TimeStamp&gt;  &lt;/ConnectionInfo&gt;  &lt;StartOrUpdate Type=\\\\\\\"audio\\\\\\\"&gt;    &lt;From&gt;      &lt;Id&gt;1c36b0157b&lt;/Id&gt;      &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;      &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;      &lt;IP&gt;172.25.81.237&lt;/IP&gt;      &lt;Port&gt;21448&lt;/Port&gt;    &lt;/From&gt;    &lt;To&gt;      &lt;Id&gt;94b8a54712&lt;/Id&gt;      &lt;EPId&gt;213808492931&lt;/EPId&gt;      &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;      &lt;Contact&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local;      opaque=user:epid:vaj8zwoldfc0zkl6hghhoaaa;gruu&lt;/Contact&gt;      &lt;IP&gt;172.25.81.238&lt;/IP&gt;      &lt;Port&gt;11616&lt;/Port&gt;    &lt;/To&gt;    &lt;Properties&gt;      &lt;Protocol&gt;UDP&lt;/Protocol&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"SIREN/16000\\\\\\\"&gt;        &lt;Low&gt;52600&lt;/Low&gt;        &lt;High&gt;68600&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"PCMU/8000\\\\\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"PCMA/8000\\\\\\\"&gt;        &lt;Low&gt;97000&lt;/Low&gt;        &lt;High&gt;161000&lt;/High&gt;      &lt;/EstimatedBandwidth&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"RED/8000\\\\\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"CN/8000\\\\\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"CN/16000\\\\\\\" /&gt;      &lt;EstimatedBandwidth Codec=\\\\\\\"telephone-event/8000\\\\\\\" /&gt;    &lt;/Properties&gt;  &lt;/StartOrUpdate&gt;…&lt;StartOrUpdate Type=\\\\\\\"video\\\\\\\"&gt;  &lt;From&gt;    &lt;Id&gt;94b8a54712&lt;/Id&gt;    &lt;EPId&gt;213808492931&lt;/EPId&gt;    &lt;URI&gt;sip:AA6B09353F1F13116DC23FFDDB2A407F@ccielab.local&lt;/URI&gt;    &lt;IP&gt;172.25.81.238&lt;/IP&gt;    &lt;Port&gt;15150&lt;/Port&gt;  &lt;/From&gt;  &lt;To&gt;    &lt;Id&gt;1c36b0157b&lt;/Id&gt;    &lt;EPId&gt;591fcf6a94&lt;/EPId&gt;    &lt;URI&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local&lt;/URI&gt;    &lt;Contact&gt;sip:9EDEEC6DC6AD3929EF68B672BCC8C2BB@ccielab.local;    opaque=user:epid:a_6tcapa01gtycf5ts8qnqaa;gruu&lt;/Contact&gt;    &lt;IP&gt;172.25.81.237&lt;/IP&gt;    &lt;Port&gt;6490&lt;/Port&gt;  &lt;/To&gt;  &lt;Properties&gt;    &lt;Protocol&gt;UDP&lt;/Protocol&gt;    &lt;EstimatedBandwidth Codec=\\\\\\\"x-rtvc1/90000\\\\\\\"&gt;      &lt;Low&gt;460000&lt;/Low&gt;      &lt;High&gt;2510000&lt;/High&gt;    &lt;/EstimatedBandwidth&gt;  &lt;/Properties&gt;&lt;/StartOrUpdate&gt;As you can see, the LSM uses simple http POST requests to send information to a network controller. The network controller just has to “listen” for such data and act on it.This concludes our journey into the wireless network for today, hope you enjoyed it as much as I did :)Many thanks to my colleague and fellow call-quality-optimizer KD!Cheers,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-sdn-api-and-cisco-wlc/\\\"},{  \\\"id\\\": \\\"post-azure-backup-part-three\\\",  \\\"title\\\": \\\"Azure Backup - Part Three\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\"],  \\\"content\\\": \\\"In my previous posts I gave you an overview of Azure Backup und explained the “Direct Backup Azure VM to Backup Vault” solution a bit in detail. Lets now focus on the Azure Backup Server option which we can backup Files and Applications like ActiveDirectory, SQL, Sharepoint, Exchange and Hyper-V. InstallationFirst of all you have to access the Backup vault and download the Microsoft Azure Backup Agent.Select a server in your organization that is domain joined where you want to install the Backup software. Before the server uploads the data to the backup vault it saves at least one copy to a local drive. Give the server an empty volume with some space.At the end you pair the server with our backup vault with a vault credential file. The file can be downloaded from the backup vault. Specify a Passphrase to encrypt your backups.The server is now registered in visible in the backup vault.Prerequisites and a more detailed description can be found here: https://azure.microsoft.com/en-us/documentation/articles/backup-azure-microsoft-azure-backup/Backup planThe next step is to define a Backup plan for the servers we want to protect. This task is pretty straight forward, I explain only the most important parts:We specify Disk and online protection. Disk protection represents the short term and online the long term protection.We specify how much restore points we keep on local disk for short term protectionNext step is to define the online Backup schedule and retention policy. In this example we configure the schedule to upload restore points daily at 09:00 PM.&nbsp;Simple restoreThe Backup runs now everyday and uploads the restore point to the backup vault. If we want to restore data we can see where the server recovers them from:&nbsp;Full restoreLets assume we backup our whole infrastructure with the Backup Server and upload the restore points to Azure. The local infrastructure isn’t available due to fire / server damage and we cannot access the backup server (and short term backups) anymore. All of our backups are in the cloud and we want to restore the whole infrastructure.It's a bit more complicated: To get access to the Azure Backups we have to install a Backup Server. To install the Backup Server we need a machine that's domain joined. Because of this prerequisites we have to follow some additional steps to recover the whole environment.Here are the steps we have to do to get the full restore done: Install a new server Create a temporary domain and make the server its domain controller Install a second new server Join the server to the temporary domain Install Azure Backup Server on the second server Join the Backup Server to the Azure Backup vault. We have now access to the restore points Restore the system state backup from a domain controller to a network location Throw away everything except the restored backup Install a new server, this will be the domain controller Restore the system state backup on the new domain controller Verify that the restored AD is working properly Install a new server as the Azure Backup Server Join the new Azure Backup Server to the restored domain Install Azure Backup Server and connect it to the Azure Backup vault Restore the DPM database Start restoring everything else according to your DR plan&lt;/ul&gt; Greetings\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-backup-part-three/\\\"},{  \\\"id\\\": \\\"post-lost-found-nano-server-github-psgallery-pester\\\",  \\\"title\\\": \\\"lost & found: Nano Server, GitHub, PSGallery, Pester\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"Nano Server status updateIt would be about time for the next post in the series about hyper-converged-infrastructure with Nano Server. Over the past few days I deployed Nano on some real hardware and I can't wait to share my findings. But, unfortunately I'm facing a few issues, probably related to hardware, with the lab servers and I didn't have a lot of time to investigate further. As TP5 should be out any day now, I decided to wait for that before wasting too much time. GitHubIn the meantime I have started to move some of my PowerShell scripts to GitHub for source control and publish them to the PowerShell Gallery for easy installation. I thought it might be interesting to share my process, so here we go.First of all, I’m not your typical developer, so I had a general idea about source control and I knew GitHub existed but never really used it, much less with PowerShell. The ongoing discussions about Continuous Integration and DevOps and what not, sparked my interest and so I decided to give it a try. The benefits of putting scripts under version control are obvious, the more you commit, the more history you get and the easier it gets to track code changes and errors. Additionally I really enjoy the community that has formed around PowerShell and publishing code to GitHub is one of many ways to contribute and give back to said community.Should you like to get started with git and don’t now where to start, this article helped me a lot when setting it up on my machines.And you can find my stuff at: https://github.com/tomtorgglerPowerShell GalleryIn case you didn’t know, Windows 10 (actually WMF5) comes with package management, yes that’s right, kind of like you know it from Linux or OSX. OneGet was introduced a while ago and eventually evolved into the PackageManagement module that is now included in WMF5. The PSGallery is already configured as a PackageSource and can therefore be used right away. Just try Find-Script or Find-Module and install whatever you find interesting with Install-Script or Install-Module. Now anyone can publish scripts to this PSGallery thing, which is exactly what I did with Invoke-SEFAUtil.ps1 and Restore-VMPermission.ps1.Other Package Sources can obviously be added, find out more at: https://msdn.microsoft.com/en-us/powershell/wmf/oneget_cmdletsPesterAlong with the move to GitHub I started to write some Unit Tests for my code. So what does that mean? Well I told you, I’m not your typical developer so I’m still figuring this thing out :) The basic idea of unit testing is to write additional code that tests your code automatically. So when you change something in a script, you run the tests and if everything is green, the script is ready to go into production. Pester is a unit testing framework for PowerShell, that can be used to achieve exactly that. Once I have found out enough to explain it in a better way, there might be a dedicated post :)&nbsp;With that, have a great weekend!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-nano-server-github-psgallery-pester/\\\"},{  \\\"id\\\": \\\"post-azure-storage-explorer\\\",  \\\"title\\\": \\\"Azure Storage Explorer, the easy way to manage your storage\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\"],  \\\"content\\\": \\\"Today I gave a try to the new Azure Storage Explorer. Its actually in preview but already amazing. You can download the Explorer from the official website.When you open Azure Storage Explorer the first time the program asks for an subscription:After you specify username and password you are able to see your storage accounts.Within the explorer you can manage all of your Azure Storage Accounts, copy Blob containers, delete VHD’s or copy them to another location and much more:&nbsp;&lt;/p&gt; &lt;/code&gt; Give it a tryGreetings\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-storage-explorer/\\\"},{  \\\"id\\\": \\\"post-azure-backup-part-two\\\",  \\\"title\\\": \\\"Azure Backup - Part Two\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\"],  \\\"content\\\": \\\"Let’s focus on Option 1 the direct Azure VM Backup:The Backup TasksWe are now going to Backup an Azure VM from the Web interface. First of all, you have to start a discovery search.When the discovery search is completed you can select the VM you want to Backup. Keep in mind: Today it’s not possible to Backup VM’s that's located on the Azure premium storage (SSD) or VM’s in created with the Resource Manager model.  The next step is to create a Backup policy. You can have a single policy that works for all servers or multiple policies with different settings regarding Backup Windows and retention period. This step should be known from other Backup solutions.  On the retention range page you specify how long protected VM’s are kept.  We have created the Backup policy and can now assign it to our VM. From now a VM Backup will be started on a daily basis. Lets restore a VM To restore a VM you basically highlight the VM in the Backup Vault and select the Restore function.   After you selected the restore point you want to restore, the wizard asks you some information. This step is important because you can specify the name and VNET the VM will belong to. Be careful to not place you restores VM in the same Network as the productive one as this is only a test.   A nice log shows the progress and result of the restore request.  When the restore is done a new VM with the specified name is visible in the Virtual Machine section of Azure. We can start this VM, restore our files or put the VM into production if this was a real restore. Greetings          \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-backup-part-two/\\\"},{  \\\"id\\\": \\\"post-azure-backup-part-one\\\",  \\\"title\\\": \\\"Azure Backup - Part One\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\",\\\"en\\\"],  \\\"content\\\": \\\"On Azure you can choose basically between two different Backup Options:1. Direct Backup Azure VM to Backup Vault2. Backup Applications like SQL, Sharepoint… and Files, System State through Microsoft Azure Backup ServerToday I will give you a short overview of the service.  &lt;/a&gt; Prerequisites - Backup Vault: First of all you have to create a Backup Vault (Thomas described this already in a former post)- If you use Microsoft Azure Backup Server a Internet Connection is needed Costs The costs are counted by instance and space used. An instance is either a Azure VM Server using Backup Option 1 or a Server to Backup specified with Microsoft Azure Backup Server using Option 2. (Price table from 12.2015)  When you create the Backup Vault you can choose between LRS or GRS. This can only be specified at the beginning.If you started already some Backups the GRS storage cannot be switched to LRS anymore. You have to recreate the backup vault.   &nbsp; For the Backup Data Azure Block Blob Storage is used. The costs can be seen from the following price table from 12.2015  &nbsp; In Part 2 I create a Backup Plan for some Azure VM’s and restore a Test-VMPart 3 covers a OnPrem Backup using Option 2 with Microsoft Azure Backup Server. I make a full Backup and full restore assuming the VM’s don’t exist anymore. Greetings\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-backup-part-one/\\\"},{  \\\"id\\\": \\\"post-hyper-convergence-with-nano-server-part-3\\\",  \\\"title\\\": \\\"Hyper-Convergence with Nano Server: Part 3\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"en\\\"],  \\\"content\\\": \\\"In this post we are going to configure the Hyper-V part of our hyper-converged Nano-Server-Cluster. We already deployed the VMs in part 1 an configured Storage Spaces Direct in part 2.Hyper-VWhen creating the Nano Server VHD files, I installed the Hyper-V role by selecting the –Compute parameter. As we have already created the cluster and the virtual disk, we could simply go ahead and create VMs now. Before doing that, I wanted to configure the Hyper-V Servers to&nbsp; store VM configurations and VHD files on the Cluster Shared Volume and I created a virtual Switch that can be used by the VMs:As you can see, I’m using the $cimSessions variable from part 1 again. This variable contains CIM Sessions to my four Nano Servers, so that the above lines do configure all servers at once. Here’s how I’ve created those sessions: $cimSessions = New-CimSession -ComputerName n01,n02,n03,n04VMsNow we are ready to create the VMs and add them to the cluster. I copied the “win2012r2.vhdx” file over to the ClusterStorage and used this as a parent disk for my VMs: That was pretty easy, so lets have a look at what our current environment looks like in the Failover Cluster Manager.We see all the VMs that were added to the cluster and we can go ahead and move them around between nodes using the Failover Cluster Manager. The same goes for the “nodes”, we see all four Nano Servers participating in the cluster and we can control the nodes status:In the storage folder of the FCM we see the virtual disk and some information about health status and capacity:&nbsp;Ok, that is pretty basic stuff if you just look at the Hyper-V part. The interesting point however, is that those same servers do also provide the shared storage that the hypervisors use.Stay tuned for more Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-3/\\\"},{  \\\"id\\\": \\\"post-hyper-convergence-with-nano-server-part-2\\\",  \\\"title\\\": \\\"Hyper-Convergence with Nano Server: Part 2\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"en\\\"],  \\\"content\\\": \\\"In this post, we build on the Nano Servers that were set-up in the part one, we are going to create a Failover Cluster and enable Storage Spaces Direct.Cluster NetworkWhen creating the Nano Server vhd files, I did add the package for failover clustering by using the –Clustering parameter of New-NanoServerImage. So now that the servers are running, I can use remote server management tools or PowerShell to create a cluster. But, before doing that, I went ahead and configured the second network adapter with static IP addressing. Remember that I created the Nano VMs with two network adapters, one connected to my lab network – where DHCP provides addressing – the other connected to an internal vSwitch, as it’ll be used for cluster communication only.Failover ClusterBefore creating a cluster I run the “Cluster Validation Wizard” to make sure my configuration checks out. We could run that wizard using the GUI tools or using the following line of PowerShell:Test-Cluster –Node n01,n02,n03,n04&nbsp; –Include “Storage Spaces Direct”,Inventory,Network,”System Configuration”Some summary information as well as the location of the html report will be printed to the screen. In the report we can actually see the results of the tests that were run. Problems are pointed out and some level of detail is provided.The only warning I got was the following: Failed to get SCSI page 83h VPD descriptors for physical disk 2. This was because my VMs originally used the default “LSI Logic SAS” controller for the OS disk, while the additional, 100GB disks were connected to the SATA Controller. To fix this, I did connect the OS disk to the SATA Controller as well.All green, so we can go ahead and create the cluster:New-Cluster -Name hc01 -Node n01,n02,n03,n04 –NoStorageThis will create another html report at a temporary location, the path will again be printed to the screen. My cluster has an even number of nodes, so I decided to use a File Share Witness. Using the following commands, I created a quick share on my management server (tp4):New-Item -ItemType Directory -Path c:\\\\\\\\hc01witness New-FileShare -Name hc01witness -RelativePathName hc01witness -SourceVolume (Get-Volume c) -FileServerFriendlyName tp4Get-FileShare -Name hc01witness | Grant-FileShareAccess -AccountName everyone -AccessRight FullAfter that, I used the following to update the cluster quorum configuration:Set-ClusterQuorum -Cluster hc01 -FileShareWitness \\\\\\\\\\\\\\\\tp4.vdi.local\\\\\\\\hc01witness Storage Spaces DirectAt this point, we have a running cluster and we can go ahead and configure storage spaces.But again, before doing that, I want to point something out. If we open the Failover Cluster Manager at this point, we can connect to the cluster just as we are used to. If we expand the “Storage” folder in the newly created cluster, we can see there are no Disks, no Pools and no Enclosures present at this time.Using the following command, I enabled storage spaces direct for the cluster:Enable-ClusterS2D -S2DCacheMode Disabled -Cluster hc01And using the following command, I create a new storage pool using the “Clustered Windows Storage” subsystem:If we go back to the Failover Cluster Manager after the above steps, we can see that now there is a Pool as well as four Enclosures, one representing each server:Ok, so far it is looking quite good, and we can go ahead an create a volume (or virtual disk):Our new virtual disk will automatically be added to the Cluster Shared volumes, we can verify that using:Get-ClusterSharedVolume -Cluster hc01Alright, we are getting close. In the next post, we are going to configure the Hyper-V roles and create some virtual machines. Sounds great? Stay tuned :)&nbsp;Cheers,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-2/\\\"},{  \\\"id\\\": \\\"post-azure-file-services\\\",  \\\"title\\\": \\\"Azure File Services\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\"],  \\\"content\\\": \\\"Today I mapped an Azure File Share to my local computer  First you have to create a Storage account and a File ServiceWithin the Webinterface you can create folders and upload filesWhen you click on “Connect” you can get the commands to map the volume. Its basically a normal Network drive.The access key can be taken from the Settings / Key sectionIf you execute the command or simply mount the network volume you have the Azure File Service connected as Volume.Greetingsdn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-file-services/\\\"},{  \\\"id\\\": \\\"post-re-register-azure-mfa-server\\\",  \\\"title\\\": \\\"Re-register Azure MFA Server\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Azure\\\"],  \\\"content\\\": \\\"If you also installed the Azure MFA Server with a MSDN Subscription and now want to switch to another subscription without re-installing the Server, you have to do the following. (Please keep in mind you loose all the settings you made within the MFA console) Export your users Make some screenshots of you configuration (Radius, Company settings ect..) Make a Backup of this folder: C:\\\\\\\\Program Files\\\\\\\\Multi-Factor Authentication Server\\\\\\\\Data Stop the service “MultiFactorAuthSvc” Delete the folders content Start the service “MultiFactorAuthSvc” When you open the console the registration wizards starts and you can register the server with another subscriptionGreetings\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/re-register-azure-mfa-server/\\\"},{  \\\"id\\\": \\\"post-hyper-convergence-with-nano-server-part-1\\\",  \\\"title\\\": \\\"Hyper-Convergence with Nano Server: Part 1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\"],  \\\"content\\\": \\\"In this post I’m walking through the steps creating the images for my Nano Servers and then deploying them. Like in this post, I’ll use WDS for the deployment, so some steps might already be familiar.Create Nano Server ImagesI installed a Windows 2016 TP4 Server with full desktop experience that serves as DHCP, WDS and management machine. I’ll run all of the scripts from there, you might as well use Windows 10 for it. So the first step is to create a new image, which is really quite similar as described in the post mentioned above.What’s different, is that I’m creating an image for each node and I’m using the DominBlobPath parameter, so before creating the images, I have to harvest the blobs using “djoin.exe”. My servers are going to be named n01 trough n04, so I’m using a little foreach loop to get all four blobs and build the four images:As noted in the intro post to this series, I’m running the first version of this lab on virtual machines, as I’m using ESXi as hypervisor, I needed to add the OEMDrivers as well as drivers for vmxnet3 NICs to the image. Those vmxnet3 drivers are located at DriversPath. I do also add Compute, Storage and Clustering packages, as we need them to provide Hyper-V and Storage Spaces Direct.Do note that the boot image needs to include drivers for vmxnet3 as well, they can be added using the WDS admin console quite easily.Once the images are created, we need to import them into WDS.Import into WDSAgain, I’m going to use the foreach loop to import all VHD files as WDS install images:Now we are ready to create the Nano Server VMs and deploy from WDS.VMsI create four VMs with the following specs on my lab ESXi host:NumCPU = 2;MemoryGB = 16;DiskGB = 20;DiskStorageFormat = 'Thin';GuestID = 'windows9Server64Guest'Then I remove the default NIC and add two of the Type ‘vmxnet3’ and make sure they are connected at startup. Finally, I add two hard disks to the VMs:StorageFormat = 'Thin';CapacityGB = 100;DiskType = 'Flat'Once again, please note that I had to use the SATA controller for these data disks, using default LSA or even the VMware paravirtual controllers, resulted in the following error in the Cluster Validation Wizard:  Disk partition style is GPT. Disk has a Microsoft Reserved Partition. Disk type is BASIC. The required inquiry data (SCSI page 83h VPD descriptor) was reported as not being supported.Using a SATA controller, and attaching the hard disks to that controller, solved the problem.To install the Nano Servers, all I need to do now, is to boot the VMs, press F12 and select the right image on the Windows Deployment Service. About a minute later my server is ready :)Yes, I did also create the VMs with PowerShell, look for a post on that soon…ish.Verify VMsOnce the VMs are installed, I create a CIM session and test connectivity by getting the system uptime like this. As all commands above, these are issued on my management machine (tp4):\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-convergence-with-nano-server-part-1/\\\"},{  \\\"id\\\": \\\"post-install-office-web-apps-server-2013-on-server-2012-r2\\\",  \\\"title\\\": \\\"Install Office Web Apps Server 2013 on Server 2012 R2\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\"],  \\\"content\\\": \\\"A quick hint about installing WAC Server. As it happens, Office Web Apps Server&nbsp;2013&nbsp;only added support for 2012R2 with SP1, and even though SP1 is about 3x the file size of RTM, you cannot install it without RTM;&nbsp;RTM setup fails and that’s where I found myself this morning. Copy SP1 files to ‘updates’ folder Download the service pack 1 for WAC Server from this link: http://go.microsoft.com/fwlink/p/?LinkId=510097 Then extract the service pack using /extract to a folder on the disk. Like this:  wacserversp2013-kb2880558-fullfile-x64-glb.exe /extract:C:\\\\\\\\temp\\\\\\\\wacsp1 Now copy all the extracted files into the “updates” folder of the RTM install files. Once the updates are there, RTM setup works on 2012R2 and automatically installs SP1, too. Note: Make sure to follow other requirements, as listed on TechNet Enjoy, Tom \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/install-office-web-apps-server-2013-on-server-2012-r2/\\\"},{  \\\"id\\\": \\\"post-hyper-convergence-with-nano-server-intro\\\",  \\\"title\\\": \\\"Hyper-Convergence with Nano Server: Intro\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\"],  \\\"content\\\": \\\"This is the first post of a series about building a hyper-converged solution with Nano Server in Windows Server 2016 Tech Preview 4. Over the next weeks, I’m going to cover the following parts of my journey:   building the nano servers  creating a cluster and setting up storage spaces direct  bringing in hyper-v  testing and breaking stuff&lt;/ul&gt;   Hyper…what? Before we get started, my quick introduction to hyper-converged, just in case you’ve never heard about it. The basic idea is to bring storage closer to the CPU and so minimize delay. This is achieved by creating groups of servers with local discs and, through the magic of software, pool all the disks into volumes that span the entire group. Such a solution does offer some benefits when we think about scale: adding nodes to the cluster gives you more storage as well as more processor/memory capacity. Obviously we will also see some interesting problems introduced by the complexity of said solutions where troubleshooting will require a great deal of knowledge in multiple fields. While in the old days we had storage, network and compute as cleanly separated silos, hyper-convergence brings all of that together.  So, what I’m going to build and test in this lab is cluster of four Nano Servers running Storage Spaces Direct as well as Hyper-V. The local disks of all Nano Servers will be used to create a virtual disk, that will then be used to store the virtual machines.   Building blocks In the first parts of the series I will build the solution using virtual machines, it’s all about proof-of-concept and learning the basics before getting access to lab equipment. Later I’d like to apply the topics and test the setup on actual hardware, measuring performance data and pulling some disks :)  The requirements for my lab are quite simple, I need an Active Directory domain, one 2016 TP4 Server where I can build and deploy the Nano Server images and later manage the cluster, and four VMs that will be running Nano Server.  DC01: Domain Controller, DNS, Certificate Authority  TP4: DHCP Server, Windows Deployment Services  N01..4: Nano Servers&lt;/ul&gt; I took to visio for a quick diagram, kindly think of the database symbols as disks:  So in the first post of the series, I’m going to build the Nano Server images and deploy them to my virtual machines using Windows Deployment Services. &nbsp; so long,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-convergence-with-nano-server-intro/\\\"},{  \\\"id\\\": \\\"post-lost-found-onyx\\\",  \\\"title\\\": \\\"lost & found: Onyx\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Another version of lost and found, another fling I’d like to share: &nbsp;https://labs.vmware.com/flings/onyx\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-onyx/\\\"},{  \\\"id\\\": \\\"post-happy-holidays-and-some-numbers\\\",  \\\"title\\\": \\\"Happy holidays and some numbers\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\"],  \\\"content\\\": \\\"It’s this time of the year again, everybody is trying to relax a bit and maybe making some plans for the coming year. Well at least that’s what I’m up to these days.NumbersI thought this would be a good opportunity to share some statistics of our blog. So a little more than a year ago, we moved to azure and cloudflare, I took the following numbers mostly from cloudflare.We are blogging here since July 2009, that’s almost six and a half years or around 2350 days. wow.In this time, we produced 250 posts, some in german, some in english. Even though there have been some times with lower activity, that’s still about one post every 10 days.All of this started over a few beers, and neither of us would have thought that it might last this long. Yet here we are, making plans for 2016 and beyond.Now according to cloudflare around&nbsp;8000 unique visitors are stopping by our little site each month, around 300 every single day. Not really mind-blowing, but also not bad.Greetings With that said, we’d like to wish all of you a happy new year and we do certainly hope to see you around.&nbsp;Cheers, Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/happy-holidays-and-some-numbers/\\\"},{  \\\"id\\\": \\\"post-lost-found-openlivewriter-rackhd-ehc-diskspd\\\",  \\\"title\\\": \\\"lost & found: OpenLiveWriter, RackHD, EHC, diskspd\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"en\\\",\\\"Server\\\",\\\"VMware\\\"],  \\\"content\\\": \\\"Another quick and dirty edition of “lost &amp; found”, just sharing stuff that I thought is interesting. Open Live WriterSo this is the first post published (and written) using the open-sourced version of Live Writer. I always liked Live Writer, so I am very happy to have it back. More info at Github: https://github.com/OpenLiveWriter/OpenLiveWriterEMC RackHDAnother open source project I stumbled upon the other day is RackHD from EMC {code}. This comes a vendor independent management and orchestration solution for the datacenter. Now I know, that sounds a lot like everything and nothing but why not have a look: http://blog.emccode.com/2015/12/08/introducing-rackhd-automate-bare-metal/VMware Embedded Host ClientThis is especially awesome for the MAC users out there, as you no longer need a Windows VM to run the C# vSphere Client. So you simply install a VIB package on your ESXi (lab) servers and point your browser to https://hostname/ui to manage the host. More Info: https://labs.vmware.com/flings/esxi-embedded-host-clientInstallation is simple and doesn’t require a reboot.esxcli software vib install -v /tmp/esxui-signed.vibThe same is true for removal:  esxcli software vib remove -n esx-ui And a quick look at what you’ll get.  DiskSpd Heard of SQLIO? Meet it’s sequel, DiskSpd. A handy little tool that generates synthetic workload to help asses storage performance. There is a good post on TechNet going into quite a bit of detail. Get the tool and documentation in the TechNet Gallery. &nbsp; Thats all for tonight, so long Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-openlivewriter-rackhd-ehc-diskspd/\\\"},{  \\\"id\\\": \\\"post-domain-joining-the-vcenter-server-appliance-6\\\",  \\\"title\\\": \\\"Domain-joining the vCenter Server Appliance 6\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\",\\\"VMware\\\"],  \\\"content\\\": \\\"In this post, we started out by deploying the VCSA to a new environment, today we'll see how to join the VCSA to an Active Directory domain and authenticate using domain accounts.&nbsp;&nbsp;PrepareTo join a domain we need the distinguished name of the organizational unit where we want the VCSA's computer object to be created, as well as an account with the required permissions to join a machine to the domain.To get the DN use your tool of choice, like PowerShell: Get-ADOrganizationalUnit -Filter {Name -like \\\\\\\"servers\\\\\\\"} | Select-Object -ExpandProperty DistinguishedName &nbsp;&nbsp;Before joining the vCenter Server Appliance to the domain, make sure DNS is working perfectly, that includes reverse lookup.&nbsp;&nbsp;JoinNow sign-in to the vCenter using the local SSO domain created during setup and go to Administration/System Configuration/Nodes. Select the VCSA from the list of Nodes and in the right pane, go to Manage/Active Directory and click the \\\\\\\"Join\\\\\\\" button on the right.&nbsp;&nbsp;\\\\t&nbsp;&nbsp;&nbsp;&nbsp;Specify the domain name and DN of the organizational unit as well as the credentials to use.&nbsp;&nbsp;\\\\t&nbsp;&nbsp;After joining the domain, a restart is required. To perform a restart, either use SSH or use the \\\\\\\"Reboot\\\\\\\" button in the \\\\\\\"Actions\\\\\\\" menu.&nbsp;&nbsp;Once the VCSA is restarted we can see that a Computer object has been created in AD. Now we log-in again, still using the local account, and go to Administration/Configuration where we select \\\\\\\"Identity Sources\\\\\\\" in the right pane, using the \\\\\\\"+\\\\\\\" button, add a new Identity Source. &nbsp;&nbsp;\\\\t&nbsp;&nbsp;Configure PermissionsOnce the Identity Source has been added, we can configure roles and permissions for AD accounts. This can be done using Administration/Global Permissions. Using the \\\\\\\"+\\\\\\\" button, we assign an AD user or group to a vCenter Role.&nbsp;&nbsp;Alternatively, we can add AD users or groups to the preconfigured groups that can be found in the \\\\\\\"Single Sign-On\\\\\\\" section of the Administration menu.&nbsp;&nbsp;\\\\t&nbsp;&nbsp;Verify Finally we can log-out of the local admin account and log-in using our AD user, which should be able to access resources, as specified by the assigned roles. Note: Users with no assigned roles will also be able to log-in, obviously they won't see any objects.&nbsp;&nbsp;TroubleshootNow if some of the steps don't work, for example you cannot log-in or you cannot access AD users or groups in the configuration, double-check DNS and have a look at the following log files:/var/log/vmware/sso/vmware-sts-idmd.log&nbsp;/storage/log/vmware/sso/ssoAdminServer.log&nbsp;I got \\\\\\\"Cannot load the users for the selected domain\\\\\\\" in the Web Client and found the &nbsp;following lines in the above mentioned logs:&nbsp;Failed to get non-GC connection to domaincom.vmware.identity.idm.IDMException: Failed to establish server connection\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/domain-joining-the-vcenter-server-appliance-6/\\\"},{  \\\"id\\\": \\\"post-azure-backup-restore\\\",  \\\"title\\\": \\\"Azure Backup: Restore\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Cloud\\\",\\\"de\\\"],  \\\"content\\\": \\\"In diesem Post habe ich beschrieben, wie man Daten mit Azure Backup sichert, nun wollen wir diese wiederherstellen.&nbsp;&nbsp;Backup AgentDie Wiederherstellung wird über den Azure Backup Agent gestartet, im ersten Schritt wählt man aus, welcher Server wiederhergestellt werden soll.&nbsp;&nbsp;\\\\t&nbsp;&nbsp;Anschließend werden die wiederherzustellenden Dateien über die Suche oder einen Filesystem Browser ausgewählt. &nbsp;&nbsp;\\\\t&nbsp;&nbsp;\\\\t&nbsp;&nbsp;Wie üblich kann man die Dateien am ursprünglichen Ort wiederherstellen, oder einen anderen Pfad angeben. Außerdem kann ausgewählt werden, ob die Berechtigungen (ACL) wiederhergestellt werden sollen. &nbsp;&nbsp;\\\\t&nbsp;&nbsp;Nach der Bestätigung wird der Wiederherstellungsprozess gestartet, dieser wird auch im Azure Portal angezeigt und protokolliert.&nbsp;Weitere Infos und Doku: https://azure.microsoft.com/en-us/documentation/services/backup/\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-backup-restore/\\\"},{  \\\"id\\\": \\\"post-installing-nano-server-using-wds-and-pxe\\\",  \\\"title\\\": \\\"Installing Nano Server using WDS and PxE \\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Technical Preview 4 of Windows Server 2016 brings along new \\\\\\\"packages\\\\\\\" for Nano Server, it can now run DNS and IIS along other roles. See TechNet for a complete list. So to get started with Nano, I tried to deploy it via WDS.&nbsp;&nbsp;PrepareNano Server is not installed like other editions of Windows Server, one has to build a customized image with the roles and packages one needs. This underscores the very nature of Nano Server, being a minimal install with minimal overhead.Now to create this image we have to mount the Windows 2016 TP4 ISO on our workstation. In the NanoServer folder right at the root of the ISO, we find the .wim along with two PowerShell scripts. There is quite a detailed guide available on TechNet so I am not going into to much detail here:&nbsp;&nbsp;First import the Module: ipmo .\\\\\\\\NanoServerImageGenerator.psm1&nbsp;&nbsp;As I ran the New-NanoServerImage cmdlet before, it already converted the WIM to VHD (that's the VHD you'll find at the \\\\\\\"BasePath\\\\\\\") so I can omit \\\\\\\"MediaPath\\\\\\\" for subsequent runs and save a little time:&nbsp;&nbsp;New-NanoServerImage -BasePath C:\\\\\\\\nanotemp -TargetPath C:\\\\\\\\Nano\\\\\\\\Nano_dns.vhd -OEMDrivers -Packages Microsoft-NanoServer-DNS-Package -ComputerName nano_dns -DomainName tomt.it -Language en-us&nbsp;&nbsp;\\\\t&nbsp;&nbsp;Note: I had to specify the Language parameter as I my system is not using en-us. I am planning to run the VHD on VMware, that's why I included \\\\\\\"OEMDrivers\\\\\\\" and not \\\\\\\"GuestDrivers\\\\\\\".&nbsp;&nbsp;WDS The steps above created a VHD at the target path and in the next step I am adding this VHD as an install image to WDS:&nbsp;&nbsp;\\\\t&nbsp;&nbsp;I changed the name to avoid confusion :)&nbsp;&nbsp;\\\\t&nbsp;&nbsp;The same can be achieved using PowerShell:&nbsp;&nbsp;Import-WdsInstallImage -Path C:\\\\\\\\nano\\\\\\\\Nano_dns.vhd -NewImageName \\\\\\\"Nano_dns_10.0.10586\\\\\\\"&nbsp;&nbsp;That's basically it, now we have to create a new VM an pxe-boot from the WDS.&nbsp;&nbsp;InstallI created a new VM using the \\\\\\\"Windows 2016\\\\\\\" template in Fusion, but before installing I reduced the size of the new virtual disk to 10G, which still is way to much ;)&nbsp;&nbsp;\\\\t&nbsp;&nbsp;\\\\t&nbsp;&nbsp;Very few miutes later our new DNS server is ready.&nbsp;&nbsp;\\\\t&nbsp;&nbsp;There is nothing really to be done on the server console, the \\\\\\\"Emergency Console\\\\\\\" can be used to configure networking, the rest is done with RSAT or PowerShell remoting.&nbsp;&nbsp;DNSTo test the functionality of my newest Nano Server, I actually set up DNS:&nbsp;&nbsp;So first of all, using Get-WindowsFeature I checked which features were installed and which ones were available. As you can see from the screenshot, there are not very many features available:&nbsp;&nbsp;\\\\t&nbsp;&nbsp;Using the following command, I installed DNS Server role: Add-WindowsFeature -ComputerName nano_dns -Name DNS&nbsp;&nbsp;After that, I was able to add the Server to the DNS Management console and configure DNS zones:&nbsp;&nbsp;\\\\t&nbsp;&nbsp;&nbsp;&nbsp;Oh, and of those of you who care, the size of the virtual harddisk is 626,6MB. Awesome, right? :)&nbsp;&nbsp;\\\\t&nbsp;&nbsp;&nbsp;&nbsp;Enjoy, Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/installing-nano-server-using-wds-and-pxe/\\\"},{  \\\"id\\\": \\\"post-lost-found-tp4-th2-win32-openssh-vs-code\\\",  \\\"title\\\": \\\"lost & found: TP4, TH2, Win32-OpenSSH, VS Code\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"en\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Tech Preview 4The latest preview of Windows Server 2016 has been released, it brings many new features including options for Containers and Nano Server.Download it from the Evaluation Center: http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview\\\\tWindows 10 1511Aka. Threshold 2 was released, pulled, and re-released, apparently because of some privacy settings. Windows Insiders got it a little earlier and so it landed on my Surface Pro 3. It leaves much more of a stable impression than \\\\\\\"RTM\\\\\\\" and fixed most of the problems I had.OpenSSH comes to WindowsYes, that's right, some folks at Microsoft heard the calls and started a project on GitHub, aiming to bring OpenSSH to the Windows-world. The wiki page at GitHub has some info about installing, which is quite simple:Once downloaded, run the following commands from an administrative PowerShell:Expand-Archive .\\\\\\\\OpenSSH-Win32.zipcd .\\\\\\\\OpenSSH-Win32\\\\\\\\OpenSSH-Win32\\\\\\\\.\\\\\\\\ssh-keygen.exe -t ecdsa -f ssh_host_ecdsa_key.\\\\\\\\sshd.exe installStart-Service sshdAnd don't forget to create a firewall rule: New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSHThen I was able to connect from my MacBook: \\\\tFind more info, a wiki and the download over at GitHub: https://github.com/PowerShell/Win32-OpenSSH\\\\tVisual Studio CodeA free, cross platform code editor with interesting language support.https://code.visualstudio.com\\\\t&nbsp;Have fun,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-tp4-th2-win32-openssh-vs-code/\\\"},{  \\\"id\\\": \\\"post-getting-started-with-vcenter-server-appliance-6\\\",  \\\"title\\\": \\\"Getting started with vCenter Server Appliance 6\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\",\\\"VMware\\\"],  \\\"content\\\": \\\"So I’ve done some work with VMware in the past and even got certified on vSphere 4, but then I changed jobs and ended up working, almost exclusively, with Microsoft software. That included a little bit of Hyper-V but mostly I worked “higher up” in the stack, with applications like Exchange and Lync, that is. As I changed jobs again and find myself focusing on Datacenter technologies now, I decided it was time to reactivate some VMware skills and get to know the latest version.I deployed a vCenter Server Appliance in a new environment the other day, and thought it might be a good starting point.PrepareYou may have heard that VMware want’s to ditch the good ol’ vSphere client and switch to a Web Client kind of a thing, this has been going on for a while, but in every release they are getting more serious about it. New features almost always come “web only”. Unfortunately they decided to make this a flash-based client, yeah, it’s almost as bad as java, but that’s another story.So get yourself a machine with a web browser and install/enable the flash plugin. I had troubles with Safari, Chrome and IE11 so I ended up using Firefox (think about that for a sec…).&nbsp;Download the VCSA from vmware.com, it comes as an ISO image that you will have to mount on your management machine. The idea is, basically, to use a website to deploy an OVF template to one of your vSphere hosts.Install&nbsp;Inside the ISO you’ll find the Web Client Plugin, which is required to deploy the OVF template, it’s located at: \\\\\\\\vcsa\\\\\\\\VMware-ClientIntegrationPlugin-6.0.0.exeOnce the Client Plugin has been installed, open the \\\\\\\\vcsa-setup.html file and follow the wizard.Most steps are straightforward, first select the target ESXi host and configure the VM name and a password for the root account.Then select how the Platform Services Controller is deployed. As far a I know, this is a new role in vCenter 6, which controls Licensing, SSO and Certificates. I selected to deploy an embedded PSC.&nbsp;The next step is to configure Single Sign-On. In my case I created a new SSO domain, as this was the first vCenter Server in the environment. Remember the “SSO Domain name” you use, it will be required to log on later. The SSO domain name must be different than the Active Directory domain name.&nbsp;Note: Make sure to check documentation when upgrading an existing vCenter, as the SSO configuration has changed quite a bit.Select an appliance size and which datastore to use for the VCSA appliance.Finally you can configure network settings. When entering a FQDN for the vCenter appliance, make sure it is already configured in DNS and the VCSA can reach the DNS server you specify. Deployment will fail if DNS doesn’t check out. As I had no NTP Server handy, I selected to synchronise the VCSA’s time with the ESXi host. And no, I would not recommend this.Now after the deployment of the OVF finishes, we should be able to logon to the vSphere Web Client using a browser, or to the classic vSphere Client installed on Windows. Make sure to logon using the administrator@ssodomain account, you wont be able to do much configuration as root!Stay tuned for more :)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/getting-started-with-vcenter-server-appliance-6/\\\"},{  \\\"id\\\": \\\"post-netscaler-as-adfs-proxy\\\",  \\\"title\\\": \\\"Netscaler as ADFS Proxy\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"ADFS\\\",\\\"Citrix\\\",\\\"en\\\"],  \\\"content\\\": \\\"I decided to use Netscaler to publish my ADFS server to the internet instead of a dedicated server in the DMZ. I checked several blogs and the official Citrix documentation but this looked overloaded. Citrix documentation: NetScaler as ADFS Proxy Deployment Guide - CitrixBlogs: http://blogs.citrix.com/2015/05/29/adfs-v3-on-windows-server-2012-r2-with-netscaler/, http://cividan.blogspot.it/2015/02/use-citrix-netscaler-as-replacement-for.htmlSo I searched a way to:- Publish ADFS to the Internet with URL filter- Do not pre-authenticate with Netscaler (Customizing multiple pre-authentication Websites can be very time consuming per tenant)- Modify the Header that ADFS server understands the request comes from externalThere was no blog post that explained the whole configuration, so I decided to write down the required steps:1. The serviceFirst create the service and specify to forward the Client IP (Header: X-MS-Forwarded-Client-IP)&nbsp;2. The vServer&nbsp;Create the vServer not directly addressable to not trash an IP address and bind the certificate3. Content switch policyCreate a content switch policy to forward only /adfs and the exact hostname to the vServer4. Content Switch vServerCreate the content switch vServer and apply the content switch policy5. Rewrite ActionsYou want to let the ADFS know that the request comes from extranet. So you can apply different authentication methods in the different zones. You have to add the header X-MS-Proxy to the request. Therefore you create a rewrite actionCreate also a rewrite action to rewrite URL /mex 6. Rewrite Policy7. Bind the PoliciesNow bind the policies to the vServer. Both are rewrite policies for requests. Be careful with the GoTo expression to the Header transformation, this must be “NEXT”8. The MonitorADFS has a probe check build in. If you check /adfs/probe you get a 200 message if everything is OK. Create the monitor and add it to the service    &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_684.png\\\\\\\"&gt;&lt;img width=\\\\\\\"265\\\\\\\" height=\\\\\\\"339\\\\\\\" title=\\\\\\\"image\\\\\\\" style=\\\\\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_682.png\\\\\\\" border=\\\\\\\"0\\\\\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Netscaler configuration is done. You can test now the authentication if you access the URL &lt;a href=\\\\\\\"https://portal.office.com\\\\\\\"&gt;https://portal.office.com&lt;/a&gt; through Netscaler. Then you will be redirected to the ADFS website for authentication:&lt;/p&gt; &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_685.png\\\\\\\"&gt;&lt;img width=\\\\\\\"438\\\\\\\" height=\\\\\\\"156\\\\\\\" title=\\\\\\\"image\\\\\\\" style=\\\\\\\"border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline; background-image: none;\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_683.png\\\\\\\" border=\\\\\\\"0\\\\\\\"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For internal requests use split DNS to forward the authentication directly to the ADFS server and not to the Netscaler ADFS proxy. So the Proxy Header is missing and your client will use internal authentication.&lt;/p&gt; &lt;p&gt;Stay tuned for my post series about configuring Exchange in Hybrid mode with Office 365.&lt;/p&gt; &lt;p&gt;Greetings&lt;br&gt;ND&lt;/p&gt;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/netscaler-as-adfs-proxy/\\\"},{  \\\"id\\\": \\\"post-azure-backup\\\",  \\\"title\\\": \\\"Azure Backup\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Cloud\\\",\\\"de\\\"],  \\\"content\\\": \\\"Seit einiger Zeit bieten die Recovery Services in Microsoft Azure die Möglichkeit, virtuelle Maschinen oder ganze Rechenzentren zu sichern. Das ist vor allem für Unternehmen interessant, die sich kein DR Rechenzentrum leisten können/wollen.Mit Azure Backup gibt es dazu auch&nbsp;die Möglichkeit einzelne Server, Clients oder nur bestimmte Daten in die Cloud zu sichern. So kann jeder an den Luxus eines off-site Backups kommen. Im folgenden Beispiel konfiguriere ich Azure Backup für meinen Windows 10 Client.&nbsp;Backup VaultAls Grundvoraussetzung benötigt man natürlich eine Azure Subscription, hier kann man sich das Ganze im Free Trial anschauen: https://azure.microsoft.com/en-us/pricing/free-trial/&nbsp;\\\\tIn der Subscription wird ein Backup Vault benötigt, dort werden die Backups gespeichert. Um ein Backup Vault zu erstellen, ist nach wie vor das \\\\\\\"alte\\\\\\\" Management Portal nötig, dieses erreicht man über: https://manage.windowsazure.com&nbsp;\\\\tUnter New, Data Services, Recovery Services erstellt man das Backup Vault.Einmal angelegt muss man nur noch die \\\\\\\"Vault credentials\\\\\\\" herunterladen, diese findet man im Dashboard des neu angelegten Vaults.Backup AgentDer Backup Agent wird auf dem Client/Server installiert, welcher in das Azure Backup Vault gesichert werden soll. Der aktuelle Backup Agent kann hier heruntergeladen werden: http://aka.ms/azurebackup_agent&nbsp;\\\\tEinmal installiert, kann man die lokale Maschine über \\\\\\\"Register Server\\\\\\\" hinzufügen, in dem Wizard werden die \\\\\\\"Vault Credentials\\\\\\\" importiert. Diese verwendet der Agent um das Vault zu finden und sich zu authentifizieren. Die Daten werden lokal verschlüsselt und über eine https Verbindung übertragen. Der Benutzer erstellt ein Kennwort für diese Verschlüsselung, die auch in der Cloud erhalten bleibt (at rest). Das Kennwort wird in einer Textdatei gespeichert und sollte sicher aufbewahrt werden.&nbsp;\\\\tSobald der Client/Server registriert wurde, kann man das Backup konfigurieren. Im ersten Schritt wählt man die Daten aus, welche gesichert werden sollen.\\\\t\\\\t&lt;p&gt;Dann gibt man unter Backup Scheduleand Retention Policy an, wann Backups erstellt werden sollen und wie dieseaufbewahrt werden.&lt;/p&gt;&lt;p&gt; \\\\t&lt;/p&gt;&lt;p&gt;That’s it. Das Backup kann mit Backup Now gestartet werden, oder man wartet bis der geplante Task das erledigt.&lt;/p&gt;&lt;p&gt; \\\\t&lt;/p&gt;&lt;p&gt;Kosten&lt;/p&gt;&lt;p&gt;Die Kosten für das Backup Vault können unter folgendem Link nachgelesen werden:&lt;/p&gt;&lt;p&gt;http://azure.microsoft.com/en-us/pricing/details/backup/ \\\\t&lt;/p&gt;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/azure-backup/\\\"},{  \\\"id\\\": \\\"post-getting-started-with-osx\\\",  \\\"title\\\": \\\"Getting started with OSX\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"en\\\"],  \\\"content\\\": \\\"Well yes, I amswitching to OSX on my work machine. I'm still using my Surface Pro 3 at homeand for meetings, but my primary work computer will be a 13\\\\\\\" MacBook Profrom now on. As I had no experience whatsoever working with OSX, here are mynotes on getting started:&nbsp;GetOneNoteOne of the mostimportant productivity tools,for me, is OneNote. Everything from screenshots, recipes, drafts, ideas,writing, learning, to meeting notes goes there. I am simply not functionalwithout it :) so just go to onenote.com and grab the latest version. It's free,too.&nbsp;GetBrew and CaskA package managerfor OSX, once installed you can easily install packages (includingdependencies) just like this:$brew search nmap$brew install nmap&nbsp;And, importantly,updating packages is straightforward to. No more updating all individualapplications, just run (Caution: this will update all packages!):$brew update &amp;&amp; brew upgrade &nbsp;Simple as that. Caskextends brew, and brings along many more packages.&nbsp;KeyboardshortcutsThis was reallyimportant for me, as I am using keyboard shortcuts a lot on windows. There is agood list of possible shortcuts at apple.com.Another importantpart, at least for me, in getting around in OSX are trackpad gestures. The mostimportant can be found in the Trackpad section of \\\\\\\"SystemPreferences\\\\\\\".&nbsp;PythonThere's noPowerShell on the Mac. Bummer. I decided to look into Python and found a couplegood sites for beginners.&nbsp;Moretools...I use KeePass on myWindows machines, a lot. There are multiple possible solutions on OSX, the onethat worked best for me is MacPass. Itopens kdbx files and there is an autotype feature.As I work a lot withconsole/command-line tools, a decent terminal emulator is key. A colleaguepointed me to iTerm2, and I love it :)Atom is a great, customizable text editor.&nbsp;Whatelse?Am I missingsomething, do you have any suggestions? Comments are highly appreciated :) &nbsp;LinksOneNote: http://onenote.comHomebrew: http://brew.shKeyboard Shortcuts: https://support.apple.com/en-us/HT201236Learn Python thehard way: http://learnpythonthehardway.org/book/Coursera: https://www.coursera.org/course/pythonlearnPython: https://docs.python.org/2/library/index.htmlMacPass: http://mstarke.github.io/MacPass/iTerm2: http://iterm2.comAtom: https://atom.io\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/getting-started-with-osx/\\\"},{  \\\"id\\\": \\\"post-moving-on!\\\",  \\\"title\\\": \\\"Moving on!\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\"],  \\\"content\\\": \\\"Wie der Eine oder Andere vielleicht weiß, habe ich die vergangenen zwei Jahre in Paderborn verbracht. Dort durfte ich einige sehr spannende Projekte im Bereich Unified Communications umsetzen und konnte sowohl beruflich wie auch persönlich viel lernen. Ein großer Dank gilt hier meinem ehemaligen Arbeitgeber, meinen Vorgesetzten und den lieben Kollegen! ;)Der Ruf der Heimat (=Berge) wurde mit der Zeit immer lauter und so entschied ich mich Anfang des Jahres, wieder nach Südtirol zu gehen. Nachdem ich den Sommer für persönliche und kulturelle Weiterbildung (und viel Urlaub) genutzt habe, geht es für mich nun auch beruflich wieder weiter. Ich bleibe dem Leben als Dienstleister treu, freue mich aber sehr in einen neuen Bereich einzusteigen und somit meinen Horizont zu erweitern. In nächster Zeit geht es für mich weg von UC und hin zu Datacenter, Netzwerk und Storage.Hier im Blog möchte ich, soweit es die Zeit zulässt, weiterhin&nbsp;aus der Praxis erzählen.Bis bald!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/moving-on!/\\\"},{  \\\"id\\\": \\\"post-how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you\\\",  \\\"title\\\": \\\"How to prepare for Exchange 2013 PF migration and what the Microsoft Guide doesn’t tell you\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"I’m currently preparing my Exchange 2010 / 2013 environment for the public folder migration from 2010 to 2013. I created a test lab to simulate the migration before I do it on the productive servers. During the test migration I noticed some problems that have to been fixed before you get into the migration.1. Fix wrong aliasesIf you have mail enabled folders with aliases containing special characters like spaces or “@” you get an error when you start the first migration part and Exchange wants to create the hierarchy.You can enumerate mailbox folders with, for example, spaces in aliases with the following query:Get-MailPublicFolder | where{$_.Name -match &quot; &quot;}If you have just less than 10 folders to fix you can do it manually. But if you have more than 50 to correct you can use the script written by Johan Veldhuis (http://www.johanveldhuis.nl/tools/scripts/fix-aliasv20.ps1)2. Set the storage quota for the public folder mailboxes on 2013 to unlimitedDuring migration, I recommend to set the storage quota for the public folder mailboxes to unlimited. I saw very strange problems with hierarchies on 2013 not comparing to 2010 if a folder is over quota. You can change the storage limit after migration is done.3. Set the legacy public folder – folder quota to unlimitedDuring migration I had some problems with mail enabled public folders. On the 2010 side the PF are mail enabled, on the 2013 not all PF’s are mail enabled but the PF’s are able to receive mails. You cannot manage the folders with EAC or porwershell. In my case, this problem was related to a PF quota set on a folder. I have many folders with content that reached the maximum limit. For all of these folders the mail enabled option was not enabled after migration. I recommend setting the PF Quota on PF Database basis to unlimited before migration. Please keep in mind to set the quota for all folders to “use database defaults”. You can do this with the following line of powershell:Get-PublicFolder -Recurse | where{$_.UseDatabaseQuotaDefaults -eq $false} | Set-PublicFolder -UseDatabaseQuotaDefaults $trueAdjust the new storage quotas later on a mailbox basis.Greeting   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you/\\\"},{  \\\"id\\\": \\\"post-netsh-trace-and-the-message-analyzer\\\",  \\\"title\\\": \\\"netsh trace and the Message Analyzer\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\",\\\"en\\\"],  \\\"content\\\": \\\"This is just a quick post about a cool feature of netsh and the successor to Microsoft’s NetMon.netsh traceWith Windows 7 / Server 2008R2 and newer versions a cool feature has been added to netsh: the possibility to capture network traces without the need to install any third party software.All you need to do is to start an elevated command prompt (run as Admin) and type the following command:netsh trace start capture=yesThen do the stuff you want to capture and stop the trace by using:netsh trace stopAn .etl trace will be generated and the file path is displayed. Note: if you use the persistent=yes parameter when starting the trace, you can even trace system reboots. Microsoft Message AnalyzerSo NetMon has been around for a while and IT pros around the world still love it, well at least I do ;) Some time ago, Microsoft introduced its successor, a tool by the name of “Message Analyzer”. This tool can to a lot more than just network traces, find some information on the MessageAnalyzer Blog.So I just captured a trace using netsh, copied the .etl file to my machine and then opened it in Message Analyzer. As you can see in the screenshot, the layout is quite a bit different from what we’re used from NetMon but the important things are still there. Filtering is quite intuitive, either write an expression into the text box at the right-hand side, or load a filter from the library. Alternatively, just right-click a property of a packet and select “Add to Filter” Well that’s about all I know about Message Analyzer for now. I was able to verify that packets got tagged with the DSCP values I expected and I did not have to install additional software to capture a trace.Happy tracing,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/netsh-trace-and-the-message-analyzer/\\\"},{  \\\"id\\\": \\\"post-considerations-when-planning-for-directaccess\\\",  \\\"title\\\": \\\"Considerations when planning for DirectAccess\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2012-R2\\\"],  \\\"content\\\": \\\"I’ve seen a fair share of DirectAccess installations recently. Here are some quick questions to ask before you or your customer start getting into the technical titbits. Licensing: DirectAccess requires the Enterprise Edition of Windows on the Client side!  Version:   Client: DirectAccess works with Windows 7 and later, Windows 8.1 i preferred as the technology has evolved  Server: DirectAccess works with Windows Server 2008R2 and later, but Windows 2012 is highly recommended as NAT64 and DNS64 have been included.&lt;/ul&gt; IPv6: Yep, DirectAccess is an IPv6 technology. Make sure your applications support IPv6 and make sure applications always use DNS names to connect to the Servers. If the client is configured to connect to an IPv4 address directly, DirectAccess will not work.  Windows Firewall: It’s sad but I do still see many organizations disabling Windows Firewall via Group Policy. Well in that case, not only are you putting your users at risk, DirectAccess will also not work. Windows Firewall must be enabled as DA uses Connection Security Rules.  Dual NIC: The DircetAccess Server should be configured with to NICs, one for external/dmz connectivity and one for connectivity to the internal network.  Static Routing: As you set the the default gateway to the external NIC, static routes will have to be created for internal networks. Make sure to use “New-NetRoute” as “route add” is no longer recommended.  Firewall: DirectAccess requires tcp/443 to be allowed from the Internet to the external network adapter of the DA server.  Public DNS: A name must be registered in the public DNS zone, clients will use this name to connect to the corporate network.  Public Certificate: A certificate issued by a publicly trusted Certification Authority is highly recommended for the DirectAccess server’s public DNS name. The DA Client checks the Certificate Revocation List before connecting, so if you are using an internal CA, make sure the CRL is available without connectivity to the corporate network.  No Schema or AD changes required: The only requirement for DirectAccess is a Windows Server 2012 (preferably 2012R2) member server. As long as you are on a 2003 or later domain level, you are good to go.  Probe Host: Clients try to connect to a “Probe Host” do determine whether or not a DirectAccess connection should be attempted. This host should, obviously, only be accessible from inside the corporate network. The DirectAccess Wizard resolves name in the Probe Host certificate’s subject, if there is no DNS record, or the DNS record points to an incorrect IP address, the Wizard will fail. Also if the probe host fails, Clients will attempt DA connections even if they are connected to the corp. network, which may lead to problems.  2FA: DirectAccess can be configured for two-factor authentication. Force Tunnelling is not supported in that scenario.  High Availability: Multiple DirectAccess Servers can be deployed for high availability. Windows Network Load Balancing can be used but I’d recommend you use an external Load Balancer.  VPN: The Remote Access Server can be configured for VPN as well.&lt;/ul&gt; &nbsp; Phew. I don’t like bullet lists… Whatever, with those in mind you should be able to plan your remote access strategy :) Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/considerations-when-planning-for-directaccess/\\\"},{  \\\"id\\\": \\\"post-wmf-5-preview-update-is-not-applicable-to-your-computer\\\",  \\\"title\\\": \\\"WMF 5 Preview: Update is not applicable to your computer\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"PowerShell\\\"],  \\\"content\\\": \\\"I just stumbled upon this one on a new machine I was working with:&nbsp;&nbsp; Are you trying to install the Windows Management Framework 5 Preview, to get all the new PowerShell stuff, and see an error like this one?\\\\\\\"The update is not applicable to your computer\\\\\\\"    This preview actually requires the system local to be set to \\\\\\\"en-US\\\\\\\", you can easily check this using Get-Host within PowerShell:    In my example, the CurrentUICulture was set to \\\\\\\"en-GB\\\\\\\" and, apparently, that's why the update failed to install. Once I changed my regional settings and downloaded the \\\\\\\"en-US\\\\\\\" language pack, the update installed just fine.  In case you haven’t heard of the preview as of yet, you can grab it here: http://www.microsoft.com/en-us/download/details.aspx?id=44070  The issue is also listed in Connect: https://connect.microsoft.com/PowerShell/feedback/details/877188/update-is-not-applicable-to-your-computer-windows-management-framework-5-0-preview-may-2014  &nbsp; Have fun,Tom \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wmf-5-preview-update-is-not-applicable-to-your-computer/\\\"},{  \\\"id\\\": \\\"post-windows-10-vhd-boot\\\",  \\\"title\\\": \\\"Windows 10 VHD Boot\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Seit einigen Tagen ist die Technical Preview von Windows 10 verfügbar. Auf meinem Notebook nutze ich Windows 8.1 und habe das Hyper-V Feature aktiviert um virtuelle Maschinen betreiben zu können. In so einer VM habe ich auch Windows 10 installiert und getestet.Nach ersten erfolgreichen Tests, wollte ich dann doch mein Notebook mal mit Windows 10 booten, also habe ich mit “bcdedit” einen neuen Eintrag im Bootloader erstellt und die virtual Hard Disk der Windows 10 VM als “device” und “osdevice” angegeben.Wichtig: Vor einer Änderung sollte man die aktuelle Konfiguration immer sichern:bcdedit /export \\\\\\\"C:\\\\\\\\Users\\\\\\\\thomas\\\\\\\\Documents\\\\\\\\bcdedit\\\\\\\"Dieser Befehl kopiert den Boot Configuration Eintrag für das aktuelle Betriebssystem. Der neue Eintrag erhält eine eigene GUID, diese wird gleich ausgegeben und wird in den darauffolgenden Befehlen verwendet.bcdedit /copy {default} /d \\\\\\\"Win10 Preview”Mit folgenden Befehlen werden die Einstellungen für den neuen Eintrag angepasst, die virtuelle Festplatte der Windows 10 VM wird als “device” konfiguriert, die GUID des oben erstellten Eintrags muss verwendet werden: bcdedit /set {&lt;new-GUID&gt;} device vhd=[C:]\\\\\\\\temp\\\\\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} osdevice vhd=[C:]\\\\\\\\temp\\\\\\\\win10_preview.vhdx bcdedit /set {&lt;new-GUID&gt;} detecthal on&lt;/code&gt; Wenn das Notebook jetzt neu gestartet wird, kann ich im Bootloader zwischen Windows 8.1 und der Tech Preview von Windows 10 wählen. Auch die virtuelle Maschine kann nach wie vor verwendet werden. Viel Spaß,Tom&nbsp; \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-10-vhd-boot/\\\"},{  \\\"id\\\": \\\"post-lost-found-windows-tech-preview-delve-sway-and-keybaseio\\\",  \\\"title\\\": \\\"lost & found: Windows Tech Preview, Delve, Sway and Keybase.io\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"WindowsSome days ago, on September 30, @tmyerson and @joebelfiore introduced Windows 10 and announced the availability of a Technical Preview. The announcement and some demos are on YouTube. Some interesting new features such as snap for 4 windows and continuum, which switches between the start menu and the start screen based on whether or not a keyboard is connected, are coming to Windows 10.The preview can be downloaded at: http://windows.microsoft.com/en-us/windows/previewAlong with the tech preview of Windows 10 came the preview for the next version of Windows Server. A ton of new features will come to the next gen server OS, a notable one might be the SDN controller role, which provides a interface between higher layer applications (think SCVMM) and the software defined networking stack in Windows.The preview for Windows Server can be downloaded at: http://technet.microsoft.com/evalcenter/dn781243DelveThe long rumored and previously shown “Office Graph” aka “Oslo” has started rolling out to Office 365 customers under the new name: “Office Delve”. To get a chance to test new features before regular users get them, one needs to enable “First Release” in the Office 365 Admin Center. SwayAnother addition to the Office family, by the name of “Sway”, started a limited preview a couple of days ago. More information and some demos can be found here: https://sway.com/Keybase.ioAfter signing up some time ago, I finally received an invite for https://keybase.io. Keybase is an interesting approach to make public key cryptography more accessible to users, among many other features it provides&nbsp; a simple way of finding someone’s public key, based on their social media and web identities, in order to be able to encrypt messages for them. It is available as a command-line tool but the website works as client, too.View my publicly-auditable identity here: https://keybase.io/tomt So long,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lost-found-windows-tech-preview-delve-sway-and-keybaseio/\\\"},{  \\\"id\\\": \\\"post-scvmm-hyperv-script-to-reboots-vms-with-powershell\\\",  \\\"title\\\": \\\"SCVMM–HyperV Script to reboots VM’s with powershell\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Today I wondered that with Hyper-V there is no option to „reboot“ a VM with right clicking on it. With ESX I have the option to reboot the guest and so I created a script to schedule the reboot with the help of VMWare Powershell and VMWare tools.   The Hyper-V modules on SCVMM gives you the option to shut down and start a VM. Therefore I wrote a simple script that shutdown all VM machines in a specified list (you can use an argument if you want to work with multiple lists). The shutdown is initiated with the “-RunAsynchronously“ switch so that the Powershell command does not wait until the vm is powered off. Immediately after sending the shutdown command a “do while” loop begins to work and waits until one of the machines is powered off. If a machine is switched off the loop powers the VM machine on. The loop ends when all machines are started up.As I have also a VMWare vCenter connected in SCVMM I only touch VM machines with a filter: VirtualizationPlatform = “HyperV”   &#160;# Import Module   Import-Module -Name &quot;virtualmachinemanager&quot;# Clear Variables   [String[]] $VMsToStart = $Null# Get List of VM's to reboot   $VMsToReboot = Get-Content &quot;C:\\\\\\\\Program Files\\\\\\\\Scripts\\\\\\\\ServerList.txt&quot;# Shutdown each VM   Foreach($VMToShutdown in $VMsToReboot){    &#160;&#160;&#160; $VMToShutdownObject = Get-SCVirtualMachine $VMToShutdown    &#160;&#160;&#160; If ($VMToShutdownObject -ne $Null){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToShutdownObject.VirtualizationPlatform -eq &quot;HyperV&quot; -and $VMToShutdownObject.VirtualMachineState -eq &quot;Running&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Shutdown-VM -VM $VMToShutdownObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart += $VMToShutdown    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }Else{    &#160;&#160;&#160; Write-Verbose (&quot;Machine &quot; + $VMToShutdown + &quot; not found&quot;)    &#160;&#160;&#160; }    }# Start each VM after graceful shutdown   Do{    &#160;&#160;&#160; ForEach($VMToStart in $VMsToStart){    &#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMToStartObject = Get-SCVirtualMachine $VMToStart    &#160;&#160;&#160;&#160;&#160;&#160;&#160; If($VMToStartObject.VirtualMachineState -eq &quot;PowerOff&quot;){    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Start-VM -VM $VMToStartObject -RunAsynchronously    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $VMsToStart = $VMsToStart | ? {$_ -ne $VMToStart}    &#160;&#160;&#160;&#160;&#160;&#160;&#160; }    &#160;&#160;&#160; }    }while($VMsToStart.Count -ne 0)    \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/scvmm-hyperv-script-to-reboots-vms-with-powershell/\\\"},{  \\\"id\\\": \\\"post-lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode\\\",  \\\"title\\\": \\\"Lync 2013 backend on SQL Cluster with mixed authentication mode\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"en\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"So I came across this issue at a customer’s site the other day. EnvironmentThe customer runs multiple Lync 2013 Front End Servers in an enterprise pool with the backend and monitoring databases being hosted on a SQL 2008R2 Cluster (default instance) that is also used for other applications and, thus, uses mixed authentication mode.A SQL admin was present during the initial installation of the Lync Pool, and his credentials were used to perform the DB installation.ProblemSo far so good, but when the SQL admin was gone and the Lync Admins (members of RTCUniversalServerAdmins) tried to access the databases with cmdlets like Test-CsDatabase, Update-CsAdderssbook or Install-CsDatabase, they got a nasty little error like:Command execution failed: Property DefaultSchema is not available for Database '[LcsCDR]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.We verified the Logins and permissions on the SQL cluster and everything looked OK, meaning the logins and permissions for all the RTCUniversal… groups were there, just as expected. Still, the error would not go away.  The problem seems to be, that Active Directory groups cannot be used with mixed mode authentication??  Solution? The only solution we found, was to add the user account of the Lync Admin as a login on the SQL cluster and assign permissions directly to the user. Once the user was granted permissions directly (and not through an AD group membership), the error disappeared and the cmdlets worked just fine. This, by the way, explains why the initial setup worked just fine: The SQL admin, whose account was used during setup, had a login and permissions configured for his AD user. The solution is OK for a temporary workaround, but is not very feasible for an enterprise deployment. If anyone has a better solution, I’d love to hear from you :) &nbsp; Cheers,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode/\\\"},{  \\\"id\\\": \\\"post-moving-to-azure\\\",  \\\"title\\\": \\\"Moving to Azure…\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"… well there is not much more to say. We have been using aruba.it as hosting provider since the beginning of ntSystems info|tech in 2009. On the upside, their simple “hosting windows” plan worked pretty OK and was very affordable, on the downside, they didn’t really care to update the servers and were not able to provide us with IPv6 or a possibility to manage the DNS zone for ntsystems.it.So after testing out various platforms and providers Daniel and I decided to move the blog to Windows Azure. It’s simple, up to date and the new “shared infrastructure” pricing tier is not to expensive, either. We are now in control of the DNS zone and use CloudFlare to improve the sites performance and easily enable IPv6.As you may already have noticed, we took advantage of Azure’s up-to-date hosting platform to migrate to the latest version of the .NET blog engine. &nbsp;We hope you enjoy the new design as much as we do and continue to find our postings helpful and interesting :)Cheers!Tom \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/moving-to-azure/\\\"},{  \\\"id\\\": \\\"post-noop-and-nat-traversal\\\",  \\\"title\\\": \\\"NoOp and NAT Traversal\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"In a recent Lync project I came across an interesting issue with SIP Trunks, fortunately we had an AudioCodes SBC so there was a simple solution to the problem. Problem In some call-forwarding scenarios no audio connection could be established, a debug trace on the gateway would show no RTP packets at all.&nbsp;Signaling was working just fine, all the right IPs and Ports were listed within the SDP messages, as you see in the screenshot, though, no RTP packets can be seen.SolutionApparently the SIP provider used some kind of NAT or security device in front of their SIP equipment, and pinholes were only opened when this device received any incoming packets from our side of the communication.That’s when I learned about the “NoOpEnable” parameter which is designed for problems, just like this one. Once the “NoOpEnable” parameter is set to “True”, the SBC will send one RTP packet (with payload No-Op) to each IP involved in the session (retrieved from SDP). The following Screenshot shows another debug trace, please note the first to RTP packets:This did the trick, whatever device the remote side was using, it let RTP packets through once it received an incoming packet.For more Information on the No-Op Payload Type, check out the following IETF Draft: A No-Op Payload Format for RTPEnable NoOpThe NoOpEnable parameter can be configured using the devices AdminPage, which can be found at: https://&lt;IPAddress&gt;/AdminPage Another way, the one I prefer nowadays, is to use the SSH command-line interface, simply connect to the device using PuTTY or TeraTerm and use the following syntax:configure voip    media RTP-RTCP    &nbsp; no-operation-enable 1    &nbsp; activate&nbsp;Lessons learnedAlways use an SBC if dealing with SIP trunks :) &nbsp;Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/noop-and-nat-traversal/\\\"},{  \\\"id\\\": \\\"post-ipv6-im-unternehmen\\\",  \\\"title\\\": \\\"IPv6 im Unternehmen\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Network\\\"],  \\\"content\\\": \\\"In diesem Artikel versuche ich ein paar Argumente für IPv6 in Unternehmensnetzwerken zu erklären, die meisten Netzwerker und Admins mit denen ich zu tun habe sind verunsichert oder schlecht informiert und versuchen aus diesen und anderen Gründen IPv6 als unwichtig oder gar unnötig abzutun.Warum?Diese Frage hört man immer wieder, dabei gibt es einige Gründe die für IPv6 sprechen. Ich teile diese Frage in zwei Bereiche auf, IPv6 im Unternehmensnetzwerk und IPv6 im Internet. IPv6 im InternetViele neuen Trends in der IT haben eines gemeinsam: immer mehr Geräte wollen immer mehr Informationen an immer mehr Teilnehmer senden. Dazu werden immer mehr Verbindungen und immer mehr Adressen benötigt. Das Internet of Things, immer-online Smartphones und viele Cloud Produkte sind ohne IPv6 bereits jetzt schon nicht mehr denkbar. Facebook stellt derzeit sogar das interne Netzwerk wegen Adressmangel auf IPv6 um.Aus der Sicht eines Unternehmens ist IPv6 spätestens dann interessant, wenn man Geschäftspartner in Regionen mit wenigen öffentlichen IPv4 Adressen hat. So werden z.B. in Asien, Afrika und Osteuropa nur noch IPv6 Anschlüsse verkauft, nur selten ist es möglich einige IPv4 Adressen zu ergattern. Durch Übergangstechnologien (transition technology) bietet der Provider zwar die Möglichkeit weiterhin auf IPv4 Inhalte zuzugreifen, aber will man sich als Unternehmen wirklich darauf verlassen, dass potentielle Kunden und Partner die Website schon irgendwie erreichen werden? Dass Emails mit Aufträgen schon irgendwie ankommen werden?Um Problemen mit Übergangstechnologien (Tunneling, CGN…) aus dem Weg zu gehen, sollten bestimmte Dienste aus dem nativen IPv6 Netzwerk erreichbar sein. Die bereits angesprochenen Aufträge oder Webzugriffe sind dabei nur ein Grund, Mitarbeiter (und Führungskräfte) reisen in Regionen in denen IPv6 Internet bereits Normalität ist und auch von dort wollen diese auf das Firmennetzwerk zugreifen und Emails abrufen.Wegen des einfachen (und für den Benutzer kaum merkbaren) Fallbacks ist E-Mail ein Dienst, der relativ einfach über IPv6 erreichbar gemacht werden kann, hier profitiert man sofort von einer besseren Erreichbarkeit und kann den Umgang mit der Technologie lernen.IPv6 im internen NetzwerkBei der Entwicklung von Windows Vista und Server 2008 wurde der Netzwerkstack komplett neu geschrieben, dabei wurde großer Wert auf die Implementierung von IPv6 gelegt. So ist IPv6 ab Windows Vista/2008 nicht nur standardmäßig aktiv, es wird auch bevorzugt. Bekommt ein Client also sowohl ein IPv4 als eine IPv6 Adresse für eine DNS Abfrage zurück, versucht dieser die Verbindung über IPv6 zuerst.Da Windows XP hoffentlich nicht mehr zum Einsatz kommt, kann man davon ausgehen, dass in den meisten Unternehmen bereits jetzt IPv6 großflächig ausgerollt wurde! Leider passiert das häufig ohne detaillierte Planung und manchmal sogar ohne das Wissen der Admins bzw. Netzwerkverantwortlichen. Während das IPv4 Netzwerk genau geregelt wird, Firewalls und IPS Systeme in regelmäßigen Audits gecheckt werden, hat man einen zweiten, nicht berücksichtigen, nicht verwalteten Netzwerkstack. Aus Sicht der Netzwerksicherheit ist dies deshalb kritisch, weil Windows teilweise automatisch Tunnel aufbaut welche dem Client einen ungefilterten Zugriff auf das wachsende IPv6 Internet geben. Da IPv6 bevorzugt wird, kann man mit einem IPv6 “Router Advertisement” einfache Man-in-the-Middle Attacken ausführen und z.B. den gesamten Traffic eines Subnets über einen Proxy umleiten. Security Features wie DHCP Snooping und ARP Inspection sind weiterhin wichtig um das IPv4 Netzwerk zu schützen, in diesem Fall sind diese aber nutzlos.Spätestens zu diesem Zeitpunkt sollte man sich Gedanken über IPv6 machen! Man muss nicht gleich das gesamte Netzwerk umstellen, wichtiger ist eine genaue Planung und die Übertragung der bestehenden Sicherheitsrichtlinien auf IPv6.MigrationDas (langfristige) Ziel einer IPv6 Einführung ist die komplette Migration des Netzwerkes auf natives IPv6, trotzdem wird man IPv4 über eine lange Zeit weiter betreiben. Wie bei jeder Einführung oder Migration ist auch hier die Planung ein wichtiger, erster Bestandteil.Dabei sollten folgende Punkte berücksichtigt werden:   Adressplan: Welche IP Adressen, Subnets? Im Enterprise Umfeld Providerunabhängige Adressen    Übergangstechnologie: Nativ, Tunnel oder eine Mischung?    Bestehendes Equipment: Können benötigte Features abgebildet werden? Firmware Update nötig? Der erste Schritt bei der Einführung ist das Aktivieren des IPv6 Zugriffes am Übergangspunkt des Netzwerkes, hier muss in der Regel mit dem ISP gearbeitet werden. Sind Routing und Sicherheitsrichtlinien eingerichtet, kann IPv6 von außen nach innen ausgerollt werden. Beginnen sollte man mit einer Labor oder Testumgebung, diese kann in einer DMZ, nahe am Übergangspunkt angesiedelt werden, so kann man Erfahrungen sammeln ohne IPv6 ans letzte Ende des Netzwerkes zu transportieren.Nach ausgiebigem Test bieten sich E-Mail und DNS als erste Dienste an, die in einer produktiven Umgebung für IPv6 aktiviert werden können. Beide fallen ohne Probleme auf IPv4 zurück, sodass Benutzer im Problemfall nicht betroffen sein sollten.Ein weiterer interessanter Punkt sind Load Balancer oder Application Delivery Controller, diese veröffentlichen bereits jetzt Systeme und stellen eine Verbindung zwischen öffentlichem und privatem Netzwerk dar. In aktuellen Versionen bieten viele dieser ADCs die Möglichkeit auch über IPv6 mit dem öffentlichen Netzwerk zu kommunizieren. Verwendet der ADC eine Technologie wie NAT64 ist dies für den veröffentlichten Dienst (SharePoint, Exchange, Web…) transparent und dieser muss nicht geändert werden.Möglichkeiten und VorteileDie Einführung von IPv6 bietet, neben der Vielfalt an Adressen weitere Vorteile, so können Router z.B. schneller arbeiten da der IP Destination Header immer an derselben Stelle im Paket zu finden ist. Außerdem erledigen sich die Themen ARP und Broadcasts, für die Auflösung der L2 Adressen wird ICMPv6 verwendet, die sogenannte Neighbor Discovery findet immer über Multicast statt.Ein weiterer Punkt der in IPv4 Netzwerken häufig zu Problemen führt ist MTU und Paketfragmentierung, auch das gibt es in IPv6 Netzwerken nicht mehr. Über ICMPv6 wird die Path MTU ermittelt, so weiß der Client wie groß seine Pakete für den Server sein dürfen, bevor er diese losschickt.Die Automatische Konfiguration von Clients wird oft als Vorteil genannt, dies kann in kleineren Netzwerken sicher interessant sein, im Unternehmen wird es weiterhin DHCP und statische Adressierung für Server geben.Eine der größten Krücken und der Grund aus dem viele immer noch an IPv4 festhalten, ist NAT oder Network Address Translation. Diese Technologie hat es überhaupt erst ermöglicht die Einführung von IPv6 so lange hinaus zu zögern, gleichzeitig hat sie aber auch jede Menge Probleme für Applikationen mit sich gebracht. Mit einem global skalierbaren IPv6 Adressplan wird eine End-to-End Kommunikation von Geräten endlich möglich, das wechseln zwischen Netzwerken kann so für den Benutzer einfacher werden. In einer mobile-first Welt ein nicht unwichtiger Punkt ;)Natürlich ist auch Sicherheit ein wichtiger Aspekt und auch da bietet IPv6 einige Vorteile, so ist IPSEC z.B. standardmäßig implementiert und jeder Host kann (theoretisch) verschlüsselt kommunizieren. Allerdings sieht man auch hier, dass es sich schon um ein älteres Protokoll handelt, einige Standardheader gelten heute als unsicher und es gibt schon einen Nachfolger für Neighbor Discovery, SEND oder SEcure Neigbor Discovery.ProblemeWie bei jeder neuen Technologie gibt es auch bei der Einführung von IPv6 bestimmte Fallstricke, so kann es z.B. sein dass Clients zwar die IPv6 Verbindung bevorzugen, das Routing dafür aber einen weniger optimalen Pfad wählt und die Verbindung deshalb langsamer ist. Aktives Monitoring, saubere Dokumentation und gutes Configuration Management sind wie bei IPv4 unerlässlich. Hier gilt es bestehende Prozesse an die neue Technologie anzupassen. &#160;Einige hilfreiche Links zum Thema hab ich hier gesammelt: IPv6 Learning Resources&#160;Ich hoffe in diesem Artikel das Interesse an IPv6 geweckt zu haben :)Happy hacking!   Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/ipv6-im-unternehmen/\\\"},{  \\\"id\\\": \\\"post-work-folders-demo-mit-microsoft-azure\\\",  \\\"title\\\": \\\"Work Folders Demo mit Microsoft Azure\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Vor einigen Tagen wollte ich in einer Demo das neue Windows Feature “Work Folders” zeigen, da ich gerade keine passende Umgebung hatte, habe ich kurzerhand zwei virtuelle Maschinen in Microsoft Azure IasS gestartet.ÜbersichtDa es sich um eine einfache Demo handelt verwende ich nur zwei Server die ich aus dem Windows 2012R2 Image in Azure erstelle. Auf dem ersten werden die Rollen Domain Controller, ADFS, Zertifizierungsstelle und Work Folders installiert, der zweite wird als Web Application Proxy für die Veröffentlichung verwendet. Da die beiden Server miteinander kommunizieren sollen, verwende ich ein virtuelles Netzwerk in welches die beiden Server ausgerollt werden. Work FoldersWork Folders ist ein Feature von Windows 2012R2 und kann mit OneDrive/Dropbox verglichen werden. Work Folders bieten dem Benutzer eine einfache Möglichkeit auf Daten zuzugreifen und diese über mehrere Geräte zu synchronisieren. Leider gibt es derzeit nur Unterstützung für Windows 7 und 8/8.1, Clients für mobile Geräte wurden noch nicht angekündigt.Im ersten Schritt stufe ich den ersten Server zum Domain Controller hoch und installiere/konfiguriere die Zertifizierungsstelle. Eine spezielle Konfiguration dieser Rollen ist nicht notwendig, die einzige Anpassung ist das Erstellen eines neuen Zertifikattemplates welches später für die ADFS und WAP Zertifikate verwendet wird.DNSVor der Konfiguration der AD FS Rolle überlege ich mir einen Namen über welchen die Federation Services später erreichbar sein sollen, hier entscheide ich mich für adfs.uclab.eu. Damit ich interne Anfragen direkt zum AD FS Server leiten kann, erstelle ich ein DNS Zone für diesen Eintrag: Der A-Record verweist auf meinen Domain Controller und AD FS Server.AD FSNach der Installation der Active Directory Federation Services sind folgende Schritte für die Konfiguration notwendig.Ein Zertifikat mit dem Namen für die Federation Services sowie dem internen Servernamen wird angefordert. Hier verwende ich ein Kopie des WebServer Templates als Zertifikatsvorlage. Sobald das Zertifikat installiert wurde, kann die AD FS Farm installiert werden, dafür wird der Thumbprint der Zertifikates benötigt, diesen kann man sich per PowerShell einfach anzeigen lassen:Get-ChildItem Cert:\\\\\\\\LocalMachine\\\\\\\\my -DnsName adfs*Außerdem wird ein Service Account für den AD FS Dienst benötigt, dafür verwende ich ein normales AD User Account. Jetzt kann die Farm installiert werden, dabei wird das Service Account mit Get-Credential abgefragt:Install-ADFSFarm -CertificateThumbprint 9EA51F4DAA939C077602DF0B7EE7426F61E2DE0A -FederationServiceDisplayName \\\\\\\"Uclab Demo\\\\\\\" –FederationServiceName adfs.uclab.eu -OverwriteConfiguration -ServiceAccountCredential (Get-Credential) -ErrorAction Stop In der AD FS Management Konsole sehen die Federation Service Properties folgendermaßen aus:&nbsp;AD FS Relying TrustJetzt wird ein Relying Party Trust hinzugefügt, dazu klickt man in der AD FS Management Konsole mit rechts auf “AD FS” und wählt “Add Relying Party Trust”. Die Daten müssen manuell eingegeben werden, ein Name wird für den Trust gewählt. Das AD FS Profil wird verwendet, die Auswahl des Zertifikates für Token Signierung sowie die Konfiguration der URLs für WS-Federation und SAML können übersprungen werden.Als Identifikation muss “https://windows-server-work-folders/V1” verwendet werden. Multi Faktor Authentifizierung ist in meiner Demo nicht nötig und wird auch übersprungen. Der letzte Schritt kann auch übersprungen werden, anschließend wird der Trust erstellt. Jetzt müssen noch “Claim Rules” definiert werden. Folgende Attribute werden definiert: Jetzt müssen per PowerShell noch folgende Eigenschaften konfiguriert werden:Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -EnableJWT:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” –Encryptclaims:$false Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -AutoupdateEnabled:$true Set-ADFSRelyingPartyTrust -TargetIdentifier “https://windows-server-work-folders/V1” -IssueOAuthRefreshTokensTo:’AllDevices’Der AD FS Server ist jetzt soweit bereit für die Authentifizierung der Work Folders.File and Storage Services: Work FoldersJetzt kann die Work Folders Rolle installiert werden, das geht am schnellsten per PowerShell:Install-WindowsFeature –Name FS-SyncShareServiceNach der Installation erfolgt die Konfiguration der Work Folders über den Server Manager, die Konfiguration ist (wie die Server Rolle) unter “File and Storage Services” zu finden.Ein neuer “Sync Share” wird angelegt, hier wird ein lokaler Pfad für die synchronisierten Daten angegeben. Anschließend wird ausgewählt wie die Ordner auf dem Server benannt werden sollen: Dann können die Berechtigungen vergeben werden, Standardmäßig wird die NTFS Vererbung unterbrochen und der Benutzer erhält exklusiven Zugriff auf sein Sync Share. Über Client Richtlinien kann geregelt werden ob die Work Folder Dateien lokal verschlüsselt werden müssen und ob das Gerät mit einem Passwort gesperrt wird. Nachdem der Sync Share erstellt wurde, muss die Authentifizierung auf ADFS geändert werden, dazu muss man im Server Manager auf Server klicken und den lokalen Server auswählen, dann kann mit einem Rechtsklick “Work Folders Settings” ausgewählt werden:Ich gebe die vorher erstellte AD FS Farm für Authentifizierung an.  Web Application ProxyJetzt ist es an der Zeit den Reverse Proxy auf meinem zweiten Server zu installieren, dieser ist nicht Mitglied der AD Domain, die Authentifizierung erfolgt über AD FS.Noch auf dem Domain Controller fordere ich ein Zertifikat für den Proxy an, hier verwende ich wieder den Namen der AD FS Farm sowie einen weiteren Namen über den ich die Work Folders veröffentlichen werde: Dieses Zertifikat exportiere ich am Domain Controller und importiere es auf dem Reverse Proxy, da dieser nicht Mitglied der Domain ist, muss auch das Root Zertifikat importiert werden.Jetzt kann die Rolle Web Application Proxy installiert werden, diese geht wieder am schnellsten per PowerShell:Install-WindowsFeature –Name Web-Application-ProxyAnschließend wird die Rolle konfiguriert, dafür kann die “Remote Access Management Console” verwendet werden, da sich diese aber nach pre-Beta anfühlt bevorzuge ich auch hier PowerShell. Ein guter Tipp für unbekannte oder selten verwendete cmdlets ist “Show-Command” so kann man sich seinen Befehl einfach zusammenstellen: Der Befehl für die Konfiguration des Web Application Proxy ist dann:Install-WebApplicationProxy -CertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -FederationServiceName adfs.uclab.eu -FederationServiceTrustCredential (Get-Credential)Nun kann die Work Folder Applikation erstellt werden, auch dafür verwende ich wieder “Show-Command” um den PowerShell Befehl zu erstellen.Der Befehl für das veröffentlichen der Applikation ist:Add-WebApplicationProxyApplication -BackendServerUrl https://wfdemo.intra.uclab.eu -ExternalCertificateThumbprint 9D082F66864E3BD9A575AC429BA12130E89CFEE2 -ExternalUrl https://workfolders.uclab.eu -Name WorkFolders -ADFSRelyingPartyName WorkFolders -ExternalPreauthentication ADFS –UseOAuthAuthenticationNachdem die Applikation über den WAP veröffentlich wurde, muss diese nur noch von außen erreichbar gemacht werden. Dazu werden in der öffentlichen DNS Zone zwei CNames erstellt, einen für die AD FS Farm den anderen für den Namen der Work Folders. Diese CNames zeigen auf den Cloud Service der Reverse Proxy VM in Microsoft Azure. Der Reverse Proxy bekommt einen HTTPS Endpunkt und wird somit erreichbar gemacht: DEMONach all diesen Schritten wird es Zeit die AD FS Authentifizierung zu testen, dazu kann folgende URL verwendet werden:https://adfs.uclab.eu/adfs/ls/idpinitiatedsignon.htm  Das sieht schon mal gut aus, also können wir die Work Folders testen, diese finden sich in der Systemsteuerung: Die URL für die veröffentlichte Applikation wird angegeben, es gibt die Möglichkeit diese in der Registry oder einem AD Attribut für Auto Discovery zu hinterlegen, beide Varianten sind aber nur auf Domain Clients interessant. Für die Anmeldung werde ich auf AD FS umgeleitet: Dann kann ich einen lokalen Speicherort auswählen und werde auf die Richtlinien hingewiesen:  In der Übersicht sieht man Status der Synchronisation und den verfügbaren Speicherplatz am Server. Viel Spaß mit den Work Folders und ein schönes, langes Wochenende :)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/work-folders-demo-mit-microsoft-azure/\\\"},{  \\\"id\\\": \\\"post-activedirectory-displayname-mit-umlauten-und-audiocodes-isdn\\\",  \\\"title\\\": \\\"ActiveDirectory DisplayName mit Umlauten und AudioCodes ISDN\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Vor einigen Tagen bin ich in einem Lync Projekt auf das Problem gestoßen, dass bestimmte Benutzer keine Anrufe in das PSTN (ISDN E1) tätigen konnten. Der Kunde setzt ein AudioCodes Gateway ein, die Syslogs des Gatways sind zur Fehlersuche sehr gut geeignet. Das Gateway bekommt die SIP Signalisierung von Lync sowie die Q.931 Signalisierung aus dem ISDN mit.Nach kurzer Suche hat sich herausgestellt, dass Benutzer welche keine Anrufe tätigen konnten, folgenden Fehler verursachten:&lt;132&gt;[S=831454] Error Indication: Last Command (Primitive) was not performed due to cause 100  [Trunk:0 Bchannel:1 ConnID:2] [Code:0x23127] &lt;133&gt;[S=831455] (   lgr_psbrdex)(833974    )   recv &lt;-- UnHandled event: EV_ISDN_ERROR_INDICATION (317) &lt;133&gt;[S=831456] [SID:766997237] (   lgr_psbrdex)(833975    )   pstn recv &lt;-- CALL_RELEASED Trunk:0 Conn:2 RetCause:73 NetCause:255 &lt;132&gt;[S=831457] REPORT_TYPE_ERROR_IN: ErrorCauseString = Incorrect parameter type, DiagnosticString= Condition unknown, ErrorCause = d, Diagnostic =  [Trunk:0 Bchannel:-1 ConnID:-1] [Code:0x23127] &lt;133&gt;[S=831458] [SID:766997237] (   lgr_psbrdif)(833976    )   pstn send --&gt; PlaceCall: Trunk:0 BChannel:1 ConnID:2 SrcPN=xxx SrcSN= DstPN=151xxxxxxxx DstSN= SrcNT=4 SrcNP=1 SrcPres=0 SrcScrn=0 DstNT=2 DstNP=1 ServiceCap=M RdrctNum= RdNT=0 RdNP=0 RdPres=0 RdScrn=0 RdRsn=-1 Excl=1 Display=Müller, Max IE= UUIE=0, RawData:0 CLIRReason:-1 OrigPN= OLI=-1 OffhookInd=0 &lt;133&gt;[S=831462] [SID:766997237] (   lgr_psbrdif)(833980    )   Abnormal Disconnect cause:255#?reason(255)? Trunk:0 Conn:2Die Normalisierung der Nummern ist bei allen Benutzern identisch, daran konnte es nicht liegen, nach einiger Zeit ist mir aufgefallen, dass Benutzer die keine Anrufe tätigen konnten einen Umlaut im Active Directory Anzeigenamen hatten… Dieser Namen wurde bei einem Benutzer zu Testzwecken umbenannt und schon konnte dieser auch telefonieren.LösungDas Attribut DisplayName bei allen Benutzern zu ändern kam natürlich nicht in Frage, glücklicherweise gibt es eine Einstellung auf dem AudioCodes Gateway mit der man das Verhalten steuern kann.Eine Möglichkeit ist es, den Calling Name nicht ins ISDN zu signalisieren, dazu kann man den Parameter Remove Calling Name auf dem entsprechenden Trunk auf Enable setzen.Alternativ kann über die AdminPage (oder die INI Datei) der Parameter ISO8859CharacterSet auf “0” gesetzt werden, dieser ändert die Umlaute in Latin-Only Zeichen, so wird “ä” zu “a”, “ö” zu “o” usw…Dieser Parameter kann auch über das CLI gesetzt werden, dazu verbindet man sich per SSH auf das Gateway. Die Einstellung versteckt sich hier:configure voip  gw digitalgw digital-gw-parameters   iso8859-charset no-accentedTom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/activedirectory-displayname-mit-umlauten-und-audiocodes-isdn/\\\"},{  \\\"id\\\": \\\"post-app-v-and-the-start-menu-folder-redirection-issue\\\",  \\\"title\\\": \\\"App-V and the start menu folder redirection issue\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"AppV\\\",\\\"en\\\"],  \\\"content\\\": \\\"If you are using redirected start menu and App-V you might get into some issues with the management of the App-V application shortcuts. First let&rsquo;s start with some background information.Start Menu The Windows start menu is located in the following folder&hellip;. If you are using folder redirection, you can redirect the folder to a fileserver. This is a very often seen scenario in RDS and Citrix deployments.App-V and the Start Menu When you publish an application for a group of users, App-V can create the folder and shortcuts in the start menu. You can manage this in the management website from App-V.App-V and the System Account After you install the App-V Client on your desktop or terminalserver machine, you can find the following service &ldquo;Microsoft App-V Client&rdquo; in the services. The App-V Client services runs with the local system account. If you change this account to a domain user account with the needed permissions, you get errors when publishing / un-publishing applications.The issue: You are using redirected start menu and remove an user from an App-V publishing group. The App-V Client does not delete the programs folder and shortcuts in the users start menu.The reason is, that the local System account, under which the App-V Client services runs, doesn&rsquo;t have the permissions to delete the folder and shortcuts from the fileserver where your start menu is located.There are 2 work around1. Don&rsquo;t redirect the start menuIf you don&rsquo;t use start menu redirection, you don&rsquo;t run into this issue2. Redirect the start menu and use a script to delete death program shortcutsI don&rsquo;t want to disable the start menu redirection and wrote a script to find &ldquo;death&rdquo; shortcuts and delete them with the appropriate folder. You can specify the following script as user logon script:Start-Sleep -Seconds 10$ErrorActionPreference = \\\\\\\"SilentlyContinue\\\\\\\" $StarMenuPath = \\\\\\\"REDIRECTED_FOLDER\\\\\\\" + [Environment]::UserName + \\\\\\\"\\\\\\\\Start Menu\\\\\\\"$Shortcuts = gci $StarMenuPath -Recurse -Filter \\\\\\\"*.lnk\\\\\\\" ForEach ($Shortcut in $Shortcuts) { &nbsp;&nbsp;&nbsp; $WshShell = New-Object -ComObject WScript.Shell &nbsp;&nbsp;&nbsp; $LocalAppDataPath = $env:LOCALAPPDATA &nbsp;&nbsp;&nbsp; $Link = $WshShell.CreateShortcut($Shortcut.Fullname) &nbsp;&nbsp;&nbsp; $PathToApp = $Link.TargetPath &nbsp;&nbsp;&nbsp; $PathToApp = $PathToApp.replace(\\\\\\\"C:\\\\\\\\Windows\\\\\\\\system32\\\\\\\\config\\\\\\\\systemprofile\\\\\\\\AppData\\\\\\\\Local\\\\\\\",$LocalAppDataPath) &nbsp;&nbsp;&nbsp; IF((!(Test-Path $PathToApp)) -and ($PathToApp.Contains(\\\\\\\"AppV\\\\\\\"))){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-item -LiteralPath $Shortcut.Fullname -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = $Null &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $RemainingFiles = gci $Shortcut.Directory.FullName -Recurse &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If($RemainingFiles -eq $Null){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Remove-Item $Shortcut.Directory.FullName -Force &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; } }Microsoft will fix this I opened a MS call and last week I got an email that the issue for this problem will be fixed in the upcoming Spring release.Greetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/app-v-and-the-start-menu-folder-redirection-issue/\\\"},{  \\\"id\\\": \\\"post-lync-sip-inter-domain-federation-with-cisco-unified-presence-2\\\",  \\\"title\\\": \\\"Lync: SIP inter-domain federation with Cisco Unified Presence - 2\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"In my last post I went through the required configuration steps on the Cisco Unified Presence Server, in this post I will cover the Lync Server configuration as well as some troubleshooting aspects.Lync configurationOn the Lync server side we have to create a trusted application pool along with a trusted application in order for Lync to accept SIP requests from the CUPS. This is done using the Lync Server Management Shell:New-CsTrustedApplicationPool -Identity cups.tomt.local -Registrar lync01.tomt.local -ThrottleAsServer $true -TreatAsAuthenticated $true -OutboundOnly $false -RequiresReplication $false -Site 1 New-CsTrustedApplication -TrustedApplicationPoolFqdn cups.tomt.local -Port 5062 -ApplicationId CUPSAfter that we need a static route pointing to the CUP Server so that Lync knows where to find Users within a certain address space (@tomt.local in our case).$r = New-CsStaticRoute -TLSRoute -Destination cups.tomt.local -Port 5062 -MatchUri tomt.local -UseDefaultCertificate $true      Set-CsStaticRoutingConfiguration -Route @{Add=$r}Note: As we are using TLS as transport protocol, we create a new TLSRoute, the destination parameter specifies where requests for a certain domain (MatchUri) are routed to, as always with TLS, the common name of the certificate must match the FQDN entered as destination. I am using Port 5062 because that is the default port for the “Peer Authentication Listener” on CUP. Once this configuration is in place, we need to make sure the Lync Server trusts the certificate used on the CUPS, so I made sure the CA that issued the CUPS certificate was present in the Lync Servers “Trusted Roots” store.Nice work, Lync users can now see Cisco users presence states and they can even chat with each other :) &#160; Ok, now that we have a working configuration, let’s have a look at troubleshooting.Problem PointsNote: This post is in progress, I will add more troubleshooting steps over the next couple of days.I will list some of the more problematic points here, so just in case you have a half working configuration, make sure to check for the following issues:Unsupported CertificateIf the Lync Server certificate does not include the Enhanced Key Usage of “Client Authentication”, the TLS handshake fails. As the error occurs before the two systems are speaking SIP, we will have to rely on NetMon or Wireshark to troubleshoot the TLS Handshake, sure enough it shows an “Encrypted Alert”:&#160; In the Binary data of the handshake we can see the alert value is 2B (hex) which translates to decimal 43 an means: unsupported certificate. So to fix this, re-issue the Lync Server certificate (Default, Web Services don’t matter here) and make sure the template includes the Client Authentication enhanced key usage.Lync Client signs out when searching for federated userThis is one of the oddest behaviors of the Lync 2013 clients that I have ever seen. A Lync user searches for another user which is homed on the Cisco Unified Presence server. As soon as the user completes the entry of the sip address (and the Lync Server sends a SUBSCRIBE message to the CUPS) the Lync user is signed out of the client.Same thing happens if a CUPS user sends an IM to the Lync user. The Lync client log shows that CUPS is trying to do MD5 authentication (yes md5 in 2014….) and that the Lync Clients handles this by signing out.### client error log ###Check the ACL configuration on the CUP Server, all Lync Servers and Clients must be excluded from MD5 authentication. Also check that your static Route on Lync points to the Peer Authentication listener.&#160;So long,    Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-2/\\\"},{  \\\"id\\\": \\\"post-lync-sip-inter-domain-federation-with-cisco-unified-presence-1\\\",  \\\"title\\\": \\\"Lync: SIP inter-domain federation with Cisco Unified Presence - 1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"As a consultant I do have the pleasure to be working with new customers on a regular basis. Recently I had the interesting request to make Lync 2013 talk to a Cisco Unified Presence 9.1 server. The goal for the customer was, to provide Lync users with the presence information available in the Cisco world.Luckily the configuration was setup with multiple domains, Lync using the public (tomt.it) and Cisco Unified Presence using an internal only (tomt.local) domain. What’s possible?Before you get your hopes to high, here goes a quick list of what functionality will be available, once the federation is in place.   Presence     Contact List (users from both domains can add each other)     IM (Peer to Peer only)  That’s it. Sure you can use Jabber to make your Cisco Desk Phone call a Lync endpoint, if you have a SIP trunk configured between the two systems, but that’s got nothing to do with the presence federation.Basic TopologyThe topology I was working with, consisted of a single Lync 2013 Standard Edition Front End Server with an associated Edge server. Lync was completely configured and operational, the SIP domain I’m going to use in this example is: @tomt.itThe Cisco Unified Presence Server was a standalone box, too. It was hooked up to a clustered CUCM installation, though that should not matter in this example. The SIP domain on the CUPS was @tomt.localAll of my test VMs are located in the 10.1.1.0/24 subnet.CUPS configurationThere are a couple of requirements on the Cisco side of things. First let’s talk certificates.The recommended configuration uses TLS as transport for the federation, not only is it more secure, it’s interesting enough that it’s easier to setup, too.So we need a certificate on the Unified Presence server, to complete this step, log in to the “OS Administration” website of the CUP Server, to connect to the OS Administration website, use /cmplatform. Once signed-in, go to Security, Certificate Management and:    Import the internal certification authority’s certificate to CUPS. Select the Type: “cup-trust”     Create a new certificate signing request (CSR). Select the Type: “cup”     Issue the certificate using a template that uses Server Authentication and Client Authentication as “Enhanced Key Usage”. Note: You’ll need a CA running on Windows Server Enterprise Edition for that, the default WebServer template does not include Client Authentication.     Import the issued certificate on the CUPS. Select the Type: “cup”  After that, my Certificate Management looked like this: The next step is setting up the SIP Federation, this requires you to log-in to the “IM and Presence Administration” website, it can be found at /cupadmin.Using Presence, Inter-Domain Federation, SIP Federation, Federated Domain we add the Lync Servers SIP Domain (tomt.it) as inter-domain federation:Note: Some documentation state that you need to check the “Direct Federation” box, I found that it will work either way. If someone with CUP knowledge reads this, please do get in touch.The next step is setting up a static route from the CUP Server to Lync. This is done using the Presence, Routing, Static Routes menu. We configure a destination pattern with an associated next hop and transport protocol, do note the notation used for the destination pattern! Important: Select TLS as “Protocol Type” and User as the “Route Type”. 5061 is the default port on which a Lync Server will listen for TLS requests.While we are in the “IM and Presence Administration” there are another couple of things to configure:The Lync Servers FQDN (i.e the Common Name on the Lync Pools Certificate) must be added as TLS Peer Subject using System, Security, TLS Peer Subjects:Then, using System, Security, Peer Auth Security Context add the newly created TLS Peer Subject: Also make sure to check the “Disable Empty TLS Fragments” box and add the TLS_RSA_WITH_3DES_EDE_CBS_SHA cipher to selected ciphers.Still in System, Security we need to configure ACLs. The ACLs are not traditional ACLs which allow or block IP:Port combinations, these are used to configure whether or not a communication partner has to be authenticated using MD5. Neither Lync Servers nor Lync Clients support SIP Digest authentication using MD5, so we need to make sure that they will not be prompted for authentication:The following show my incoming and outgoing ACL entries:The last configuration step on the CUP Server is to update the public FQDN using System, Service Parameters, Federation Routing Parameters:Note: The documentation and help context for this parameter state that it should not be changed, although I found the Federation Routing FQDN will be used in the Record-Route Header (maddr field) and if Lync does not have a Trusted Application Pool for this FQDN, communication will fail.Lastly we’ll have to restart some services on the CUP Server in order for the configuration changes to become active. To do this, we need to log-in to the “IM and Presence Serviceability” website, which can be found at /ccmservice.Navigate to Tools, Control Center, Feature Services and restart SIP Proxy Service, then navigate to Tools, Control Center, Network Services and restart the XCP Router Service.Ok, so that’s it on the Cisco side of things. Click here for the Lync Server Configuration.Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-1/\\\"},{  \\\"id\\\": \\\"post-lync-conf-2014-keynote\\\",  \\\"title\\\": \\\"Lync Conf 2014 Keynote\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Gestern wurde die zweite Lync Conference in Las Vegas er&ouml;ffnet. In der Keynote gab es einige interessante Ank&uuml;ndigungen:Skype und MobileUnter anderem hat Derek Burney die lange erwartete Video Kommunikation mit Skype demonstriert. Weitere Infos dazu gibt&rsquo;s auf dem Skype Blog und auf dem Offical Microsoft Blog, hier schreibt der neue (alte) Pr&auml;sident der Lync &amp; Skype Engineering Gruppe, Gurdeep Singh Pall auch &uuml;ber weitere Ziele. Die Unterschiede in Bedienung und Funktion der Technologien die wir im privat- bzw. Arbeitsleben einsetzen, sollen wegfallen. Der Fokus liegt auf Work-Life-Balance und sogenannten Digital Natives.All diese &Auml;nderungen und Ziele werden unter dem neuen Schlagwort Universal Communications zusammengefasst.In einer weiteren Demonstration wurde das Lync Mobile App f&uuml;r Android Tabled vorgestellt, dieses soll in den n&auml;chsten Monaten ver&ouml;ffentlicht werden. Damit gibt es mobile Clients f&uuml;r:Windows Phone 8Windows 8.1 / Windows RTiOS: iPhone und iPadAndroid: Phone und TabletInteropInteressant f&uuml;r viele Kunden mit bestehenden Videokonferenzsystem d&uuml;rfte der &ldquo;Interop Server&rdquo; sein, dieser soll als Bestandteil der n&auml;chsten Lync Server Version ausgeliefert werden und erm&ouml;glicht u.a. die Anbindung von Tandberg VTC an Lync.VideoSeit einiger Zeit wird das Thema WebRTC mehr oder weniger hei&szlig; diskutiert, es w&auml;re sicher interessant wenn anonyme Benutzer ganz ohne Plug-in an einer Konferenz teilnehmen k&ouml;nnten. Nun konnte sich die Industrie allerdings noch nicht wirklich auf einen gemeinsamen Weg einigen, dementsprechend wenig Informationen gab es &uuml;ber die Demo eines Video Gespr&auml;ches direkt im Browser.Bei der Technologie handelt es sich um einen Javascript Wrapper f&uuml;r die Unified Communications Web API (http://ucwa.lync.com), welche Codecs verwendet wurden und ob ein Plug-in ben&ouml;tigt wird, hat Derek allerdings nicht angesprochen.Lync OnlineAuch f&uuml;r das Cloud Angebot hat Microsoft ein neues Feature angek&uuml;ndigt, so soll es Unterst&uuml;tzung f&uuml;r Meetings mit bis zu 2000 Teilnehmern geben. Die Unterst&uuml;tzung f&uuml;r Enterprise Voice in der Cloud wurde erneut angek&uuml;ndigt, auch hier fehlen weitere Details.Die Keynote wurde aufgezeichnet und kann hier angesehen werden.http://www.lyncconf.comNa dann, willkommen im Zeitalter der Universal Communications :)Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-conf-2014-keynote/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-update-hybridconfiguration\\\",  \\\"title\\\": \\\"Exchange 2010 Update-HybridConfiguration\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Office365\\\",\\\"de\\\"],  \\\"content\\\": \\\"Ein schneller Tipp für Hybrid-Admins ;)Beim ausführen des Hybrid Configuration Wizard auf einem Exchange 2010 Server tritt folgender Fehler auf:Fehler beim Aktualisieren der Hybridkonfiguration: 'System.Management.Automation.Remoting.PSRemotingTransportException: Beim Ausführen von Daten vom Remoteserver ist folgender Fehler aufgetreten: [ClientAccessServer=DB3PR05CAXXX,BackEndServer=db3pr05mbXXX.eurprd05.prod.outlook.com, RequestId=ce4f8474-2bcc-4b3b-b4e4-5089f60f2372,TimeStamp=2/11/2014 10:11:28 AM] The request for the Windows Remote Shell with ShellId FC244D6B-C78E-4605-B7E1-91A480CD914B failed because the shell was not found on the server. Possible causes are: the specified ShellId is incorrect or the shell no longer exists on the server. Provide the correct ShellId or create a new shell and retry the operation. Weitere Informationen finden Sie im Hilfethema &quot;about_Remote_Troubleshooting&quot;.&lt;/p&gt;    Weitere Informationen zur Fehlerbehebung finden Sie in der Protokolldatei &quot;Update-HybridConfiguration&quot; unter C:\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V14\\\\\\\\Logging\\\\\\\\Update-HybridConfiguration\\\\\\\\HybridConfiguration_2_11_2014_10_10_45_635277102457617512.log.&lt;/code&gt;  Wieder mal hat das Problem mit den unterschiedlichen Datumsformaten zu tun, der Server hatte deutsche Regionaleinstellungen.      Diese müssen auf English (USA) geändert werden und schon läuft der Wizard ohne Probleme durch.  Gruß,   Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-update-hybridconfiguration/\\\"},{  \\\"id\\\": \\\"post-lync-2013-hosting-pack-v2-and-skype-federation\\\",  \\\"title\\\": \\\"Lync 2013 Hosting Pack v2 and Skype federation\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"With the hosting pack v2 for Lync 2013 Microsoft made the Skype federation available for hosting environments. To configure the federation, follow the official Microsoft guide.If you have configured Skype federation, you have to enable Federation on to tenant:Import-Module LyncOnline Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowFederatedUsers $true Set-CsTenantFederationConfiguration -Tenant [TenantID] -AllowPublicUsers $trueIf you try to send some IM&rsquo;s to a Skype user, you get the following error message in the OCS loggerms-diagnostics: 27000;reason=\\\\\\\"To-Uri Domain is not in the sender-tenant allow list\\\\\\\";To get the federation working, you have to add the following domains to the tenant allow list. This is the way Microsoft do this on Office 365.$d1 = New-CsEdgeDomainPattern -Domain \\\\\\\"br.live.com\\\\\\\" $d2 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.ch\\\\\\\" $d3 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.co.il\\\\\\\" $d4 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.co.jp\\\\\\\" $d5 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.co.th\\\\\\\" $d6 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.co.uk\\\\\\\" $d7 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.com\\\\\\\" $d8 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.com.ar\\\\\\\" $d9 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.com.tr\\\\\\\" $d10 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.es\\\\\\\" $d11 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.de\\\\\\\" $d12 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.fr\\\\\\\" $d13 = New-CsEdgeDomainPattern -Domain \\\\\\\"hotmail.it\\\\\\\" $d14 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.at\\\\\\\" $d15 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.be\\\\\\\" $d16 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.ca\\\\\\\" $d17 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.cl\\\\\\\" $d18 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.cn\\\\\\\" $d19 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.co.in\\\\\\\" $d20 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.co.kr\\\\\\\" $d21 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.co.uk\\\\\\\" $d22 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.co.za\\\\\\\" $d23 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com\\\\\\\" $d24 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.ar\\\\\\\" $d25 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.au\\\\\\\" $d26 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.co\\\\\\\" $d27 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.mx\\\\\\\" $d28 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.my\\\\\\\" $d29 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.pe\\\\\\\" $d30 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.ph\\\\\\\" $d31 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.pk\\\\\\\" $d32 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.pt\\\\\\\" $d33 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.sg\\\\\\\" $d34 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.com.ve\\\\\\\" $d35 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.de\\\\\\\" $d36 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.dk\\\\\\\" $d37 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.fr\\\\\\\" $d38 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.hk\\\\\\\" $d39 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.ie\\\\\\\" $d40 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.in\\\\\\\" $d41 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.it\\\\\\\" $d42 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.jp\\\\\\\" $d43 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.nl\\\\\\\" $d44 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.no\\\\\\\" $d45 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.ph\\\\\\\" $d46 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.ru\\\\\\\" $d47 = New-CsEdgeDomainPattern -Domain \\\\\\\"live.se\\\\\\\" $d48 = New-CsEdgeDomainPattern -Domain \\\\\\\"livemail.com.br\\\\\\\" $d49 = New-CsEdgeDomainPattern -Domain \\\\\\\"livemail.tw\\\\\\\" $d50 = New-CsEdgeDomainPattern -Domain \\\\\\\"messengeruser.com\\\\\\\" $d51 = New-CsEdgeDomainPattern -Domain \\\\\\\"msn.com\\\\\\\" $d52 = New-CsEdgeDomainPattern -Domain \\\\\\\"passport.com\\\\\\\" $d53 = New-CsEdgeDomainPattern -Domain \\\\\\\"sympatico.ca\\\\\\\" $d54 = New-CsEdgeDomainPattern -Domain \\\\\\\"tw.live.com\\\\\\\" $d55 = New-CsEdgeDomainPattern -Domain \\\\\\\"webtv.net\\\\\\\" $d56 = New-CsEdgeDomainPattern -Domain \\\\\\\"windowslive.com\\\\\\\" $d57 = New-CsEdgeDomainPattern -Domain \\\\\\\"windowslive.es\\\\\\\" $d58 = New-CsEdgeDomainPattern -Domain \\\\\\\"outlook.com\\\\\\\" Greetings nd\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-hosting-pack-v2-and-skype-federation/\\\"},{  \\\"id\\\": \\\"post-lync-client-certificate-warning-exchange-autodiscover\\\",  \\\"title\\\": \\\"Lync Client certificate warning Exchange Autodiscover\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"I’ve seen this problem at a customer the other day, even though I had a solution to fix it, I do still not fully understand why it happens. So I’m going to document it here, we’ll see if that sheds more light… :)The Problem As the title implies, the problem is similar to this one I described earlier, it does however also affect Lync 2010 clients. Once signed-in, the Lync Client will show a certificate warning, indicating that it wants to connect to some Exchange Server but the certificate was not ok, only after double (triple) checking, the certificate really was ok.BackgroundSure enough, the problem only appears in certain environments, the one I was in used different domains for the SIP address and the users primary SMTP address. So, here goes an example:UserPrincipalName: user@contoso.com     PrimarySMTPAddress: user@contoso.com     msRTCSIP-PrimaryUserAddress: user@fabrikam.comWhen this users signs into Lync, the client will perform an Exchange Autodiscover request, in order to retrieve the Exchange Web Services Endpoint. The certificate used on the Exchange Server had the following attributes:CN=exchange.contoso.com    DNS=exchange.contoso.com     DNS=exchange.fabrikam.com     DNS=….Now the warning in the Lync Client says there was a problem connecting to exchange.contoso.com, even though the certificates CN was exactly the same name, that the client tired to reach. Makes sense? Not to me…WorkaroundThe workaround I described in the earlier article still applies, just add the Exchange Servers domain to the clients TrustModelData registry entry. The registry key locations change depending on the client version:            Lync 2010                 HKEY_CURRENT_USER\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Communicator\\\\\\\\TrustModelData                         Lync 2013                 HKEY_CURRENT_USER\\\\\\\\Software\\\\\\\\Policies\\\\\\\\Microsoft\\\\\\\\Office\\\\\\\\15.0\\\\\\\\Lync                         Type        Reg_SZ                  Value        contoso.com contoso.eu        So if anyone has more information on this one, please do get in touch.Cheers,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-client-certificate-warning-exchange-autodiscover/\\\"},{  \\\"id\\\": \\\"post-migration-ntsystems-mail-von-aruba-nach-office-365\\\",  \\\"title\\\": \\\"Migration: ntSystems Mail von Aruba nach Office 365\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Office365\\\"],  \\\"content\\\": \\\"Nachdem einigem &uuml;berlegen haben wir uns entschieden Mail f&uuml;r die Domain ntsystems.it nach Office 365 zu migrieren. Wir verwenden einen E1 Plan, dieser bietet f&uuml;r 6,5&euro; pro User und Monat eine Exchange Mailbox, Lync, SharePoint und SkyDrive sowie Yammer.ArubaDer aktuelle Provider (und auch Hoster dieser Seite) ist Arbua. An dieser Stelle muss ich sagen, dass wir bisher zwar keine gr&ouml;&szlig;eren Probleme mit unseren Mails hatten, das Mail System allerdings nicht mehr wirklich zeitgem&auml;&szlig; ist, so fehlen z.B. Features wie Kalender, Active Sync und die Anmeldung erfolgt standardm&auml;&szlig;ig &uuml;ber http (ja richtig, unverschl&uuml;sselt. Im Jahr 2014.). Freundlicherweise wird ein Link zu einer &ldquo;Secure Version&rdquo; angezeigt&hellip;DNSEs gibt leider kein Angebot von Aruba, bei dem WebHosting und das Verwalten der DNS Zone m&ouml;glich w&auml;ren. Nach einigem hin und her, konnte ich den Support schlie&szlig;lich dazu bewegen, die ben&ouml;tigten DNS Eintr&auml;ge f&uuml;r Office 365 zu erstellen. Damit die Domain zu Office 365 hinzugef&uuml;gt werden kann, muss zun&auml;chst ein TXT Record mit einem von Microsoft vorgegebenen Wert erstellt werden:Type: TXT Name: @ TXT Value: MS=ms93664998 TTL: 1 HourJetzt kann die Domain verifiziert werden, sobald dieser Vorgang abgeschlossen ist, k&ouml;nnen Benutzer hinzugef&uuml;gt werden. Diesen Schritt habe ich &uuml;bersprungen und stattdessen der Domain ein Verwendungszweck zugewiesen. In unserem Fall: Exchange Online.Sobald der Verwendungszweck ausgew&auml;hlt ist, werden weitere DNS Eintr&auml;ge ben&ouml;tigt, diese sind:&nbsp;Auch diese Eintr&auml;ge hat der Support freundlicherweise erstellt, wichtig ist hierbei, dass Office 365 die Eintr&auml;ge &uuml;berpr&uuml;ft, der MX Eintrag muss also die Priorit&auml;t 0 haben und auch der TTL Wert muss &uuml;bereinstimmen, damit die Domain hinzugef&uuml;gt werden kann.MailEine serverseitige Migration der Inhalte war nicht m&ouml;glich, Inhalten konnten &uuml;ber einen Client (Outlook) oder &uuml;ber das &ldquo;Connected Account&rdquo; Feature von Office 365, &uuml;bernommen werden. Mit diesem Feature kann ein Benutzer bis zu f&uuml;nf Postf&auml;cher zu seinem Office 365 Konto hinzuf&uuml;gen. Unterst&uuml;tzt werden Konten die POP oder IMAP unterst&uuml;tzen.Viele Gr&uuml;&szlig;e aus der Cloud :) Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migration-ntsystems-mail-von-aruba-nach-office-365/\\\"},{  \\\"id\\\": \\\"post-connect-to-office-365-with-powershell\\\",  \\\"title\\\": \\\"Connect to Office 365 with Powershell\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Office365\\\"],  \\\"content\\\": \\\"In this Post I explain how to connect to Office 365 with Powershell and manage Exchange and Lync.1. Install Microsoft Online Services Sign-In Assistant for IT Professionals BETA http://www.microsoft.com/en-us/download/details.aspx?id=392672. Install the Office 365 cmdlets http://go.microsoft.com/fwlink/p/?linkid=2362973. Set Execution Policy to Remote Signed Set-ExecutionPolicy RemoteSignedExchange Online4. Connect to Exchange OnlineImport-Module MSOnline $ExchangeOnlineCred = Get-Credential $ExchangeOnlineSession = New-PSSession &ndash;ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell -Credential $ExchangeOnlineCred -Authentication Basic -AllowRedirection Import-PSSession $ExchangeOnlineSession -AllowClobber Connect-MsolService &ndash;Credential $ExchangeOnlineCredNow you are connected to Exchange Online:Lync Online4. Install Windows PowerShell Module for Lync Online http://www.microsoft.com/en-us/download/details.aspx?id=393665. Connect to Lync OnlineImport-module lynconlineconnector $LyncOnlineCred = Get-Credential $LyncOnlineSession = New-CsOnlineSession -Credential $LyncOnlineCred Import-PSSession $LyncOnlineSessionGreetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/connect-to-office-365-with-powershell/\\\"},{  \\\"id\\\": \\\"post-import-certificate-to-rd\\\",  \\\"title\\\": \\\"Import Certificate to RD\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2012\\\",\\\"en\\\",\\\"Server-2012-R2\\\",\\\"RDS\\\"],  \\\"content\\\": \\\"With Server 2012 the MMC “Remote Desktop Session Host Configuration” doesn’t exist anymore. If you want to import a specific certificate to the RD Session Host you can do the following:1. Import the certificate to the machines personal store2. Then use the following commands to import the certificate to the Session Host:$pass = ConvertTo-SecureString “CERTIFICATE-PASSWORD” -AsPlainText –Force    $thumbprint = (Import-PfxCertificate -Password $pass -CertStoreLocation cert:\\\\\\\\localMachine\\\\\\\\my -FilePath '\\\\\\\\\\\\\\\\LocationToCertificate\\\\\\\\certificate.pfx').thumbprint    $path = (Get-WmiObject -class &quot;Win32_TSGeneralSetting&quot; -Namespace root\\\\\\\\cimv2\\\\\\\\terminalservices -Filter &quot;TerminalName='RDP-tcp'&quot;).__path    Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash=&quot;$Thumbprint&quot;}Now the certificate is imported.Greetings   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/import-certificate-to-rd/\\\"},{  \\\"id\\\": \\\"post-pal-performance-analyse\\\",  \\\"title\\\": \\\"PAL: Performance Analyse\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Exchange\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Neulich bin ich über ein interessantes Codeplex Projekt gestolpert, Performance Analysis of Logs (PAL) ToolHier handelt es sich um ein Tool, welches Perfmon Dateien (.blg) auswerten und einen schönen Report generieren kann. Interessant ist die Möglichkeit “Threshold files” zu auszuwählen, diese werden Teilweise mitgeliefert oder können selbst hinzugefügt werden. In diesen XML Dateien sind Performance Counter und entsprechende Schwellwerte hinterlegt.InstallationDie Installation erfolgt typischerweise auf einer Workstation, folgende Komponenten werden benötigt:   .NET Framework 3.5    Microsoft Chart Controls for Microsoft .NET Framework 3.5 (Download) Das PAL Tool selbst ist ein Instsaller der aus Codeplex heruntergeladen werden kann. Die Installation erfolgt nach C:\\\\\\\\Program Files\\\\\\\\PAL\\\\\\\\PAL\\\\\\\\ wo auch die mitgelieferten XML Dateien abgelegt werden. Weitere Threshold Files findet man z.B. in der TechNet Gallery, hier der Linkfür den Lync Server 2013.AnalyseInteressant an den XML Dateien ist, dass man daraus Templates für Perfmon Data Collector Sets erstellen. Man muss also nichtmehr mühsam Counter aus der Produtkdoku suchen und diese dann einzeln hinzufügen, es reicht PAL (PALWizard.exe) zu starten und im Reiter “Threshold File” auf “Export Perfmon template” zu klicken.&#160;Aus diesem Template erstellt man dann ein Data Collector Set auf den Systemen die analysiert werden sollen, die Standardwerte für den Dateipfad und die Laufzeit des Sets sollte noch angepasst werden. Ist die Datensammlung abgeschlossen, wird die .blg Datei wieder auf die Workstation mit dem PAL Tool kopiert.Die .blg Datei wird im PAL Tool ausgewählt: Anschließend müssen im Reiter “Questions” noch drei Fragen zu den analysierten Servern beantwortet werden: Unter “Output Options” wird das Verzeichnis angegeben in welchem die Reports erstellt werden sollen.Viel Spaß,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/pal-performance-analyse/\\\"},{  \\\"id\\\": \\\"post-windows-azure-point-to-site-vpn\\\",  \\\"title\\\": \\\"Windows Azure – Point to Site VPN\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Cloud\\\"],  \\\"content\\\": \\\"An interesting feature in Windows Azure is the possibility to expand the local network to the Cloud. This feature comes in two options, a site-to-site tunnel can be created, as well as a simple client VPN, or point-to-site connection. A site-to-site tunnel is configured on a firewall device or router within the corporate network, essentially connecting the Cloud like any other remote site. This post is about clients connecting to the Cloud, so called point-to-site VPN connections. This feature might be of less interest to corporate customers, however, I find it quite cool for lab and dev/test scenarios.Azure Virtual NetworkTo get started we need to configure a virtual network in Windows Azure, chances are that if you have been using Azure virtual machines, you might already have a virtual network configuration. It is required to have VMs communicate with one another.So, in the management portal, create a new virtual network using the “Custom Create” option. After specifying a Name and Affinity Group, configure the DNS Server, this will be the DNS Server for the virtual machines in this virtual network. A quick hint: Azure virtual machines cannot be configured with static IP addresses, but the address assignment always starts with .4, so the first virtual machine that is started will get the .4 address. I do make sure to start my DNS server before starting anything else. Since we are configuring point-to-site VPN, we need to check the corresponding check box. In the next screen we are configuring an IP address range that will be used by the virtual network. This is not yet the subnet for the VM, it is just the address range within which the individual subnets will be created. And in the last screen we are actually configuring the subnets. We need one ore more subnets (within the address range configured before) for the virtual machines, as well as a “Gateway subnet”. This subnet will be used for the gateway. Once the virtual network has been created, we need to add a subnet for the VPN clients that will connect to the virtual network. This is done using the “Configure” tab in the virtual network’s properties. The last step is to create the gateway, using the “Create Gateway” button in the “Dashboard” tab of the virtual network. This process creates the required configuration within Windows Azure, an IP address and a hostname are assigned for clients to connect. Voila, that’s it from a network configuration point of view. AuthenticationNow when Clients are connecting to a VPN some form of authentication is required, in our case of point-to-site VPN, the Azure virtual network uses an SSTP connection with certificates for authentication.The first step is to upload the Certification Authority’s certificate (public key) to the virtual network. Certificates issued by this CA can then be used to authenticate and connect to the VPN. I am using my lab CA and had to install the CA certificate in my clients “Local Machine” trusted root store. After uploading the CA certificate, I requested a new certificate for my user account (using the “User” template). In order to connect to the virtual network in the Azure Cloud one last step is required, we need to download the Client VPN package which is available in the “Dashboard” tab in the virtual network configuration. The installation is simple and once installed, a new VPN connection will be available. And that’s it. Now I am able to connect my notebook to the Azure virtual network, making it possible to connect “directly” to the VMs running in the Cloud :)A quick ipconfig shows that my client got an IP address from the address range I configured earlier, the DNS servers have been assigned, too.&#160;&#160;Ok, enough for tonight, time to get my head out of the clouds :-)    Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-azure-point-to-site-vpn/\\\"},{  \\\"id\\\": \\\"post-cng-certificates-and-lync-tmg\\\",  \\\"title\\\": \\\"CNG Certificates and Lync/ TMG\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"The other day I had a problem assigning certificates to a Lync 2013 Edge Server, today I had the same thing with TMG 2010. Here’s a quick summary, and the solution ;)ProblemI tried to assign an existing certificate to a Lync Edge Server. It did not work using the Deployment Wizard, I tried the PowerShell command and it didn’t work, either.Every time I tried to “Set-CsCertificate” I would get the following error:„Set-CsCertificate: Command execution failed: The buffer supplied to a Function was too small.”Kind of the same thing happened with TMG Server, I tried to assign a certificate to a Web Listener and it would not show up in the Wizard. When I unchecked the “Show only valid Certificates” checkbox, the certificate in question would show with an Error saying:“Incorrect Key Type”SolutionThe solution is to export the certificate, including private key, to a .pfx file. Copy the .pfx file to some workstation with Firefox installed and import the certificate in Firefox. Now use Firefox to “backup” the certificate, this will create a .p12 file, again containing the private key. Copy the .p12 file back to the Server delete the existing certificate and then import the .p12 file using MMC Certificates.Warning: Before deleting the certificate from the Server, make sure you have a working backup (like the .pfx file) or you will have to get a new one.Try to assign the Certificate to a Lync Service or a TMG Web Listener and enjoy.I realize that this sounds pretty silly at first, if you want more detail, keep on reading :)BackgroundIf you are still reading, there is a little more information for you. The certificates in question were using something called “Cryptography Next Generation”, which seems to be some new set of APIs that was introduced in Windows Vista and Server 2008. When creating a custom certificate request, one can select the “Template” to use, this is not the certificate template, but the “Crypto Provider” if you will.The certificates that I mentioned, have all been requested using the CNG Template. Importing/ Exporting them in Firefox seems to fix this, maybe because Firefox prefers CAPI over CNG? If you have any information on this topic, please leave a comment.More info on Crypto Next Generation is available on TechNet: http://technet.microsoft.com/en-us/library/cc730763(WS.10).aspxCheers,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/cng-certificates-and-lync-tmg/\\\"},{  \\\"id\\\": \\\"post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-2\\\",  \\\"title\\\": \\\"How to build an UAG 2010 Array for Exchange publishing–Part 2\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\",\\\"Lync\\\",\\\"uag\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Finally I finished Part 2 of the UAG 2010 publishing post. I spent days with the UAG configuration to publish Exchange 2013 in the right way but with no success. There are some problem with Lync and OWA that I cannot fix. I decided to disable URL filters. Now my Exchange publishing works and in this final post I explain how my configurations looks like.First step is to create a new Trunk for Exchange publishingThen you have to create the Applications for Exchange. First create the Outlook Web Access Application:Select the Exchange CAS Servers or the CAS Server VIP.Configure the authentication and authorize all users.Next step is to rerun the Wizard to publish Outlook Anywhere and Exchange Active Sync.Configure Authentication, Kerberos for OWA and Basic for AutodiscoverDon&rsquo;t forget to configure SPN&rsquo;s and delegation in ActiveDirectory for Kerberos to work. You can export the settings needed into an LDIF File with the &ldquo;Export KCD settings&rdquo; wizard in UAG and import it in AD. Or you can set the SPN&rsquo;s manually:You can check the SPN&rsquo;s and export the file:When you created the applications you have an application list like this:Configure Portal Homepage Change the Portal Home page and uncheck display Home Page within portal frameDisable component installation To prevent UAG installing the client, disable component installation.Redirect HTTP to HTTPSTo redirect HTTP connections to HTTPS create the redirection Trunk in the &ldquo;HTTPS Connections&rdquo; section and select the Exchange Trunk.&nbsp;The basic configuration is done and Exchange is now published via UAG. But there are some issues:Lync: Lync Clients cannot get autodiscover settings In my environment Lync clients couldn&rsquo;t get the autodiscover configuration from Exchange. After checking the UAG logs I noticed that UAG has a problem when Lync announces his Client Agent.Solution: Disable scripting on the trunkOWA: 500 error message when you open another mailbox from OWA In my environment it was not possible to open another users mailbox without getting the following 500 error message:Solution: Disable &ldquo;verify URLs&rdquo; on the OWA ApplicationConclusionI&rsquo;m sure with deeper troubleshooting there must be exist a better way to fix this errors but in my opinion UAG is not the right product for publishing Exchange. Better you use a load balancer or II ARR. I my next publishing post I explain how to publish Exchange 2013 with Citrix Netscaler.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-2/\\\"},{  \\\"id\\\": \\\"post-connect-sharepoint-2013-with-exchange-2013-to-sync-tasks\\\",  \\\"title\\\": \\\"Connect Sharepoint 2013 with Exchange 2013 to sync tasks\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\",\\\"Sharepoint\\\"],  \\\"content\\\": \\\"To sync Tasks with Exchange and Sharepoint 2013 some base functionality has to be prepared:- Running user profile synchronization - Work management service deployed - SSL for the Web Application with valid certificateUser profile synchronization There are some nice how to&rsquo;s how to get this service running. In simple words you need an user account that has &ldquo;Replicating Directory Changes&rdquo; rights in ADThen you have to start the User Profile Service Application in the Sharepoint Central Administration.If everything works both ForeFront Services are running and you can configure the user profile service.&nbsp;Work management The Work management Service application doesn&rsquo;t need extra configuration. It only has to be deployed and working. On Technet is a short description how to create this service application.http://technet.microsoft.com/en-us/library/fp161254.aspxSSLThe Web Application needs to be SSL enabled. This can be done easily in IIS by enabling the HTTPS binding:To verify that this works you can check if the Exchange server can access the AuthMetadataUrl with the browser. AuthMetadataUrl: https://intranet.domain.local/_layouts/15/metadata/json/1If you can access the 1.json file without authentication this step worked.Tip: If you have to enter credentials, check the authentication methods in IIS for the Web Application. Anonymous needs to be activated:&nbsp;Now you can connect Sharepoint with Exchange:On Sharepoint 2013 1) Download EWSManagedAPI.msi from http://www.microsoft.com/en-us/download/details.aspx?id=35371 2) Install the EWS API with the following switches: msiexec /i EwsManagedApi.msi addlocal=\\\\\\\"ExchangeWebServicesApi_Feature,ExchangeWebServicesApi_Gac\\\\\\\" 3) Reset IISOn Exchange 2013 1) Switch to the following directory: C:\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V15\\\\\\\\Scripts 2) Configre Enterprise Partner Application .\\\\\\\\Configure-EnterprisePartnerApplication.ps1 -ApplicationType Sharepoint -AuthMetadataUrl https://intranet.domain.local/_layouts/15/metadata/json/1You should get the following outputNow you are able to sync Tasks with Sharepoint and Exchange 2013:Tip: If this does not work and - you are not in the same Domain with Exchange (maybe in a subdomain) - you have an error with Exchange Autodiscover in the Sharepoint logs - you have authentication errors with Exchange in the Sharepoint logs  check that your subdomain (for example subdomain.domain.local) is added to the accepted domains in Exchange.Greetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/connect-sharepoint-2013-with-exchange-2013-to-sync-tasks/\\\"},{  \\\"id\\\": \\\"post-activesync-devices-ask-for-authentication\\\",  \\\"title\\\": \\\"ActiveSync devices ask for authentication\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"One of the first steps in an Exchange 2010 to 2013 migration is to make Exchange 2013 internet facing to handle the requests from external and internal clients.After my first attempt to switch from Exchange 2010 CAS and TMG to UAG and Exchange 2013 CAS servers on the frontend I noticed that some Android and iPad ActiveSync users got authentication requests.First thing I checked was the eventlog on the CAS machines and if the inheritance was enabled on the user accounts. Both were ok so I began to check the IIS logs first on the 2013 and then on the 2010 machine because the 2013 CAS proxies the requests to the 2010 CAS.On the 2013 CAS I could see that this users tried to logon but the session ended with a HTTP 401 (Unauthorized) Error:On the CAS 2010 I checked the logs and filtered users and time when they tried to logon. The result was that in the IIS logs the domain of the users that did not sync was different from the users that worked.User1 &ndash;&gt; domain\\\\\\\\User1 User2 &ndash;&gt; domain.local\\\\\\\\User2 User3 &ndash;&gt; domain.local\\\\\\\\User3I checked the devices of User2 and User3 and find out that the domain was missing in the account settings. Previously when Exchange 2010 with TMG were internet facing, TMG made this stuff working.To get this fixed with Exchange and UAG you can set the default domain in IIS on the Exchange 2013 CAS servers if the device does not send the domain.After an IIS reset the devices can successfully connected.Greetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/activesync-devices-ask-for-authentication/\\\"},{  \\\"id\\\": \\\"post-lync-2013-survivable-branch-server-installation\\\",  \\\"title\\\": \\\"Lync 2013 Survivable Branch Server – Installation\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"de\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Nach dem Planen und Veröffentlichen der Topologie kann der Server installiert werden. Wie bereits erklärt, werden nicht alle Lync Rollen installiert, weshalb die Liste der Systemvoraussetzungen deutlich kürzer ausfällt:Windows 2012 SystemvoraussetzungenAdd-WindowsFeature Windows-Identity-FoundationSobald die Windows Identity Foundation installiert ist, kann das Lync Setup wie gewöhnlich ausgeführt werden. Dafür wird der Deployment Wizard verwendet und im ersten Schritt der lokale “Configuration Store” installiert.Anschließend werden im Schritt zwei und drei die Lync Komponenten installiert und ein Zertifikat zugewiesen. Das Zertifikat fällt auf dem Survivable Branch Server deutlich einfacher aus, was wieder auf die reduzierten Serverrollen zurückzuführen ist. Webservices und Lyncdiscover werden nicht installiert, je nach DNS Konfiguration muss man allerdings den Eintrag für SIP berücksichtigen. In meinem Lab sieht das sieht das Zertifikat so aus:CN = ly15-sba.tomt.local      DNS Name = ly15-tomt.local       DNS Name = sip.tomt.itIst das Zertifikat zugewiesen, können die Dienste gestartet werden, der Erfolg wird am Besten per PowerShell überprüft:Get-CsWindowsServiceInfrastrukturDie Verfügbarkeit von Infrastrukturdienste wie DNS und DHCP muss in Außenstellen natürlich auch berücksichtigt werden.Gibt es in der Außenstelle Telefone mit Lync Phone Edition sollte der DHCP Dienst lokal verfügbar sein, sonst verlieren diese Telefone bei Ablauf der Leases die Verbindung.Die DHCP Optionen werden dabei folgendermaßen konfiguriert:Option 42 (NTP): lokaler NTP Server, z.B. Router      Option 43 (Certificate Provisioning): Front End Server, ly15.tomt.local       Option 120 (SIP Registrar): SBS, ly15-sba.tomt.local&lt;/p&gt;    DHCPUtil -SipServer ly15-sba.tomt.local -WebServer ly15.tomt.local&lt;/code&gt;  Bei DNS kann man nicht immer eine separate Konfiguration darstellen, gibt es einen Domain Controller in der Außenstelle, stellt dieser für gewöhnlich die Active Directory integrierte Zone zur Verfügung. Das ist für Lync allerdings kein Problem, für das WebTicket benötigt der Client ohnehin eine Verbindung zum Front End Server. Wird der Benutzer dann auf den SBS verschoben, teilt der Lync Front End Server das im Anmeldeprozess mit.  Benutzer  Wenn der Survivable Branch Server einsatzbereit ist, können Benutzer auf diesen verschoben werden um von der höheren Verfügbarkeit zu profitieren. Dies kann über das Lync Server Control Panel oder die Lync Management Shell gemacht werden:  Move-CsUser –Identity user10@tomt.it –Target ly15-sba.tomt.local  Dieser Befehl verschiebt den Benutzer user10 auf den SBS. Der Anmeldeprozess am Client sieht jetzt folgendermaßen aus:  Das Erste REGISTER geht an den Lync Front End Server (10.1.1.27), dieser wurde über DNS Autokonfiguration ausgewählt, der Dienst Eintrag für _sipinternaltls.tomt.it zeigt nach wie vor auf diesen Server.     Der Front End Server antwortet mit einem “301 Redirect” und teilt dem Client seinen Home Server für die Anmeldung mit. Der Client sendet dann erneut ein REGISTER an diesen neuen “Home Server” (10.1.1.21).     Nach der erfolgreichen Anmeldung sehen wir in den Konfigurationsinformationen, dass der Client mit dem SBS Pool verbunden ist (Connected Lync Server). Außerdem fällt hier auf, dass der Client nach wie vor die Web Services des zentralen Lync Pools (Front End Server) nutzt.    Fällt die WAN Verbindung (oder der Lync Pool) aus, wechselt der Client in einen Modus mit eingeschränkter Funktionalität und zeigt eine Warnung an. Diese erinnert den Benutzer, dass er zwar seine Buddy Liste verliert, allerdings nach wie vor telefonieren kann. In diesem Fall ist es vorteilhaft wenn der Client ein lokales Adressbuch hat, die Client Policy für Benutzer auf dem SBS sollte entsprechend konfiguriert werden.    Natürlich kann auch der SBS ausfallen, in diesem Fall meldet sich der Lync Client wieder am Front End Server an und kann weiterhin die kompletten Features nutzen.  &#160;  Grüße,    Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-survivable-branch-server-installation/\\\"},{  \\\"id\\\": \\\"post-hyper-v-general-access-denied-error\\\",  \\\"title\\\": \\\"Hyper-V General access denied error\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Hyper-V\\\"],  \\\"content\\\": \\\"Like many others in the ITPro world, I am using many VMs to demo, learn, troubleshoot all different kinds of products and customer scenarios. I also mess with the disk files a lot. Every now and then I get the following error when trying to start a VM:Hyper-V Manager &lt;/p&gt;    An error occurred while attempting to start the selected virtual machine(s).     'dc02' failed to start. (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02' Microsoft Emulated IDE Controller (Instance ID 83F8638B-8DCA-4152-9EDA-2CA8B33039B4): Failed to Power on with Error 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02': IDE/ATAPI Account does not have sufficient privilege to open attachment 'C:\\\\\\\\Users\\\\\\\\Public\\\\\\\\Documents\\\\\\\\Hyper-V\\\\\\\\Virtual hard disks\\\\\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708)     'dc02':&#160; Account does not have sufficient privilege to open attachment 'C:\\\\\\\\Users\\\\\\\\Public\\\\\\\\Documents\\\\\\\\Hyper-V\\\\\\\\Virtual hard disks\\\\\\\\dc02_2.vhdx'. Error: 'General access denied error' (0x80070005). (Virtual machine ID F4E4E8F0-99BF-4282-99E3-F57AE7AC8708) &lt;/code&gt;  Problem  The problem is rather simple, and since Hyper-V has been around for some time now, it should also be well-known to most of us: The VM does not have the necessary (read, write) permissions to use the assigned .vhd or .vhdx disk. So how do you restore the permissions?  Solution  As always, there are many solutions, one could use Hyper-V manager, remove the disk from the affected VM and then add it again. You could even use icacls to somehow get the ACLs right.  Or, simply use my Restore-VMPermission script :)  It’s a PowerShell script that can be used to easily restore permissions for a specific VM (or all VMs) on your Lab Host, it requires the Hyper-V PowerShell Module to get the VMId and then builds the required ACE and adds it to the virtual disk file’s ACL.  As always, please don’t use this in production without thoroughly testing. This is meant for Lab environments.  Verify  Just try to start your VM again, or have a look at the .vhd or .vhdx files security settings and find a similar looking entry:     &#160;  so long,    tom \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-v-general-access-denied-error/\\\"},{  \\\"id\\\": \\\"post-lync-2013-survivable-branch-server-planung\\\",  \\\"title\\\": \\\"Lync 2013 Survivable Branch Server – Planung\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Immer häufiger ersetzen Unternehmen klassische Telefonanlagen (PBX) mit Unified Communications Lösungen wie Microsoft Lync. Da Telefonie immer schon gute Verfügbarkeit hatte, müssen in der Lync Umgebung Konzepte her um diesen hohen Anforderungen gerecht zu werden.Für das Rechenzentrum In Außenstandorten sieht das meist anders aus, durch die Zentralisierung der IT-Dienste gibt es wenige (oder gar keine) Server und kein Personal das sich um die Wartung einer komplexen Umgebung kümmern kann. Die Clients in der Außenstelle hängen also von einer zuverlässigen Verbindung zum Rechenzentrum ab. Fällt diese Verbindung aus, ist der Lync Pool nicht mehr erreichbar und somit auch Telefonie nicht mehr verfügbar.Survivable Branch…?Genau in diesen Szenarien kommen Survivable Branch Server oder Applicances ins Spiel. Diese werden eingesetzt um Telefonie in Außenstellen unabhängiger von der Verbindung in das Rechenzentrum zu machen.Folgendes Schaubild habe ich im TechNet gefunden, Benutzer die sich in der “Branch Site” aufhalten sollen weiterhin telefonieren können, wenn die WAN Verbindung (und dadurch der Lync Pool) nicht verfügbar ist. Features wie Konferenzen, Response Groups oder die Buddy List sind bei einem Ausfall der WAN Verbindung trotz SBS nicht verfügbar, es geht hier nur um Telefonie.Quelle: http://technet.microsoft.com/en-us/library/gg398095.aspxDie Grundvoraussetzung ist natürlich eine Verbindung in das Telefonnetz, die von der WAN Verbindung unabhängig ist. Üblicherweise hat man dafür einen Amtsanschluss und ein passendes Media Gateway in der Außenstelle. Appliance oder Server?Eine Survivable Branch Appliance ist, wie der Name schon sagt, eine Hardware Appliance. Diese kommt entweder direkt mit dem PSTN Gateway oder wird nachträglich eingebaut. Auf der Appliance läuft ein Windows Server, bei der Einrichtung werden die benötigten Lync Rollen installiert.Ein Survivable Branch Server ist ein “normaler Server” (auch virtuell) auf dem die benötigten Lync Rollen installiert werden.Bei beiden varianten, SBA und SBS, wird kein vollständiger Lync Front End Server, sondern “nur” die Rollen Mediation Server und Registrar, installiert. So erklärt sich auch, warum ein SBS zwar die Telefonie aufrechterhalten, aber z.B. keine Konferenzen hosten kann.Eine SBA kann für Außenstellen mit bis zu 1000 Benutzern verwendet werden, während ein SBS bis zu 5000 Benutzer bedienen kann.Beide Varianten benötigen keine Lync Server Lizenz, Windows muss natürlich entsprechend lizenziert werden.VorbereitungWie immer bei Lync, muss man die Konfiguration erst mal im Topology Builder planen, bevor es an die Installation geht.Wir erstellen also eine neue “Branch Site” in der Topologie, dabei vergeben wir einen Namen und weitere Eigenschaften wie City, State und Country. Die Branch Site wird immer einer Central Site zugewiesen:Die Checkbox für “Open the new SBA wizard…” ist Standardmäßig aktiv. Für die Lync Topologie gibt es den Unterschied zwischen SBS und SBA nicht, wir legen also im nächsten Schritt den FQDN für unseren SBS fest: Clients in der Branch Site benötigen Zugriff auf einen Front End und Edge Pool für die meisten Funktionen, diese Pools werden im Wizard angegeben: Im letzten Schritt wird das Gateway angegeben, welches in der Außenstelle für Telefonie verwendet wird:&#160;Die Topologie muss veröffentlich werden, bevor der Survivable Branch Server installiert werden kann, auch dieser holt sich die Informationen über die zu installierenden Rollen aus dem Central Management Store. Achtung: Das Computerkonto für den SBS sollte vor dem veröffentlichen der Topologie existieren, da einige Active Directory Berechtigungen gesetzt werden. Gibt es das Konto noch nicht, protokolliert der Topology Builder eine Fehlermeldung. Sobald der SBS Mitglied der Domain ist, muss die Topologie erneut veröffentlicht werden.Im nächsten Beitrag installieren wir die Lync Rollen auf dem Survivable Branch Server und schauen uns die Funktionalität der Clients an.   Schönes Wochenende!    Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-survivable-branch-server-planung/\\\"},{  \\\"id\\\": \\\"post-lync-private-line\\\",  \\\"title\\\": \\\"Lync Private Line\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"I was at a customer’s site the other day when we he received the following request.ProblemUser A (the Boss) forwards his phone to User B (the Assistant). As someone calls the Boss, obviously the Assistants phone rings and she picks it up, it turns out the caller is important and needs to talk to the Boss. The Assistant transfers the call to the Boss… and that’s it. Since the Bosses phone is forwarded, nobody will be able to reach him.Interestingly, in the ancient PBX world there was a “feature” (I’d call it bug) where the Assistant could “break through” the forwarding setting and therefore transfer calls to the Boss.After bouncing some ideas we came up with a pretty simple solution. As the title implies, it makes use of Private Line feature in Lync 2013.SolutionAfter some testing we configured a Private Line on the Bosses account and again, set up call forwarding to the Assistant in his Lync client.Now, if someone calls the Boss, the Assistants phone would ring. If the caller wants to talk to the Boss, the Assistant can now simply forward the call to the Bosses private line. Call forwarding settings are not applied to this line, so his client would ring and he would be able to take the call. Alternative solutionsSure enough, there is no “one” solution, other possibilities would be the use of the Delegate or even Team Call features. In this particular case, though, we decided to use the Private Line.Update: Another solution for this particular problem would be to have the Boss configure the Assistant as his delegate, and the configure “Forward to Delegate” in her Lync Client. This enables User B to put calls through to User A, even though User A’s client is configured to forward calls. You can use my wrapper script for SEFAUtil to configure this, too..\\\\\\\\Invoke-SefaUtil.ps1 –Server ly15.tomt.local –UserName boss@tomt.it –AddDelegate assistant@tomt.it –FwdToDelegates Thanks to @jpborth for pointing this out!ConfigurationThe Private Line feature requires Lync Server 2013, and is not exposed in the Lync Control Panel. The Set-CsUser cmdlet is used to configure a private line for a user:Set-CsUser –Identity boss@uclab.eu –PrivateLine “tel:+39123123”Note: TechNet says, private line is new in Lync 2013, next time I’m in a pure 2010 environment, I’ll check if this feature can be configured on Lync 2010, too.&#160;so long,    tom \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-private-line/\\\"},{  \\\"id\\\": \\\"post-updated-invoke-sefautil\\\",  \\\"title\\\": \\\"date_modified: Invoke-SEFAUtil\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"PowerShell\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Some weeks ago, I’ve written about my PowerShell wrapper function for SEFAUtil.exe, the original post can be found here: /post/Invoke-SEFAUtil-a-PowerShell-wrapper-function.aspxGUIFirst of all, in case you haven’t seen it yet, MVP Johan Veldhuis created an AWESOME GUI wrapper. Check it out: http://johanveldhuis.nl/en/sefautil-gui/If you still want to run it via PowerShell, keep on reading ;)Updated ScriptAfter playing around with my script I figured it would be cool if it would return more “PowerShell like” objects instead of the plain text returned by sefautil.exe. I also wanted it to take pipeline input and updated the related links to point to a help page instead of the blog article. Turning a bunch of strings into a PowerShell objectLooking at the text output of the tool, we can see it has a format of “description : value”. Sample output:User Aor: sip:ttorggler@uclab.eu      Display Name: Thomas Torggler       UM Enabled: True       Simulring enabled: False       User Ring time: 00:00:30       Call Forward No Answer to: voicemailAs they have the same structure, this does immediately bring PowerShell dictionaries (hashtables) to mind. I simply used the –split method to split the strings at “: “ (colon space) and saved the result to a new array.$SEFAResultSplit = $SEFAResult -split ': 'This worked as expected, so I went ahead and created my custom object like this:$data =&#160; @{$SEFAResultSplit[0] = $SEFAResultSplit[1];      $SEFAResultSplit[2] = $SEFAResultSplit[3];       }After testing it in the lab, I realized, even though this worked, it was less then ideal. Sefautil returns a dynamic amount of strings depending on which features are configured for the given user. So while it was reasonably sure that ”$SEFAResultSplit[0]” would always be “User Aor”, I would have no way of knowing the value of the next strings. And, more importantly, I would not know how many strings to expect, a more dynamic approach was needed.This is what I came up with after some serious head scratching:for ($i = 0; $i -lt $SEFAResultSplit.Count; $i++) {      &#160;&#160;&#160; if ([bool]!($i%2)) {       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $j = $i + 1       &#160;&#160;&#160;&#160;&#160;&#160;&#160; $outData += @{$SEFAResultSplit[$i] = $SEFAResultSplit[$j]}       &#160;&#160;&#160; }       }And here is what it does: The array that contains the split strings would always contain the “description” at an even number while the actual values would be found at odd numbers. So, the script loops through the array, and for each even number it creates a new “Key : Value” pair that is saved to a hash table. Whatever object in the array is at the even index number would be used as key, and that even number +1 would be used as value. Sweet.Why?Well, first of all, because it’s cool ;)Then, think about this:Get-CsUser –OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\\\\\Invoke-SEFAUtil.ps1 –Server ly15.tomt.local | Where-Object {‘Simulring enabled’ –eq $true}First the Get-CsUser cmdlet is used to get all users within a specified organizational unit, the user objects are then piped into my wrapper script and the output can be filtered just like any other PowerShell output. Of course it could also be converted to html or exported to csv, the point is returning objects instead of text.Sure enough, we can now also take advantage of pipeline input processing to set call forwarding settings for multiple users:Get-CsUser -OU &quot;OU=users,OU=Italy,DC=tomt,DC=local&quot; | .\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate user1@tomt.itAgain, we use Get-CsUser to get some Lync Users and pipe them to the script, which adds user1@tomt.it as a delegate to the every one of the users. DownloadI’ve updated the script on my Sky Drive, find a link at the new help page.Cheers,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/updated-invoke-sefautil/\\\"},{  \\\"id\\\": \\\"post-exchange-unified-messaging-sprachauswahl\\\",  \\\"title\\\": \\\"Exchange Unified Messaging Sprachauswahl\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Lync\\\",\\\"Exchange\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Seit Exchange 2007 integriert die Unified Messaging Rolle klassische Anrufbeantworter in Exchange und schafft so eine neue, “unified” Mailbox für Benutzer.Seit es die Exchange Unified Messaging Rolle gibt, kann man diese durch die Installation von Sprachpaketen anpassen. In diesem Post beschreibe ich eine Änderung in der Funktionsweise die mir in den vergangen Tagen einiges an Kopfzerbrechen bereitet hat.SzenarioAnhand folgender Test Benutzer versuche ich das Verhalten in den jeweiligen Exchange Versionen zu erklären. “Bekannt” und “Unbekannt” bezieht sich hier auf die Exchange Umgebung, “bekannt” heißt der Benutzer hat eine Mailbox, die für UM aktiviert wurde, in der Exchange Umgebung, “unbekannt” heißt er hat keine Mailbox.In dem Beispiel wurde das Sprachpaket für Deutsch auf dem Exchange UM Server installiert, außerdem gibt es einen Exchange Dial Plan, die Standardsprache des Dial Plans ist Deutsch.Benutzer A = bekannt, Regionaleinstellung: Deutsch    Benutzer B = bekannt, Regionaleinstellung: Englisch     Benutzer C = Unbekannt, z.B. Partner, KundeSubscriber Access: Ein bekannter Benutzer ruft eine in Exchange konfigurierte Nummer an, um auf seine Mailbox zuzugreifen.Call Answering: Ein bekannter oder unbekannter Benutzer wird auf ein UM Postfach weitergeleitet, da der ursprünglich Angerufene Teilnhemer das Gesrpäch nicht annehmen konnte.Exchange 2010 SP2 und neuerRuft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B oder C auf die UM Mailbox von Benutzer A weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Wenn Benutzer A oder C auf die UM Mailbox von Benutzer B weitergeleitet werden, antwortet die Mailbox in deutscher Sprache. (Standardsprache des Dial Plans)Exchange 2007 bis 2010 SP1Ruft Benutzer A die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in deutscher Sprache.Ruft Benutzer B die Subscriber Access Nummer an um auf seine Mailbox zuzugreifen, antwortet die Mailbox in englischer Sprache.Wenn Benutzer B auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer A auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer bekannt ist, wird dessen Sprache bevorzugt.)Wenn Benutzer C auf die UM Mailbox von Benutzer A weitergeleitet wird, antwortet die Mailbox in deutscher Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)Wenn Benutzer C auf die UM Mailbox von Benutzer B weitergeleitet wird, antwortet die Mailbox in englischer Sprache. (Wenn der Anrufer unbekannt ist, wird die Sprache der Zielmailbox verwendet.)UnterschiedeDas mag in Textform etwas verwirrend wirken, der Unterschied ist für mich jedoch beträchtlich:Bis Exchange 2010 SP1 benötigt man einen Dial Plan um alle Sprachen abzudecken, da Exchange rücksichft auf die Sprache der Mailbox nimmt.Ab Exchange 2010 SP2 benötigt man für jede Sprache die unterstützt werden soll einen eigenen Dial Plan, da die Sprache der Mailbox ausschließlich für Subscriber Access berücksichtigt wird.&#160;Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-unified-messaging-sprachauswahl/\\\"},{  \\\"id\\\": \\\"post-lync-server-backup\\\",  \\\"title\\\": \\\"Lync Server Backup\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"As with all systems a sound backup and recovery strategy is key when deploying Lync. This post will cover some basic ideas about what (and how) to backup in a Lync Topology. Lync, being essentially a SIP proxy, does not store a lot of data. It cannot be compared to the likes of Exchange or SQL, systems that are all about storing stuff. With Lync, we need availability, the rest is real time traffic/ presence information, only interesting in the moment when it happens.What?So what does Lync store then?Topology, Policies, Configuration The topology contains all relevant information about Lync Servers and applications. Once the servers are set up, administrators start configuring voice and client policies, trunk settings and all the other good stuff.We can export all of this configuration settings using the cmdlet: Export-CsConfiguration.User Settings, Buddy Lists After configuring the server side of things it’s time to enable some users for Lync, as the admin does so, configuration about the users, like their RegistrarPool ,SipAddress and LineUri are saved within the Lync system. Once the user logs on and starts to add contacts to their buddy list, those get stored on the Lync Servers as well.We can export all of this information using the cmdlet: Export-CsUserDataResponse GroupIf Lync Response Groups are configured there is some configuration information to store for them as well. This can be exported using the cmdlet: Export-CsRGSConfigurationLocation ServiceThe same idea applies to the Location Services, if configured, the configuration can be exported using the cmdlet: Export-CsLisConfigurationLync File StoreSure enough, the Lync file store needs to be included in the backup plan as well. This is not stored inside Lync, it typically resides on a highly available fileserver.Now if that external fileserver is backed up regularly, just make sure it is included in your backup/recovery documentation and try to restore it regularly. If it is not included in existing backup strategies consider using robocopy.Monitoring and Archiving DataMonitoring and Archiving data are not really stored inside Lync, either. Data is stored within the LcsCDR, QoEMetrics and LcsLog databases on a SQL server. There are no Lync tools available to backup this data, it is typically backed up using existing backup software for SQL or through SQL Management Studio.As with the Lync file store, make sure to include backup/restore dependencies and scenarios in the Lync documentation.Persistent Chat DataLync 2013 introduced the persistent chat feature, now for the first time we really do store instant messages and attachments sent by users.Data is stored within the Persistent Chat Database and can be exported using the cmdlet: Export-CsPersistentChatData. If existing backup software for SQL is available, the persistent chat database is typically backed up like any other application database.How?Now that we know what there is to backup, let’s have a look at how. I did point out the Export-* cmdlets and they’re the tool of choice for backing up Lync configuration information and settings.  Note: The account used to run the Export-* cmdlets needs to be member of the RTCUniversalServerAdmins group.I’ve come up with a quick script that invokes the mentioned Export-* cmdlets. The script can be found on my Github.Find more information about the script on the help page.Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-server-backup/\\\"},{  \\\"id\\\": \\\"post-outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013\\\",  \\\"title\\\": \\\"Outlook Autodiscover and what to do when migrating from Exchange 2010 to 2013\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Outlook Clients &gt;= 2007 use Autodiscover to detect the connection settings to connect to the Exchange Server.When a CAS Server is installed, the server hosts a virtual directory in IIS named &ldquo;Autodiscover&rdquo;.Outlook and mobile phones contact this virtual directory and download the autodiscover.xml file if one of the following condition occurs:- When you configure a mailbox - When the mailbox is already configured but Outlook or the mobile phones is unable to connect to the Exchange server - Outlook contacts periodically the Autodiscover service to update the connection settings if neededThe client discovers and connects to the Autodiscover service in a different way if located internal and external.If Outlook is externalWhen the Outlook Client is outside the cooperate network it uses DNS to discover the Autodiscover URL by searching an A Record with autodiscover.domain.com or an SRV record that points to the public name.If Outlook is internalWhen the Outlook Client is inside the cooperate network it searches in AD for a SCP (service connection point) object. The SCP object is an entry for each CAS server in ActiveDirectory that contains the Autodiscover URL. You can check the SCP object by using the cmdlet Get-ClientAccessServer or ADSIedit. If you want to update the SCP records, use the cmdlet instead of ADSIedit.What do I have to do if I&rsquo;m upgrading from Exchange 2010 to 2013?When you upgrade from Exchange 2010 to 2013 one of the first steps is to make the CAS 2013 internet facing. So clients get the autodiscover.xml file and settings via the Exchange 2013 servers. The CAS knows if the mailbox is hosted on an Exchange 2013 server, then the CAS sends you the settings to connect to the 2013 environment, or on the old 2010, then the CAS sends you the settings to connect to Exchange 2010 (CAS 2013 proxies the requests to 2010).This is OK for external Clients. But for internal clients connections you have to update the SCP object from the old 2010 Exchange CAS server to point to the new 2013 CAS server. This is necessary because Exchange 2013 servers provide additional AutoDiscover information to clients to improve the discovery process. From this time when internal clients connect to the Autodiscover service they contact every time the 2013 CAS and get the connection settings. You can update the SCP object and so updating the URL by using the cmdlet Set-ClientAccessServer like in the following example:Set-ClientAccessServer CAS2010SERVER -AutoDiscoverServiceInternalUri https://cas2013server.domain.local/Autodiscover/Autodiscover.xmlGreetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013/\\\"},{  \\\"id\\\": \\\"post-troubleshooting-sharepoint-error-messages\\\",  \\\"title\\\": \\\"Troubleshooting Sharepoint Error Messages\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Sharepoint\\\"],  \\\"content\\\": \\\"When you get a Sharepoint error message, they are sometimes not very helpful and it can be tricky to figure out what’s going wrong.At this point the Sharepoint EventLog can help you getting more details. With the Powershell commandlet get-splogevent you can search the corresponding exception message. The correlation ID is the key.If I’m searching the corresponding exception message from the error shown on the printscreen above, I execute following command:get-splogevent | where-object {$_.Correlation -eq &quot;88ab369c-71dd-108f-df09-ea6c74999562&quot;} | flGreetings    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/troubleshooting-sharepoint-error-messages/\\\"},{  \\\"id\\\": \\\"post-lync-music-on-hold-wartemusik\\\",  \\\"title\\\": \\\"Lync: Music on Hold / Wartemusik\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Nach einiger Zeit mal wieder ein Artikel in deutscher Sprache :)Heute wollen wir uns die Music On Hold Thematik in einer Lync Enterprise Voice Umgebung anschauen. In diesem Artikel betrachten wir nur den Lync Client, MoH Konfiguration für IP Phones und Gateways werden in einem eigenen Artikel beschrieben.Was ist Music on Hold?Das kennt eigentlich jeder, trotzdem zur Erklärung: Teilnehmer A spricht mit Teilnehmer B, B möchte A weiterleiten und ruft C an. Bevor B ein neues Gespräch aufbauen kann, muss das aktuelle Gespräch gehalten werden. Damit A sich gut aufgehoben fühlt bekommt er Musik oder einen Text (“Sie werden mit dem gewünschten Teilnehmer verbunden…”) vorgespielt.Wer spielt die Musik?Jetzt wird das Thema interessant: Woher kommt die Musik? In der klassischen Telefonie wird für gewöhnlich ein “Medienserver” dafür verwendet, dieser hängt zentral an der TK Anlage und stellt Music on Hold für alle Gegenstellen zur Verfügung.In einer End-to-End Infrastruktur wie Lync ist das nicht mehr so einfach, der Medien Datenstrom (Sprache) zwischen Teilnehmer A und B ist direkt, auch für die Signalisierung sind die User Agenten zuständig. Will also Teilnehmer B das aktuelle Gespräch halten, muss er dies Teilnehmer A irgendwie mitteilen und diesem dann, wenn gewünscht, Musik vorspielen.In einer Lync Umgebung ist also der Lync Client von Teilnehmer B für die Musik zuständig.Welche Musik?In den Einstellungen des Lync Clients kann eine Audio Datei, die als Music on Hold gespielt wird, ausgewählt werden.  Möchte man sich für diese Aufgabe nicht auf seine Benutzer verlassen, kann man dies in einer CsClientPolicy vorgeben.New-CsClientPolicy &quot;MusicOnHold&quot; -EnableClientMusicOnHold:$true –MusicOnHoldAudioFile:&quot;C:\\\\\\\\Program Files (x86)\\\\\\\\Microsoft Office\\\\\\\\Office15\\\\\\\\MEDIA\\\\\\\\DefaultHold.wma&quot;&lt;/p&gt;    Grant-CsClientPolicy –Identity “Username” –PolicyName “MusicOnHold”&lt;/code&gt;  Diesen Pfad bekommt der Lync Client per in-band provisioning mit, das sieht im Log so aus:     Achtung: Das setzen von EnableClientMusicOnHold:$true alleine ist nich ausreichend, der Benutzer muss hier nach wie vor die Datei selbst auswählen.  Dateipfad  Der aufmerksame Leser hat das Problem in der obigen Konfiguration sicher bereits gesehen, der Dateipfad für die Musik liegt im Installationsverzeichnis des Lync Clients. Dies unterscheidet sich allerdings von Lync 2010 zu Lync 2013 sowie bei 32 und 64 Bit Installationen.  Standardpfad Lync 2013: &quot;C:\\\\\\\\Program Files (x86)\\\\\\\\Microsoft Office\\\\\\\\Office15\\\\\\\\MEDIA\\\\\\\\DefaultHold.wma&quot;   Standardpfad Lync 2010: &quot;C:\\\\\\\\Program Files (x86)\\\\\\\\Microsoft Lync\\\\\\\\MEDIA\\\\\\\\DefaultHold.wma&quot;  Dies kann problematisch werden, wenn Benutzer sich an mehreren Geräten mit unterschiedlichen OS oder Lync Client Versionen anmelden. In diesem Fall empfiehlt es sich einen “allgemein gültigen“ Pfad in die CsClientPolicy zu schreiben. Dies kann wiederum problematisch werden wenn Benutzer sich von Unternehmensfremden Endpunkten anmelden, diese finden dann am personalisierten Pfad keine Datei, oder können nicht auf eine Freigabe zugreifen… Die aktuell Verfügbaren Konfigurationsmöglichkeiten erlauben es nicht wirklich alle Szenarien abzudecken.  Ausnahme: Response Group Service  Natürlich gibt es eine Ausnahme in der die Musik vom Lync Server kommt, ruft Teilnehmer A eine RGS Nummer an, kommt die Wartemusik vom Lync Server, allerdings nur bis zu dem Zeitpunkt an dem ein Agent das Gespräch entgegen nimmt. Jetzt liegt die Verantwortung beim Lync Client des Agenten, wird das Gespräch vom Agenten gehalten, kommt die Musik vom Client desselben.  Hintergrund: Auf folgender Seite habe ich die SIP Kommunikation zwischen Teilnehmer A und B aus diesem Artikel genauer beschrieben. SIP: Anruf halten     Schönes Wochenende!     Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-music-on-hold-wartemusik/\\\"},{  \\\"id\\\": \\\"post-sip-anruf-halten\\\",  \\\"title\\\": \\\"SIP: Anruf halten\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"An dieser Stelle möchte ich einen Blick auf die SIP Kommunikation in einem Anruf halten Szenario werfen. Die Informationen aus der SIP Kommunikation die ich im folgenden zeige sind auf das absolute Minimum beschränkt, ein wirkliches SIP Paket enthält viel mehr Informationen. Im folgenden Beispiel ruft Teilnehmer A (+49151xxxxxxxx) Teilnehmer B (+39047xxxxx) an, Teilnehmer B nimmt das Gespräch an. Anschließend hält Teilnehmer B das Gespräch. Die Frage die sich stellt ist natürlich wie signalisiert ein Teilnehmer (B) dem anderen (A) dass er das Gespräch halten möchte?INVITE / OKBevor ein Gespräch gehalten werden kann, muss dieses aufgebaut werden. Dazu sendet Teilnehmer A eine INVITE Anfrage an Teilnehmer B. Der Header beschreibt die SIP Sitzung, im Body wird mit SDP die Medien Sitzung beschrieben. Die interessanten Felder fasse ich hier zusammen:Invite Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37     CSeq: 24467 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Invite Body:      c=IN IP4 192.168.1.100     m=audio 54720 RTP/AVP 0 8 115 13 118 97 101Der Lync Client des angerufenen Teilnehmers (B) muss die empfangene Anfrage beantworten und macht dies mit einem 200 OK. In diesem schickt er SDP Informationen mit, welche die RTP Sitzung aus seiner Sicht beschreiben:Ok Header:      From: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     To: &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 24467 INVITEOk Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101re-INVITE / OKUm eine existierende SIP Sitzung (Dialog) zu ändern, schickt Teilnehmer B ein INVITE bei dem die Werte für Call-ID sowie From und To Tag identisch mit denen aus der bestehenden Sitzung sind. Man spricht in diesem Fall von einem re-Invite. Das Ziel dieses erneuten Invites ist es die RTP Sitzung zu ändern, also schickt der User Agent des Teilnehmer B neue SDP Informationen an Teilnehmer A, diese enthalten die Beschreibung der RTP Sitzung aus sicht von Teilnhemer B.re-Invite Header:     From: &quot;&quot; &lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;epid=ea6d933f37;tag=4f75d0c634     To: &lt;sip:+49151xxxxxxxx@uclab.eu;;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4     CSeq: 1 INVITEre-Invite Body:      c=IN IP4 192.168.1.6     m=audio 8746 RTP/AVP 8 0 13 101     a=sendonlyAuch diese Anfrage muss der Lync Client beantworten, in diesem Fall erhält Teilnehmer A die Invite Nachricht, Teilnehmer B möchte das Gespräch halten.Ok Header:      From: &quot;&quot;&lt;sip:+39047xxxxx@uclab.eu;user=phone&gt;;tag=4f75d0c634;epid=ea6d933f37     To: &lt;sip:+49151xxxxxxxx@uclab.eu;user=phone&gt;;epid=5075F8584B;tag=1559ef9c1     CSeq: 1 INVITE     Call-ID: c73279cc-a979-40b4-bb7b-6e261ab0ddc4Ok Body:      c=IN IP4 192.168.1.100     m=audio 6190 RTP/AVP 8 13 101     a=recvonly\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sip-anruf-halten/\\\"},{  \\\"id\\\": \\\"post-invoke-sefautil-a-powershell-wrapper-function\\\",  \\\"title\\\": \\\"Invoke-SEFAUtil – a PowerShell wrapper function\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Lync\\\",\\\"PowerShell\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"I had to use SEFAUtil to get some tasks done the other day. As I prefer using PowerShell over just another command line tool, I decided to come up with a quick wrapper function that is intended to make my life a little easier.If you don’t know what SEFAUtil is and how to configure it, check out this great post or this one if you prefer German ;) In a nutshell, it’s a command line tool to configure Skype for Business (Lync) Voice Features (like call forwarding, team call) on behalf of end-users.Warning: I do not recommend using this in production without understanding what it does, although I did test it in my lab, it may break something!Ok, having that said, how do I use thins thing? First of all you will need a copy of this script on the computer where you have been running SEFAUtil until now. As the computer is authenticated using a certificate (it must be configured as a trusted application), you will not be able to run this from anywhere. Once you’ve downloaded the script, start a Skype for Business Management Shell and use like in the following examples:EXAMPLE 1.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it This example invokes SEFAUtil without additional parameters, call forwarding settings for the user thomas@tomt.it are shown.EXAMPLE 2.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -EnableSimulRing +391231234567This example enables Simul Ring for the user thomas@tomt.it. The destination number for Simul Ring is +391231234567.EXAMPLE 3.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -AddTeamMember user10@tomt.itThis example adds user10@tomt.it to thomas@tomt.it. This will also enable Simul Ring for the user.EXAMPLE 4.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it -DelayRingTeam 10 This example set’s the delay for Team Calls to 10 seconds for the user thomas@tomt.itEXAMPLE 5.\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Username thomas@tomt.it –DisableTeamCallThis example disables Team Call for thomas@tomt.itEXAMPLE 6Get-CsUser -OU \\\\\\\"OU=users,OU=tomt,DC=tomt,DC=local\\\\\\\" | .\\\\\\\\Invoke-SEFAUtil.ps1 -Server ly15.tomt.local -Verbose -AddDelegate thomas@tomt.itThe complete online help can be found hereWhat I did in this script, is basically wrap PowerShell around SEFAUtil.exe, I did add some parameter validation, it can only run against Lync users for example. It does write a logfile to the $temp directory and supports PowerShells common parameters like Verbose and WhatIf.Download &amp; Source for Invoke-SEFAUtil – a PowerShell wrapper functionThe  is available on the PowerShell Gallery, you can install or download it using the following commands:Install-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Scope CurrentUserSave-Script -Name Invoke-SEFAUtil – a PowerShell wrapper function -Path &lt;Path&gt;And you can find the source on GitHub:             tomtorggler/PowerShell      Note: The script requires the Lync Module to be available on the Computer where it will be run, it does also require PowerShell version 3.  Note: Changing the CallAnswerTime only does not work, a limitation of the SEFAUtil.exe does not allow this setting to be changed without also configuring CallForwardingso long,Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/invoke-sefautil-a-powershell-wrapper-function/\\\"},{  \\\"id\\\": \\\"post-your-windows-phone-does-not-support-this-server-version\\\",  \\\"title\\\": \\\"Your Windows phone does not support this server version…\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"This is just a a quick post about an interesting issue I&rsquo;ve seen today, interesting it was, at least to me. I was at a customer&rsquo;s site publishing Exchange 2010 using a Sophos &ldquo;Unified Threat Management&rdquo; box. Well, we all have to live in a post TMG world, don&rsquo;t we?After installing the certificate on the box we configured the &ldquo;virtual web servers&rdquo; and the corresponding &ldquo;real web servers&rdquo;. Outlook Web App worked straight away so we went ahead and tried to connect a Windows Phone 8 using ActiveSync.That didn&rsquo;t go so well, the Phone would not connect and instead give a strange error message saying:Error 85002028: Your Windows phone does not support this server version.Ok, that&rsquo;s where the interesting begins. I quickly fired up Remote Connectivity Analyzer which provided a much clearer error description along with a link to this KB article.It turned out that we had not installed the intermediate CA certificate on the Sophos box. As the Winodws Phone requires the Reverse Proxy to send the whole chain down for verification, this simply didn&rsquo;t work. Here comes a quote from the above KB article.Windows Mobile-based devices do not generally contain intermediate CA certificates in their certificate store. Internet Information Services (IIS) sends the whole certificate chain to the device. However, IIS does this only if it can verify the whole chain. By default, the device does not contain these certificates. Therefore, the server must send them. The device must contain only the root certificate in its certificate store.Makes sense, finally.until next time, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/your-windows-phone-does-not-support-this-server-version/\\\"},{  \\\"id\\\": \\\"post-migrating-from-exchange-2010-to-2013-part-5\\\",  \\\"title\\\": \\\"Migrating from Exchange 2010 to 2013 – part 5\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Welcome to the last post in this series, we did migrate all mailboxes in part 4, the only thing that is still missing is public folder. So let&rsquo;s go ahead and migrate legacy public folders over to modern public folders.Modern Public Folders, huh?Public folders have been around for quite a while now, and for some time they have been written off, even by Microsoft. Exchange 2007 RTM&rsquo;d without management features, 2010 came along with no real improvements to replication and high availability.Everything changed, Exchange 2013 introduces the shiny, new &ldquo;Modern Public Folders&rdquo;. This shows that the Exchange Team is actually listening to customers, this, and the availability of public folders in Exchange Online (Exchange Team Blog) tells us that modern public folders are here to stay. So what&rsquo;s changed?No more public folder databases, modern public folders are stored in the mailbox database, within special public folder mailboxes. This gives the administrator more flexibility (think DAG) and reduces a lot of the additional complexity that came with managing PF replication. Other nice side effects are that clients do not need to connect to the mailbox servers anymore, CAS is now able to handle ALL incoming connections.The hierarchy is stored within a root public folder mailbox but every public folder mailbox has a read-only copy, so all clients get quick access to it. The root mailbox can be shown using the following cmdlet:Get-OrganizationConfig | select RootPublicFolderMailboxMigrationOnce you are ready to migrate public folder to Exchange 2013, head over to Microsoft&rsquo;s Download Center and download the Public Folder Migration Scripts. I downloaded these scripts to the Exchange 2010 server, as they will be run there. The first script to run is Export-PublicFolderStatistics.ps1, it takes to parameters as input, the first one is a filename the second one is your Exchange 2010 mailbox server..\\\\\\\\Export-PublicFolderStatistics.ps1 sizemap.csv EX14.tomt.localThis script creates a file called sizemap.csv in the current directory, this file contains public folder statistics gathered from the server EX14.tomt.local. It&rsquo;s actually a simple list of public folder names and their respective sizes in bytes.The second script, PublicFolderToMailboxMapGenerator.ps1 reads the output file generated by the first one, and takes two additional parameters. The first parameter is the maximum mailbox size in bytes, then comes the sizemap.csv generated by the first script, the last parameter specifies a new file, which will contain a public folder to mailbox mapping based on the maximum mailbox size parameter..\\\\\\\\PublicFolderToMailboxMapGenerator.ps1 1073741824 sizemap.csv mailboxes.csvThis example specifies a 1GB mailbox limit, it reads the sizemap.csv from the previous script, and creates a new mailbox to home public folders every time the mailbox size will reach 1GB.As my little lab does not have a huge public folder structure, everything will be placed into the first mailbox. Note that I changed the name of the first &ldquo;TargetMailbox&rdquo; as the default was something like &ldquo;Mailbox1&rdquo;.So now that we have created the mailboxes.csv file, we need to copy it over to the Exchange 2013 mailbox server. In the next step we are going to import the mailboxes.csv file and create the target public folder mailboxes with a little bit of PowerShell:Import-Csv .\\\\\\\\mailboxes.csv | select -expand TargetMailbox | foreach {New-Mailbox -Name $_ -PublicFolder -HoldForMigration:$True -IsExcludedFromServingHierarchy:$true}The two parameters HoldForMigration and IsExcludedFromServingHierarchy are used to prevent users from accessing the public folder mailbox for now. To verify that the mailboxes have actually been created use the following cmdlet:Get-Mailbox &ndash;PublicFolderOk, so now that we have created the target mailboxes we can go ahead and start moving data. Again, we will need the mailboxes.csv file, as the New-PublicFolderMigrationRequest cmdlet takes it as input:New-PublicFolderMigrationRequest -SourceDatabase (Get-PublicFolderDatabase -Server ex14.tomt.local) -CSVData (Get-Content .\\\\\\\\mailboxes.csv -Encoding Byte)In this example I am getting public folder database information from the server EX14.tomt.local and then reading the content of mailboxes.csv, which has to be in the current location. As the name implies, a new Public Folder Migration Request is generated, it copies data at about two to three GB per hour. The request is created with the PreventCompletion parameter set to $true, that means, once the data has been copied, the request will be AutoSuspended.Users should not have noticed anything about this public folder migration until now, they continue working on the 2010 public folder as usual. Before we can complete the public folder migration request, though, we will need to block user access to the legacy public folders. We will need some time to synchronize the already moved data with latest changes during this window of downtime.So once you&rsquo;ve informed your users, we are going to prevent access to legacy public folders, remember that because of HoldForMigration:$true, we are also preventing access to the modern public folders!Set-OrganizationConfig -PublicFoldersLockedForMigration:$trueThis setting prevents users to access public folders, be sure to allow some time for it to replicate if you have more than one public folder database. Now that no one is able to make changes to the legacy public folders, we can go ahead and set the PreventCompletion flag to $false, and then resume the public folder migration request to finally move all data.Set-PublicFolderMigrationRequest -Identity \\\\\\\\PublicFolderMigration -PreventCompletion:$false Resume-PublicFolderMigrationRequest -Identity \\\\\\\\PublicFolderMigrationOnce this is done, it is recommended to test access to modern public folders with a few users, before allowing everybody to make changes again. This is the last point in time where you do have a way back without data loss!To test access to the modern public folders, we use the following cmdlet:Set-Mailbox &ndash;Identity user1 &ndash;DefaultPublicFolderMailbox PFMailbox001This overrides the IsExcludedFromServingHierarchy and allows the user user1 to access public folders on the new Exchange 2013 server. Outlook Connection Status will show something like this:If everything is fine, we can finally remove the IsExcludedFromServingHierarchy flag and set the PublicFolderMigrationComplete property to $true.Get-Mailbox -PublicFolder | Set-Mailbox -PublicFolder -IsExcludedFromServingHierarchy:$false Set-OrganizationConfig -PublicFolderMigrationComplete:$trueOk, one last thing: You may have noticed that the Proxy Server in the screenshot above shows the external server name for the connection to Exchange Public Folders. This is due to a bug in Outlook, before a fix becomes available, make sure internal clients can access the external hostname by creating a split DNS record. There is a KB article available, here.Nice, that completes this series on migrating Exchange 2010 to Exchange 2013. Thanks for following along :)&nbsp;so long, see you next time!tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-5/\\\"},{  \\\"id\\\": \\\"post-web-application-proxy-in-windows-2012-r2-preview\\\",  \\\"title\\\": \\\"Web Application Proxy in Windows 2012 R2 preview\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\"],  \\\"content\\\": \\\"The preview of the next version of Windows Server 2012 has been released very recently. Let&rsquo;s have a quick look at some of the features.The taskbar properties feature a new &ldquo;Navigation&rdquo; pane, we can configure stuff like &ldquo;Boot to Desktop&rdquo;, yay :)Web Application Proxy and ADFSAnother desperately needed feature is the new Web Application Proxy server role, many people (including me) think this is going to be the replacement for TMG. So, very keen to play with the new toy I went ahead and added the server role, found underneath &ldquo;Remote Access&rdquo;.&nbsp;Adding &ldquo;Web Application Proxy&rdquo; as a role service.Like in Windows 2012 the server manager kindly reminds me to configure the newly added role:Just in case you want to run this wizard again but can&rsquo;t find it anymore, it can be started from the Remote Access Management Console.The first step in the Wizard asks for a federation service name, now until this moment I didn&rsquo;t really bother researching anything about this new server role. Not the smartest move&hellip; As documentation is still pretty thin for Windows Server 2012 R2 I decided to simply set up an ADFS server in my lab and try to connect the Web Application Proxy to that federation service.Active Directory Federation ServicesThe first step is to add the Active Directory Federation Services server role to an machine in the domain.Again, the Server Manager reminds me to configure the new role, the first thing I do is supplying credentials which are used to perform the configuration:In the next step I select a certificate for the federation service and set a name for it. Obviously I do have to create a DNS record that resolves the federation service name to the IP address of the server that&rsquo;s actually hosting it.Now I have to select a service account for the federation service, note that the federation service name must be added as Service Principal Name to the account. This can be done using &ldquo;setspn &ndash;F &ndash;S host/adfs.tomt.local adfssvc&rdquo;In the last step I select the database to use for the federation service, as I am using only one server I&rsquo;ll give the Windows Internal Database a go.Ok, no we do have a federation service running, so we can go ahead and configure the Web Application Proxy.Web Application ProxyOk, picking up where we left for a quick excursion to ADFS, we are now back on the Web Application Proxy machine and specify the newly created federation service name.&nbsp;&nbsp;A certificate is required on the proxy, too. So after requesting a certificate from my internal CA, I can go ahead and select it here. Make sure that the certificate&rsquo;s subject alternative names include the federation service name!Ok, the last step shows the PowerShell code that get&rsquo;s executed and if everything works out, you&rsquo;ll see a message that the Proxy was configured successfully.A few caveats: Make sure DNS resolution is ok, the proxy must be able to resolve the federation service, and the ADFS server must me able to resolve the proxy. The certificate on both servers must include the federation service name.Publishing a serviceAfter having configured ADFS and the Web Application Proxy, which also acts as ADFS Proxy, we can finally proceed and publish a server. This is done using the Remote Access Management Console.I hit publish in the tasks pane and in the wizard that comes up, I am asked to select if I want to use pre-authentication or simply pass-trough the requests. After all that pain with installing and configuring ADFS I do definitely want to use pre-authentication :)Ok, so I have to select the ADFS relying party, whatever that is:After that I am prompted to enter a name for the publishing rule, an external and internal URL as well as a certificate.Again, we get to see the actual PowerShell code just before the publishing rule is created. Niiice, we have just successfully configured our first \\\\\\\"post TMG&rdquo; publishing rule.TestingNow to make sure that this is really working, let&rsquo;s fire up a client and browse to the published URL, owa.tomt.it in my case. Browsing to a published web site that requires pre-authentication, redirects the client to the AD FS Proxy service.After successfully authenticating against the Web Application Proxy the client gets redirected back to it&rsquo;s intended destination web site.Note: Make sure the client actually behaves like an external client, it must resolve the federation service name to the Web Application Proxy for this to work!Port mappingAnother application that I do publish using TMG frequently is Lync, sure enough I have to map the external web services port from 443 to 4443. This can be done using Web Application Proxy, too. For Lync we don&rsquo;t use pre-authentication:The internal URL contains the port to use:Awesome, that gives us a new possibility to publish web services, obviously we are not yet able to use it in production and time will tell if it get&rsquo;s a few additional features in RTM, all in all, for no additional cost, I think it is already a nice tool to use.Wish list,or: What would be nice to have in the RTM Version of Windows Server 2012 R2:Publish multiple servers for a particular external URL (think load balancing) Health checking of internal servers Maybe some additional authentication possibilities That&rsquo;s it for today, so long tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/web-application-proxy-in-windows-2012-r2-preview/\\\"},{  \\\"id\\\": \\\"post-lync-and-exchange-2013-owa-integration\\\",  \\\"title\\\": \\\"Lync and Exchange 2013 OWA integration\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"I configured Lync 2013 to work with Exchange 2013 these days, as it took me a while to get the &lsquo;Online Meeting request&rsquo; up and running, I thought I&rsquo;d post a quick post here.CertificatesThe first thing to consider when thinking about integration between Exchange 2013 and Lync is certificates. The servers use OAuth and TLS connections and we need the certificate common names to match the names that the servers use to access the resource. In my simple environment I do have the CN ly14.ntsystems.local on my Lync server&rsquo;s certificate, the Exchange server&rsquo;s certificate has a CN of ex14.ntsystems.local.Exchange 2013 - Enterprise Partner ApplicationThe first thing we configure, if it&rsquo;s not already set up, is Exchange Autodiscover service. What we actually care about is the internal URI used:Get-ClientAccessServer | fl AutoDiscoverServiceInternalUriIf it looks good, we go ahead and use the following script shipped with Exchange to set up an Enterprise Partner Application.&amp; $exInstall\\\\\\\\Scripts\\\\\\\\Configure-EnterprisePartnerApplication.ps1 &ndash;AuthMetaDataUrl https://ly15.ntsystems.local/metadata/json/1 -ApplicationType LyncThe &ldquo;&amp;&rdquo; sign tells PowerShell to start the script located at the Scripts folder in the Exchange 2013 installation directory. With the AuthMetaDataUrl we specify the Lync 2013 Pool&rsquo;s Auth Metadata document, this includes public key information for the Partner Application.Lync 2013 - Trusted Application PoolSo next up we have to configure Lync to trust the Exchange Server 2013.New-CsTrustedApplicationPool -Identity ex15.ntsystems.local -Registrar ly15.network.local -Site Bolzano -RequiresReplication $FalseNew-CsTrustedApplication -ApplicationId OutlookWebApp -TrustedApplicationPoolFqdn ex15.ntsystems.local -Port 5199&lt;/p&gt;New-CsPartnerApplication -Identity Exchange -ApplicationTrustLevel Full -MetadataUrl https://autodiscover.ntsystems.local/autodiscover/metadata/json/1Set-CsOAuthConfiguration &ndash;Realm ntsystems.localEnable-CsTopology&lt;/code&gt;Ok, so first we create a new Trusted Application Pool withing Lync, the Identity of the application pool is the Exchange 2013 server, the registrar is the Lync standard edition server. Then we create a Trusted Application and assign it to the trusted application pool configured before. The third thing we configure is a Partner Application and set the OAuth configuration, we need those last steps for the Online Meeting request in OWA, make sure that you actually use the Autodiscover URL, this didn&rsquo;t work if I used the server name instead.Ok, once the configuration is done, publish the topology.Exchange 2013 - Enable Instant MessagingBack on the Exchange side of things we need to configure the OwaVirtualDirectory to enable Instant Messaging.Get-OwaVirtualDirectory | Set-OwaVirtualDirectory &ndash;InstantMessagingEnabled $True -InstantMessagingType OCSNow comes the nasty part, we have to update OWA&rsquo;s web.config file to include the Exchange Servers certificate thumbprint. So first, we use the following cmdlet to get the certificate&rsquo;s thumbprint:Get-ExchangeCertificateCopy the thumbprint of the certificate that is assigned to the IIS service and fire up notepad to open the web.config file of the Owa virtual directory, located here:C:\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V15\\\\\\\\ClientAccess\\\\\\\\OWA\\\\\\\\web.configNo we need to Include the following Lines underneath the &lt;AppSettings&gt; node:&lt;add key=\\\\\\\"IMCertificateThumbprint\\\\\\\" value=\\\\\\\"Exchange Cert Thumbprint\\\\\\\"/&gt; &lt;add key=\\\\\\\"IMServerName\\\\\\\" value=\\\\\\\"ly15.tomt.local\\\\\\\"/&gt;So, after updating that web.config file, there is one step left, we need to actually allow users to use instant messaging in OWA. This is controlled in the Owa mailbox policy, to keep it simple I&rsquo;ll just update the default policy which will enable IM for everybody.&nbsp;Set-OwaMailboxPolicy -Identity \\\\\\\"Default\\\\\\\" -InstantMessagingEnabled $True -InstantMessagingType \\\\\\\"OCS\\\\\\\"Wow, now that all configuration is done, I like to do a quick iisreset to make sure all the configuration changes are picked up, obviously this should not be done on production machines&hellip;If users sign in to webmail, they will be able to sign into Lync, set their state and participate in IM chats.And, as a nice little addon, we can now also create Online Meeting requests from OWA:Note, Exchange 2013 CU1 is required for Online Meeting requests and Lyncdiscover has to be set up, too.&nbsp;Enjoy,tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-and-exchange-2013-owa-integration/\\\"},{  \\\"id\\\": \\\"post-migrating-from-exchange-2010-to-2013-part-4\\\",  \\\"title\\\": \\\"Migrating from Exchange 2010 to 2013 – part 4\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Hello everybody, after thinking about installation, client access and mail routing, we are getting ready to move some mailboxes.So, we talked about Exchange 2013 CAS being a pretty smart proxy, that&rsquo;s why we had to append ?ExchClientVer=15 to the ECP URL in order to get to the new Admin Center while the Mailbox was still on Exchange 2010. Obviously, once the mailbox gets moved to Exchange 2013 this is no longer required. Another thing that will change as we move mailboxes from Exchange 2010 to 2013 is the Outlook Profile, it does no longer show the RPCClientAccess endpoint as Server, instead it gets updated to show the &lt;Mailbox GIUD&gt;@&lt;Primary SMTP domain&gt;.Moving mailboxes&nbsp;There are a couple of things to take into consideration before moving mailboxes to the 2013 server. As we learned in part two of this series, it is essential to move the namespaces used by Exchange to the new CAS prior to moving mailboxes, users would not be able to access mailboxes if the names would still point to an Exchange 2010 CAS. Another important check is whether new mailbox servers have been provisioned with enough disk space to accommodate the moved users, and if the properties of the mailbox database, such as ProhibitSendReceiveQuota and OfflineAddressBook have been set to desired values. Assuming that everything is fine, we go ahead and create some move requests, very much the same way as we did in Exchange 2010.New-MoveRequest &ndash;Identity user3@tomt.it &ndash;TargetDatabase mbd01This command moves the mailbox of user3 to the target mailbox database mdb01 which is hosted on Exchange 2013. Like in 2010, the move is performed online, so the user is able to work in his mailbox until the move request is finished. Once the move request completes, the user will be prompted to restart Outlook, this is when the Profile gets updated to show the GUID instead of the server name or RPCClientAccessServer property.Note that this is the users mailbox GUID, as that is the user&rsquo;s unique identifier within the Exchange Organization, it will be different for every user. This GUID is used to locate the active mailbox database copy, in Exchange 2013 all protocols are provided to the user by the server that is hosting the active mailbox database copy.Batch movesIn Exchange 2010 we had the ability to do batch move requests, but it was more like creating many move requests and assigning the same BatchName to them, Get-MoveRequest was used to retrieve information about the move requests. Now Exchange 2013 comes with some new cmdlets that are dealing with batch migrations: *-MigrationBach.Honestly I do think those new cmdlets are a little complicated, I guess they were primarily introduced to make hybrid or cloud move requests easier, in an on-premises world they might not be that useful. I created a New-MigrationBatch and then started the migration. The first thing we need is a CSV file with a column called EmailAddress, so let&rsquo;s get all users homed on the Exchange 2010 server, and export them to CSV:Get-Mailbox -Server ex14 | select @{n=\\\\\\\"EmailAddress\\\\\\\";e={$_.PrimarySmtpAddress}} | Export-Csv -NoTypeInformation -Path .\\\\\\\\BatchMove.csvNow we can use this CSV file to create a new MigrationBatch, you see what I mean with a little complicated&hellip;New-MigrationBatch -Local -Name BatchMove -CSVData ([System.IO.File]::ReadAllBytes(\\\\\\\".\\\\\\\\BatchMove.csv\\\\\\\")) -TargetDatabases mdb01It&rsquo;s looking like that in PowerShell:Ok, once we have created the MigrationBatch, we can go ahead and start the migration to actually move data over to the new Exchange.Get-MigrationBatch | Start-MigrationBatchThe Get-MigrationStatistics cmdlet can be used to get information about the ongoing migrations, once all mailboxes are moved, TotalCount and SyncedCount should show the same value. Get-MigrationUser can be used to get information about the individual mailboxes being moved. The Get-MigrationBatch cmdlet includes a Report property containing links to CSV reports about the MigrationBatch.Note that the Start-MigrationBatch does not complete the move requests, use the Get-MoveRequest cmdlet to show the individual move requests and their state, it will be AutoSuspended. The Complete-MigrationBatch cmdlet is used to complete the move requests:Get-MigrationBatch | Complete-MigrationBatchIf we run the Get-MoveRequest cmdlet again, we will finally see that mailboxes have been moved to Exchange 2013.Since there is not much documentation available, yet, I will stick with the &ldquo;old&rdquo; way and just use New-MoveRequest to move mailboxes for now.&nbsp;&nbsp;&nbsp;Outlook ProfileOk so now that we have migrated our users over to the new Exchange it&rsquo;s time to have a look at Outlook, as mentioned above, the profiles will be updated and no longer show a server name, but it will also be using RPC over HTTP on the internal network:The proxy settings of the Outlook profile is updated, too, it will now select &ldquo;On fast networks, connect using HTTP first&hellip;&rdquo; by default.The AutoDiscover.xml file now contains more information for clients, while Exchange 2010 had the following three Type nodes &lt;EXCH&gt;,&lt;EXPR&gt; and &lt;WEB&gt; the new AutoDiscover.xml contains two &lt;EXHTTP&gt; nodes for internal and external OutlookAnywhere settings.It is very important to update Outlook to the minimum required version by Exchange 2013 before moving mailboxes, as older Outlook versions will not be able to interpret the new xml file.Well, and that&rsquo;s it for part four. We do have one big thing left for part five, public folders.&nbsp;Stay tuned,tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-4/\\\"},{  \\\"id\\\": \\\"post-exchange-2013-open-public-folder-on-exchange-2010\\\",  \\\"title\\\": \\\"Exchange 2013, Open Public Folder on Exchange 2010\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"You may notice that with the Exchange 2013 defualt settings on Outlook Anywhere you are unable to open public folders located on you &ldquo;old&rdquo; Exchange 2010 server. You get an authentication pop up and the following error:Microsoft has released a KB (http://support.microsoft.com/kb/2834139/en-us) article how to get that work.Simply change your Outlook Anywhere settings to use internal and external NTLM with requirement of SSL:Get-OutlookAnywhere &ndash;server ex01 | Set-OutlookAnywhere -ExternalClientAuthenticationMethod NTLM -InternalClientAuthenticationMethod NTLM -ExternalClientsRequireSsl $true -InternalClientsRequireSsl $trueThe next time the client gets the Autodiscover File, it sets the Logon Network Security Settings of the Outlook Profile from &ldquo;Anonymous Authentication&rdquo; to &ldquo;Negotiate Authentication&rdquo; and you can open the public folders located on Exchange 2010.Greetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2013-open-public-folder-on-exchange-2010/\\\"},{  \\\"id\\\": \\\"post-configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa\\\",  \\\"title\\\": \\\"Configure Exchange 2013 CAS Array with WNLB and enable Kerberos support for OA\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Like Tom described in his Post Migrating from Exchange 2010 to 2013 &ndash; part 2 the major changes in the Exchange 2013 CAS role, I explain in this post how to configure high available CAS Array with WNLB.First you have to install WLNB on both CAS nodes and create the Cluster and VIP. The CAS Servers need only one NIC, we use the Multicast operation mode.Next we create the Port Rules. In this example I create a port rule for the whole port range. Because there is not need of Affinity we can safely disable the the feature:Now create the Host A Record for the Cluster name excararray01 to point to the VIP.Remember to change the internal URL&rsquo;s of the virtual directories of both CAS servers to use the Cluster name and not the CAS computername.Kerberos supportI have 2 UAG servers that are publishing the Exchange 2013 CAS servers. On the UAG servers I don&rsquo;t want to publish both CAS servers and use the UAG load balancing. I want to publish the CAS Cluster Name and let the WNLB do the load balancing. If you don&rsquo;t configure an alternate service account for the CAS Cluster Name you will no be able to use NTLM authentication for Outlook Anywhere.To use Kerberos authentication you have to create a computer account in AD (the name don&rsquo;t have to match the array FQDN):Then run the following script that is located in C:\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V15\\\\\\\\Scripts to configure the Alternative Service Account.\\\\\\\\RollAlternateServiceAccountPassword.ps1 -ToArrayMembers excasarray01.domain.local -GenerateNewPasswordFor \\\\\\\"domain\\\\\\\\EXCASARRAY01ASA$\\\\\\\" &ndash;Verboseexcasarray01.domain.local stands for the FQDN of the CAS array domain\\\\\\\\EXCASARRAY01ASA$ stands for the created computer accountAfter the script has finished configuring we have to register some spn&rsquo;s with the CAS Array FQDNsetspn -s exchangeMDB/excasarray01.domain.local domain\\\\\\\\EXCASARRAY01ASA$ setspn -s exchangeRFR/excasarray01.domain.local domain\\\\\\\\EXCASARRAY01ASA$ setspn -s exchangeAB/excasarray01.domain.local domain\\\\\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\\\\\EXCASARRAY01ASA$ setspn -s http/excasarray01.domain.local domain\\\\\\\\EXCASARRAY01ASA$Now we can publish the CAS Array FQDN with uag and use NTLM as authentication method for Outlook Anywhere.Greetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa/\\\"},{  \\\"id\\\": \\\"post-migrating-from-exchange-2010-to-2013-part-3\\\",  \\\"title\\\": \\\"Migrating from Exchange 2010 to 2013 – part 3\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Hello again and welcome back to the third part of our journey to Exchange 2013. In the previous two posts (part 1, part 2) we covered preparing and installing Exchange 2013, as well as some news with the Client Access Server role and some design considerations. Now in this part we will try to cover some key aspects of transport in the new Exchange.Hub Transport RoleAs you already know, there is no Hub Transport server role in Exchange 2013, the transport pipeline has been split into three services, one of which is running on the CAS, the other two on the MBX role.Front End Transport serviceThis service is running on the CAS role, like all other CAS services, it is nothing more than a stateless (but smart) proxy for inbound and outbound SMTP connections. Neither message queuing, nor message filtering happens here. The front end transport service talks to the transport service on the MBX server role.Transport serviceThis service runs on the Mailbox server role, like the hub transport role in Exchange 2010, this service performs message queuing, inspection, categorization and so on. Very much NOT like in Exchange 2010, though, this service never talks to a mailbox database. This service routes messages between the front end transport service, the transport service and the mailbox transport service.Mailbox Transport serviceThis service runs on the Mailbox server role, too. It receives messages via SMTP from the transport service and connects via RPC to the mailbox database to deliver the message. It also connects to mailbox databases via RPC to retrieve messages and forward them to the transport service, again using SMTP.This shows one thing very clearly, through the use of SMTP, Exchange 2013 is able to break the close relationship between server roles that existed in previous versions. The front end transport role in CAS does no longer use RPC, an thus, could be running a different software version than the mailbox server, communication between mailbox servers, specifically between the mailbox transport service and the transport service, also uses SMTP and has no requirement to be on the same software version.I used Wireshark to capture an incoming mail proxied through the CAS:The Client (10.1.1.10) connects to the CAS (10.1.1.21) using TCP 25, all SMTP messages are exchanged between those two nodes. Note, that the CAS does only send the &ldquo;250 Queued Mail for delivery&rdquo; after connecting to the transport service on the Mailbox Server (10.1.1.25), since the Front End Transport service does not queue mails locally, this &ldquo;smart proxy&rdquo; functionality ensures that the message gets stored in the mailbox servers queue, before sending an OK to the client. The connection between CAS and MBX uses TCP 2525 and is encrypted using TLS, this is why Wireshark is not able to encode it as SMTP.There is whole section on Transport on TechNet: http://technet.microsoft.com/en-us/library/aa996349.aspxMigration Send and Receive connectorsNow that we know (a little bit) how transport works in Exchange 2013, we can start to include Exchange 2013 servers to the send connectors and configure the appropriate receive connectors.To add Exchange 2013 servers as sources to the existing send connectors, use the Exchange Admin Center and navigate to &ldquo;mail flow, send connectors&rdquo;. Then select the send connector to edit and add the new source server under &ldquo;scoping&rdquo;We could also use PowerShell to add additional SourceTransportServers to the connector, be aware though, that the existing servers have to be included in the command.Set-SendConnector &ndash;Id ToInternet &ndash;SourceTransportServers ex14,ex15Another interesting flag sits under the &ldquo;general&rdquo; node of the send connector&rsquo;s properties: Proxy though client access server&rdquo;So what&rsquo;s that all about? If this flag is checked, outbound mails are not sent directly by the mailbox server&rsquo;s transport role, but are proxied through a Client Access Server. This could be interesting if only a subset of Exchange Servers (CAS) were allowed to connect to the internet via SMTP. With multi role servers, which are recommended for many environments, this flag will have no effect.Ok, so now we have got our outbound mail flow configured, what about incoming mails? Receive connectors are per-server settings, so we have to check the configuration of existing connectors and configure the new server accordingly.Get-ReceiveConnector &ndash;Server ex14 | ft Identity,Enabled,Bindings,RemoteIpRangesThis command shows all receive connectors on the 2010 server, along with the Ports used and the remote IP addresses that are allowed to use this connector. Obviously, if there are custom AD permissions or authentication methods defined, those have to be configured on the new server, too.Nice, now we have got client access and transport covered, the next post will finally include moving some mailboxes to the new Exchange server.&nbsp;so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-3/\\\"},{  \\\"id\\\": \\\"post-exchange-2013-clean-install-but-many-msexchange-common-106-errors\\\",  \\\"title\\\": \\\"Exchange 2013 clean install but many MSExchange Common 106 errors\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Update: 09.06.2013 Updated the PowerShell script and some additional information about event logs. /tomToday I installed 4 Exchange 2013 servers. All of them have many &ldquo;MSExchange Common&rdquo; 106 errors in the Application Log indicating&nbsp;that Performance Counters could not be updated:Performance counter updating error. Counter name is LDAP Queries Issued by Expanded Groups., category name is Expanded Groups Cache. Optional code: 3. Exception: The exception thrown is : System.InvalidOperationException: The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnlyThe problem is that the performance counters are not registered correctly. I wrote a simple script to re-register all the Exchange 2013&nbsp;performance counters. Now the Application log looks much better First open Powershell in Admin Mode, then execute the following code:Note that New-PerfCounters actually deletes and re-creates the performance counter, there is no need to use Remove-PerfCounters first. The script might throw some errors if performance counters cannot be created or files are invalid, other than that no information is displayed, no news is good news, I guess ;) For more information check the Application Log of the server, two events are logged for every performance counter. Event ID 1001 indicates that the counter has been removed, while Event ID 1000 is logged as soon as the counter has been loaded again.If an antivirus software is running on the server, it could be disabled temporarily to improve performance.Special thanks to @msxfaq&nbsp;:)&nbsp;Greetings nd\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2013-clean-install-but-many-msexchange-common-106-errors/\\\"},{  \\\"id\\\": \\\"post-how-to-build-an-uag-2010-array-for-exchange-publishing-part-1\\\",  \\\"title\\\": \\\"How to build an UAG 2010 Array for Exchange publishing–Part 1\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"As TMG is not &ldquo;available&rdquo; anymore, I decided to use UAG 2010 with SP3 for the Exchange / Lync 2013 publishing. UAG SP3 supports Exchange 2013 and Lync 2013. In Part 1 of the Post I&rsquo;m going to explain how to build the UAG 2010 Array.First we have to prepare 2 Windows Server 2008 R2 Server each of them with 2 NIC&rsquo;s and at least 4GB RAM. The NIC&rsquo;s should be configured in this way:INTERNALDefault Gatewayshould not be definedDNS Serversshould be definedRegister this connection&rsquo;s address in DNSEnabledFile and Printer Sharing for Microsoft NetworksEnabledClient for Microsoft NetworksEnabledNetBIOS over TCP/IPEnabledLMHOSTS lookupEnabled&nbsp;EXTERNAL&nbsp;&nbsp;Default Gatewayshould be definedDNS Serversshould not be definedRegister this connection&rsquo;s address in DNSDisabledFile and Printer Sharing for Microsoft NetworksDisabledClient for Microsoft NetworksDisabledNetBIOS over TCP/IPDisabledLMHOSTS lookupDisabledThe order should modified that NIC INTERNAL becomes the first NIC used:The Next steps are to install NLB (without configuring it) and UAG on both nodes. Install UAG in the following order:UAG 2010 SP1 Update 1If Update 1 fails, download and install it manuallyUAG 2010 SP1 Updat 1TMG 2010 SP2UAG 2010 SP2UAG 2010 SP3When UAG is fully installed, we have to configure it. Lets start on the node that becomes the Array Manager.Open UAG and select the Network SettingsThen we have to define the Topology: Select the node as Array Member and specify credentialsBefore you join the 2nd node as the array member, open the TMG console and add the 2nd server to the &ldquo;Managed Server Computers&rdquo; group. Install the Policy.Open the UAG console on the 2nd server and join him to the arrayTIP: If the UAG services on the 2nd node don&rsquo;t start, copy the content of folder C:\\\\\\\\Program Files\\\\\\\\Microsoft Forefront Unified Access Gateway\\\\\\\\von\\\\\\\\Conf from the manager to the member server. Then start the services.Now we have to configure the NLB from the UAG console. Open Network Load Balancing from the Admin menu and add the first VIP IP:Next you have to save and activate the configuration. UAG is now building the NLB cluster with both nodes. You can check the activity with the UAG Activation Monitor:Finally we have to open the WebMonitor and navigate to the Array Monitor section. There we have to start the NLB nodes:After you have started the nodes, the NLB status changes to &ldquo;Converged&rdquo;INFO: When you open the NLB manager, you will get RPC errors. The reason is that DCOM does not work with TMG/UAG. But don&rsquo;t worry, the cluster is OK if the Web Monitor doesn&rsquo;t show errors.In Part 2 I will explain how to publish Exchange 2013 OWA / OA and ActiveSync.Greetings dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-1/\\\"},{  \\\"id\\\": \\\"post-migrating-from-exchange-2010-to-2013-part-2\\\",  \\\"title\\\": \\\"Migrating from Exchange 2010 to 2013 – part 2\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Updated: 08.06.2013: The original post had some errors regarding RPC over TCP and the RPCClientAccessServer namespace. You would never want to move this namespace&#160; to CAS 2013 as the new CAS does not understand RPC over TCP.Welcome back, this is the second part of my series on migration to Exchange 2013. I covered prerequisites, installation and a little bit of management in the first post, now we’ll have a look at namespaces and certificates.Namespaces in Exchange 2013After installing Exchange, it’s time to start getting into the planning phase :) Ok, just kidding, I’ll use the newly installed Exchange server to walk through some planning steps, though.First of all, let’s make some assumptions. We do have an Exchange 2010 server and a CAS array with the RpcClientAccessServer endpoint configured to outlook.tomt.local. For OWA, EWS, OAB, EAS and Outlook Anywhere there is only one namespace, mail.tomt.it. Outlook Anywhere is configured with NTLM authentication, more on that later. Internal Outlook clients would connect (via MAPI) to outlook.tomt.local, external clients would use Outlook Anywhere (HTTPS) and connect to mail.tomt.it. The certificate on Exchange 2010 has a Subject of CN=ex14.tomt.local and the following SANs: ex14.tomt.local, mail.tomt.it. Ok, so far so good. Now when migrating to Exchange 2013, it is recommended that the new server takes over the namespace and deals with all incoming client connections. For incoming connections with a mailbox homed on Exchange 2013, our new CAS would simply proxy the request to the mailbox server hosting the mailbox. For mailboxes hosted on Exchange 2010, though, the 2013 CAS would act as HTTP proxy and connect the client with the Outlook Anywhere endpoint (/rpc) of the Exchange 2010 CAS. So what does that mean? First of all, this does not apply for internal, RPC over HTTP clients, the RPCClientAccessServer namespace is not moved to CAS 2013. If you are in the unfortunate situation to have the RPCClientAccessServer namespace match your OutlookAnywhere namespace, there is a very good post over at the Exchange Team Blog.For RPC over HTTP connections, OutlookAnywhere must be enabled on the Exchange 2010 CAS before Exchange 2013 CAS can take over the namespace, and the IIS Authentication methods must include the NTLM. The Exchange 2013 CAS is authenticated by Exchange 2010, this does not work with basic authentication. To make sure Outlook Anywhere is configured, and the IIS Authentication method includes NTLM use the following cmdlet on Exchange 2010.Get-OutlookAnywhere –Server ex14 | fl ExternalHostname, ClientAuthenticationMethod, IISAuthenticationMethodsTo add NTLM as an IIS Authentication method, use the following cmdlet. Note that the ClientAuthenticationMethod does not matter in this case.Set-OutlookAnywhere –Identity ex14\\\\\\\\rpc* –IISAuthenticationMethods Basic,NTLMNice, now Exchange 2010 CAS is ready and we can start thinking about the certificate request for Exchange 2013. We want the new CAS to take over the namespace, so we do already know which name to include: mail.tomt.it, but is that enough? Well, the answer is, it depends ;)Protocol specific namesExchange 2013 introduces some radical changes, including how client connections are handled. In 2010, client affinity was everything. Clients would always need to be redirected to the same CAS for a specific session, if that CAS would become unresponsive or if the client would connect to another CAS, re-authentication would occur. When talking about load-balancing, an expensive Layer 7 capable load-balancer was required. The load-balancer would intercept the traffic and make sure client A would always reach server A for a particular session. This had one clear advantage, though, because the load-balancer was L7 aware (knows which endpoint the client asked for), it could check if a particular endpoint was reachable on a CAS, and if not redirect the client to a CAS where it was reachable. This is not the case in 2013 anymore, client to CAS sessions are stateless and a less-expensive Layer 4 load-balancer (or DNS round-robin) could be used with 2013. A L4 load-balancer, on the other hand, would have no idea of what endpoint the client was looking for, it would only see and forward encrypted (https) packets. Protocol specific namespaces are here to solve that problem. If we created a virtual IP and a distinct name for each endpoint on the CAS (OWA, EWS, EAS…) the L4 load-balancer would be aware of what endpoint the client was looking for.So, long story short, we are going to include more names in that certificate. The subject is CN=ex15.tomt.local and the SANs are: ex15.tomt.local, oa.tomt.local, mail.tomt.it, owa.tomt.it, eas.tomt.it, ews.tomt.it, oab.tomt.it. In the DNS configuration we need a CName for all of these names pointing to our new CAS, or an A record pointing to the load-balancers virtual IP. Next, we’ll use the Exchange Management Shell to update the ExternalUrl properties of the virtual directories.Set-OwaVirtualDirectory –Identity ‘ex15\\\\\\\\owa (Default Web site)’ –ExternalURL https://owa.tomt.it/owa      Set-EcpVirtualDirectory –Identity ‘ex15\\\\\\\\ecp (Default Web site)’ –ExternalURL https://owa.tomt.it/ecp       Set-OabVirtualDirectory –Identity ‘ex15\\\\\\\\oab (Default Web site)’ –ExternalURL https://oab.tomt.it/oab       Set-WebServicesVirtualDirectory –Identity ‘ex15\\\\\\\\ews (Default Web site)’ –ExternalURL https://ews.tomt.it/ews/exchange.asmx       Set-ActiveSyncVirtualDirectory –Identity ‘ex15\\\\\\\\microsoft-server-activesync (Default Web site)’ –ExternalURL https://eas.tomt.it/Microsoft-Server-ActiveSyncAnd last, but not least we configure Outlook Anywhere on the new Exchange 2013 CAS.Set-OutlookAnywhere –Identity ‘ex15\\\\\\\\rpc (Default Web site)’ –InternalHostname oa.tomt.local –InternalClientAuthenticationMethod NTLM –InternalClientsRequireSsl:$true –ExternalHostname mail.tomt.it –ExternalClientAuthenticationMethod NTLM –ExternalClientsRequireSsl:$true –IISAuthenticationMethods Basic, NTLM, NegotiateNow that Outlook Anywhere command was pretty long, let’s break it into smaller pieces. First we are setting the InternalHostname, as Exchange 2013 uses Outlook Anywhere for all client connectivity (internal and external) we don’t use the RpcClientAccessServer anymore. Along with that we set the authentication method for internal clients as well as the requirement for SSL. Next we set that same pieces of information for external clients, and the last property is configuring the supported authentication methods by IIS.Wow, now we should finally be able to take over that namespace with our brand new Exchange 2013 CAS. I updated the DNS records for mail.tomt.it to point to the new CAS and created a new CName oa.tomt.local for the internal OutlookAnywhere used in Exchange 2013. Nothing really changes for Outlook when it connects to an Exchange 2010 mailbox from inside the network, it will still use the RPCClientAccessServer endpoint to connect to the mailbox using RPC over TCP.If the mailbox is on Exchange 2013, though, Outlook will use RPC over HTTP and connect to the internal OutlookAnywhere endpoint: From a OWA point of view, all users do log on using the new CAS now:Exchange 2010 mailboxes get proxied to the Exchange 2010 CAS for OWA. After this text heavy post we have a nice little overview of CAS in Exchange 2013, I wanted to cover mail routing in this post, given the length I reckon it be better to save that for the next one.I hope this has been informative for you as the reader, at least it was extremely so for me :)so long,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-2/\\\"},{  \\\"id\\\": \\\"post-migrating-from-exchange-2010-to-2013-part-1\\\",  \\\"title\\\": \\\"Migrating from Exchange 2010 to 2013 – part 1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"This is my first post about migrating from an existing Exchange 2010 environment to Exchange 2013. I&rsquo;ll try do cover everything that seems important to me, if I miss something that you think should be covered&hellip; well, that&rsquo;s what comments are for :)Preparing for Exchange 2013All servers in the Exchange 2010 organization must be running service pack 3, if you haven&rsquo;t already installed SP3, as always it&rsquo;s a very good idea to start with reading the release notes. On the Exchange 2013 side of things, we need Cumulative Update 1, there is a very good post at the Exchange Team Blog about that.Ok, so assuming we are running Exchange 2010 SP3 and have downloaded CU1, let&rsquo;s get started with preparing the first Exchange 2013 server. All the required Windows Features can be installed with the InstallWindowsComponent.ps1 script located in the Setup\\\\\\\\ServerRoles\\\\\\\\Common directory of the CU1 install files. The script takes several parameters, in this case I&rsquo;ll be installing a multirole server, I want the AdminTools to be installed as well as the Remote Server Admin Tools for Active Directory..\\\\\\\\InstallWindowsComponent.ps1 AdminTools, MailBox, ClientAccess -ADToolsNeeded:$TrueNote that the script has no parameter for source files, the server needs internet access to download the required files. That&rsquo;s not always practical, so I edited the script and simply added &ldquo;&ndash;Source wim:d:\\\\\\\\sources\\\\\\\\install.wim:4&rdquo; to the Add-WindowsFeature cmdlet within the script.After the required reboot, we need to install Unified Communications Managed API 4.0 Runtimethe Office Filter Pack is not mandatory and can be installed later on, it still produces a warning during setup, though.Now that we have the new, designated Exchange 2013 server ready, we need to prepare Active Directory. Obviously, if you don&rsquo;t know what all this is about, don&rsquo;t do it! So, that said, from an elevated command prompt change to the directory containing the Exchange 2013 installation files. You&rsquo;ll need Schema, Enterprise and Domain Admin rights to run the following tasks.In the first step, setup will extend the schema, this is done using:.\\\\\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareSchemaThe next step is to prepare the Active Directory Forest, this creates the Microsoft Exchange container (if it doesn&rsquo;t already exist) and universal groups used by Exchange..\\\\\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareAD /OrganizationName tomtAnd the last step is to prepare the Domain, this needs to be done for every Domain that will contain Exchange servers or Mail-Enabled users, alternatively use /PrepareAllDomains:.\\\\\\\\setup.exe /IAcceptExchangeServerLicenseTerms /PrepareDomainEach step relies on Active Directory to replicate changes throughout the topology, you should absolutely wait for the changes of each step to be replicated before continuing with the next step. In a distributed environment such a change needs to be properly planned and would typically take place during a maintenance window.&nbsp;Installing Exchange 2013With all prerequisites checked, we can now continue with the installation of our first Exchange 2013 server. Easy as it is, I&rsquo;m not going to walk through graphical setup screens, you basically just select the server roles to be installed and click next. There is a command line version of the setup, too. Try setup.exe /help:Install for a list of parameters that can be used to customize the installation. The Exchange setup is pretty smart, meaning that it keeps track of the installation and if errors occur, you will be able to continue right from where the error happened, no need to click through all the windows again. It also provides a lot of information in the ExchangeSetupsLogs folder, located at the root of the drive on which Exchange is installed.Something new with setup is that you cannot remove server roles anymore, the only way to do that would be to completely uninstall Exchange and re-install the role of choice.So, installing Exchange 2013 was pretty easy, let&rsquo;s move on the the more interesting stuff.Managing Exchange 2013The first thing I wanted to see after the setup completed, was the shiny new Exchange Admin Center, so I went straight to IE and typed https://localhost/ecp, I entered my credentials on the neat, new login screen only to see the good, old Exchange Control Panel from 2010. It took some time, but then I realized that that was exactly correct behavior. The Exchange 2013 Client Access Role is a stateless proxy and no longer responsible for rendering OWA (or anything for that matter) and my mailbox was still on Exchange 2010, so my request got proxied to 2010. There are two solutions for this, move your admin mailbox to 2013, or less troublesome, simply add ?ExchClientVer=15 to the URL. https://localhost/ecp?ExchClientVer=15 takes you right to the Admin Center. This is also the only way (I found) to access the Admin Center with a user that has no mailbox.From an Exchange Management Shell point of view, everything is very similar to the way we are used from Exchange 2010, a new remoting session can simply be created using:$Session = New-PsSession &ndash;ConnectionURI &lsquo;http://ex15.tomt.local/PowerShell&rsquo; &ndash;ConfigurationName 'Microsoft.Exchange&rsquo; Import-PsSession $SessionThat&rsquo;s it for the first part, in the second part I&rsquo;ll try to cover the basics of namespace planning, mail routing and maybe move some mailboxes.I see some real world projects coming closer and I know Daniel is working hard on the topic, I&rsquo;m sure there is more content coming&hellip; :)so long, enjoy your weekend!tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-1/\\\"},{  \\\"id\\\": \\\"post-whats-happening-these-days\\\",  \\\"title\\\": \\\"What’s happening these days…\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"It has been quiet around here for some time, so what have I been up to?Well, on one side, I’m having fun at the Scripting Games (http://scriptinggames.org/) where I learn quite a bit (more from reviewing other entries, than from my own coding) and try to to improve my PowerShell skills. I’ll point out some of the things I’ve learned later on.On the other side, I’ve decided to quit my job in the heart of the Italian Alps and accepted a role in Germany, in the nice city of Paderborn. So the last few weeks have been pretty busy for me, moving my stuff from northern Italy way up to northern (at least for me) Germany. Right now I am trying to get used to my new surroundings and I do learn something every day :)So, what are my key takeaways from the Scripting Games so far?   Standard cmdlet parameter names: While I did know that there was a list of allowed Verbs (Get-Verb), I wasn’t aware that there was something similar for parameter names and types, too. Check out MSDN for more information.    Help and comments should be nested under the function, so if you are used to just press “Ctrl+J” to insert a new “empty” function and start from there, remember to move the help inside the function { } block.    ConvertTo-HTML has some really neat parameters like –Head, –PreContent and –PostContent so you can enhance and customize the HTML report generated by the cmdlet.    I started to use splatting to set parameter values and think this is really useful, basically you assign common values for parameters to a hash table and pass it to the cmdlet. I’ll post quick example later.    Filter, I tend to get every possible bit of information and then use Where-Object to select the few properties I really need, that’s not really efficient as most cmdlets provide a way to filter or just ask for the properties you need. And here comes the example for splatting:if ($Credential) {     &#160;&#160;&#160; $wmiParam = @{'Credential'=$Credential; 'ErrorAction'=&quot;Stop&quot;}      } else {      &#160;&#160;&#160; $wmiParam = @{'ErrorAction'=&quot;Stop&quot;}      }       Get-WmiObject @wmiParam –ComputerName “myComputer” –Class “Win32_Processor”This passes a hash table (wmiParam) to the Get-WmiObject cmdlet, so I don’t have to set the ErrorAction every time and the Credential parameter is only used when a $Credential object exists.&#160;Yeah, and that’s what’s new with me :)tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/whats-happening-these-days/\\\"},{  \\\"id\\\": \\\"post-joining-wifi-before-login-on-mac-os-x-108\\\",  \\\"title\\\": \\\"Joining WiFi before login on Mac OS X 10.8\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\"],  \\\"content\\\": \\\"We had an interesting problem at work recently, as the solution was a little complex I decided to write about it here. So, as the title suggests, we are talking Wireless networking, authentication and Mac OS X today. It’ll be fun, trust me :)Some prerequisites: We use EAP-TLS as the authentication protocol for WiFi and SCEP for certificate enrollment. I’ve written about SCEP before, in a different context, though. We also use the iPhone Configuration Utility to deploy configurations to devices, more on that later. The ProblemWe join our MACs to the Active Directory domain and want our users to be able to login using their domain credentials. Obviously you need some sort of connectivity to the AD in order to login, we used to configure Wireless Networks as “System Profile” in OS X in the past. Unfortunately, that GUI went away in more recent versions of that operating system.This is a screenshot of 10.5, simple enough. As we tried to configure that same thing on 10.8, though, we realized that this little option was gone. All Wi-Fi networks would be started AFTER the used login, no AD login was possible. Oops.After scratching our heads for a while, we found a workaround other than installing Windows ;)The SolutioniPhone Configuration Utility was used ever since we had the requirement to connect iOS devices to the wireless network, it can be used to create configuration files that can be deployed to iOS devices. It has been possible for some time to deploy these same configuration files to OS X, too. As they are simple XML files, we took a deeper look into them. Wwith some help from Google we found that we could change the Wi-Fi payload to be a “System Profile” instead of a “User Profile”, and thus be started BEFORE user login.So, first thing is to create a configuration profile using iPhone Configuration Utility. Choose a name, identifier and description for the profile. Add the certification authorities certificate, so we trust certificates issued by our internal CA.  Configure SCEP, the iPhone or MAC is going to connect to the SCEP URL to enroll a certificate using the specified subject. Add the Wi-Fi payload, specifying the SSID and authentication protocol. As we use EAP-TLS we use the SCEP certificate to authenticate.Once the profiles is configured, export it: We get a .mobileconfig file from the export, it can be edited using a simple text editor. Here comes the fun part, we have to add the following lines to the configuration file:&lt;key&gt;SetupModes&lt;/key&gt;      &lt;array&gt;       &lt;string&gt;System&lt;/string&gt;       &lt;/array&gt;       &lt;key&gt;PayloadScope&lt;/key&gt;       &lt;string&gt;System&lt;/string&gt;This part goes just underneath the PayloadOrganization in the AutoJoin section.And we have to change “Configuration” at the very end of the file from:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;Configuration&lt;/string&gt;to “SystemConfiguration”:&lt;key&gt;PayloadType&lt;/key&gt;      &lt;string&gt;SystemConfiguration&lt;/string&gt;As it is quite important where you change/add the lines, I’ll paste a complete file for reference.&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      &lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&gt;       &lt;plist version=&quot;1.0&quot;&gt;       &lt;dict&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AutoJoin&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPClientConfiguration&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;AcceptEAPTypes&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;13&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTProvisionPACAnonymously&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EAPFASTUsePAC&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateAnchorUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;EncryptionType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WPA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;HIDDEN_NETWORK&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;true/&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures wireless connectivity settings.&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;WiFi (MYSSID)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.wifi1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SetupModes&lt;/key&gt;        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadScope&lt;/key&gt;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;System&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.wifi.managed&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;2CD56B1A-068C-4F3C-AC43-9D4E2115260F&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServer&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;proxy.ntsystems.it&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyServerPort&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;8080&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;ProxyType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Manual&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;SSID_STR&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;MYSSID&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadCertificateFileName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MIIDYzCCAkugAwIBAgIQL1CM7d+PQrhAgO7UcdHbyDANBgkqhkiG&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; …      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; bnBODc20wZMRDAhWuA==       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/data&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Provides device authentication (certificate or identity).&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.credential2&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.root&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;25800C8A-A389-4598-A3C4-F5569A4D5273&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadContent&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Challenge&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;4F20EACEDE479165&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Type&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;RSA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Key Usage&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;0&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Keysize&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;2048&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Name&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt-DC01-CA&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Retries&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;3&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;RetryDelay&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;10&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;Subject&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;CN&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;macbookair$&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;URL&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;https://scep.tomt.it/certsrv/mscep/mscep.dll&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;Configures SCEP&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;SCEP (tomt-DC01-CA)&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile.scep3&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;com.apple.security.scep&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;string&gt;40C2FC1D-D1AA-4BA6-B2A3-959B6BFF9EB1&lt;/string&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dict&gt;       &#160;&#160;&#160; &lt;/array&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDescription&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadDisplayName&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt-wlan&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadIdentifier&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;it.tomt.wlanprofile&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadOrganization&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;tomt&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadRemovalDisallowed&lt;/key&gt;       &#160;&#160;&#160; &lt;false/&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadType&lt;/key&gt;       &#160; &#160; &lt;string&gt;SystemConfiguration&lt;/string&gt;        &#160;&#160;&#160; &lt;key&gt;PayloadUUID&lt;/key&gt;       &#160;&#160;&#160; &lt;string&gt;B58A2BCB-7617-421B-B0C8-12DE22B5A2B1&lt;/string&gt;       &#160;&#160;&#160; &lt;key&gt;PayloadVersion&lt;/key&gt;       &#160;&#160;&#160; &lt;integer&gt;1&lt;/integer&gt;       &lt;/dict&gt;       &lt;/plist&gt;Now, if we copy that file to the MAC OS X machine, we can import the wireless configuration and it will be a system profile. Phew.(In this case we need some sort of connectivity in order to enroll for a certificate over SCEP, this could be via LAN or an open guest Wi-Fi)SummaryIt might be though to get your head around this if EAP-TLS and SCEP are new, yet the same idea holds through for a Username/Password or even pre-shared key authentication protocol. The problem remains the same, Wi-Fi user profiles are started after the user logs on, rendering Active Directory logins impossible. We couldn’t find a solution to change that behavior without the iPhone Configuration Utility.Would be happy to hear about others experiences with this stuff.Special thanks to my mate @eduriz :)&#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/joining-wifi-before-login-on-mac-os-x-108/\\\"},{  \\\"id\\\": \\\"post-patching-office-web-apps-server\\\",  \\\"title\\\": \\\"Patching Office Web Apps Server\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Today I started my day with an Office Web Apps Farm that was not working anymore. After reviewing the Event Log I figured something strange happened… :)The Event Log was basically full with .Net Runtime and Application Errors, I’ll paste some for reference:Log Name: ApplicationSource: .NET RuntimeEvent ID: 1026Application: ppteditingbackendwatchdog.exeFramework Version: v4.0.30319Description: The process was terminated due to an unhandled exception.Exception Info: System.TypeInitializationExceptionStack:&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.ServiceInstanceFinder.GetLocalAgentInstance(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.PrepareRegistrations(Microsoft.Office.Web.Common.OfficeServiceType)&amp;#160;&amp;#160; at Microsoft.Office.Web.Common.WatchdogHelper.WatchMachines(Microsoft.Office.Web.Common.OfficeServiceType, CheckServiceInstance, Microsoft.Office.Web.Common.OfficeServiceType, System.String)&amp;#160;&amp;#160; at Microsoft.Office.Server.Powerpoint.Watchdog.EditingBackend.Program.Main(System.String[])...Log Name: ApplicationSource: Application ErrorEvent ID: 1000Faulting application name: ppteditingbackendwatchdog.exe, version: 15.0.4481.1000, time stamp: 0x50ee5a9eFaulting module name: KERNELBASE.dll, version: 6.2.9200.16451, time stamp: 0x50988aa6Exception code: 0xe0434352Fault offset: 0x000000000003811cFaulting process id: 0x94cFaulting application start time: 0x01ce2b83409e789aFaulting application path: C:\\\\\\\\Program Files\\\\\\\\Microsoft Office Web Apps\\\\\\\\PowerPointEditingServicesWatchdog_App\\\\\\\\ppteditingbackendwatchdog.exeFaulting module path: C:\\\\\\\\Windows\\\\\\\\system32\\\\\\\\KERNELBASE.dllReport Id: 7e88e5ec-9776-11e2-93f3-0050569e79e3Faulting package full name:Faulting package-relative application ID: There would be the same errors for all of the Web Apps (Excel, Word…) Needless to say, neither SharePoint 2013 nor Lync 2013 would be able to leverage features that required Web Apps Server. So, what’s next?Well I continued digging through the Event Log and realized that the Server was patched and restarted very recently, as part of the patching someone applied KB2760445. Sweet.So I started searching TechNet for information on that Update for Office Web Apps and found a nice article on how to Apply software updates to Office Web Apps Server. Basically it goes like this: After patching the Server, you will have to re-create the Office Web Apps Farm. In my case, I simply removed the farm usingRemove-OfficeWebAppsMachineand then re-used the same cmdlet I used to create the Web Apps Farm initially.New-OfficeWebAppsFarm -InternalUrl \\\\\\\"https://myOWAserver.tomt.local\\\\\\\" -ExternalUrl \\\\\\\"https://office.ntsystems.it\\\\\\\" –CertificateName \\\\\\\"ntSystems OfficeWebApps\\\\\\\" –EditingEnabledAll set.If there is one take-away from this, it is very likely: Read that documentation, oh, and please, do test!Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/patching-office-web-apps-server/\\\"},{  \\\"id\\\": \\\"post-prepare-windows-server-2012-for-lync-2013\\\",  \\\"title\\\": \\\"Prepare Windows Server 2012 for Lync 2013\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"To prepare a Windows Server 2012 for a Lync 2013 installation, install the following features manually before you run the Lync setup:.Net Framework 3.5Windows Identity Foundation 3.5   Media Foundation    HTTP Activation    Use the Powershell to speed up the installation:Install-WindowsFeature –name NET-Framework-Core –source D:\\\\\\\\sources\\\\\\\\sxs (the Windows 2012 Disk is mounted on D: )Install-WindowsFeature –name Windows-Identity-Foundation,Server-Media-Foundation,NET-HTTP-ActivationIf you have to prepare the AD schema, install also the AD DS Administration Tools.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/prepare-windows-server-2012-for-lync-2013/\\\"},{  \\\"id\\\": \\\"post-installing-lync-2013-updates\\\",  \\\"title\\\": \\\"Installing Lync 2013 Updates\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"Server\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"A few days ago, Microsoft released a bunch of updates for Lync 2013. I will walk through the required steps to upgrade a Lync 2013 Standard Edition server in this post. The February updates for Lync 2013 enable some new features including Lync 2013 mobile Clients, Group Call pick-up and many more…Get Files and read documentationHead over to the download center and download the update files: http://www.microsoft.com/en-us/download/details.aspx?id=36820Make sure you read the corresponding KB article as there are some manual steps required after the update: http://support.microsoft.com/kb/2809243InstallPrior to installing the updates stop the Lync Services, you can use the –Graceful parameter:Stop-CsWindowsService –GracefulYou can use Get-CsPoolUpgradeReadinessState to check if the pool you are going to update is ready.Copy all the files from the download to a local folder on the Lync Server, open LyncServerUpdateInstaller.exe and install the updates by clicking “Install Updates”&#160;After installing the updates, check the folder with the update files for logs. If everything installed correctly, reboot the server.Update DatabasesAfter the reboot, the databases need to be updated, too. On a standard edition front end server, the databases are installed locally, so you can update them using the following cmdlets:Install-CsDatabase -ConfiguredDatabases -SqlServerFqdn lyncfe.ntsystems.local –VerboseThe Central Management Store needs an update too, it is also co-located on the standard edition server:Install-CsDatabase -CentralManagementDatabase -SqlServerFqdn lyncfe.ntsystems.local -SqlInstanceName rtc –VerboseAfter that, the newly published topology needs to be enabled, this can be done using the Enable-CsTopology cmdlet.Enable-CsTopologyNow the last step is to run the Bootstrapper on the updated front end servers, it can be found on the Lync Server in the following path:&quot;%ProgramFiles%\\\\\\\\Microsoft Lync Server 2013\\\\\\\\Deployment\\\\\\\\Bootstrapper.exe&quot;That should be it and the Lync 2013 February updates have been installed.so long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/installing-lync-2013-updates/\\\"},{  \\\"id\\\": \\\"post-activesync-forefront-tmg-and-accountlockoutthreshold\\\",  \\\"title\\\": \\\"ActiveSync, ForeFront TMG and AccountLockoutThreshold\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"The use of smartphones and other mobile email clients has been increasing for quite some time. With ActiveSync being one of the widest-used protocols comes the need to manage another set of devices. As users are forced to change their domain account&rsquo;s passwords from time to time, some might forget to update their smartphones as well.The ProblemSo, as a user changes their password, the mobile device will continuously try to sync with a wrong set of credentials. Now depending on the rate at which it tries to sync, this might very well lock-out the users AD account, depending on the Domains Password Policy.Another possibility to consider is an attacker who could create quite a disturbance by locking out accounts intentionally, using any published Web Site with Forms Base Authentication.The SolutionForefront TMG 2010 SP2 comes with a new feature, called AccountLockoutThreshold. Forefront TMG keeps track of failed logons and locks the account locally, after a specified amount of failures. After that, any other attempt to authenticate via TMG is not forwarded to Active Directory/LDAP, so that the users account does not get locked-out continuously .The AccountLockoutThreshold feature is local to the Forefront TMG server, so if there is an array of publishing servers, it has to be configured on each of them. It can only be configured for Web Listeners using Forms Based Authentication.To configure AccountLockoutThreshold we need to use PowerShell, there is no GUI that exposes this setting. A great script to control the settings is available in the Script Center. So, we copy the script and save it to a *.ps1 file on the Desktop of the TMG Server, then we use dot-sourcing to load it into an administrative PowerShell session.Example: I saved the script to AccountLockout.ps1 on the Desktop. Use &ldquo;. .\\\\\\\\Desktop\\\\\\\\AccountLockout.ps1&rdquo; to import the script.The Get-AccountLockoutSetting cmdlet is used to retrieve the current settings.&nbsp;The Set-AccountLockoutSetting cmdlet is used to configure the feature.Example: I use &ldquo;Set-AccountLockoutSetting -WebListener OWA -EnableAccountLockout $true -AccountLockoutThreshold 5 -AccountLockoutResetTime 300&rdquo; to enable the AccountLockout feature, accounts will get locked out for 300 seconds if there are 5 consecutive failed attempts.Once configured, the following event will be logged to the Application Log of the TMG server if an account gets locked out locally:Source: Microsoft Forefront TMG Web Proxy Event ID: 32581 Level: Error Text: limit for consecutive logon failures has been reached. Additional logon attempts by domain.local\\\\\\\\user.name will be automatically rejected for the next 300 secondsUnfortunately TMG has been discontinued and is no longer available for customers, but for anyone already using it, this should help you dealing with Account Lockout Policies and ActiveSync devices.&nbsp;so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/activesync-forefront-tmg-and-accountlockoutthreshold/\\\"},{  \\\"id\\\": \\\"post-lync-2013-(client)-and-lyncdiscoverinternal\\\",  \\\"title\\\": \\\"Lync 2013 (Client) and LyncDiscoverInternal\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"Client\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"Daniel and I have been quite busy implementing Lync 2013 these days. One interesting gotcha thing we knew, but didn’t give a lot attention about the Lync 2013 client is, that it makes use of the LyncDiscover and LyncDiscoverInternal DNS records. These records were introduced with Lync 2010 Mobility and were used by the mobile clients to locate a sign-in server. Lync 2010 Clients don’t look for them, they use _sipinternaltls._tcp and _sip._tls records for auto sign-in.With the Lync 2013 Client that changed. The new client now queries for the following DNS records in order to sign-in automatically:   LyncDiscoverInternal.ntsystems.it    LyncDiscover.ntsystems.it    _sipinternaltls._tcp.ntsystems.it    _sip._tls.ntsystems.it    sipinternal.ntsystems.it    sip.ntsystems.it    sipexternal.ntsystems.it  So, as you can see, even before trying to locate the SRV records, the 2013 Client tries to connect to the AutoDiscover Web Service. That works just fine, in most situations.But… in a configuration like the following you might run into this bug get a certificate warning when signing into Lync for the first time from the internal network.   You have a disparate namespace (like ntsystems.local for your Lync Servers while ntsystems.it is your SIP domain) AND    You use internal certificates on the Front End Servers AND    You have Split DNS configured (ntsystems.it on the internal DNS servers) AND    You set LyncDiscoverInternal.ntsystems.it DNS record (for public zone on internal DNS server) The certificate warning shows the server name to which Lync is attempting to connect, it also shows the certificate subject and you can view the certificate. You double (triple) check the certificate, subject alternate names, dates, DNS, basically everything and it seems to be just fine. Still, you continue to get the warning.WorkaroundFirst of all, I have to say that I do not fully understand why this happens. The way I see it, is that Lync 2013 connects to the internal Web Service (using LyncDiscoverInternal) and all certificate parameters are fine… As you are probably not going to get a certificate for ntsystems.local from a public CA I wonder what the right solution looks like…The good news: There is a workaround for this, you can use Group Policy to configure Lync 2013 to configure the Trusted Domain List. According to TechNet, this “Lists the trusted domains that do not match the prefix of the customer SIP domain.” – nice. So, I added ntsystems.local to the Trusted Domain List that can be found in User and Computer Configuration under: Administrative Templates/Microsoft Lync 2013/Microsoft Lync Feature PoliciesYou can download the admx/adml files for Office 2013 here. The Group Policy adds the domain to the either “HKEY_LOCAL_MACHINE\\\\\\\\SOFTWARE\\\\\\\\Policies\\\\\\\\Microsoft\\\\\\\\Office\\\\\\\\15.0\\\\\\\\Lync\\\\\\\\TrustModelData” or “HKEY_CURRENT_USER\\\\\\\\SOFTWARE\\\\\\\\Policies\\\\\\\\Microsoft\\\\\\\\Office\\\\\\\\15.0\\\\\\\\Lync\\\\\\\\TrustModelData” depending on what you choose in the Group Policy Object. Another workaround would be to simply remove the LyncDiscoverInternal record from the internal DNS zone, which breaks mobile clients (including Lync Windows Store App) on the internal network (Wireless). Not really a solution…Again, I don’t fully understand the problem, this is what I found during my research. If you have a better solution, please drop me a line :)&#160;Happy New Year and have a nice weekend,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-(client)-and-lyncdiscoverinternal/\\\"},{  \\\"id\\\": \\\"post-lync-2013-installation-and-certificates\\\",  \\\"title\\\": \\\"Lync 2013 – Installation and Certificates\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"Server-2012\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"This post is the follow-up to the one about AD and topology preparation and I will again use screenshots to walk through the Installation and Certificate request and assignment processes.DNS RecordsThe last post ended with publishing the Topology, after that, the wizard provides a simple To-Do list, summarizing the next steps. Creating the DNS records for our Simple URLs was one of them. So, using DNSmgmt.msc I created CNames for the meet, dialin and lyncadmin URLs, all pointing to the Lync Front End Server.The DNS Records used for automatic sign-in are not mentioned in said To-Do list, though. I created the sip.tomt.local record as just another alias pointing to the Lync FE Server. Automatic Sign-in also needs the following Service Location Record (SRV)_sipinternaltls._tcp.tomt.local SRV service location:     &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; port&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = 5061      &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; svr hostname&#160;&#160; = lyfe01.tomt.localAll in all, I do now have the following DNS Records:            HostName        RecordType        RecordData                  _sipinternaltls._tcp        SRV        [0][0][5061][lyfe01.tomt.local.]                  lyfe01        A        10.1.1.11                  dialin        CNAME        lyfe01.tomt.local.                  meet        CNAME        lyfe01.tomt.local.                  sip        CNAME        lyfe01.tomt.local.                  lyncadmin        CNAME        lyfe01.tomt.local.        Server PrerequisitesThe next step is to install the prerequisites on the Lync Server, for more information check TechNet. I use the following PowerShell cmdlet to install Lync Server prerequisites, make sure you specify a “–Source”.   Add-WindowsFeature NET-Framework-Core, NET-Framework-45-Features, RSAT-ADDS, Web-Server, Web-Static-Content, Web-Default-Doc, Web-Http-Errors, Web-Http-Redirect, Web-Asp-Net, Web-Net-Ext, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Http-Logging, Web-Log-Libraries, Web-Http-Tracing, Web-Windows-Auth, Web-Client-Auth, Web-Basic-Auth, Web-Filtering, Web-Stat-Compression, Web-Dyn-Compression, Web-Mgmt-Console, Web-Scripting-Tools, Web-Request-Monitor, NET-WCF-HTTP-Activation45, Web-Asp-Net45, Web-Mgmt-Tools, Web-Mgmt-Compat, Desktop-Experience, Telnet-Client, BITS, Windows-Identity-Foundation –Source ‘D:\\\\\\\\sources\\\\\\\\sxs’ –Restart&lt;/code&gt;  Now after the reboot open Lync Deployment Wizard again and click &quot;Install or Update Lync Server System&quot;    After installing Local Configuration Store and Lync Server Components, we need to request and assign Certificates for Lync to use.    If you use an online (enterprise) CA, select send request immediately, if you intend to send the request to a public CA, select the offline certificate request option. As I have ADCS installed in my test forest, I use the enterprise CA for this.    Optionally specify credentials and a certificate template, if your current user has permissions to request a certificate using the “WebServer” template, click next. Then specify the friendly name for and the key length for the certificate.    Lync automatically includes the required Alternative Names along with Simple URLs and external pool name. Other details (such as City, Country, Region) typically used in certificate requests can be specified too.    Select the SIP Domains, so that they are included, too. You can optionally add additional SANs, I didn’t need any more than the ones included by the wizard.  Request the Certificate and tick the “Assign this certificate…” checkbox.    If you plan to use Server-to-Server authentication (Office Web Apps, Exchange, SharePoint) also request an OAuth Certificate. The procedure is the same as for the Server certificate.    The OAuth Certificate is a &quot;Global&quot; Certificate, that means that Lync Central Management Store replicates it to all Lync Servers, and all Lync Servers will use the same Certificate for OAuth.  Starting the Services  Phew, now after all those steps, we can finally go ahead and start the services. Give it some time, and check if all services are started using services.msc.  Now, we can use Lync Server Control Panel to check out our work. I prefer to use the Control Panel on my client PC, as it requires Silverlight to be installed. So, on a Computer sporting Silverlight, open the Simple Administration URL specified before.     I will continue to test some features of Lync 2013, stay tuned for more!  &#160;  so long, have a nice weekend!   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-installation-and-certificates/\\\"},{  \\\"id\\\": \\\"post-lync-2013-prepare-ad-and-build-topology\\\",  \\\"title\\\": \\\"Lync 2013 – Prepare AD and build Topology\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Lync\\\",\\\"Server-2012\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"In this post I use the screenshots taken in my test environment to walk through the steps of setting up a Lync 2013 Standard Edition Front End Server in a test environment.Install Deployment ToolsFirst of all we need to install the Lync Deployment Wizard on a server, this doesn’t necessarily have to be the Lync Server, although it’s a good idea to use this server. So, start Setup and select a location for the installation files.&#160;After that installation finishes, we we start the Deployment Wizard and install the administrative tools. Preparing Active DirectoryWarning: This is going to update the AD schema, make sure you are in test environment.From the Lync Server Deployment Wizard click “Prepare Active Directory” and update schema, prepare the forest as well as the current domain. The following cmdlets can be used to check domain/forest readiness.Get-CsAdDomain: If Domain is ready: LC_DOMAINSETTINGS_STATE_READY    Get-CsAdForest: If Forest is ready: LC_FORESTSETTINGS_STATE_READYNow preparing the current domain created some AD groups used by Lync. Add the account used to administer Lync to the CSAdministrator group.Define TopologyAfter preparing Active Directory we are ready to create a new Topology using the Topology Builder. So we start Topology Builder and create a new TopologySpecify a primary SIP domain, additional SIP domains can be specified in the next step.The first thing we need to create is a new Site within our new topology, specify a name and some details for the first Lync SiteStart the New Front End Pool wizard after finishing the New Topology wizard and enter the FQDN of your Lync Standard Edition Server. Specify the Lync Server Features to be installed on this serverAs we add Enterprise Voice and Conferencing we need a Mediation Server, tick the check box to Collocate the Mediation ServerDefine the SQL Store for the front end pool, as we install a Standard Edition Server we cannot change this Select a File Share that has already been added to the Topology builder or create a new one Specify the external URL, this URL will be used by external clientsAssociate an Office Web Apps Server that has already been added to the Topology or add a new one, if you have oneIf you selected the Monitoring on the features page, specify a SQL instance with Reporting Services. This can be installed locally or on a remote SQL server After finishing the new Front End Pool wizard, configure Simple URLs and Associate Central Management Server by right clicking “Lync Server” and selecting Edit Properties in the Topology BuilderCheck the Configured Settings and publish the Topology by selecting Action from the menu and clicking “Publish Topology”Ok, nice work. We have just created and published our Lync 2013 Topology. Time to get the Server ready.In the next post I will walk through the actual installation of the Lync 2013 Standard Edition Front End Server.so long,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-prepare-ad-and-build-topology/\\\"},{  \\\"id\\\": \\\"post-lync-2013-voicemail-escape\\\",  \\\"title\\\": \\\"Lync 2013 – Voicemail Escape\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Lync\\\",\\\"Skype4B\\\"],  \\\"content\\\": \\\"With the availability of all Office Wave 15 products, Lync 2013 piloting has begun. Exciting times :)So, this is a quick post about a new feature in Lync Server 2013, voicemail escape. What this does is, essentially providing a &ldquo;too soon&rdquo; timer for PSTN calls. Ok, you might say, why do I need such a thing?Well, if an enterprise voice user configures simultaneous ringing on her mobile phone, and that phones battery died or she wandered into an area with no network coverage, her provider&rsquo;s voicemail would answer. Now, even if she was sitting on her desk, she might never get the call, as the caller would always go to her voicemail. Voicemail escape defines a timer using the &ldquo;Set-CsVoicePolicy&rdquo; cmdlet, if a call is answered before that timer elapsed, Lync would ignore that answer and keep the call on premises.Enable the VoicemailEscapeTimer:Set-CsVoicePolicy -EnableVoicemailEscapeTimer:$true -PSTNVoicemailEscapeTimer:5000EnableVoicemailEscapeTimer enabled the timer. PSTNVoicemailEscapeTimer sets the timer (in ms) used to determine whether or not a call has been answered &ldquo;too soon&rdquo;.MonitoringThe Lync Monitoring server shows those ignored answers with a SIP Response Code of 480 and a Reason of: &rsquo;Terminating call as it is answered earlier than the specified voicemail escape timer&rsquo;The Lync Server Logging tool (Component: S4, Level: All) shows the timer in the SIP INVITE packet as:ms-vm-escape-timer: 5000You may have to tune the timer depending on your setup and the providers you are using. I had to set it pretty high to actually see an effect.so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-2013-voicemail-escape/\\\"},{  \\\"id\\\": \\\"post-windows-server-2012-virtualized-domain-controller\\\",  \\\"title\\\": \\\"Windows Server 2012 – Virtualized Domain Controller\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2012\\\"],  \\\"content\\\": \\\"Hello, welcome and a very happy new year!During Windows Server 8 Beta times, I wrote about virtualizing Domain Controllers and the VM-GenerationID attribute, since the old post was in German and about the beta version, this will be an updated translation.ProblemThe problem in Active Directory versions before 2012 was, that the restore of a snapshot would introduce a condition known as USN-Rollback, breaking replication between Domain Controllers. For that reason, DCs could not leverage all features of a modern, virtualized environment. Cloning a DC was pretty much unthinkable. Until now!VDC Safe RestoreThe Active Directory replication model assigns an ongoing number to every transaction (Update Sequence Number). DCs keep track of these numbers, along with a unique identifier (Invocation ID) for each replication partner. If a DC was rolled back in time (applying a snapshot), that DC would start reusing aged USNs and, therefore, replication partners would refuse the updates and terminate the replication partnership. The only resolution for this problem was to manually remove the DC from the Active Directory.Now, Windows 2012 introduces a feature to tackle that problem. The Hypervisor exposes a VM-Generation ID through the ACPI table, this ID is saved in the Domain Controllers memory. If the VM-Generation ID changes (e.g. when a snapshot is applied), the restored DC knows that something happened and resets it’s invocation ID.&#160;As replication partners have never heard of the new Invocation ID before, they don’t care about USN reuse and replicate like it was a new relationship. Apart from resetting the Invocation ID, the DC also, non-authoritatively restores SYSVOL and logs the following Event to the “Directory Services” Event Log.The new Active Directory attribute used to store the VM-Generation ID is ms-DS-Generation-Id, find more information about that attribute on MDSN.There is no need (and no way) to configure VDC Safe Restore, as long as the Hypervisor supports VM-Generation ID, it automatically works. In a recent blog post VMware announced support for VM-Generation ID for it’s vSphere platform, so now you can choose Hyper-V 2012 and VMware’s ESXi as Hypervisor for your Domain Controllers.A word of caution at the end, never, and I mean NEVER, stop taking regular (AD aware) backups! The feature discussed in this post is meant just to solve the USN-Rollback issue, it is in no way a replacement for a backup as the DC is restored in a non-authoritative way.Stay tuned for DC cloning :)&#160;so long, have a nice weekend!   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-2012-virtualized-domain-controller/\\\"},{  \\\"id\\\": \\\"post-powershell-v3-invoke-webrequest\\\",  \\\"title\\\": \\\"PowerShell v3 Invoke-WebRequest\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Today I have a quick function to download the current Sysinternals Suite from http://live.sysinternals.com. I created this mainly to learn/try some concepts of PowerShell, if you have any hints/ideas feel free to drop me a mail.This function leverages the new &lsquo;Invoke-WebRequest&rsquo; cmdlet, available in PowerShell v3, so, obviously V3 is required.Example use:Update-SysinternalsSuite -Path C:\\\\\\\\tools\\\\\\\\sysinterals &ndash;AsJobThis downloads the Sysinternals Tools to C:\\\\\\\\tools\\\\\\\\sysinternals. If the specified folder does not exist, the script creates it. It also makes use of background jobs, so you can keep using PowerShell during the download.I&rsquo;ve posted the Function to PoshCode:&nbsp;enjoy, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-v3-invoke-webrequest/\\\"},{  \\\"id\\\": \\\"post-microsoft-ndes-and-cisco-ios-part-2\\\",  \\\"title\\\": \\\"Microsoft NDES and Cisco IOS – part 2\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server-2012\\\",\\\"Network\\\"],  \\\"content\\\": \\\"This is part two of my article about NDES and Cisco. In the first article, I configured the Windows 2012 NDES role, in this part I will walk you through the enrollment process on a Cisco IOS router.RSA keySo what are we going to do here? We will be leveraging SCEP to obtain a digital certificate from a CA. As a prerequisite to this, the router needs a key-pair, that is, private and public keys. The public key will be sent to the CA (using SCEP), the CA will sign that public key and send the certificate (signed public key) back to the router.If you are already using services like “ssh” or “ip http secure-server” you can use the existing keys. If no keys exist, the router will create a new set of keys as we enroll for a certificate. This auto generated key-pair is only using a 512 bit key, that is not considered secure anymore.To create a new key-pair, using a reasonable secure key length:&#160;TrustpointHaving the keys in place, we need to get the CA certificate. The router will use the CAs public key to authenticate the CA and other digital certificates issued by that same CA.To download the CA certificate we define a new trustpoint and set to enrollment URL to the SCEP URL, if you have no name resolution configured, be sure to use the IP address of the SCEP server instead of the name.The SCEP URL defaults to: http://servername:80/CertSrv/mscep/mscep.dll After configuring the trustpoint, we tell the router to download the CA certificate: ´IOS shows the Thumbprint (fingerprint) of the digital certificate, so one could verify that this is the correct certificate using an out-of-band method.A quick look at the running-config shows that the key was received.EnrollNow that the router does trust our CA we can go ahead and request a digital certificate: IOS prompts for a password that would be used to revoke the certificate, and you can choose to add the IP address or serial number to the certificate. The request gets signed by the CA and the certificate is sent back to the router, you should see the following messages in the log or on “terminal monitor”CRYPTO_PKI:&#160; Certificate Request Fingerprint MD5: 4C9C472F 605AA33F 869EB167 9F097C56    CRYPTO_PKI:&#160; Certificate Request Fingerprint SHA1: E943141D 19A5C4EB 6B5EE5D2 B87AAF57 B829FFED     %PKI-6-CERTRET: Certificate received from Certificate AuthorityThe IIS Log on the SCEP server shows the successful transaction like this:2012-11-30 18:58:19 192.168.1.21 GET /CertSrv/mscep/mscep.dll/pkiclient.exe operation=PKIOperation&amp;message=MIIJUgYJKoZIhvcNAQcCoIIJQzCCCT8CAQExDjAMBggqhkiG…   …2Bw6Q1AJGzQs4wl7jA4GvWvikdP1wnPzAkVP7KZ%2FZ1%2Fz4hCYNpP4%3D%0A 80 - 192.168.1.1 - - 200 0 0 277In the “Certificate Authority” MMC Snap-In you see the certificates that have been issued:  &#160;That was the second, and final part on NDES and IOS routers.so long,tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-2/\\\"},{  \\\"id\\\": \\\"post-microsoft-ndes-and-cisco-ios-part-1\\\",  \\\"title\\\": \\\"Microsoft NDES and Cisco IOS – part 1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\",\\\"Cisco\\\",\\\"Security\\\"],  \\\"content\\\": \\\"With digital certificates being the de-facto standard for authentication, a handy enrollment model is key (pun intended). Microsoft included it’s NDES or Network Device Enrollment Service as a Role in Windows 2008, it has been available as add-on for Windows 2003, too. NDESSo, NDES sounds pretty cool, but what is it, you may wonder. It’s Microsoft’s implementation of SCEP or Simple Certificate Enrollment Protocol, which is a PKI communication protocol that leverages existing PKCS#10 and #7 technology over HTTP. It provides a simple means of requesting and issuing digital certificates across different devices and vendors.&lt;/p&gt;Installing NDES on Windows Server 2012To use SCEP with your existing ADCS based PKI simply add the Role to the Server that provides CA Web Enrollment. I’m not going through the details of setting up a ADCS based PKI here, that might very well be a topic for a future post, though.Add the Role using ServerManager or Windows PowerShell:Install-WindowsFeature –Name ADCS-Device-EnrollmentConfiguring NDESAfter successful installation of the Role, ServerManager informs you that there is some sort of configuration required for the newly added feature.An AD user account is required for the NDES service to use. That account must be member of the local IIS_IUSRS group on the NDES Server. I created a user with the name of scep and added it to the group before starting the configuration wizard.Select the Service Account:Fill in information required for the RA certificate. What happens here, is that the NDES Server is issued two Registration Authority certificates, which are then used for SCEP:Configure cryptographic settings for the RA keys:After reviewing the settings, and clicking Configure you will see the RA certificates in the personal store of the NDES Server: &lt;/p&gt;Configure NDES CA settingsThe certificate template used by NDES defaults to IPSECIntermediateOffline, that can be changed by modifying the following registry keys:HKEY_LOCAL_MACHINE\\\\\\\\SOFTWARE\\\\\\\\Microsoft\\\\\\\\Cryptography\\\\\\\\MSCEPEncryptionTemplateGeneralPurposeTemplateSignatureTemplateI decide to go with the WebServer template, so I update the registry and restart the certsvc service. Keep in mind, that the service-user account (TOMT\\\\\\\\scep, in my lab) needs permissions to enroll for the selected certificate template. This can be configured using the Certificate Templates MMC Snap-In:NDES requires a challenge for every certificate transaction, unfortunately there seems to be no such setting in Cisco’s SCEP implementation. That default can be changed by setting the following registry key to 0:HKEY_LOCAL_MACHINE\\\\\\\\SOFTWARE\\\\\\\\Microsoft\\\\\\\\Cryptography\\\\\\\\MSCEP\\\\\\\\EnforcePassword\\\\\\\\EnforcePasswordWarning: This disables the need for a challenge, so that essentially anyone with knowledge of your NDES server can enroll for certificates.Restart the certsvc service after modifying the registry:Get-Service certsvc | Restart-ServiceConfigure NDES IIS settingsIIS request filtering sets the value for MaxQueryString to 2048 by default, a reasonable key length is at least 1024, more often 2048. You see the problem, that value needs to be changed in order to support strong keys.Use appcmd to change the value for MaxQueryString:%systemroot%\\\\\\\\system32\\\\\\\\inetsrv\\\\\\\\appcmd.exe set config /section:system.webServer/security/requestFiltering /requestLimits.maxQueryString:\\\\\\\"4096\\\\\\\" /commit:apphostIf you don’t update MaxQueryString you will see error 404.14 Query string too long in the IIS log.There is a really good guide to NDES on TechNet Wiki.That’s it for the first part, our NDES on Windows Server 2012 is configured and ready to go. Stay tuned for part 2.— Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-1/\\\"},{  \\\"id\\\": \\\"post-get-access-to-a-windows-2012-server-without-a-password\\\",  \\\"title\\\": \\\"Get access to a Windows 2012 Server without a password\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2012\\\"],  \\\"content\\\": \\\"In this article, I will explain how you get access to a Windows Server without a password.When the server boots up you have a nice feature “Easy access” on the logon screen. In the next steps, we change the “Easy Access” function with a cmd command prompt:1. Boot with the Server 2012 CD and select “Repair your computer”2. Select “Troubleshooting” and “Command prompt”       3. Get the drive letter of your System Volume with diskpart4. Rename the utilman.exe file to utilman.old and copy cmd.exe to utilman.exe5. Reboot the server and start the “Easy Access” feature. You will get a command prompt. Now type whoami and you will see that you can run commands under the local system accountND\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/get-access-to-a-windows-2012-server-without-a-password/\\\"},{  \\\"id\\\": \\\"post-sharepoint-2013-change-default-settings-of-upload-image-pop-up\\\",  \\\"title\\\": \\\"Sharepoint 2013 change default settings of “Upload Image” Pop-Up\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"When you upload files or images in Sharepoint you have get a pop-up that asks you about the file, destination library and an option to overwrite extsting files.When the pop-up appears the checkbox “Overwrite existing files” is checked. To change the default setting we have to change 2 aspx files:   Navigate to C:\\\\\\\\Program Files\\\\\\\\Common Files\\\\\\\\Microsoft Shared\\\\\\\\Web Server Extensions\\\\\\\\14\\\\\\\\TEMPLATE\\\\\\\\Layouts    Make a backup of the following files: upload.aspx and uploadex.aspx    Edit the upload.aspx file    Locate the line which contains: &lt;asp:CheckBox id=”OverwriteSingle” Checked=”true” Text=&lt;%$Resources:wss,upload_document_Overwrite_file%&gt;” runat=”server” /&gt;    Change the Checked=”true” to Checked=”false“    Edit the uploadex.aspx file and make the same changes on the same lines    Save the files    Perform an IISRESET The checkbox is now not selected default anymore.Greetings   nd\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-2013-change-default-settings-of-upload-image-pop-up/\\\"},{  \\\"id\\\": \\\"post-exchang-2013-offline-owa\\\",  \\\"title\\\": \\\"Exchang 2013, Offline OWA\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"en\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"In the last time I worked a lot on my Exchange 2013, SQL 2012 and Sharepoint 2012 lab. A really nice feature is the Exchange 2013 Offline OWA.You can start using OWA offline from the OWA Website:OWA informs you to that it will save some content of your mailbox on the computer.What you can see now is that OWA safes mailbox content on your local disk under C:\\\\\\\\Users\\\\\\\\user\\\\\\\\AppData\\\\\\\\Local\\\\\\\\Microsoft\\\\\\\\Internet Explorer\\\\\\\\Indexed DB&nbsp;Like Exchange also the offline files are some edb an log files.There is a full list of all offline OWA features: http://technet.microsoft.com/en-us/library/aa997437(v=exchg.80).aspxGreetings nd\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchang-2013-offline-owa/\\\"},{  \\\"id\\\": \\\"post-windows-server-2012-directaccess\\\",  \\\"title\\\": \\\"Windows Server 2012 – DirectAccess\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server-2012\\\",\\\"Server\\\"],  \\\"content\\\": \\\"DirectAccess is a feature that has been introduced in Windows Server 2008R2 and Windows 7. It allows secure access to enterprise resources, without requiring a manual VPN connection. A DirectAccess enabled computer establishes a secure connection to the DirectAccess server every time the computer is connected to the internet.Windows Server 2012 and Windows 8 really simplify the configuration required for DA, making it much easier to deploy a remote access solution.RequirementsThe only requirement is the installation of a Windows Server 2012 member server, providing the “head end” of the connection. No Active Directory, schema, forest, domain-level updates are required.The DA Server needs two network adapters, one connected to the internal LAN, the other one connected to a DMZ or public network.&#160;If the DA Server is located behind a firewall, https (tcp/443) has do be allowed from the internet to the “public” network adapter.DirectAccess relies on IPv6 technology, the only hosts that require an IPv6 address are the DirectAccess Server and clients, though. The DA server performs NAT64 and DNS64 in order to enable the DA client to access IPv4 only servers.InstallationUse ServerManager or PowerShell to install the Remote Access server role on the designated DirectAccess server. Once installed, use the “Getting started” wizard to configure DirectAccess. The wizard can be started from ServerManager or from within the “Remote Access Management Console”.Select “Deploy DirectAccess only” in the wizard. Select the network topology to be used, in this example I am using a server with two network adapters, one connected to a DMZ and one connected to my LAN. Specify the name (or public IP) that clients will be using to connect.  And that’s all there is about it, it’s called “simplified deployment”. The Wizard goes ahead and creates Group Policies for DA Servers and Clients, creates DNS records for Network Location. Pretty cool, eh?To modify the settings, click the “here” link on the last page of the wizard, for my test environment I go with the defaults.As the wizard finishes, it shows some information about what it did.DirectAccess Server The DirectAccess Configuration can be shown and changed in the Remote Access Management Console. The Dashboard and Operations Status panels do provide information about the servers status, required services and connected clients. DirectAccess ClientsThe wizard created a Group Policy Object, named “DirectAccess Client Settings” and a WMI Filter, to apply that GPO to Notebooks running Windows 7 or 8 Enterprise editions. So all I had to do was to update the group policies on the notebook (gpupdate). As long as it was connected to the LAN nothing changed, if I connected the notebook to the internet, the DA (Workplace Connection) was established automatically and I was able to access internal resources as if I was on the LAN. I think this “simplified deployment” really does make it easier to get started with DirectAccess, to deploy it in an enterprise network, one should be a little more familiar with the technology :) So this post was meant to be a quick-and-dirty intro, stay tuned for more in-depth information.so long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-2012-directaccess/\\\"},{  \\\"id\\\": \\\"post-windows-8-windows-to-go\\\",  \\\"title\\\": \\\"Windows 8 – Windows To Go\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"en\\\"],  \\\"content\\\": \\\"Windows to Go (WTG) is a new feature available in the Windows 8 Enterprise Edition. It enables the deployment of Windows 8 to USB thumb drives so that an End User can really plug in their USB drive and boot their Enterprise environment on any machine. Now, for security reasons the thumb drive can be encrypted using BitLocker and the User has no access to local hard disks of the &ldquo;host&rdquo;.HardwareWTG requires a &ldquo;fixed drive&rdquo;, that is, you cannot use any USB drive, it must be &ldquo;Certified&rdquo;. I am using a Kingston DataTraveler Workspace (www.kingston.com/wtg) other supported devices are listed on TechNet: Windows To Go: Feature OverviewEven though its not required USB 3 is highly recommended to speed things up. If you have no WTG certified drive handy, try using a USB hard disk.DeployDeployment is really simple, simply open &ldquo;Windows To Go&rdquo; from Control Panel. The WTG Wizard starts, and the first thing you have to select is which drive to use.In the next step you select the Windows 8 Image, for testing I mounted a Windows 8 Enterprise DVD. In a real-world scenario you would use your customized Image for deployment.Set a password to BitLocker the device (highly recommended).Obviously all data on the drive is lost, so if that is not a problem, click &ldquo;Create&rdquo;.Yeah, that&rsquo;s it. In the last step you can choose to reboot the machine or just finish and close.Boot and WorkSo now you have created a new WTG Workspace that can be used to boot Windows from almost any PC. If the PC can run Windows 7 or 8, it almost certainly will run Windows to Go. The first time you boot WTG it takes some time, just as every new Windows installation takes some time. After the quick, first steps you can start working, you&rsquo;ll notice that there is no access to the hard drives of the host computer. If local access is needed, simply open &ldquo;Disk Management&rdquo; and make the disks available (Requires Administrative permissions).If you shut down Windows To Go and remove your USB drive, the local Computer starts, absolutely unaffected by WTG. BYOD just got a lot simpler, IT just needs to hand out USB drives and doesn&rsquo;t need to be supporting all kind of different environments Users might have on their devices.On the other hand, Users do not have to worry about IT enforcing policies on there private-owned devices.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If you ask me, that&rsquo;s pretty cool :) tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-8-windows-to-go/\\\"},{  \\\"id\\\": \\\"post-sharepoint-2013-search-center-windows-8\\\",  \\\"title\\\": \\\"SharePoint 2013 Search Center – Windows 8\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Sharepoint\\\"],  \\\"content\\\": \\\"SharePoint 2013 Enterprise Search Center provides powerful indexing and search, not only for the local SharePoint instance but for file shares and other SharePoint farms as well.More info: What's new in search in SharePoint Server 2013Federated SearchWindows 7 and later support the connection of external sources through OpenSearch, which essentially is a Web Service that receives search queries by the client and returns results in either RSS or Atom XML format. This allows users to search remote data and view search results within Windows Explorer.More info: Federated Search in WindowsCreate OSDX FileNow to get SharePoint search into Windows Explorer you need to create an OSDX (OpenSearch Description) file and deploy it to your clients.Here is an example file that works for my SharePoint 2013 and Windows 8:&lt;?xml version=\\\\\\\"1.0\\\\\\\" encoding=\\\\\\\"UTF-8\\\\\\\"?&gt; &lt;OpenSearchDescription xmlns=\\\\\\\"http://a9.com/-/spec/opensearch/1.1/\\\\\\\"&gt; &lt;ShortName&gt;SharePoint Search&lt;/ShortName&gt; &lt;Description&gt;Search the SharePoint Search Center&lt;/Description&gt; &lt;Url type=\\\\\\\"application/rss+xml\\\\\\\" template=\\\\\\\"http://intranet.ntsystems.local/sites/searchcenter/_layouts/srchrss.aspx?k={searchTerms}&amp;amp;web.count=50\\\\\\\"/&gt; &lt;Url type=\\\\\\\"text/html\\\\\\\" template=\\\\\\\"http://intranet.ntsystems.local/sites/searchcenter/Pages/results.aspx?k={searchTerms}\\\\\\\"/&gt; &lt;/OpenSearchDescription&gt; &nbsp;Simply create a new file using notepad, adjust the URLs to point to your SharePoint Enterprise Search Center and save it with the .osdx extension.There are many possibilities for customization within the OSDX specification, check out MSDN to learn more about Creating an OpenSearch Description File.To test the OSDX files, double-click it and click \\\\\\\"Add\\\\\\\" to add the search connector to Windows Explorer.This adds a link to \\\\\\\"Favorites\\\\\\\" so you can easily search SharePoint from there.Deploy OSDXNow, to deploy this to more than one client, you could publish a link to the OSDX file and have your users click on that link to add the search provider.Alternatively Group Policy Preferences can be used to deploy the search connector:Copy the .searchConnector-ms file from your Client (%UserProfile%\\\\\\\\Searches\\\\\\\\) to a share that is available to the clientsCreate a GPO and use the 'Files' GPP to copy the searchConnector-ms file from the share to %UserProfile%\\\\\\\\Searches&nbsp;&nbsp;Use the 'Shortcuts' GPP to create a Shortcut in the \\\\\\\"User Profile, Links\\\\\\\" folder, remember to select a nice Icon&hellip; ;)&nbsp;&nbsp;So that's how to get results from SharePoint into Windows Explorer.&nbsp;So long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-2013-search-center-windows-8/\\\"},{  \\\"id\\\": \\\"post-office-2013-web-apps\\\",  \\\"title\\\": \\\"Office 2013 Web Apps\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server-2012\\\",\\\"Sharepoint\\\"],  \\\"content\\\": \\\"So October has been pretty quiet around here, but I have some cool stuff to share with you today.Office 2013 RTM'd some time ago and so did all the server products. So with SharePoint 2013 available on TechNet I decided to set up some demo sites to get a feel for the product, after looking for a new version of the Office Web Apps I realized that there was some change coming here.Office Web Apps ServerOffice 2013 Web Apps are no longer installed on SharePoint servers directly, it became a stand-alone product instead. Not only does that stand-alone product bring new design and scalability possibilities, it is also possible to share the Web Apps with Exchange and Lync 2013.PrerequisitesTo install Office Web Apps Server on a Windows Server 2012 box the following roles and features must be installed as a prerequisite:Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices If you want to use https for the Web Apps a proper certificate must be available on the server, too. To display the certificates installed on a computer try the following command:Get-ChildItem Cert:\\\\\\\\LocalMachine\\\\\\\\my | select Subject,FriendlyName The Web Apps Server can also be installed on Windows Server 2008R2, find the prerequisites on TechNet.Installing Office Web Apps Server and creating the farmThe actual installation of the Server is pretty straightforward, just download the ISO and double click it (love that&hellip;). The only thing you can choose during setup is the installation path.Once done with the installation, you can go ahead and use PowerShell to create a new Web Apps Farm. Not surprisingly the cmdlet to be used is New-OfficeWebAppsFarm, the following parameters have to be used to create a farm:-InternalUrl: the URL used for internal Clients-ExternalUrl: the URL used for Clients on the Internet-CertificateName: set the FriendlyName of the certificate to be used for the farm-EditingEnabled: enable editing of files in the browser (SharePoint)The following example creates a farmNew-OfficeWebAppsFarm -InternalUrl \\\\\\\"https://myOWAserver.tomt.local\\\\\\\" -ExternalUrl \\\\\\\"https://office.ntsystems.it\\\\\\\" &ndash;CertificateName \\\\\\\"ntSystems OfficeWebApps\\\\\\\" &ndash;EditingEnabled To verify that the farm has been created successfully, open a browser and go to https://myowaserver.tomt.local/hosting/discovery you should see some XML information about your internal and external URLs.SharePoint 2013Now to connect your SharePoint 2013 farm to the brand new Web Apps farm, fire up an administrative SharePoint Management Shell and use the New-SPWOPIBinding cmdlet. Use the &ndash;ServerName parameter to specify the internal URL of the Web Apps farm:New-SPWOPIBinding -ServerName https://myOWAserver.tomt.local &nbsp;After that you can have a look at the WOPI Zone, if users are accessing the SharePoint from internal and external clients you might want to change the zone from its default value of \\\\\\\"internal-https\\\\\\\" to \\\\\\\"external-https\\\\\\\":Set-SPWOPIZone &ndash;zone \\\\\\\"external-https\\\\\\\" &nbsp;Almost done, if you are using https on your SharePoint web applications you should be ready to go. If you are using http for SharePoint you need to set AllowOAuthOverHttp to true. This needs to be done in the SharePoint Management Shell using the following commands:$config = (Get-SPSecurityTokenServiceConfig) $config.AllowOAuthOverHttp = $true $config.Update() &nbsp;To check if it worked, use:(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp Try it&hellip;Ready to see it? Open a browser, go to your SharePoint 2013 sites and create a new Document or open an existing one, should be looking like that:&nbsp;So long,tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/office-2013-web-apps/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-and-maxinboundconnectionpersource\\\",  \\\"title\\\": \\\"Exchange 2010 and MaxInboundConnectionPerSource\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Exchange receive connectors do have a setting of MaxInboundConnectionPerSource which limits the maximum number of connections from a single IP address at any moment. So with a default value of 20, there are no more than 20 connections from a specific IP address allowed. The following warning is logged in the transport server's application log if the limit is exceeded:Event ID: 1021Event Source: MSExchangeTransportMessage Text: Receive connector 'Connector Name' rejected an incoming connection from IP address '10.10.10.10'. The maximum number of connections per source ('20') for this connector has been reached by this source IP address.The sender of a mail might receive the following message:Deferred: 421 4.3.2 The maximum number of concurrent connections has exceeded a limit, closing transmission channel\\\\\\\" Status 4.0.0, \\\\\\\"Transient failure\\\\\\\"According to RFC this is not a permanent error, so the sender's mail server should try to send the message again after some delay.\\\\\\\"The command was not accepted, and the requested action did not occur. However, the error condition is temporary, and the action may be requested again.\\\\\\\"Set-ReceiveConnectorTo view the configured value of MaxInboundConnectionPerSource use the Get-ReceiveConnector cmdlet, to change the value use the Set-ReceiveConnector cmdlet with the &ndash;MaxInboundConnectionPerSource parameter. The following example increases the value to 100 Get-ReceiveConnector default* | Select Name,MaxInbound*Get-ReceiveConnector default* | Set-ReceiveConnector -MaxInboundConnectionPerSource 100 More info on: TechNet &nbsp;So longtom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-and-maxinboundconnectionpersource/\\\"},{  \\\"id\\\": \\\"post-scheduled-jobs-in-powershell-v3\\\",  \\\"title\\\": \\\"Scheduled Jobs in PowerShell v3\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"I am really excited to write about that great feature of PowerShell I started using recently. It's all about scheduling administrative tasks, actually it's more like scheduling everything, to run when I am at home sleeping happily JSo as I have mentioned before I'm no PowerShell expert at all and I'm sure all that stuff can be done many other ways, but then this thing is working for me&hellip;SnippetsIf you have been using PowerShell ISE you might know what Snippets are, if you don't, just open powershell_ise.exe and press 'ctrl+j'. Snippets are code samples that can be added to your script easily. You can create your own snippets like that:$code = @' # this is my sample code '@ New-IseSnippet -Title 'Sample' -Description 'Just a sample' -CaretOffset $code.Length -Text $code -Force &nbsp;This will create a 'Snippets' folder at your Documents\\\\\\\\WindowsPowerShell where your new snippet is saved for later use. Having that said let's move on to scheduled jobs.Scheduled JobsUntil now it was quite a pain in the butt to run PowerShell scripts as scheduled tasks, you had to specify the path to powershell.exe and then use some params to make it run the script you choose. You could even pass arguments to those scripts, but it was no real fun. So now we can do all that very easy and directly from within PowerShell.TriggerFor starters we need to create a job trigger, to tell PowerShell when to execute out script.$trigger = New-JobTrigger -At 22:00 &ndash;Once &nbsp;This will create a variable containing our trigger, as you can see the script will be executed today, at 22:00 and it will be executed only once.JobOptionsNext we can define some job options, it's not necessary though$option = New-ScheduledJobOption &ndash;RequireNetwork -StartIfOnBattery -ContinueIfGoingOnBattery &nbsp;Using the New-ScheduledJobOption cmdlet we can specify all kinds of different options, you might already know them from Task Scheduler.ScriptblockNow that we have a trigger and some options we need to define a scriptblock that is going to be executed by our scheduled job.$sb={  param([System.IO.FileInfo]$path,[string]$string)  Add-Content -Path $path -Value $string -Force } &nbsp;This, obviously, is just a simple example. It will simply append a string to a file, should be enough to demo what I mean though.CredentialLast thing we need to specify is the account that should be used to run the task.$cred = Get-CredentialThis will create a variable containing the credential you type in. We will pass this to the &ndash;Credential parameter of the next step.RegisterScheduledJobWe have defined everything we need so we can go ahead and register the job.Register-ScheduledJob -Name \\\\\\\"test\\\\\\\" -Trigger $trigger -Credential $cred -ScheduledJobOption $options -ScriptBlock $sb -ArgumentList (\\\\\\\"c:\\\\\\\\temp\\\\\\\\test.txt\\\\\\\",\\\\\\\"abcde\\\\\\\") &nbsp;This creates a scheduled task at \\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\PowerShell\\\\\\\\ScheduledJobs, it can be viewed using Task Scheduler or using the Get-ScheduledJob cmdlet.If you want to specify a script file instead of a scriptblock, simply change the &ndash;ScriptBlock param and use &ndash;FilePath.UnregisterScheduledJobThe job can be deleted in Task Scheduler or by using the Unregister-ScheduledJob cmdlet.&nbsp;&nbsp;I hope you will find this feature as exciting as I do, I'll provide you with the code snipped so you can easily use 'crtl+j' to create a task the next time. Just copy the ps1xml file to your Documents\\\\\\\\WindowsPowerShell\\\\\\\\Snippets folder and enjoy. JScheduled Job.snippets.ps1xml (1.35 kb)&nbsp;&nbsp;So long, have a nice weekend!tom&nbsp;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/scheduled-jobs-in-powershell-v3/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-attachments\\\",  \\\"title\\\": \\\"Exchange 2010, Outlook doesn’t show attachments\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Last Week I had into the problem that Outlook 2010 didn’t show some attachments. After a research on technet I found out that this attachment was a not referenced inline-attachment.To fix this behavior and make Outlook showing the attachment you have to do the following:- Stop the Exchange Transport service.    - Locate the EdgeTransport.exe.config file. This file is located in the following path:     C:\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\Bin\\\\\\\\ In the EdgeTransport.exe.config file, add the following entry between the &lt;appSettings&gt; element and the &lt;/appSettings&gt; element: &lt;add key=&quot;TreatInlineDispositionAsAttachment&quot; value=&quot;true&quot; /&gt; - Start the Transport serviceGreetings    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-attachments/\\\"},{  \\\"id\\\": \\\"post-gal-photos-reloaded-batch-import\\\",  \\\"title\\\": \\\"GAL Photos reloaded–batch import\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"About two years ago I&rsquo;ve posted an article about Exchange 2010 and GAL Photos. Now this is not great news anymore, there are two great articles on the Exchange Team Blog, that explain how to configure this, too. Find them here: aka.ms/galphotosand aka.ms/galphotosfaqKey points are the the minor schema change and the maximum file size of 10KB. Images can be max. 96x96 pixels in size.Now in the last couple of days I wrote a &ldquo;cmdlet&rdquo; to make batch importing images easier. For starters, the cmdlet gets all *.jpg files in folder, then it uses the files BaseName to find corresponding Exchange Mailboxes. After that the image&rsquo;s physical dimensions as well as file size are verified, if they are ok, the image is imported using Import-RecipientDataProperty.The folder containing the images can be set using the cmdlet&rsquo;s &ndash;FilePath parameter, the cmdlet takes pipeline input from Get-ChildItem too.Here are two examples of how the cmdlet could be used:PS C:\\\\\\\\&gt; Import-GalPhoto -FilePath 'c:\\\\\\\\temp\\\\\\\\pics' &nbsp; PS C:\\\\\\\\&gt; dir 'c:\\\\\\\\temp\\\\\\\\pics' | Select-Object -First 2 | Import-GalPhotoI&rsquo;ve pasted the function to PoshCode, here it goes:enjoy, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/gal-photos-reloaded-batch-import/\\\"},{  \\\"id\\\": \\\"post-server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten\\\",  \\\"title\\\": \\\"Server 2008 R2, Disk Management und DiskPart lässt sich nicht starten\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Mit Windows Server 2008 R2 kommt es manchmal vor, dass ich Volumes nicht extenden konnte und der Wizard folgenden Fehler anzeigt: “Unable to connect to Virtual Disk Service”&#160; Mit Diskpart sieht das dann so aus: “Diskpart encountered an error starting the COM service”&#160; Im EventLog ist folgender Fehler zu finden:Unable to start a DCOM Server: {9C38ED61-D565-4728-AEEE-C80952F0ECDE}. The error:        &quot;1260&quot;         Happened while starting this command:         C:\\\\\\\\Windows\\\\\\\\System32\\\\\\\\vdsldr.exe –EmbeddingWorkaroundHierzu habe ich einen kleinen Workaround um die Disk schnell zu extenden: CMD öffnen und folgendes Kommando starten: C:\\\\\\\\Windows\\\\\\\\System32\\\\\\\\vdsldr.exe –Embedding Nun funktioniert Diskpart und die Disk kann extended werden. Grüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten/\\\"},{  \\\"id\\\": \\\"post-my-powershell-profile\\\",  \\\"title\\\": \\\"My PowerShell Profile\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Today I am going to walk you through my PowerShell Profile and try to explain the basics of what a Profile is and how it can be used.So what is a Profile, and where is it?Well, basically a profile is a PowerShell script file (.ps1) that is stored in a preconfigured location and that gets executed every time PowerShell starts. This script enables you to customize your PowerShell session and predefine settings as you find them useful. There is a built-in variable, $Profile, which stores the location of the script that is executed every time PowerShell starts. The profile file is located in the WindowsPowerShell folder in every users “My Documents” folder. It has to be named Microsoft.PowerShell_profile.ps1.By default there is no profile and everything is left to their defaults, to create the profile script you can create the WindowsPowerShell folder and then use notepad to save a file containing some PowerShell commands in that folder. You can also use the New-Item cmdlet to create the folder and an empty file by typing:New-Item –Path $Profile -Type File –Force Example profileNow that we know what a profile is and where it is located we can go on and take a look at an example profile, it’s actually my profile so if you have any tips for me, feel free to leave a comment.I am starting my Profile with setting some variables, some are predefined and some are custom, I use them for the following settings:$MaximumHistoryCount is used to set the number of commands that are stored in History. Defaults to 64. Maximum 32767.    $Transcript is used to set the path for Start-Transcript     $env:PSModulePath is an environment variable (‘env:’) and it is used to customize the path where PowerShell will look for modules to import.     $cert is a variable I use to store my CodeSigningCert to sign scripts.After that I use Get-Host to figure out which version of PowerShell is running in the current session, if version 3 is detected, I set some DefaultParameterValues using $PSDefaultParameterValues. After that I check if the current session was started with “Run as administrator” if it was, the Update-Help cmdlet is run.Since I am writing a module I have a short function to just make my life a little easier, it signs the module file using Set-AuthenticodeSignature and then copies the file to some network share for my coworkers.At the end I am creating a new PSDrive of the FileSystem PS provider, after creating the drive the current location is set to that drive. This is my working directory, it contains all the scripts and test files I need.I pasted the file to http://poshcode.org, I really like their “embed code” feature.&#160;Now again, this is my profile, I use it to simply show what can be done, since I am still a beginner I appreciate ideas and tips from anyone!tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/my-powershell-profile/\\\"},{  \\\"id\\\": \\\"post-vbnet-powershell-script-starten\\\",  \\\"title\\\": \\\"VB.Net PowerShell Script starten\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Vor einigen Tage habe ich versucht ein PowerShell Script über ein VB.Net Programm zu starten.    Hat mich ein wenig Zeit gekostet :)Anbei der Code:Public Function RunCreatePasswordPowerShell(ByVal script As String) As Integer    &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim execProcess As New System.Diagnostics.Process     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Dim psScriptTextArg = &quot;-Command &quot;&quot;&amp; &quot; + script + &quot; &quot; + &quot;'&quot; + System.Environment.CurrentDirectory + &quot;'&quot; + &quot;&quot;&quot;&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.WorkingDirectory = Environment.SystemDirectory &amp; &quot;\\\\\\\\WindowsPowershell\\\\\\\\v1.0\\\\\\\\&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.FileName = &quot;powershell.exe&quot;     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.Arguments = psScriptTextArg     &#160;&#160;&#160;&#160;&#160;&#160;&#160; execProcess.StartInfo.UseShellExecute = True     &#160;&#160;&#160;&#160;&#160;&#160;&#160; Return execProcess.Start     &#160;&#160;&#160; End FunctionErklärung:Die Funktion RunCreatePasswordPowerShell wird mit einer String Variable als Argument aufgerufen (script). Diese String Variable beinhaltet den Pfad zu unserem PowerShell Script.    In meinen speziellen Fall geben ich beim zusammenstellen der Argumente noch die den aktuellen Pfad mit. Eventuell noch interessant: Dieses PowerShell Script welches ich hier aufrufe erstellt verschlüsselte PasswordFiles, welche dann über die PowerShell weiter verwendet werden können. Anbei der Code dazu:param(    &#160;&#160;&#160; [parameter(Mandatory = $true)]     &#160;&#160;&#160; [string]$CurrentDirectory     )     $PasswdFilename = read-host &quot;Filename&quot;     $Passwd = read-host &quot;Password&quot; -assecurestring | convertfrom-securestring     $PasswdPathFile = $CurrentDirectory + $PasswdFilename + &quot;-Pass.txt&quot;     $Passwd | Out-File $PasswdPathFileGrüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/vbnet-powershell-script-starten/\\\"},{  \\\"id\\\": \\\"post-nps-migration-von-server-2003-nach-2008-r2\\\",  \\\"title\\\": \\\"NPS Migration von Server 2003 nach 2008 R2\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Den IAS Server von Server 2003 zu Server 2008 R2 zu migrieren ist eine sehr einfache Migration:Zunächst muss das Migrationstool iasmigreader auf den Windows Server 2003 kopiert werden.Das Migrationstool befindet sich entweder auf der Server 2008 R2 CD unter D:\\\\\\\\sources\\\\\\\\dlmanifests\\\\\\\\microsoft-windows-iasserver-migplugin oder auf dem Server 2008 R2 unter C:\\\\\\\\Windows\\\\\\\\SysWow64Über die Kommandozeile wird das Tool aufgerufen um auf dem 2003 Server die Konfiguration in das vordefinierte Textfile ias.txt zu exportieren.ACHTUNG: Beim Import von 32BIT zu 64BIT Systemen muss folgendes vorher gemacht werden. Sonst gibt es Probleme mit der PEAP Authentifizierungsmethode:Import File öffnen den Wert 0 in SystemInfo auf 0000000009 ändern:  Nun kann das File auf dem 2008 Server importiert werden:    Netsh nps import filename=&quot;paht\\\\\\\\ias.txt&quot;Grüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/nps-migration-von-server-2003-nach-2008-r2/\\\"},{  \\\"id\\\": \\\"post-automatic-ios-configuration-backup\\\",  \\\"title\\\": \\\"Automatic IOS configuration backup\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\"],  \\\"content\\\": \\\"If you are like me you frequently forget to backup router and switch configurations before making changes. Ok, maybe not so frequently but it happens… There are some ways to prevent this from happening, we can make manual backups or use the automatic archiving feature which is built into IOS.Manual backupA manual backup can always be taken using the ‘copy startup-config' command, typing a question mark ‘?’ after that command lists possible backup destinations:RT#copy startup-config ?      &#160; archive:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to archive: file system       &#160; flash:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to flash: file system       &#160; ftp:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to ftp: file system       &#160; http:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Copy to http: file systemSo to backup a routers current startup-config to a FTP server you would simply type something like this:RT#copy startup-config ftp://user:pass@10.10.10.1The username and password can also be configured so that you don’t need to type them in every time you are performing a backup.RT(config)#ip ftp username tom      RT(config)#ip ftp password secretOk, that’s better but since the backup still has to be started manually chances are that one could forget it…Automatic archiveThe archive feature allows for automatic configuration backup that is triggered by a timer and the ‘write memory’ command. The following example configures the archive feature on router RT to create a backup once every 24 hours and additionally every time someone enters the ‘write-memory’ command, that is, every time someone makes a configuration change and decides to save that change:RT(config)#archive      path ftp://10.10.10.1/History/rt-config-       write-memory       time-period 1440The time-period keyword simply configures how often a scheduled backup runs, if the write-memory command is configured a configuration backup is performed every time someone saves the config. The ‘show archive’ command displays the 10 latest configuration files:RT#show archive      The maximum archive configurations allowed is 10.       The next archive file will be named ftp://10.10.10.1/History/rt-config--&lt;timestamp&gt;-50       Archive #&#160; Name       &#160;&#160; 1&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-51-57.153-47       &#160;&#160; 2&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48       &#160;&#160; 3&#160;&#160;&#160;&#160;&#160;&#160;&#160; ftp://10.10.10.1/History/rt-config-Jul-10-13-53-57.337-49Obviously other backup destinations such as tftp or flash can be configured. IOS does not take care of the removal of old files, so even though only the 10 latest configuration versions are shown in the ‘show archive’ output, there might be more on the server.Restoring configurationIf a configuration change needs to be rolled back the ‘configure replace’ command can be used. So if a configuration change had unintended consequences the ‘configure replace ftp://10.10.10.1/History/rt-config-Jul-10-13-52-57.245-48’ command could be used to restore the current running-config from a backup.&#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/automatic-ios-configuration-backup/\\\"},{  \\\"id\\\": \\\"post-steve-ballmer-on-exciting-times-office-2013\\\",  \\\"title\\\": \\\"Steve Ballmer on Exciting Times–Office 2013\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Update: Beta versions of all Server Products are now available, check out the link on the bottom. Added a link to the webcast.Microsoft hold a live webcast today where they kicked off the new Office 15 wave.Ballmer gave a quick overview of the latest announcements, including Surface, Windows Phones 8, Windows 8 and some Server products, before he gets going with the introduction of Office 2013.He calls the new version of Microsoft Office the “most ambitious release of office” ever. It’s was designed for cloud and touch enabled devices, a full featured version of Office 15 will also be available on ARM devices.View the recorded webcast: http://www.microsoft.com/en-us/news/presskits/office/liveevent.aspxBallmer talked about Microsoft’s recent acquisitions, namely Yammer and PPI. Yammer provides integration to all kind of social media for Office 15 client and Server products. PPI build huge, high definition displays which could be great for meetings and collaboration.One of the most important points Ballmer makes is the ability of ink and touch support in every application, so that one can take digital annotations through the new generation of hardware. It seems like a big effort to finally move away from pen and paper.After that, Ballmer introduced Kirk Koenigsberger for some live demo of the product. Kirk is very excited too and shows some sneak peaks of what is to come with a focus on consumer usage. Office 15 is heavily integrated into Skydrive and stores all content in the cloud by default, if you install the Office preview you will soon notice that you can sign-in with you Windows Live ID directly into Office.Office 15 features integration with social networking, multimedia, Skype and Lync offer presence information for the People Card (kind of an evolution from that thing we know from Outlook 2010).Really neat is the “last location” feature, where a toast notification brings you back to the section of the document that you have been editing when you left one device and switched to another.SharePoint 2013 comes with fully featured enterprise social networking, with mentions, #hashtags and like buttons all packed into a sleek, new design. A Newsfeed will provide the user with “Facebook” style updates from co-workers and friends, again using Yammer to aggregate news from different sources into one feed. Office documents and multimedia content can be previewed directly from the new timeline, the People Card quickly shows all contact information and presence status of the team members.Try it nowThe next generation of Office can be downloaded from Office.com.Server ProductsWhat is at least as exciting as the new version of Office client products is that the Server products are already listed on the website. Can’t wait to get my hands dirty on that stuff… http://www.microsoft.com/office/preview/en/try-more-productsso that’s it for now,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/steve-ballmer-on-exciting-times-office-2013/\\\"},{  \\\"id\\\": \\\"post-why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too\\\",  \\\"title\\\": \\\"Why am I learning PowerShell? And why do I think you should give it a try, too?\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"To be frank, I am kind of a beginner when it comes to PowerShell or scripting in general, I was working for really small businesses for some time and I didn’t really bother scripting. There were simply not too many repeating tasks and so I went and did most everything manually.So obviously things have changed, for starters I’m not working for said small businesses any more. There are now a lot of tasks that would take hours to be completed manually. And there is this shiny, new toy out there, called Windows PowerShell. Ok, it’s not really new, but a lot of people still stick to there old tools as they knew how they worked for years, so why change something that got the job done in the past? Well, here are my key points:Automation prevents errorsThis is the most important point for me, think about some task where you have to repeat a configuration change for like 8 times. It’s not that scripting or automating is that much faster than making the change manually, that would be the case if it were 100 times or more, but 8, come on. The one key thing is, that by using automation the configuration is exactly the same every single time you have to do it. Sure, you have to spend a little more time in planning your steps (instead of just clicking your way through), you have to write a few lines of script, or just chain together some commands. Once your little tool is complete and tested, you can use it over and over again, it will produce the same result every time you run it. So we are getting to my second point.Create reusable toolsPowerShell enables you to create reusable tools very easily, if you are typing some commands into the command line interface, the exactly same commands can be saved to a ps1 file and executed by a co-worker, a scheduled task or... you get the point. The first point still applies here, if you create a tool and share it with your colleagues or co-workers not only are you simplifying certain tasks, you are again eliminating a common source of error.DocumentationThe transcript feature simply writes anything you type and all output of the current command line window to a file, this file can easily be used to document configuration changes.ResourcesSo where do I start? First of all, remember one key command: Get-Help. It’s simple, it comes with PowerShell and the help content is very, very well written! Try this: ‘Get-Command | Get-Random | Get-Help –Full’A good place to start is the Windows PowerShell Survival Guide on the TechNet Wiki.There are some good books on the topic available, I’m looking forward to PowerShell in Depth by three of the most well-known PowerShell gurus: Don Jones, Richard Siddaway, and Jeffery Hicks.&#160;Have fun!   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too/\\\"},{  \\\"id\\\": \\\"post-activesync-organization-settings-mobile-device-management\\\",  \\\"title\\\": \\\"ActiveSync Organization Settings–Mobile Device Management\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"The growing number of mobile devices requires some sort of mobile device management policy to be in place. Now there are different approaches to enforce such a policy, there are some software vendors offering more or less sophisticated tools and there is Exchange 2010 which comes with basic device management capabilities built-in.If a mobile device connects to an Exchange Server the following sequence evaluates the access state of the device (from TechNet: http://technet.microsoft.com/en-us/library/ff959225.aspx)   Is the mobile device authenticated?&#160;&#160; If not, challenge the mobile device for the correct credentials. Otherwise, go on to the next step.     Is Exchange ActiveSync enabled for the current user?&#160;&#160; If not, return an &quot;access restricted&quot; error to the device. Otherwise, go on to the next step.     Are the mobile policy enforcement criteria met by the current mobile device?&#160;&#160; If not, block access. Otherwise, go on to the next step.     Is this mobile device blocked by a personal exemption for the user?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device allowed by a personal exemption for the user?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Is this mobile device blocked by a device access rule?&#160;&#160; If so, block access. Otherwise, go on to the next step.     Is this mobile device quarantined by a device access rule?&#160;&#160; If so, quarantine the device. Otherwise, go on to the next step.     Is this mobile device allowed by a device access rule?&#160;&#160; If so, grant full access. Otherwise, go on to the next step.     Apply the default access state per the Exchange ActiveSync organizational settings.&#160;&#160; This grants access, blocks access, or quarantines the current device, depending on the organizational settings.  Default Access StateThe last step in the above list determines the ‘default access level’ organizational setting. This setting defaults to ‘Allow’ so if no other device access rules are configured, all ActiveSync devices (which meet enforcement criteria) are allowed. That means, any user with an ActiveSync enabled mailbox (another default) is able to connect up to 10 devices using ActiveSync.To change this behavior the ‘default access level’ setting can be modified using the ‘Set-ActiveSyncOrganizationSettings’ cmdlet. Other than ‘Allow’ this can be set to ‘Quarantine’ or ‘Block’. Quarantine: Enables devices to connect to the Server but grants only limited access to the device. Users will be able to add content to their calendar, tasks and notes folders, however no content can be retrieved from the server. The user will receive an email stating that the mobile device has been quarantined, that email can be retrieved by the mobile device and will be available in the users mailbox through Outlook and OWA. If a device is quarantined an administrative email address is notified too, so that they can decide to allow or block the device.An admin (or any user with the required privileges) who receives the notification can use the Exchange Control Panel to allow or block the device:Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.Block: Simply blocks all new or unknown devices. Devices listed in a users ‘ActiveSyncAllowedDeviceIDs’ attribute are allowed.If users are already using ActiveSync to access their mailboxes the Exchange Management Shell can be used to add the DeviceID of currently used ActiveSync devices to the ActiveSyncAllowedDeviceIDs property.Set-ActiveSyncOrganizationSettings The following command sets the recipient of the admin notification to support@ntsystems.local. Every time a device is quarantined that email address is notified.Set-ActiveSyncOrganizationSettings –AdminMailRecipients support@ntsystems.localThe following command sets the ‘default access state’ to quarantine.Set-ActiveSyncOrganizationSettings –DefaultAccessLevel QuarantineNeed to scale? Try Device Access Rules!Manual approval might not work for environments with many users or when users change their mobile devices frequently. Device Access Rules can be used to allow or block devices based on Family or Model so that users can connect approved device types without the need to be manually allowed by an admin:Using Device Access Rules allows for some amount of scalability, even though it’s not perfect – it comes with Exchange.&#160;so long,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/activesync-organization-settings-mobile-device-management/\\\"},{  \\\"id\\\": \\\"post-passing-an-array-to-a-scriptblock\\\",  \\\"title\\\": \\\"Passing an array to a {scriptblock}\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Some Friday PowerShell fun today.I created a PowerShell script the other day where I was passing a variable to a scriptblock. As long as the variable was a simple string everything was just fine, but when the variable was of the type System.Array only the first item would have been passed to the scriptblock.[more]Example 1 shows what I mean.$myArray = \\\\\\\"a\\\\\\\",\\\\\\\"b\\\\\\\",\\\\\\\"c\\\\\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock -ArgumentList $myArrayThis example would produce an output of &ldquo;a&rdquo; even though I assumed it would output &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.So I was scratching my head for a while and then tried to do it that way:$myArray = \\\\\\\"a\\\\\\\",\\\\\\\"b\\\\\\\",\\\\\\\"c\\\\\\\"$myBlock = { param($p1) write $p1 }Invoke-Command -ScriptBlock $myBlock &ndash;ArgumentList (,$myArray)This one works as expected, so it produces an output of &ldquo;a&rdquo;,&rdquo;b&rdquo;,&rdquo;c&rdquo;.&nbsp;have a nice weekend!tom&nbsp;&nbsp;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/passing-an-array-to-a-scriptblock/\\\"},{  \\\"id\\\": \\\"post-we-are-still-out-there-somewhere\\\",  \\\"title\\\": \\\"We are still out there, somewhere…\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"It has been a while since our last post, but then we are both really busy getting our work done and studying for some certification and other stuff. I’d like to promise that we will publish cool stuff on a more regular basis, not sure if we can keep it though. What I DO promise is that I am going to try!&quot;One must have a good memory to be able to keep the promises that one makes&quot; - F. NietzscheSo, having that said, what was going on that we have not been blogging about:Windows 8 and Windows Server 2012 Release Previews are out!Go, give it a try. And check out all the cool content over at Windows Server Blog and Building Windows 8. Really.Windows Phone 8 has been announced.I’m personally looking forward to that, I came to love my Windows Phone 7 and I think this is going to be even better. Read more on the Windows Phone Blog.        Device encryption: To help keep everything from documents to passwords safe, Windows Phone 8 includes built-in technology to encrypt the entire device, including the operating system and data files.       Better security: Windows Phone 8 supports the United Extensible Firmware Interface (UEFI) secure boot protocol and features improved app “sandboxing,” so the phone is better protected from malware with multiple layers of security.       Remote management: With Windows Phone 8, IT departments can manage apps and phones remotely, with tools similar to ones they now employ for Windows PCs.       Company Hub and apps: Companies can create their own Windows Phone 8 Hub for custom employee apps and other critical business info.    Microsoft Surface has been announced.Hm, looks nice… but we will see.Get more (well, not too much more) at surface.comMoving away from MD5 and keys under 1024 bits.Some efforts are made to put more trust into the struggling SSL Certificate business and I guess it also gives us more security. Personally I think that education is the key point when it comes to “trust” and SSL and IT security in general. People should really be aware of what it means to just ignore Certificate warnings… Its up to us IT Pros to make (our) internal servers trustworthy and sort of train users to rely on SSL and watch out for it.Lets get back to MD5. So, recently there has been a some media coverage of the so called “Flame” malware which used phony certificates to make a man-in-the-middle attack against Windows Update possible. Whoever created the malware used a flaw in Microsoft's Terminal Server Licensing certificate infrastructure to create a code signing certificate that chained up to Microsoft's Root CA. In essence this was possible because of the TS Licensing certs using MD5 hashes which are prone to collision attacks.More information about Flame on: NakedSecurity; Remote Desktop Services Blog; Security Research &amp; Defense; the Security Advisory can be found here.Some days after that I (and other customers) received an email from RapidSSL stating that MD5 is to be abandoned by June 1, that is all (RapidSSL) certificates that have been using the MD5 hashing scheme have been revoked. They did also revoke any certificate using a key size under 1024 bits.Microsoft is also going to release an update that blocks certificates with keys less than 1024 bits. More information on this on the Windows PKI Blog.Exchange 15 rumorsExchange 2010 has been available for little more than two years when Microsoft kicked off the “Office 15” technical preview (for few, select people) back in January 2012. Not much information has been published since then, although a beta is expected for “late summer”. Since the Exchange Conference happens to take place by the end of September I suppose we all will know more by then.&#160;That’s it for now. Have a nice weekend!tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/we-are-still-out-there-somewhere/\\\"},{  \\\"id\\\": \\\"post-wireless-sniffing-mit-netmon-34\\\",  \\\"title\\\": \\\"Wireless Sniffing mit NetMon 3.4\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\"],  \\\"content\\\": \\\"Damit mit Wireshark unter Windows Wlan Traffic analysiert werden kann benötigt man einen speziellen Adapter (AirPcap), der auch im Promiscuous Mode (oder Monitor Mode) betrieben werden kann.Mit Microsoft Network Monitor 3.4 und Windows 7 kann man jetzt auch “normale” Adapter im Monitor Mode betreiben um Wireless Frames zu sniffen.NetMonDazu die entsprechende Version von NetMon herunterladen (x86 oder x64) und installieren.NetMon öffnen und unter “Select Networks” den Wireless Adapter auswählen. Alle anderen Adapter deaktivieren.Dann auf “Properties” klicken und die “Scanning Options” konfigurieren.Der “Monitor Mode” muss aktiviert werden, außerdem kann man den Frequenzbereich sowie den Kanal auswählen. Wählt man keinen Kanal aus, scannt NetMon alle Kanäle.Mit “Apply” werden die Einstellungen übernommen, das Fenster “Scanning Options” muss man offen lassen, der “Network Interface Configuration” Dialog kann mit “OK” geschlossen werden.Jetzt kann man auf “New Capture” klicken und mit “Start” einen neuen Trace starten.AnalyseDie Analyse des Traffics ist mit NetMon etwas ungewohnt, es hilft allerdings sehr wenn man sich von&#160; http://nmparsers.codeplex.com/ die aktuellsten Parser installiert.Alternativ kann man das Ergebnis aus NetMon als “.cap” Datei speichern und mit Wireshark öffnen.&#160;btw. das funktioniert genauso mit Windows 8 Beta &#160;have fun!tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wireless-sniffing-mit-netmon-34/\\\"},{  \\\"id\\\": \\\"post-windows-server-8-virtualized-domain-controller\\\",  \\\"title\\\": \\\"Windows Server 8–Virtualized Domain Controller\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server-2012\\\"],  \\\"content\\\": \\\"In bisherigen Version von Windows Server und Active Directory hatte das Betreiben von virtuellen DCs einige Nachteile im Vergleich zu anderen virtuellen Servern. So konnten Domain Controller z.B. nicht von der Snapshot F&auml;higkeit des Hypervisors profitieren, das zur&uuml;cksetzen eines DCs auf einen Snapshot hatte fatale Auswirkungen auf die Gesamtstruktur.VDC Safe RestoreIm Active Direcotry Replikationsmodell wird jede Transaktion mit einer fortlaufenden Nummer (Update Sequence Number) versehen. Domain Controller &ldquo;merken&rdquo; sich diese Nummern sowie eine eindeutige ID des Replikationspartners (Invocation ID) von dem sie die jeweilige &Auml;nderung erhalten haben. Wird ein DC auf einen fr&uuml;heren Zeitpunkt zur&uuml;ckgesetzt (Snapshot) k&ouml;nnte er bereits verwendete USNs wiederverwenden, seine Replikationspartner akzeptieren diese Transaktionen nicht mehr, sie haben diese bereits erhalten. Der wiederhergestellte DC kann nicht mehr replizieren und wird in den sogenannten &ldquo;USN Rollback Protection&rdquo; Status gesetzt. Der DC muss jetzt manuell aus dem AD entfernt werden.In Windows Server 8 Active Directory gibt es ein Feature das dieses Problem verhindern soll. &Uuml;ber die ACPI Table stellt der Hypervisor die VM-Generation ID zur Verf&uuml;gung, diese wird im RAM des jeweiligen Domain Controllers gespeichert.Wird ein Snapshot angewandt, wird diese VM-Generation ID zur&uuml;ckgesetzt, so merkt der Domain Controller dass er wiederhergestellt wurde.&nbsp;Der wiederhergestellte DC setzt seine Invocation ID zur&uuml;ck und da seine Replikationspartner diese ID noch nicht kennen kann die Replikation wieder aufgenommen werden. Au&szlig;erdem wird der SYSVOL Ordner &ldquo;nicht autorisierend&rdquo; wiederhergestellt und folgendes Ereignis wird im &ldquo;Directory Service&rdquo; Event Log protokolliert.Folgendes Active Directory Attribut wird f&uuml;r die VM-Generation ID verwendet. Hier geht&rsquo;s zum entsprechenden Eintrag im MSDN.ms-DS-Generation-IdVDC Safe Restore muss (und kann) nicht konfiguriert werden, sofern der Hypervisor das VM-Generation ID Feature unterst&uuml;tzt ist es automatisch aktiv. Aktuell unterst&uuml;tzt nur Windows Server 8 Hyper-V dieses Feature, andere Herstellen werden hoffentlich bald nachziehen.Achtung, dieses Feature soll die USN Rollback Problematik l&ouml;sen, es ist auf keinem Fall ein Ersatz f&uuml;r ein konsistentes Backup! Der DC wird &ldquo;nicht autorisierend&rdquo; wiederhergestellt.&nbsp;so long,tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-8-virtualized-domain-controller/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-send-on-behalf-for-distribution-groups\\\",  \\\"title\\\": \\\"Exchange 2010 Send on behalf for distribution Groups\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Tipp: Damit man die “send on behalf” Berechtigung einem Benutzer für eine Verteilergruppe geben kann, ist ein einfacher Powershell Befehl nötig:Set-DistributionGroup GroupName -GrantSendOnBehalfTo UserName&#160;Grüßedn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-send-on-behalf-for-distribution-groups/\\\"},{  \\\"id\\\": \\\"post-windows-8-to-go\\\",  \\\"title\\\": \\\"Windows 8 to Go\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"de\\\"],  \\\"content\\\": \\\"Mit Windows 8 kommt ein neues Feature \\\\\\\"Windows 8 to Go\\\\\\\", welches bereits in der CP verf&uuml;gbar ist. Damit ist es m&ouml;glich die Windows Umgebung per USB-Stick oder anderen Datentr&auml;ger mitzunehmen.Als erstes muss der USB Stick bootf&auml;hig gemacht werden. Diese Prozedur ist dieselbe, die Thomas bereits in folgenden Post erkl&auml;rt um Windows 7/8 vom USB Stick zu installieren.Anbei nochmal kurz die Befehle:- diskpart- list disk- select disk X (USB Datentr&auml;ger ausw&auml;hlen)- create partition primary- format fs=ntfs quick- active&nbsp;Jetzt muss noch der PC neu gestartet werden und Windows 8 installiert werden. Als Datentr&auml;ger empfiehlt sich hier ein USB 3.0 Speichermedium.&nbsp;Gr&uuml;&szlig;edn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-8-to-go/\\\"},{  \\\"id\\\": \\\"post-forefront-tmg-2010-sp2-nlb-kerberos\\\",  \\\"title\\\": \\\"Forefront TMG 2010 SP2–NLB Kerberos\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Seit kurzem ist das Service Pack 2 f&uuml;r den Nachfolger von ISA 2006 verf&uuml;gbar. Neben Bugfixes und verbesserten Fehlerseiten ist vor allem die M&ouml;glichkeit den Firewall Service als Domain User zu starten interessant. Dadurch erh&auml;lt man die M&ouml;glichkeit den SPN f&uuml;r die virtuelle IP Adresse des NLB Custer auf eine Benutzerkonto zu binden, wenn der Firewall Service dann mit diesem Konto gestartet wird, funktioniert Kerberos Authentifizierung auch im NLB.&nbsp;&nbsp;NLB und KerberosF&uuml;r ein erfolgreiche Kerberos Authentifizierung muss der Service Principal Name den der Client verwendet um sich mit dem Server zu verbinden im Active Directory Account des Servers registriert sein. Der SPN muss im gesamten Forest eindeutig sein, d.h. nur ein Account kann den SPN f&uuml;r die NBL IP Adresse verwenden. Verbinden sich Clients mit anderen Knoten im Cluster schl&auml;gt die Kerberos Authentifizierung fehl, da der SPN nicht stimmt.Bisher konnte der &ldquo;Microsoft Forefront TMG Firewall Service&rdquo; nur als Network Service laufen, d.h. f&uuml;r Kerberos Authentifizierungen wurde das Computerkonto jedes TMG Servers verwendet.Mit Service Pack 2 kann man den Firewall Dienst als Dom&auml;nenbenutzer starten, registriert man auf diesen Dom&auml;nenbenutzer die ben&ouml;tigten SPNs funktioniert die Kerberos Authentifizierung im Clusterbetrieb.Service Account SicherheitAus Sicherheitsgr&uuml;nden sollte man ein eigenes Benutzerkonto f&uuml;r den TMG Service anlegen, dieses Benutzerkonto sollte ausschlie&szlig;lich f&uuml;r TMG verwendet werden und keine weiteren Berechtigungen in der Domain haben. Au&szlig;erdem sollte man das Konto aus der Gruppe &ldquo;Domain Users&rdquo; entfernen, und eine andere Gruppe als prim&auml;re Gruppe definieren. Auch dieses Gruppe sollte kein Berechtigungen in der Domain oder auf einem anderen System haben.Forefront TMG erteilt dem Benutzerkonto automatisch die minimal ben&ouml;tigten Berechtigungen wenn man den Firewall Service f&uuml;r dieses Konto konfiguriert. Auch auf dem TMG ist somit keine Konfiguration von Berechtigungen f&uuml;r das Service Account notwendig.KonfigurationNach der Installation von Service Pack 2 kann man in den Eigenschaften des Arrays, im Reiter &ldquo;Credentials&rdquo; das Konto ausw&auml;hlen unter dem der Firewall Service in Zukunft laufen soll.SPN hinzuf&uuml;genUm einen Serivce Principal Name zum Service Account hinzuzuf&uuml;gen, kann man z.B. das Tool &ldquo;setspn&rdquo; verwenden.Registrierte SPNs anzeigen:setspn &ndash;L benutzername&lt;/p&gt;setspn &ndash;L computername&lt;/code&gt;Neuen SPN registrieren:setspn -S http/myArray.ntsystems.local tmgSvcUsrDer Parameter &ndash;S &uuml;berpr&uuml;ft zuerst ob der SPN nicht bereits von einem anderen Konto verwendet wird, anschlie&szlig;end wird er zum Konto hinzugef&uuml;gt.Verify Kerberos AuthenticationMit einem Netzwerk Analyse Tool sieht man dass vor der Registrierung des SPN NTLM f&uuml;r Proxy Authentifizierung verwendet wird.Wurde der Firewall Service als Domain User gestartet und der ben&ouml;tigte SPN registriert, wird Kerberos verwendet.Der Client verwendet jetzt GSS-API, also Kerberos, um sich zu authentifizieren. Mit &ldquo;klist&rdquo; kann man sehen dass der Client jetzt ein Ticket f&uuml;r den Array Namen hat.Achtung: Es m&uuml;ssen alle Mitglieder im Array aktualisiert werden, bevor der Firewall Service als Domain User gestartet werden kann. Au&szlig;erdem sollte man den SPN erst dann hinzuf&uuml;gen, wenn der Firewall Service als Domain User l&auml;uft da es sonst zu Authentifizierungsproblemen kommt.&nbsp;Weitere Informationen zu &ldquo;Kerberos authentication on an NLB array&rdquo; im TechNet: http://technet.microsoft.com/en-us/library/hh454304.aspxUm Forefront TMG SP2 installieren zu k&ouml;nnen muss Forefront TMG SP1 Update 1 installiert sein, Download: http://www.microsoft.com/download/en/details.aspx?id=11445&nbsp;so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/forefront-tmg-2010-sp2-nlb-kerberos/\\\"},{  \\\"id\\\": \\\"post-windows-server-8-cp-dhcp-server-failover\\\",  \\\"title\\\": \\\"Windows Server 8 CP–DHCP Server Failover\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2012\\\"],  \\\"content\\\": \\\"In Windows Server Versionen bis 2008R2 gab es f&uuml;r eine ausfallsichere DHCP Umgebung zwei M&ouml;glichkeiten, ein sogenanntes Split Scope Deployment oder ein Windows Failover Cluster. Beide Varianten haben Nachteile, im Split Scope Deployment teilen sich mehrere DHCP Server einen Bereich. F&auml;llt ein Server aus, gibt es auf den verbleibenden Servern unter Umst&auml;nden nicht genug freie Adressen, auch Leases bzw. Reservierungen sind nicht konsistent. Ein Failover Cluster hat einen gewissen administrativen Aufwand (Shared Storage) und erfordert Windows Server Enterprise Lizenzen f&uuml;r alle Knoten im Cluster.Windows Server 8 DHCP Server FailoverDHCP Server Failover bietet die M&ouml;glichkeit zwei DHCP Server f&uuml;r einen Bereich zu konfigurieren. Es muss sich dabei um Windows 8 DHCP Server handeln, andere Hersteller oder &auml;ltere Server Betriebssysteme werden nicht unterst&uuml;tzt. Im Load Sharing Modus bedienen beide Server Client Anfragen und replizieren die Lease Informationen. F&auml;llt ein Server aus kann der zweite Server bereits bestehende Leases verl&auml;ngern. Au&szlig;erdem verf&uuml;gen beide Server &uuml;ber den gesamten Bereich, Reservierungen und Optionen werden ebenfalls zwischen den Servern repliziert und sind so konsistent.Load Sharing ModeIm Standard Modus wird ein Failover Relationship im Load Sharing betrieben, das bedeuted Clientanfragen werden gleichm&auml;&szlig;ig auf die beiden DHCP Server verteilt. Die Verteilung der Anfragen kann &uuml;ber den Wert load-balancing ratio konfiguriert werden. Der Load Sharing Mode eignet sich f&uuml;r Server im selben Standort.Hot Standby ModeAlternativ k&ouml;nnen die DHCP Server im Hot Standby Mode betrieben werden, dabei ist ein Server &ldquo;aktiv&rdquo; und bedient Clientanfragen. Der zweite Server &uuml;bernimmt diese Aufgabe sobald er erste nicht mehr verf&uuml;gbar ist. Die Entscheidung ob ein Server &ldquo;aktiv&rdquo; oder &ldquo;standby&rdquo; ist, kann f&uuml;r jeden DHCP Bereich getroffen werden, ein Server kann also standby f&uuml;r einen Bereich sein und gleichzeitig aktiv f&uuml;r einen andern. Der Hot Standby Mode eignet sich f&uuml;r Au&szlig;enstellen oder kleinere Standorte an denen kein zweiter Server vor Ort ist und ein Server im entfernten Rechenzentrum nur im Problemfall &uuml;bernehmen soll.DHCP Rolle installierenDie DHCP Server Rolle wird &uuml;ber den Server Manager hinzugef&uuml;gt, dazu verwendet man den Add Roles and Features Wizard.Die entsprechende Rolle ausw&auml;hlen, und entscheiden ob der Server automatisch neustarten soll, das ist f&uuml;r DHCP nicht notwendig.Nach der Installation wei&szlig;t der Post-Install configuration Wizard darauf hin, dass man den Server noch im Active Directory autorisieren muss.Nat&uuml;rlich kann man die Rolle auch mit der PowerShell hinzuf&uuml;gen, verwendet wird dazu das Modul ServerManager (PowerShell v3 importiert Module automatisch, also kein Import-Module):Auch nach dieser Insatllation wei&szlig;t der ServerManager auf notwendige Post-Install Schritte hinEs sind jetzt zwei DHCP Server verf&uuml;gbar, nun geht es an die Failover Konfiguration.DHCP Server Failover Konfiguration&Uuml;ber einen Rechtsklick auf einen DHCP Server im Server Manager &ouml;ffnet man die bekannte dhcpmgmt Konsole (doch nicht &uuml;berall Metro).Ein neuer Bereich wird, wie immer, mit einem Rechtsklick auf den IPv4 Knoten erstellt. Dabei hat sich mit WS8 nichts ge&auml;ndert, man w&auml;hlt einen Namen, das Subnet bzw. den IP Range sowie Optionen wie Gateway und DNS Server.Jetzt kann man entscheiden ob man DHCP Failover f&uuml;r den gesamten Server oder f&uuml;r jeden einzelnen Bereich konfigurieren will. Je nach dem f&uuml;r welche Konfiguration man sich entscheidet, beginnt man mit der Konfiguration auf dem IPv4 Knoten oder auf dem jeweiligen Bereich.Mit &ldquo;Configure Failover&rdquo; wird die Konfiguration gestartet, als ersten Schritt muss man den Partner-Server angeben.Nach der Auswahl des Partner-Servers werden einige Voraussetzungen f&uuml;r eine erfolgreiche Failover Beziehung &uuml;berpr&uuml;ft, unter anderem wird &uuml;berpr&uuml;ft ob der Server erreichbar ist, ob mindestens Windows Server 8 Beta installiert ist, ob der angemeldete Benutzer &uuml;ber ausreichende Rechte verf&uuml;gt (Mitglied der Gruppe DHCP Administrators) und ob auf dem Partner &uuml;berhaupt ein DHCP Server l&auml;uft. Sind die Vorrausetzungen ok, wird ein Dialog f&uuml;r die Konfiguration des Failover Relationships angezeigt.In diesem Dialog wird der Failover Mode konfiguriert. Au&szlig;erdem kann die Load Sharing ratio hier festgelegt werden. Maximum Client Lead Time gibt die tempor&auml;re Lease Zeit f&uuml;r neue Clients an, deren Anfragen der Failover Server bedient. Auch die Zeit nach der ein Server im Partner-Down-State den gesamten Bereich &uuml;bernimmt wird durch die MCLT gesetzt.Wird der Hot Standby Mode gew&auml;hlt, kann anstelle der Load Sharing ratio die Menge an Adressen Konfiguriert werden, welche f&uuml;r den Standby Server reserviert werden. Sollten keine Adressen reserviert werden, kann der Standby Server erst dann neue Clients bedienen, wenn er den gesamten Bereich &uuml;bernommen hat, das dauert standardm&auml;&szlig;ig eine Stunde (MCTLT).Das Auto State Switchover interval gibt an nach welcher Zeit ein Server vom communication interrupted in den partner down state wechselt. Standardm&auml;&szlig;ig passiert das nach 10 Minuten.Hat man die Optionen konfiguriert wird die Partnerschaft konfiguriert. F&uuml;r die Failover Konfiguration wird TCP Port 647 verwendet.In den Eigenschaften des Bereiches gibt es den neuen Reiter Failover, dort kann man den Status der Failover Partnerschaft und die konfigurierten Optionen sehen.Konfiguration &auml;ndern oder l&ouml;schenUm die Konfiguration zu &auml;ndern, &ouml;ffnet man die Eigenschaften des IPv4 Konten und w&auml;hlt dort unter Failover die entsprechende Partnerschaft aus.Mit Edit kann man die ausgew&auml;hlte Partnerschaft &auml;ndern, mit delete wird diese gel&ouml;scht.Verify FailoverMit einem Netzwerk Analyse Tool sieht man die DHCP Kommunikation, hier ist zu beobachten dass der Client zwei DHCP Offers bekommt. Eine von jedem Server in der Failover Konfiguration.Beide DHCP Offers sind bis auf die angebotene Lease Time identisch, der &ldquo;aktive&rdquo; Server bietet eine Adresse mit der im Bereich konfigurierten Lease Time an (8 Tage).W&auml;hrend die Lease Time im Offer des &ldquo;standby&rdquo; Servers der Maximum Client Lead Time entspricht.&nbsp;so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-8-cp-dhcp-server-failover/\\\"},{  \\\"id\\\": \\\"post-wireshark-und-windows-8\\\",  \\\"title\\\": \\\"Wireshark und Windows 8\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"de\\\",\\\"Server-2012\\\"],  \\\"content\\\": \\\"Eines der ersten Tools das auf meinen Ger&auml;ten installiert wird ist das Analysetool Wireshark.Nach der Installation auf Windows 8 konnte ich keine neuen Captures starten, es war kein Interface verf&uuml;gbar.Das Problem scheint am WinPCAP Treiber zu liegen, die L&ouml;sung war einfach. Ich habe den WinPCAP im &ldquo;Kompatibilit&auml;tsmodus&rdquo; Windows 7 neu installiert.&nbsp;Download WinPCAP: www.winpcap.orghave fun!\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wireshark-und-windows-8/\\\"},{  \\\"id\\\": \\\"post-windows-server-8-cp-ad-administrative-center\\\",  \\\"title\\\": \\\"Windows Server 8 CP–AD Administrative Center\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server-2012\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Mit Windows Server 2008R2 wurde das Active Directory Verwaltungscenter oder Administrative Center eingeführt. Es sollte das seit Windows 2000 bekannte Active Directory Users and Computers Snap-in ersetzen. Das Verwaltungscenter in Windows 8 Server Beta kommt im Metro Style daher und ist Teil der ADDS Simplified Administration. Es bietet einige sehr nützliche Funktionen, unter anderem endlich eine grafische Oberfläche für PSO und den AD Papierkorb. Außerdem werden die neuen Dynamischen ACLs über das Verwaltungscenter konfiguriert.Da es auf PowerShell aufsetzt, ist ein PowerShell History Viewer integriert.Metro StyleGeöffnet wird das Administrative Center über “Tools” im Server Manager oder man führt “dsac.exe” aus.“Reset Password” und “Global Search” sind schon aus dem ADAC von 2008R2 bekannt, neu ist die PowerShell History im unteren Bereich. Öffnet man diesen sieht man die PowerShell Befehle welche das ADAC zuletzt ausgeführte. Active Directory Recycle BinAuch der AD Papierkorb wurde mit Windows Server 2008R2 eingeführt, die Verwendung war zwar etwas kompliziert (keine grafische Oberfläche), trotzdem war es eine nützliche Erweiterung. Mit Windows Server 8 gibt es ein GUI um gelöschte Objekte einfach zu finden und wiederherzustellen.Sollte der AD Recycle Bin noch nicht aktiv sein, kann man ihn im ADAC gleich aktivieren. Dafür muss sich der Forest im “Windows Server 2008R2” Functional Level befinden.Einfach auf “Enable Recycle Bin…” klicken und den Dialog bestätigen, schon ist der Recycle Bin aktiv. Natürlich muss die Änderung auf alle DCs repliziert werden, erst wenn dieser Vorgang abgeschlossen ist funktioniert er zuverlässig.Im der PowerShell Histroy sieht man sofort welcher Befehl ausgeführt wurde: Enable-ADOptionalFeature -Confirm:$false -Identity:&quot;766ddcd8-acd0-445e-f3b9-a7f9b6744f2a&quot; -Scope:&quot;ForestOrConfigurationSet&quot; -Target:&quot;tomt.local&quot;Löscht man jetzt ein Objetk aus dem AD wird es in den neu erstellten Container “Deleted Objects” verschoben. Dort bleibt es (mit all seinen Attributen und Links) bis die Deleted Objects Lifetime (msDS-DeletedObjectLifetome)abgelaufen ist, dann wird es zum recycled Object. Nach Ablauf der Recylced Object Lifetime (tombstoneLifetime) wird es vom Garbage Collection Process endgültig aus der AD Datenbank gelöscht.Im “Deleted Obejects” Container findet man gelöschte Objekte die nach aktiveren des Recylce Bin Features gelöscht wurden und deren Deleted Objects Lifetime noch nicht abgelaufen ist. Man kann in dem Container suchen und die Ansicht filtern um die gewünschten Objekte zu finden.Hat man die Objekte gefunden kann man diese einzeln oder mehrere zusammen wiederherstellen. Einfach rechts auf das Objekt klicken und “Restore” oder “Restore To…” auswählen.“Restore” stellt die Objekte an ihrem Ursprünglichen Ort wieder her (lastKnownParent), mit “Restore To…” erhält man folgenden Dialog und kann das Ziel auswählen.Auch hier werden in der PowerShell History die ausgeführten Befehle angezeigt:Restore-ADObject -Confirm:$false -Identity:&quot;bb127a94-277f-4a7d-a09b-5893906cb16b&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot;Fine-Grained Password PolicyFine-Grained Password Policies wurden mit Windows Server 2008 eingeführt, sie waren eine wichtige Neuerung und auch sie waren in der Verwendung nicht ganz einfach.Mit dem neuen ADAC gibt es eine GUII für die sogenannten PSOs oder Password Setting Objects. Um ein neues PSO zu erstellen öffnet man den Container Password Settings (“CN=Password Settings Container,CN=System,DC=tomt,DC=local”) und klickt auf New, Password Settings.Im Dialog “Create Password Settings” kann man die Fine-Grained Password Policy konfigurieren und diese gleich einer Gruppe oder einem Benutzer zuweisen. Ist ein Benutzer Mitglied in mehreren Gruppen auf die ein PSO angewendet wird, hat jenes mit dem niedrigerem Precedence Wert (msDS-PasswordSettingsPrecedence) Vorrang.Und auch hier wieder die entsprechenden PowerShell Befehle:Add-ADFineGrainedPasswordPolicySubject -Identity:&quot;CN=pso_group1,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -Server:&quot;WIN8CP-DC1.tomt.local&quot; -Subjects:&quot;CN=group1,OU=groups,OU=tomt,DC=tomt,DC=local&quot;      &lt;/p&gt;    New-ADFineGrainedPasswordPolicy -ComplexityEnabled:$true -LockoutDuration:&quot;00:30:00&quot; -LockoutObservationWindow:&quot;00:30:00&quot; -LockoutThreshold:&quot;0&quot; -MaxPasswordAge:&quot;42.00:00:00&quot; -MinPasswordAge:&quot;1.00:00:00&quot; -MinPasswordLength:&quot;7&quot; -Name:&quot;pso_group2&quot; -PasswordHistoryCount:&quot;24&quot; -Precedence:&quot;20&quot; -ReversibleEncryptionEnabled:$false -Server:&quot;WIN8CP-DC1.tomt.local&quot;          Set-ADObject -Identity:&quot;CN=pso_group2,CN=Password Settings Container,CN=System,DC=tomt,DC=local&quot; -ProtectedFromAccidentalDeletion:$true -Server:&quot;WIN8CP-DC1.tomt.local&quot;&lt;/code&gt;  Durch diese neuen grafischen Oberflächen wird das ADAC wahrscheinlich mehr Verwendung finden als sein Vorgänger. Auch an den Metro Style wird man sich gewöhnen (müssen).  &#160;  so long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-8-cp-ad-administrative-center/\\\"},{  \\\"id\\\": \\\"post-windows-server-8-cp-remote-group-policy-refresh\\\",  \\\"title\\\": \\\"Windows Server 8 CP–Remote Group Policy refresh\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2012\\\"],  \\\"content\\\": \\\"Mit Windows Server 8 kann man einen Group Policy refresh auf remote Computern initiieren. Verwendet wird dazu die GPMC oder natürlich PowerShell.Group Policy Management ConsoleMan wählt die OU aus in der sich die Computerkonten befinden auf denen man das Update ausführen möchte. Achtung: Man kann das GP Update nur auf Computerkonten initiieren, es werden aber Computer und Benutzerrichtlinien aktualisiert.Mit einem Rechtsklick auf die OU kann man “Group Policy Update…” auswählen. Der Dialog um das Update zu bestätigen zeigt an um wie viele Computer es sich handelt.Klickt man auf “Yes” wird “gpupdate /force” auf den erreichbaren Computern ausgeführt.Ein kurzer Report wird angezeigt, in dem evtl. Fehler sichtbar sind.PowerShellMit dem cmdlet “Invoke-GPUpdate” aus dem Modul “GroupPolicy” kann man das GP Update auch per PowerShell starten.Invoke-GPUpdate –Computer “win8cp-dc1”FirewallDamit das Remote GP Update funktioniert müssen folgende Windows Firewall Regeln aktiviert sein (Verbindungen akzeptieren)   Remote Scheduled Tasks Management (RPC)    Remote Scheduled Tasks Management (RPC-EPMAP)    Windows Management Instrumentation (WMI-IN) &#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-8-cp-remote-group-policy-refresh/\\\"},{  \\\"id\\\": \\\"post-windows-server-8-cp-servermanager\\\",  \\\"title\\\": \\\"Windows Server 8 CP –ServerManager\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2012\\\"],  \\\"content\\\": \\\"Seit kurzem die Beta des neuen Servers verfügbar, natürlich musste mal wieder ein neuer Name her: Windows Server “8” Consumer Preview.Der neue Server Manager ist natürlich im Metro Style und ist über die RSAT (Remote Server Administration Tools) auch für das neue Client OS (Windows 8 Consumer Preview) verfügbar.Download RSAT (Beta/CP): http://www.microsoft.com/download/en/details.aspx?id=28972DashboardÜber das Dashboard sieht man eine Zusammenfassung der verwalteten Server und Rollen. Der Status wird automatisch aktualisiert, standardmäßig alle 10 Minuten. Man wird so auf evtl. Probleme hingewiesen.Über “Manage” kann man Server hinzufügen oder Rollen und Features auf bereits verwalteten Server installieren.Fügt man einen Server hinzu, kann man diese aus dem Active Directory suchen oder den DNS Namen angeben, außerdem kann man Textdateien die Servernamen enthalten importieren.Damit man einen Server hinzufügen kann muss die Remoteverwaltung (WinRM) dort aktiviert werden, DCOM wird nicht mehr benötigt.Server GroupsMit Server Gruppen können mehrere Server die z.B. dieselbe Aufgabe erfüllen zu einer Gruppe hinzugefügt werden.&#160;&lt;h1&gt;Add Roles and Features&lt;/h1&gt;  &lt;p&gt;Über den Server Manager können Rollen und Features auf allen verwalteten Server hinzugefügt oder entfernt werden. In folgendem Beispiel füge ich einen weiteren Domain Controller hinzu. Alle Schritte führe ich auf meinem Windows 8 CP Client mit RSAT aus.&lt;/p&gt;  &lt;p&gt;Unter “Manage” klicke ich auf “Add Roles and Features” um den Wizard zu starten.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_377.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_375.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle die Art der Installation und den Zielserver aus.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_378.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_376.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich wähle Active Directory Domain Services aus und bestätige dass ich die nötigen Rollen sowie die Management Tools installieren möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_379.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_377.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_380.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_378.png\\\\\\\" width=\\\\\\\"234\\\\\\\" height=\\\\\\\"244\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wurden die ADDS Binaries auf dem Zielserver installiert erhält man eine Notification im Server Manager, hier wird auch gleich der “Task” angezeigt um den Server zum Donain Controller zu machen (zu promoten)&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_381.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_379.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"132\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ich klicke also auf “Promote this server to a domain controller” und komme so zu folgendem Wizard.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_382.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_380.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Wie bereits mit “dcpromo” kann man auch hier auswählen ob man den DC zu einer bestehenden Domain, eine neue Domain in einem bestehenden Forest hinzufügen, oder gleich einen neuen Forest erstellen möchte.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_383.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_381.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Im nächsten Schritt werden die DC Options konfiguriert. Der DC soll DNS sowie Global Catalog sein, außerdem wird hier die Site ausgewählt und das DSRM Passwort gesetzt.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_384.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_382.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Man kann noch die Pfade für die ADDS Datenbank und Log Files sowie den SYSVOL Share setzen.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_385.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_383.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ist die Konfiguration abgeschlossen kommt man zur “Review Options” Seite, man kann die ausgewählten Optionen nochmal überprüfen. Das eigentlich interessante an dieser Seite ist jedoch der Button “View Script” er zeigt das PowerShell Script an, welches auf dem Remote Server ausgeführt wird.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_386.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_384.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"211\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Der Server Manager erledigt alle Tasks mit PowerShell Befehlen, dcpromo kann noch für “unattended” Insatllationen verwendet werden, die Empfehlung von Microsoft ist es allerdings “dcpromo” nicht mehr zu verwenden.&lt;/p&gt;  &lt;p&gt;Server Manager führt einen prerequisite Check auf dem Zielserver durch, dabei wird überprüft ob der Server zum DC promoted werden kann.&lt;/p&gt;  &lt;p&gt;&lt;a href=\\\\\\\"/assets/archive/image_387.png\\\\\\\"&gt;&lt;img style=\\\\\\\"background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\\\\\\\" title=\\\\\\\"image\\\\\\\" border=\\\\\\\"0\\\\\\\" alt=\\\\\\\"image\\\\\\\" src=\\\\\\\"/assets/archive/image_thumb_385.png\\\\\\\" width=\\\\\\\"244\\\\\\\" height=\\\\\\\"180\\\\\\\" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nach dem Klick auf “Install” gehts los, der Server wird hochgestuft, und DNS sowie die AD Tools werden installiert. Anschließend wird der Server neu gestartet und ich habe einen neuen DC.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;tom&lt;/p&gt;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-8-cp-servermanager/\\\"},{  \\\"id\\\": \\\"post-powershell-loves-wmi-os-info\\\",  \\\"title\\\": \\\"PowerShell loves WMI – OS Info\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Mit dem cmdlet Get-WmiObject kann Windows PowerShell auf WMI Objekte zugreifen. Man kann also z.B. die Eigenschaften der Klasse “Win32_OperatingSystem” anzeigen und daraus Informationen über das Betriebssystem erhalten.Die vollständige Liste der Eigenschaften (und Methoden) gibt es im MSDN. Oder natürlich mit folgendem Befehl:Get-WmiObject -Class win32_OperatingSystem -Property * | select *Interessante EigenschaftenOperatingSystemSKU: Enthält die installierte Version des Betriebssystems, z.B. Ultimate, Enterprise, Datacenter Server EditionProductType: Workstation, Domain Controller, ServerBuildNumber: Enthält die Build Nummer des BetriebssystemsOSArchitecture: 32-Bit oder 64-BitFilterMan kann aufgrund dieser Eigenschaften einfache Filter für Scripts erstellen und so z.B. sicherstellen dass ein bestimmtes Script nur auf einem bestimmten Betriebssystem ausgeführt wird.#Variable OS erstellen, enthält alle Informationen der angegebenen Klasse&lt;/p&gt;    $OS = Get-WMIObject –Class Win32_OperatingSystem    if($OS.OperatingSystemSKU -eq &quot;4&quot; -and $OS.Caption -like &quot;*Windows 7*&quot;) {    #Code für Windows 7 Enterprise    } else {    #Code für jedes andere OS    }    if ($os.OSArchitecture -eq &quot;64-bit&quot;){    #Code für x64     } else {    #Code für x86    }&lt;/code&gt;  Das sind natürlich sehr einfache Beispiele, wie mächtig WMI ist kann man sich am besten in der WMI Reference ansehen. Außerdem enthält das Beispiel keine Fehlerüberprüfung, läuft irgendwas schief, wars das.  Remote  Natürlich kann man auch Informationen über einen oder mehrere remote Computer auswerten. Das cmdlet Get-WmiObject hat den Parameter Computername über den man einen oder mehrere Computernamen (getrennt mit Komma) abfragen kann. Über Pipline Input kann man dem cmdlet Computernamen aus einem Textfile oder dem ActiveDirectory übergeben.  Get-WmiObject –Class win32_OperatingSystem –Computer mypc1,mypc2&lt;/p&gt;    Get-ADComputer -Filter 'Name -like &quot;*Server*&quot;'| Get-WmiObject –Class win32_OperatingSystem&lt;/code&gt;  &#160;  so long,  tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-loves-wmi-os-info/\\\"},{  \\\"id\\\": \\\"post-powershell-implicit-remoting\\\",  \\\"title\\\": \\\"PowerShell Implicit Remoting\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Eine der wichtigsten Funktionen der PowerShell ist die M&ouml;glichkeit cmdlet&rsquo;s (ScriptBlocks) auf remoten System auszuf&uuml;hren. Dazu wird eine PowerShell Sesion mit dem Remote Computer erstellt, die Befehle werden remote ausgef&uuml;hrt und das Ergebnis lokal angezeigt.Nun gibt es verschiedene Module f&uuml;r das Verwalten von Serverrollen wie z.B. Active Directory, Exchange 2010 oder Lync 2010. Will ich von meinem Client aus diese cmdlet&rsquo;s verwenden muss ich die Module installieren. Oder?Session erstellen und Modul LadenMan erstellt eine neue PSSessoin mit einem Computer auf dem das entsprechende Modul installiert ist.$ADSession = New-PSSession &ndash;ComputerName dc01.domain.localDann wird das Modul in der gerade erstellten Session geladen:Invoke-Command {Import-Module ActiveDirectory}&nbsp; -Session $ADSessionImport-PSSessionBefehle aus einer Session k&ouml;nnen mit Import-PSSession in die aktuelle PowerShell Sitzung &uuml;bernommen werden, man kann entweder alle Verf&uuml;gbaren cmdlet&rsquo;s importieren oder nur einen Teil. In diesem Beispiel interessieren mich die cmdlets aus dem ActiveDirectory Modul, die entsprechenden Nouns beginnen mit AD, ich kann also auf *-AD* Filtern und so nur ActiveDirectory cmdlet&rsquo;s &uuml;bernehmen.Import-PSSession -Session $ADSession-CommandName *-AD*So kann ich in meiner aktuellen PS Sitzung die AD cmdlet&rsquo;s wie Get-ADUser verwenden. Schlie&szlig;e ich das aktuelle PS Fenster wars das mit den AD cmdlet&rsquo;s.Export-PSSessionDamit man sich diese Befehle nicht merken muss und die cmdlet&rsquo;s einfach wiederverwendet kann, erstellt Export-PSSession automatisch ein Modul mit den gew&uuml;nschten remote cmdlet&rsquo;s.Export-PSSession $ADSession -OutputModule AD -CommandName *-AD* &ndash;AllowClobberJetzt kann man das aktuelle PowerShell Fenster schlie&szlig;en, ein Modul wurde erstellt das wie gewohnt geladen werden kann.Import-Module ADDie Befehle aus dem Modul sind jetzt verf&uuml;gbar, allerdings gibt es noch keine PSSession. Diese muss jedoch nicht manuell erstellt werden, f&uuml;hrt man den ersten Befehl aus dem Modul aus (Get-ADUser username) wird automatisch eine PS Session mit dem remote Computer erstellt und das cmdlet ausgef&uuml;hrt.So kann man also auf jedem beliebigen Client (auf dem nur PowerShell v2 installiert ist) cmdlet&rsquo;s ausf&uuml;hren die auf dem Server laufen.Exchange und LyncExchange und Lync bieten einen eigenen Endpoint f&uuml;r PowerShell Verbindungen, man gibt diesen bei der Erstellung der PSSession als ConnectionURI an.$exSession = New-PSSession -ConnectionUri 'http://ex14.domain.local/powershell/&rsquo; -ConfigurationName Microsoft.Exchange -Authentication Kerberos&lt;/p&gt;$lyncSession = New-PSSession &ndash;ConnectionUri &lsquo;https://lync.domain.local/ocspowershell&rsquo;&lt;/code&gt;Hat man die gew&uuml;nschte Session erstellt kann man sie wie gehabt mit Import-PSSession gleich verwenden oder mit Export-PSSession ein Modul erstellen.PrefixDamit man die lokalen und remoten cmdlet&rsquo;s unterscheiden kann, gibt es den Parameter &ndash;Prefix f&uuml;r die cmdlet&rsquo;s Import-Module und Import-PSSession.Import-Module AD &ndash;Prefix &lsquo;r&rsquo;So wird jedem Noun ein &lsquo;r&rsquo; vorgestellt, ich verwende also z.B. Get-rMailbox, Get-rADUser usw.&nbsp;Ich denke diese wenig bekannte Funktionalit&auml;t zeigt wie genial das Konzept der PowerShell ist, mit Windows 8 sollen jede Menge weitere cmdlet&rsquo;s dazukommen. PowerShell wird das ultimative Admin Werkzeug werden.&nbsp;so long, happy hacking!tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-implicit-remoting/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-sp2-installation\\\",  \\\"title\\\": \\\"Exchange 2010 SP2 Installation\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Service Pack 2 für Exchange 2010 ist seit über zwei Monaten verfügbar,langsam Zeit sich ernsthaft gedanken über ein Update zu machen. Dabei gibt es ein paar Dinge zu berücksichtigen, hier eine kurze Zusammenfassung.Active Directory SchemaEs gibt ein neues Active Directory Schema, ein paar Infos dazu hier: http://blogs.technet.com/b/exchange/archive/2012/01/17/custom-aka-extension-attributes-in-exchange-2010-sp2-and-their-use.aspxUm das AD Schema zu aktualisieren benötigt man “Schema Admin” Berechtigungen, installiert man Exchange 2010 SP2 mit einem Benutzer der diese Rechte hat wird das Schema automatisch erweitert. Alternativ kann man die Setup Files von SP2 auf den Schema-Master kopieren und mit setup.com /prepareAD das Update durchführen.Die aktuelle Schema Version findet man folgendermaßen:Active Directory Schema:Get-ADObject &quot;cn=schema,cn=configuration,dc=ath,dc=int&quot; -Properties ObjectVersionExchange Schema:Get-ADObject &quot;cn=ms-Exch-Schema-Version-Pt,cn=schema,cn=configuration,dc=domain,dc=local&quot; -Properties RangeUpperGenauere Infos und die genauen Schema Versionsnummern gibt es im TechNet Wiki.Client Access Sever PrerequisiteDie Systemvoraussetzungen für die Client Access Rolle wurden geändert, hinzugefügt wurde IIS 6 Wmi Compatibility oder “web-wmi”. Das Feature kann automatisch installiert werden wenn die entsprechende Option beim Setup aktiviert wird, alternativ kann man es im Servermanager oder per Powershell installieren.Import-Module Servermanager&lt;/p&gt;    Add-WindowsFeature Web-WMI&lt;/code&gt;  Execution Policy GPO  In vielen Umgebungen werden Einstellungen wie z.B. die PowerShell Execution Policy über Gruppenrichtlinien gesteuert. Diese Gruppenrichtlinie führt zu einem Problem bei der Installation des Service Packs das den Server in einem Status zurücklässt in dem Exchange nicht mehr läuft und die Installation nicht fortgesetzt werden kann. Der Fehler “AuthorizationManager check failed” wird angezeigt. Klingt nach Restore.  Um das zu verhindern muss man die Gruppenrichtlinie vor dem Update deaktivieren, überprüft werden kann das so:  Get-ExecutionPolicy –List    Wichtig ist hierbei dass MachinePolicy und UserPolicy auf “Undefined” stehen.  Genaueres gibt es in der Knowledge Base.  Release Notes  Wie vor jedem Update empfehle ich hier auf jeden Fall einen Blick auf die Release Notes zu werfen.  &#160;  so long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-sp2-installation/\\\"},{  \\\"id\\\": \\\"post-windows-powershell-v30\\\",  \\\"title\\\": \\\"Windows PowerShell v3.0 (CTP 2)\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Schon seit einiger Zeit ist das Community Technology Preview 2 vom Windows Management Framework 3.0 verfügbar, unter anderem enthält es die Windows PowerShell v3.Um in den Genuss der neue Features wie “automatic module loading” und “robust sessions” zu kommen benötigt man ein englisches Windows 7 und das .NET Framework 4. Ist das Betriebssystem in einer anderen Sprache installiert muss man vor der Installation des Management Frameworks das englische Sprachpaket installieren.DownloadAchtung: Es handelt sich um pre-release Code, sollte natürlich nur in Testumgebungen verwendet werden!.NET Framework 4 - http://go.microsoft.com/fwlink/?LinkID=212547Windows Management Framework 3.0 - Community Technology Preview (CTP) #2 - http://www.microsoft.com/download/en/details.aspx?id=27548InstallationDie Installation ist denkbar einfach, zuerst wird das .NET Framework installiert, anschließend je nach Platform WINDOWS6.1-KB2506143-x64.msu oder WINDOWS6.1-KB2506143-x86.msu. Nach einem neustart ist die neue PS verfügbar.Einige FeaturesWie bereits erwähnt enthält die neue PowerShell eineige neue Features sowie jede Menge neue cmdlets. Besonders gut gefallen mir die “Robusten Sessions”, verliert man die Netzwerkverbindung ist eine PowerShell Session mit einem remoten Host für gewöhnlich weg. Mit PS v3 wird die Session automatisch wieder hergestellt.Außerdem angenehm ist das autmatische Laden von Modulen, wer z.B. diverse Admin-Tools (Active Directory, Exchange) installiert hat muss in einer neuen PowerShell Session immer Module nachladen (oder ein entsprechendes Profil erstellen). Mit v3 wird ein Modul automatisch geladen wenn ein cmdlet aus dem Modul verwendet wird.PowerShell v2Man kann natürlich auch mit installierter PS v3 die Version 2 verwenden, da es sich um pre-release Code handelt kann es durchaus zu Problemen kommen. Um v2 zu starten wird die powershel.exe mit dem Parameter “-version 2” gestartet.Weitere InformationenEin guter Start ist das TechNet Wiki: http://social.technet.microsoft.com/wiki/contents/articles/4741.powershell-v3-featured-articles-en-us.aspx&#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-powershell-v30/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-recovery\\\",  \\\"title\\\": \\\"Exchange 2010–Restore Mailbox Content\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber ein anderes mal mehr.Restore FilesDie Datenbank wird von der Sicherung zurück geholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Wiederherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die .edb Datei (Datenbank) und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Recovery DatabaseIst die Wiederherstellung abgeschlossen wird mit der Exchange Management Shell eine Recovery Database erstellt, diese verwendet die wiederhergestellte .edb Date sowie die wiederhergestellten Log Files. Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server MBX01, X:\\\\\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner wiederhergestellt wurden.New-MailboxDatabase RDB01 –Recovery –Server MBX01 –EdbFilePath x:\\\\\\\\restore\\\\\\\\db.edb –LogFolderPath x:\\\\\\\\restore Die Datenbank wurde also erstellt, allerdings wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.EseutilUm die Datenbank in einen sauberen Status zu bringen wird eseutil.exe verwendet. Dabei ist es wichtig die richtigen Parameter zu verwenden.Als erstes kann man überprüfen in welchen Zustand sich die Datenbank befindet:Eseutil /mh x:\\\\\\\\restore\\\\\\\\db.edbDie Datenbank ist also im “Dirty Shutdown” State und kann so nicht gemounted werden, mit “eseutil /r” wird die DB ohne Datenverlust in einen “Clean Shutdown” State gebracht. Mit dem Parameter /r wird der Präfix der Logs angegeben, also am besten zuerst den Dateinamen den Logs überprüfen. Die Parameter /l und /d geben den Pfad zu den Logs&#160; bzw. zur Datenbank an.Eseutil /r “E01” /l x:\\\\\\\\restore\\\\\\\\ /d x:\\\\\\\\resotreAchtung: Sollte das nicht funktionieren kann mit eseutil /p ein Hard Repair durchgeführt werden, dabei wird die Datenbank ohne Rücksicht auf Verluste in den “Clean Shutdown” State gebracht. Datenverlust ist möglich!Nachdem Eseutil durchgelaufen ist und sich die Datenbank im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick auf die RDB oder mit der Management Shell und folgendem Befehl:Mount-Database RDB01Mailbox Restore RequestWenn die Recovery Database online ist kann man beginnen Mailbox Inhalte wiederherzustellen, dazu verwendet man das cmdlet New-MailboxResotreRequest. Folgendes Beispiel stellt den Inhalt der Mailbox “Test User” in den Ordner Restore derselben Mailbox wieder her.New-MailboxRestoreRequest –SourceDatabase ‘RDB01’ –SourceStoreMailbox ‘test user’ –TargetMailbox ‘test.user@ntsystems.it’ –TargetRootFolder ‘Restore’Folgendes Beispiel stellt den Inhalt aller Mailboxen der Datenbank DB01 wieder her. Es wird für jede Mailbox ein Restore Request erstellt, auch hier wird der Inhalt in den Ordner Restore der jeweiligen Mailbox wiederhergestellt.Get-Mailbox –Database ‘DB01’ |foreach { New-MailboxRestoreRequest -SourceStoreMailbox $_.Guid –SourceDatabase ‘RDB01’ -TargetMailbox $_.Guid –TargetRootFolder ‘Restore’}Bei diesem cmdlet ist zu beachten dass die Parameter –SourceStoreMailbox und -TargetMailbox verschiedene Eingaben unterstützen, am Besten die Mailbox GUID verwenden, diese wird von beiden unterstützt.Weitere Infos zu New-MailboxRestoreRequest gibt es im TechNet: http://technet.microsoft.com/en-us/library/ff829875.aspx&#160;CleanupWenn der Restore Vorgang abgeschlossen ist kann man die Recovery Database wieder entfernen, dazu muss sie zuerst mit folgendem Befehl dismounted werden:Dismount-Database RDB01Anschließend kann man die RDB löschen, dazu verwendet man folgenden Befehl:Remove-MailboxDatabase RDB01Die Datenbank ist jetzt aus der Konfiguration entfernt, die Files sind jedoch nach wie vor auf dem Server. Diese müssen manuell gelöscht werden.&#160;so long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-recovery/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-unified-messaging-cisco-call-manager-86\\\",  \\\"title\\\": \\\"Exchange 2010 Unified Messaging–Cisco Call Manager 8.6\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Unified Messaging in Exchange 2010 verbindet E-Mail mit Voice Messaging in einer Messaging Infrastruktur. E-Mail und Voice Mail Nachrichten werden in einer “unified” Mailbox verwaltet und der Benutzer erhält neben Outlook und OWA auch über das Telefon (OVA – Outlook Voice Access) Zugriff auf seine Mailbox.Um die Unified Messaging Rolle mit der “traditionellen” Telefonwelt zu verbinden braucht man ein IP Gateway oder eine IP Telefonzentrale wie den Cisco Call Manager.Exchange Unified MessagingDie Unified Messaging Server Rolle kann auf einem bestehenden Exchange Server hinzugefügt werden, alternativ kann man einen separaten UM Server installieren.PrerequisitesDie notwendigen Voraussetzungen müssen auf einem Windows Server installiert werden, dazu verwendet man am besten die Powershell. Folgendes Beispiel installiert die Voraussetzungen für einen Server der nur die UM Rolle betreibt.Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Desktop-Experience –RestartAchtung: Neustart erfolgt automatisch, sollte das nicht gewünscht sein den Parameter –Restart entfernen.UM Rolle InstallierenUm die Exchange UM Rolle zu installieren wird Setup.exe von einer aktuellen Version der Installationsmedien ausgeführt. Auf einem neuen Server wird dann nur die Unified Messaging Rolle installiert, ein bestehender Server wird über den “Maintenance Mode” um diese Rolle erweitert.Wie nach jeder Installation sollte man auch hier Windows Update ausführen und evtl. Updates installieren.UM KonfigurationNach der Installation der Rolle muss diese konfiguriert werden.Organization ConfigurationEin UM Dial Plan muss erstellt werden, dazu unter Organization Configuration auf Unified Messaging klicken und “New UM Dial Plan” wählen, hier wird der URI Type “Telephone Extension” ausgewählt sowie die länge der internen Telefonnummern (Extension) angegeben.Der UM Dial Plan ist die zentrale Komponente der UM Konfiguration und entspricht der Telefonzentrale bzw. Gruppen von Benutzern mit gleichen Telefonnummern (4 stellig) und dem selben URI Type (Telephone Extension).Der Dial Plan wird im Active Directory unter “CN=My 4 Digit DP, CN=UM DialPlan Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” gespeichert.Gleichzeitig mit dem Dial Plan wird eine UM Mailbox Policy erstellt, auch diese wird im AD unter “CN=My 4 Digit DP Default Policy, CN=UM Mailbox Policies, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain,DC=Local” gespeichert.Über die UM Mailbox Policy werden Einstellungen für UM aktivierte Postfächer konfiguriert.&#160;Als nächstes wird ein UM IP Gateway angelegt, das Gateway ist die SIP Gegenstelle. In diesem Fall gebe ich den Cisco Call Manager an. Um ein UM IP Gateway anzulegen klickt man unter Organization Configuration, Unified Messaging auf “New UM IP Gateway”.Für jedes IP Gateway wird im AD unter “CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local” ein neuer Container angelegt.Eine Hunt Group verbindet das IP Gateway mit dem Dial Plan, wird beim erstellen des UM IP Gateways ein Dial Plan angegeben wird automatisch die “Default Hunt Group” erstellt. Dieser Default Hunt Group wird kein Pilot Identifier zugewiesen, d.h. alle eingehenden Calls (SIP Invites) werden angenommen.Wird die Hunt Group manuell erstellt kann ein Pilot Identifier angegeben werden, dadurch antwortet Exchange UM nur mehr auf Calls die eine konfigurierte Nummer anrufen. Ich verwende hier 9999 als Pilot Identifier, d.h. der Call Manager muss Anrufe an 9999 über den SIP Trunk routen.Um eine neue Hunt Group zu erstellen wählt man unter Organization Configuration, Unified Messaging das IP Gateway aus und klickt dann auf “New UM Hunt Group”.Die Hunt Group wird im Container des entsprechenden IP Gateways gespeichert, in diesem Fall unter: “CN=MY_CUCM_HuntGroup, CN=CUCM1, CN=UM IPGateway Container, CN=Organization, CN=Microsoft Exchange, CN=Services, CN=Configuration, DC=Domain, DC=Local”Die Verbindung zum Dial Plan wird im Attribut msExchUMHuntGroupDialPlanLink gespeichert.Die Exchange Unified Messaging Organisationskonfiguration ist somit abgeschlossen.Server ConfigurationIn der Server Configuration wird der Dial Plan mit einem oder mehreren Exchange UM Servern verbunden. Dazu unter Server Configuration auf Unified Messaging klicken und den entsprechenden Server auswählen. In den Eigenschaften “UM Settings” wählen und den Dial Plan hinzufügen.Die Exchange Unified Messaging Serverkonfiguration ist damit abgeschlossen und die Exchange Umgebung ist bereit für die erste “unified” Mailbox.Recipient ConfigurationUm eine Mailbox für UM zu aktivieren wählt man die Mailbox unter Recipient Configuration, Mailboxes aus und klickt auf Enable Unified Messaging.Jedem Benutzer muss eine UM Mailbox Policy zugewiesen werden, außerdem muss er eine eindeutige “Extension” erhalten. Die Extension ist die Telefonnummer unter der die Voice Mailbox antwortet, also die Interne Telefonnummer des Benutzers.Der Benutzer erhält ein Willkommens-E-mail von Unified Messaging in dem sein PIN und seine Extension mitgeteilt werden.Die Extension wird dem Benutzer als “E-Mail Adresse” vom Typ EUM zugewiesen:ProxyAddressString: EUM:1000;phone-context=CUCM1.domain.localSoll ein Benutzer mehrere Extension erhalten kann man diese einfach als zusätzliche “E-Mail Adressen” hinzufügen.&#160;Cisco Call ManagerDamit der Call Manager mit dem Exchange Server verbunden werden kann wird ein SIP Trunk benötigt. Außerdem muss eine Route erstellt werden über die der Call Manager weiß welche Nummern hinter dem SIP Trunk zu finden sind.SIP TrunkDer SIP Trunk wird unter Device, Trunk “Add New” erstellt.Man muss dem Trunk einen Namen geben, den Device Pool auswählen, die IP Adresse des Exchange UM Servers als Destination angeben und ein SIP Profile sowie das SIP Trunk Security Profile auswählen. Sind mehrere Exchange UM Server vorhanden muss ein Trunk pro Server angelegt werden.Wichtig: Für Outbound Calls muss “Redirecting Diversion Header Delivery – Outbound” aktiviert werden, durch die Informationen im Diversion Header kann der Exchange Server das Postfach aufgrund der Extension zuweisen.Für alle anderen Einstellungen sind die Defaults des Call Managers ok. Je nach Umgebung kann es sein dass man “Media Termination Point Required” aktivieren muss.Route PatternDamit der Call Manager Anrufe an 9999 routen kann muss man eine Route Pattern erstellen, dazu unter Call Routing, Route/Hunt auf Route Pattern klicken. Mit Add New kann eine neue Pattern hinzugefügt werden. Auch hier muss ein Device Pool sowie der SIP Trunk als Gateway angegeben werden. In Umgebungen mit mehrere Exchange UM Servern empfiehlt es sich eine Route List für die SIP Trunks anzulegen und die Pattern auf die Route List zu binden.Die minimale Konfiguration ist dadurch abgeschlossen, wenn der UM aktivierte Benutzer mit der Nummer 1000 jetzt die Nummer 9999 anruft erhält er Zugriff auf sein Postfach über OVA. Wenn derselbe Benutzer eine Umleitung auf 9999 einrichtet werden alle eingehenden Calls auf sein Voicemail Postfach umgeleitet.MWI - Message Waiting IndicatorWenn jemand eine Nachricht hinterlässt wird diese in der Inbox angezeigt, zusätzlich kann am Phone ein MWI Status angezeigt werden (rotes LED). Der Benutzer sieht so sofort dass er eine neue Voicemail hat. Um dieses Feature zu aktivieren muss das “SIP Trunk Security Profile” geändert werden. Dazu unter System, Security auf SIP Trunk Security Profile klicken und das Profil auswählen das dem Trunk zugewiesen wurde. Bei diesem Profil muss die Option “Accept Unsolicited Notification” aktiviert werden.Voice Mail ProfileUm den Voice Mail Button am Phone zu konfigurieren muss ein Voice Mail Pilot sowie ein Voice Mail Profile konfiguriert werden.Dazu unter Advanced Features, Voice Mail auf Voice Mail Pilot klicken und mit Add New einen neuen Voice Mail Pilot erstellen.Unter Advanced Features, Voice Mail, Voice Mail Profile kann ein neues Profil angelegt werden.Achtung: Wird “Make this the default…” ausgewählt wird das Profil automatisch auf allen Phones konfiguriert die keine diesbezügliche Konfiguration haben.Nun kann man unter Device, Phone in der entsprechenden Direct Number Configuration ein Voice Mail Profile konfigurieren.&#160;special thanks to pk :)&#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-unified-messaging-cisco-call-manager-86/\\\"},{  \\\"id\\\": \\\"post-citrix-sprache-des-ica-client-andern\\\",  \\\"title\\\": \\\"Citrix, Sprache des ICA Client ändern\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Citrix\\\"],  \\\"content\\\": \\\"Kleiner Tipp: Das Citrix Online Plug-In (ICA Client) wird standardgemäß in der Betriebssystemsprache ausgeführt. Will man die Sprache manuell ändern, lässt sich das über folgenden Befehl unter C:\\\\\\\\Program Files (x86)\\\\\\\\Citrix\\\\\\\\ICA Client realisieren: WFICA32.EXE /UserUILocale&#160;&#160;Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/citrix-sprache-des-ica-client-andern/\\\"},{  \\\"id\\\": \\\"post-windows-8-installation-in-vhd\\\",  \\\"title\\\": \\\"Windows 8 - Installation in VHD\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Client\\\"],  \\\"content\\\": \\\"In diesem Post (Windows 7 - Nativer VHD Support) habe ich vor einiger Zeit beschrieben wie man Windows 7 in eine VHD installieren kann.Nun, das funktioniert genau gleich f&uuml;r das&nbsp;Windows 8 Developer Preview! Hier nochmal eine kuze Zusammenfassung:VHD erstellen: Diskpart; create vdisk file=\\\\\\\"E:\\\\\\\\VHD\\\\\\\\win8-1.vhd\\\\\\\" type=fixed maximum=20480 erstellt eine 20GB VHD vom Typ \\\\\\\"Fixed\\\\\\\", die Datei belegt also den vollen Speicher auf der FestplatteVon Windows 8 Installationsmedium bootenmit \\\\\\\"Shift\\\\\\\"+\\\\\\\"F10\\\\\\\" eine Eingabeaufforderung &ouml;ffnenVHD ausw&auml;hlen: Diskpart; select vdisk file=\\\\\\\"E:\\\\\\\\VHD\\\\\\\\win8-1.vhd\\\\\\\"attach vhdDiskpart und Eingabeaufforderung schlie&szlig;en, Windows 8 installieren.Der neue Bootmanager ist &uuml;brigens auch im Metrostyle ;)Wie Windows 7 kann man auch Windows 8 vom USB Stick installieren, auch diese Anleitung funtioniert weiterhin!enjoy!!\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-8-installation-in-vhd/\\\"},{  \\\"id\\\": \\\"post-windows-8-developer-preview\\\",  \\\"title\\\": \\\"Windows 8–Developer Preview\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"In Anaheim, Ca findet zurzeit die BUILD Konferenz statt. Diese mehrtätige Veranstaltung richtet sich vor allem an Entwickler und stellt das neue Betriebssystem Windows 8 vor.Seit dem frühen Morgen kann man sich ein “Developer Preview” Build von Windows 8 herunterladen. Verfügbar sind 32 und 64 Bit Images mit oder ohne Entwicklungstools. Hier der Link zur Seite: http://dev.windows.comEinige Neuerungen im ÜberblickDas neue Startmenü im Metro StyleWindows Explorer mit Ribbon, und den neuen Copy/Cut/Paste DialogenAußerdem kann man jetzt ISO und VHD Files direkt im Windows Explorer mounten/öffnen.Auch der Task Manager wurde erneuertHyper-V Support, der Hammer! Hyper-V für den Client mit 64 Bit Guest Support. Außerdem Support für Standby Mode und WLANPowerShell 3&#160;Das ist nur ein schneller Überblick, in den nächsten Tagen gibt es Details. Sehr Empfehlenswert sind folgenden Links:http://www.buildwindows.comhttp://blogs.msdn.com/b/b8enjoy!   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-8-developer-preview/\\\"},{  \\\"id\\\": \\\"post-outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender\\\",  \\\"title\\\": \\\"Outlook 2003 / Exchange 2010 Probleme beim Öffnen freigegebener Kalender\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"In einer Umgebung mit Exchange 2010 und Outlook 2003 als Mail Client kann es beim &Ouml;ffnen freigegebener Kalender zu Problemen kommen. Dabei erscheint folgende Fehlermeldung:&nbsp;Anders als &lt; Office 2007 &ouml;ffnet Outlook 2003 die Verbindung direkt zu den Mailboxserver und nicht &uuml;ber den Address-Book Service. Um dieses Problem zu beheben, muss das Verbindungslimit, welches standardgem&auml;&szlig; 20 betr&auml;gt, angehoben werden. Hierzu erstellen wir eine neue ThrottlingPolicy und weisen diese dem Benutzer zu:&nbsp;New-ThrottlingPolicy &ndash;name Outlook2003CalendarSet-ThrottlingPolicy &ndash;identity Outlook2003Calendar &ndash;RCAMaxConcurrency 100Set-Mailbox &ndash;Identity &ldquo;MAILBOX-USER&rdquo; &ndash;ThrottlingPolicy Outlook2003Calendar&nbsp;Gr&uuml;&szlig;e   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender/\\\"},{  \\\"id\\\": \\\"post-powershell-rekursiv-nach-anderungsdatum-sortieren\\\",  \\\"title\\\": \\\"PowerShell–Rekursiv nach Änderungsdatum sortieren\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Ganze Ordnerstrukturen oder Laufwerke nach Dateien zu durchsuchen die zuletzt ge&auml;ndert worden sind kann ganz sch&ouml;n m&uuml;hsam sein. Mit der PowerShell geht das in einem Oneliner.PS X:\\\\\\\\&gt; Get-ChildItem C:\\\\\\\\Windows\\\\\\\\Logs -Recurse | Sort-Object -Property LastWriteTime &ndash;Descending | Where-Object {$_.Mode -notlike \\\\\\\"d*\\\\\\\"} | Select-Object -First 10 | Format-Table -Property LastWriteTime,FullName &ndash;AutoSizeDieses Beispiel durchsucht C:\\\\\\\\Windows\\\\\\\\Logs rekursiv und sortiert Absteigend nach &ldquo;LastWriteTime&rdquo;. Ordner werden standardm&auml;&szlig;ig auch zur&uuml;ckgegeben, diese werden mit &ldquo;Where-Object&rdquo; gefiltert. Da mich nur die 10 Dateien interessieren die zuletzt ge&auml;ndert wurden verwende ich &ldquo;Select-Object&rdquo;. Anschlie&szlig;end wird die Ausgabe noch Formatiert. Das Ganze sieht dann so aus:M&ouml;chte man das Ergebnis in eine Datei schreiben, bietet sich das cmdlet &ldquo;Export-CSV&rdquo; an, daf&uuml;r &auml;ndert man die &ldquo;Select-Object&rdquo; Abfrage z.B. folgenderma&szlig;en:PS X:\\\\\\\\&gt; Get-ChildItem C:\\\\\\\\Windows\\\\\\\\Logs -Recurse | Sort-Object -Property LastWriteTime -Descending | Where-Object {$_.Mode -notlike \\\\\\\"d*\\\\\\\"} | Select-Object &ndash;Property FullName,CreationTime,LastWriteTime,LastAccessTime,Length,Attributes | Export-Csv Report.csvDas Ergebnis sieht dann so aus:Durch &Auml;nderungen der Where, Select, Format cmdlets bzw. Parameter l&auml;sst sich eine Vielzahl von Ausgaben erzeugen, f&uuml;r weitere Informationen und Hilfe zu den einzelnen cmdlets:Get-Help cmdlet &ndash;OnlineAchtung: Der Parameter &ldquo;Recurse&rdquo; geht durch alle untergeordneten Verzeichnisse, das kann je nach Struktur ziemlich lange dauern. Au&szlig;erdem gelten Berechtigungen nat&uuml;rlich auch f&uuml;r die PowerShell, man kann also nicht Ordner durchsuchen auf die man keine Rechte hat, das sieht dann so aus:have fun!    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-rekursiv-nach-anderungsdatum-sortieren/\\\"},{  \\\"id\\\": \\\"post-diginotar-nur-ein-zufall!\\\",  \\\"title\\\": \\\"DigiNotar–nur ein Zufall!?\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Vor einigen Tagen wurde bekannt das bereits Anfang Juni(!!) bei einem Hack der niederl&auml;ndischen Zertifizierungsstelle &ldquo;DigiNotar&rdquo; mehr als 500 &ldquo;gef&auml;lschte&rdquo; Zertifikate ausgestellt wurden.Unter den Zertifikaten befinden sich folgende Wildcard Zertifikate:*.*.com *.*.org *.10million.org *.android.com *.aol.com *.azadegi.com *.balatarin.com *.comodo.com *.digicert.com *.globalsign.com *.google.com *.JanamFadayeRahbar.com *.logmein.com *.microsoft.com *.mossad.gov.il *.mozilla.org *.RamzShekaneBozorg.com *.SahebeDonyayeDigital.com *.skype.com *.startssl.com *.thawte.com *.torproject.org *.walla.co.il *.windowsupdate.comEine vollst&auml;ndige Liste der Zertifikate gibt es hier.&nbsp;Der Angriff wurde entdeckt weil in Googles Chrome Browser die g&uuml;ltigen Zertifikate fix hinterlegt sind, der Browser also beim Anzeigen vermeintlich authentischer Google Inhalte gemeckert hat. Wenn die &ldquo;T&auml;ter&rdquo; den &ldquo;User Agent String&rdquo; von Chrome gefiltert h&auml;tten, wer wei&szlig; wann (und ob) dieser Hack &ouml;ffentlich geworden w&auml;re&hellip;Vermutungen wie viele derartige Angriffe bisher unerkannt geblieben sind und wer dahinter steckt &uuml;berlasse ich anderen. Ich hoffe allerdings dass die Debatte um Sicherheit und das &ldquo;Web of Trust&rdquo; weitergef&uuml;hrt wird und durch solche krassen Vorf&auml;lle mehr Aufmerksamkeit bekommt.&nbsp;&nbsp;Betroffene CAsFolgende Zertifizierungsstellen m&uuml;ssen aus allen Browsern, Applikationen und Betriebssystemen verschwinden, sie gelten als NICHT mehr Vertrauensw&uuml;rdig:CertificateIssued byThumbprintDigiNotar Root CADigiNotar Root CAc0 60 ed 44 cb d8 81 bd 0e f8 6c 0b a2 87 dd cf 81 67 47 8cRoot CA G2DigiNotar Root CA G243 d9 bc b5 68 e0 39 d0 73 a7 4a 71 d8 51 1f 74 76 08 9c c3PKIoverheid CA OverheidStaat der Nederlanden Overheid CAb5 33 34 5d 06 f6 45 16 40 3c 00 da 03 18 7d 3b fe f5 91 56PKIoverheid CA Organisatie - G2Staat der Nederlanden Organisatie CA - G25d e8 3e e8 2a c5 09 0a ea 9d 6a c4 e7 a6 e2 13 f9 46 e1 79PKIoverheid CA Overheid en BedrijvenStaat der Nederlanden Overheid CA40 aa 38 73 1b d1 89 f9 cd b5 b9 dc 35 e2 13 6f 38 77 7a f4Windows UpdateMicrosoft hat inzwischen reagiert und ein Windows Update zur Verf&uuml;gung gestellt, genauere Informationen findet man im Microsoft Security Advisory (2607712).Wie an vielen Stellen zu lesen ist soll es mit diesen Zertifikaten m&ouml;glich sein gef&auml;lschte Windows Updates zu verteilen, das ist laut Microsoft NICHT der Fall. Der Windows Update Client installiert ausschlie&szlig;lich Pakete die mit dem &ldquo;Microsoft Root Certificate&rdquo; signiert sind.&nbsp;FirefoxF&uuml;r Mozilla Firefox wir ein Update in k&uuml;rze erwartet, hier empfiehlt es sich die genannten CAs manuell zu entfernen!Unter Einstellungen, Erweitert, Verschl&uuml;sselung klickt man auf &ldquo;Zertifikate anzeigen&rdquo;. Jetzt bekommt man eine Liste der Zertifizierungsstellen und kann das Vertrauen entziehen.Weitere Infos im Mozilla Security Blog.&nbsp;&nbsp;AppleApple hat wohl zur Zeit andere Priorit&auml;ten, MAC Benutzer sollten auf jeden Fall manuell die oben genannten Zertifikate entfernen. Chester Wisniewski von Sophos beschreibt das Ganze so:What about Apple users? Well, apparently they are too busy playing Angry Birds and making pictures in Photoshop to worry about pesky certificate issues.&lt;/p&gt;My advice if you run a Mac? Use BootCamp and Windows 7 until Apple decides to provide a patch. Or I guess you could use Firefox (not Chome, it also uses Apple's KeyChain)...&lt;/code&gt;Ein erster Bericht der Security Consultants Fox-IT zum Thema ist verf&uuml;gbar:http://www.rijksoverheid.nl/ministeries/bzk/documenten-en-publicaties/rapporten/2011/09/05/diginotar-public-report-version-1.htmlstay secure  tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/diginotar-nur-ein-zufall!/\\\"},{  \\\"id\\\": \\\"post-esxi-persistent-scratch-location\\\",  \\\"title\\\": \\\"ESXi–Persistent Scratch Location\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"VMware\\\",\\\"Server\\\"],  \\\"content\\\": \\\"In diesem Artikel habe ich beschrieben wie man den ESXi Hypervisor auf einem USB Stick installieren kann. Ein Nachteil dieser Installation ist das Fehlen der Scratch Partition, sie wird nicht automatisch erstellt da Flash Medien eine beschränkte Anzahl von schreib/lese Zyklen haben und sich so nicht besonders als Speicherort für Logfiles eignen.&#160;ESXi Scratch PartitionDie Scratch Partition ist optional und wird standardmäßig während der Installation von ESXi auf lokalem Storage angelegt. Wenn lokaler Storage verfügbar ist wird die Scratch Partition mit 4GB angelegt, sie wird verwendet um den Output von “vm-support” zu speichern, gibt es keine Scratch Partition wird dieser wird dieser Output in den RAM geschrieben.Wird die Scratch Partition automatisch erstellt ist es nicht empfohlen die bestehende Konfiguration zu ändern, wird die Scratch Partition nicht automatisch angelegt (z.B. bei Installation auf USB) ist es empfohlen manuell einen Speicherort für “Scratch” zu konfigurieren.Configure Scratch Location – vSphere ClientUm die Scratch Location manuell zu konfigurieren muss man zuerst einen Ordner auf einem Datastore anlegen, der ESXi Host muss natürlich Zugriff auf diesen Datastore haben. Dazu wechselt man im vSphere Client auf “Configuration” und wählt unter “Storage” einen Datastore aus, mit rechtsklick “Browse Datastore” öffnet man den Datastore Browser und legt einen Ordner an. Achtung: Es muss einen eindeutigen Ordner pro ESXi Host geben, man kann nicht einen Scratch Ordner für mehrere Hosts verwenden!Die Scratch Location wird in den “Advanced Settings” unter “Configuration”, “Software” konfiguriert. Dort gibt es einen Abschnitt “ScratchConfig” welcher ein Textfeld für die Einstellung “ScratchConfig.ConfiguredScratchLocation” anzeigt. In dieses Textfeld muss der vollständige Pfad zum Order eingegeben werden, also z.B: /vmfs/volumes/&lt;myDatastore&gt;/.scratch-esx1Achtung: diese Einstellung wird erst nach einem Neustart des ESXi Hosts wirksam.vSphere Client Login– A general system error occuredWird eine Active Directory Domain zur Authentifizierung angegeben und es ist keine Scratch Partition Konfiguriert kann man sich am vSphere Client nicht anmelden und bekommt eine (sehr vielsagende) Fehlermeldung, entweder: “A general system error occured” oder “gss_acquire_cred failed”Der Grund für den Fehler ist offensichtlich dass ESXi versucht Informationen über die Anmeldung in ein Logfile unter /scratch/var/tmp zu schreiben.Genauere Infos zum Thema gibts hier:http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&amp;cmd=displayKC&amp;externalId=1033696http://blogs.vmware.com/esxi/2011/04/scratch-partition-best-practices-for-usbsd-booted-esxi.htmlhttp://blogs.vmware.com/esxi/2011/03/ops-changes-part-5-scratch-partition.htmlso long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/esxi-persistent-scratch-location/\\\"},{  \\\"id\\\": \\\"post-citrix-ima-dienst-startet-nicht-mehr\\\",  \\\"title\\\": \\\"Citrix IMA Dienst startet nicht mehr\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Citrix\\\"],  \\\"content\\\": \\\"Lässt sich der Citrix IMA Dienst nicht mehr starten, können keine eingehende Verbindung zum Citrix Server mehr initiiert werden. Versucht man den IMA Dienst zu starten und erhält folgende Fehlermeldung: Windows could not start Citrix Independent Management Architecture on Local Computer. For more information, review the System Event Log. If this is a non-Microsoft service, contact the service vendor, and refer to service-specific error code –2147483647&#160;&#160;Opening the Event Viewer of the affected server shows this event on the System Log:&lt;/p&gt;    “Failed to load plugin C:\\\\\\\\Prgoram Files (x86)\\\\\\\\Citrix\\\\\\\\System32\\\\\\\\Citrix\\\\\\\\IMA\\\\\\\\Subsystems\\\\\\\\RADESessionsSs.dll with error IMA_RESULT_FAILURE”&lt;/code&gt;  &#160;    &#160;  In den meisten Fällen ist die lokale Streaming Offline Datenbank korrupt. Dies lässt sich meist durch den Befehl dsmaint recreaterade beheben.   Lässt sich der IMA Dienst immer noch nicht starten, sind wahrscheinlich die Verbindungseinstellungen im File C:\\\\\\\\Program Files (x86)\\\\\\\\Citrix\\\\\\\\Independent Management Architecture\\\\\\\\RadeOffline.dsn korrupt:  Fehlerhafte Konfiguration:    Diese muss durch eine gültige Konfiguration ersetzt werden:    Nun ist es noch notwendig die Streaming Offline Datenbank neu zu erstellen:  dsmaint recreaterade   Der Citrix IMA Dienst sollte sich jetzt normal starten lassen.  &#160;  Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/citrix-ima-dienst-startet-nicht-mehr/\\\"},{  \\\"id\\\": \\\"post-citrix-xenapp6-fehler-beim-starten-des-webservice\\\",  \\\"title\\\": \\\"Citrix XenApp6 Fehler beim starten des Webservice\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Citrix\\\"],  \\\"content\\\": \\\"Letztens bin ich auf ein seltsamen Problem in XenApp6 gestoßen:Sobald man den Webservice startet und einen Verbindungsversuch unternimmt, beendet sich der ApplicationPool und Verbindungen werden terminiert.Im EventLog wird folgender Fehler protokolliert:&#160;Log Name: Application&lt;/p&gt;    Source: Microsoft-Windows-IIS-W3SVC-WP    Date: 17/06/2011 09:37:36    Event ID: 2307    Task Category: None    Level: Error    Keywords: Classic    User: N/A    Computer: ts1.ntsystems.it    Description:    The worker process for application pool 'CitrixWebInterface5.3.0AppPool' encountered an error 'Failed to decrypt attribute 'password'    ' trying to read configuration data from file '\\\\\\\\\\\\\\\\?\\\\\\\\C:\\\\\\\\inetpub\\\\\\\\temp\\\\\\\\apppools\\\\\\\\CitrixWebInterface5.3.0AppPool.config', line number '150'. The data field contains the error code.&lt;/code&gt;  &#160;  Lösung  Um den Fehler zu beheben und das Webinterface richtig starten zu können, müssen in der Datei C:\\\\\\\\Windows\\\\\\\\System32\\\\\\\\inetsrv\\\\\\\\config\\\\\\\\applicationHost.config die Zeilen zwischen  &lt;configProtectedData&gt; gelöscht werden. Wichtig ist dabei, dass IIS vorher beendet wurde. Danach muss der Service wieder gestartet, der ApplicationPool lässt sich nun auch normal starten. Eingehende Verbindungen zum Webinterface werden nun auch richtig verarbeitet.  &#160;  Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/citrix-xenapp6-fehler-beim-starten-des-webservice/\\\"},{  \\\"id\\\": \\\"post-ex2k10-pst-in-archive-importieren\\\",  \\\"title\\\": \\\"EX2k10 PST in Archive importieren\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Um PST Files in ein Exchange 2010 SP1 Archive-Mailbox zu verschieben muss zunächst sichergestellt werden, dass der Microsoft Exchange Mailbox Replication Dienst gestartet ist. Zudem muss der Gruppe “Exchange Trusted Subsystem Security Group” NTFS und Freigabeberechtigungen für das PST File gegeben werden.&#160;Um den Import durchzuführen muss jetzt das entsprechende Benutzerkonto der neuen Gruppe “Mailbox Import Export Group” hinzugefügt werden:New-RoleGroup &quot;Mailbox Import Export Group&quot; -Roles &quot;Mailbox Import Export&quot;Add-RoleGroupMember &quot;Mailbox Import Export Group&quot; -Member &quot;Administrator&quot;&#160;Nun kann das PST File über den Befehl New-MailboxImportRequest in das Archiv importiert werden. Anbei ein Script, wo man im File Users.csv PST Files den jeweiligen Benutzern zuweisen und den Import Request generieren kann:import-csv &quot;Users.csv&quot;|ForEach{&lt;/p&gt;    New-MailboxImportRequest -Mailbox $_.user -FilePath $_.Path -BadItemLimit 50 -IsArchive    }&lt;/code&gt;  Bsp für Users.csv:  User,Path   daniel.nitz,\\\\\\\\\\\\\\\\share\\\\\\\\daniel-PST.PST  &#160;  Grüße   dn&lt;/td&gt;&lt;/tr&gt;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/ex2k10-pst-in-archive-importieren/\\\"},{  \\\"id\\\": \\\"post-lync-integration-in-outlook-web-app-2010\\\",  \\\"title\\\": \\\"Lync Integration in Outlook Web App 2010\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Seit einiger Zeit ist der Nachfolger des Office Communication Servers verf&uuml;gbar, Lync 2010 vereint Enterprise Voice, Instant Messaging, Presence sowie Live Meeting, weitere Details gibts hier: http://lync.microsoft.com/en-us/Pages/default.aspxAuch Outlook Web App kann als Lync Client konfiguriert werden, folgende Features werden direkt von OWA unterst&uuml;tzt, es wird daf&uuml;r kein Client auf dem PC ben&ouml;tigt:Presence, der Status anderer wird angezeigt, au&szlig;erdem kann man seinen Status &auml;ndern bzw. sich an- und abmelden Die Lync Kontaktliste wird angezeigt Instant Messaging mit einem Web Client PrerequisitesAuf dem Client Access Server m&uuml;ssen die Komponenten f&uuml;r Microsoft Office Communications Server 2007 R2 Web Service Provider installiert werden. Der Common Name im Zertifikat des Client Access Servers muss der FQDN des Client Access Servers sein. Wenn es sich um ein CAS Array handelt muss der Common Name dem FQDN des CAS Array entsprechen. Instant Messaging muss auf dem Client Access Server aktiviert werden In der Lync Umgebung muss ein Trusted Application Pool und eine Trusted Application erstellt und aktiviert werden. Exchange Client Access Server/Array KonfigurationFolgende Pakete herunterladen:Office Communication Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=2310 Hotfix f&uuml;r den OC Web Service Provider:      http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=797 Hotfix f&uuml;r Unified Communication API:      http://www.microsoft.com/download/en/details.aspx?id=7557 Als erstes wird jetzt CWAOWASSPMain.msi installiert, dieses Paket erstellt einen Ordner (Standard: C:\\\\\\\\Web Service Provider Installer Package\\\\\\\\) und kopiert die ben&ouml;tigten Installationsdateien f&uuml;r den OC Web Service Provider in diesen Ordner. Jetzt in diesen Ordner wechseln und die Pakete in folgender Reihenfolge installierenvcredist_x64.exe UcmaRedist.msi CWAOWASSP.msi Jetzt fehlen noch die Hotfixes aus den Downloads 2 und 3, auch diese Pakete installierenUcmaRedist.msp CWAOWASSP.msp Die ben&ouml;tigte Software ist somit installiert, jetzt muss Instant Messaging noch aktiviert werden. Die Konfiguration daf&uuml;r wird am OWA Virtual Directory gemacht. Der InstantMessagingType wird auf OCS ge&auml;ndert, als InstantMessagingServerName wird der Lync Server angegeben. Au&szlig;erdem muss der Thumbprint des Zertifikates das f&uuml;r TLS verwendet werden soll angegeben werden und InstantMessaging aktiviert werden. Folgende PowerShell Befehl erledigt dieses Schritte:$iiscert = (Get-ExchangeCertificate | Where {$_.Services -like \\\\\\\"*IIS*\\\\\\\"}).ThumbprintGet-OWAVirtualDirectory -Server ex14.ntsystems.local | Set-OWAVirtualDirectory -InstantMessagingType OCS -InstantMessagingEnabled:$true -InstantMessagingCertificateThumbprint $iiscert -InstantMessagingServerName lync.ntsystems.localAchtung: Wenn bei Get-OWAVirtualDirectory der Parameter Server weggelassen wird werden alle Virtual Directories der Exchange Umgebung konfiguriert. Bei InstantMessagingServerName muss der FQDN des Lync Servers angegeben werden.In einem CAS Array m&uuml;ssen diese Schritte auf allen Servern wiederholt werden.Lync Server KonfigurationMit dem Lync Server Topology Builder wird jetzt unter &ldquo;Trusted Application Servers&rdquo; ein neuer Application Pool angelegt. Dieser Pool wird als Single Computer Pool angelegt, der FQDN muss dabei entweder dem Namen des Client Access Server oder dem Namen des CAS Arrays entsprechen.Jetzt wird der Lync Server Frontend Pool ausgew&auml;hlt, welcher f&uuml;r diese Applikation verwendet werden soll.Der Server ist jetzt erstellt, Standardm&auml;&szlig;ig ist &ldquo;Enable replication of configuration data to this pool&rdquo; aktiviert, das wird nicht ben&ouml;tigt und kann in den Eigenschaften des soeben erstellten Objektes deaktiviert werden.Jetzt kann die &Auml;nderung der Topologie ver&ouml;ffentlicht werden, dazu klickt auf Action, Topology und Publish.Es fehlt noch die CSTrustedApplication, diese wird &uuml;ber die Lync Server Management Shell angelegt. Auch dabei muss wieder der FQDN des Client Access Servers oder des CAS Arrays angegeben werden, au&szlig;erdem wird ein Port f&uuml;r die Applikation angegeben, nat&uuml;rlich muss ein Port verwendet werden der frei ist. (netstat &ndash;an zeigt verwendete Ports an). Mit folgendem PowerShell Befehl wird die Applikation erstellt:New-CsTrustedApplication -ApplicationID OWA -TrustedApplicationPoolFqdn ex14.ntsystems.local -Port 4999Diese Konfiguration muss noch aktiviert werden, das wird mit folgendem PowerShell cmdlet gemacht:Enable-CsTopologyEnjoyDie Konfiguration ist jetzt abgeschlossen, ab jetzt sind die neuen Features in Outlook Web App aktiv&hellip;TroubleshootingFQDN &ndash; Der CN im Zertifikat des Client Access Servers (oder Arrays) muss passen. Mit Get-CsTrustedApplication bzw. Get-CsTrustedApplicationComputer kann man die Lync Konfiguration nochmal &uuml;berpr&uuml;fen Lync Server Logging Tool &ndash; bei vielen Problemen hilft das Log des SIPStack &nbsp;viel Spa&szlig;    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/lync-integration-in-outlook-web-app-2010/\\\"},{  \\\"id\\\": \\\"post-cisco-aaa\\\",  \\\"title\\\": \\\"Cisco AAA\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Network\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Nachdem der RADIUS Server konfiguriert ist geht es an die Konfiguration des Clients.Bei Cisco muss dazu das “neue” AAA Model aktiviert werden. Das geht einfach mit folgendem Befehl:aaa new-model      Lokale AuthentifizierungAchtung: nach absetzen dieses Befehls ist das neue Model aktiv, d.h. man kann sich nur mehr mit Benutzername und Passwort anmelden. Man sollte jetzt einen lokalen Benutzer angelegen, dieser kann auch im Fallback Fall, also wenn der RADIUS Server nicht erreichbar ist, verwendet werden. Mit folgendem Befehl legt man einen lokalen User cisco mit Passwort cisco an:username cisco secret cisco Radius ServerBevor man RADIUS als Authentifizierung verwenden kann muss ein RADIUS Server konfiguriert werden. Mit folgenden Befehlen konfiguriert man den RADIUS Server 10.1.1.100 und den entsprechendem Pre-Shared Key. RADIUS verwendet standardmäßig die UDP Ports 1812 und 1813 für Authentifizierung und Accounting, Cisco Geräte verwenden die Ports 1645 und 1646, das kann man evtl. mit “auth-port 1812 acct-port 1813” ändern. Der NPS RADIUS Server antwortet auf beide Varianten, man muss das also nicht definieren.radius-server host 10.1.1.100 key PRE_SHARED_KEYMit “radius-server retransmit x” kann man angeben wie oft eine Anfrage gesendet wird wenn innerhalb des Timeouts keine Antwort kommt. Das Zeitfenster für das Timeout kann mit “radius-server timeout x” auf x Sekunden erhöht werden. Das Interface über welches der Cisco Switch die RADIUS Anfrage schickt kann mit “ip radius source-interface x” angegeben werden.AAA ListenDas AAA Authentication Model arbeitet mit Listen, man definiert eine Liste und weißt diese Liste einem Interface zu. Die Liste “default” gilt für alle Interfaces auf denen keine andere Liste gebunden ist. Folgender Befehl setzt die Standardauthentifizierung auf RADIUS, Fallback (RADIUS nicht erreichbar) ist local:aaa authentication login default group radius local      Ab diesem Zeitpunkt muss man sich an allen Interfaces mit Benutzername und Passwort vom RADIUS Server anmelden.Wenn die Netzwerkgeräte in sicheren Serverräumen untergebracht sind kann man sich überlegen die Authentifizierung für den Console Port zu deaktivieren, damit man im Desaster Fall noch eine letzte Hoffnung auf Zugriff hat. Dazu legt man eine Liste an und setzt die Authentifizierung auf “none”, danach bindet man die Liste auf “line con 0”:aaa authentication login liste1 none&lt;/p&gt;    line con 0      &#160; login authentication liste1&lt;/code&gt;  Authorization  Am RADIUS Server habe ich in den Settings das Attribut Service-Type auf “Administrative” gesetzt. Dadurch müsste ich eigentlich im “enable” Mode landen. Das funktionier jedoch erst nachdem auch die Authorization auf RADIUS gesetzt wurde. Folder Befehl legt fest dass RADIUS für alle Interfaces verwendet wird, die Console ist dabei ausgeschlossen:  aaa authorization exec default group radius local  Um Authorization auf der Console über RADIUS zu aktivieren wird folgender Befehl verwendet:  aaa authorization console  Wenn ich mich erneut anmelden lande ich direkt im “Enable” Mode des Switches.  Logging  Am NPS wird im Event Log Security ein Event 6272 aufgezeichnet, außerdem wird im Logfile (D:\\\\\\\\NPS\\\\\\\\LogFiles) ein Eintrag hinzugefügt.  Sniffing  Mit Wireshark o.ä. sieht man ein RADIUS Access-Request Paket vom Switch zum NPS Server und ein RADIUS Access-Accept Paket vom NPS Server zum Switch.  Das Access-Request Paket enthält unter anderem folgende Informationen:  User-Name: Der Benutzer der sich am RADIUS Client anmeldet  Calling-Station-Id: IP Adresse des Clients (der z.B. die Telnet Session öffnet)  NAS-IP-Address: IP Adresse des RADIUS Clients  Das Access-Accept Paket enthält die AV-Pair Informationen:  AVP: Attribute Value Pair das am NPS konfiguriert wurde (Service-Type: Administrative)    &#160;  tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/cisco-aaa/\\\"},{  \\\"id\\\": \\\"post-cisco-aaa-nps-radius-server\\\",  \\\"title\\\": \\\"Cisco AAA–NPS RADIUS Server\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Network\\\"],  \\\"content\\\": \\\"In größeren Netzwerken kann es aufgrund der Firmenrichtlinie oder der Gesetzgebung notwendig sein sich an den Netzwerkgeräten mit persönlichen User Accounts anmelden zu müssen. Man kann dafür natürlich für jeden Netzwerkadministrator ein persönliches Account auf allen Geräten anlegen, oder man authentifiziert gegen einen RADIUS Server. Dieser RADIUS Server kann z.B. ein Network Policy Server sein, der seit Windows Server 2008 den IAS abgelöst hat. Der Vorteil so einer Implementierung liegt auf der Hand, die Authentifizierung wird über das Zentrale Active Directory gesteuert und Benutzerkonten müssen nur an einem Ort gepflegt werden.NPSDie NPS Serverrolle muss auf einem Server hinzugefügt werden, ob das ein dedizierter Server ist oder ob man die Rolle auf einem andern mitlaufen lässt hängt von der Größe der Umgebung ab. Die Rolle kann wie jede andere über den Servermanager oder das PowerShell cmdlet Add-WindosFeature hinzugefügt werden. Damit das cmdlet verfügbar ist muss das Modul ServerManager geladen werden.Für RADIUS reicht der NPAS-Policy-Server. Wen die Rolle hinzugefügt wurde kann NPS konfiguriert werden, der erste Schritt ist es den NPS Server im Active Directory zu registrieren. Rechtsklick auf NPS (local) und “Register Server in Active Directory” wählen&quot;Der zweite Schritt ist die Konfiguration des Accounting, bzw. Logging, dafür gibt es in der NPS Konsole unter dem Punkt “Accounting” drei Einstellungsmöglichkeiten.Der “Configure Accounting Wizard” erleichtert einem Konfiguration:Ich entscheide mich für das Logging in ein Textdokument, je nach Umgebung kann man auch einen zentralen SQL Server angeben.Den Ordner für die Log Files lege ich auf eine zweite Partition. Der NPS Server ist nun konfiguriert, es fehlen noch die RADIUS Clients sowie das Regelwerk das definiert wer sich anmelden darf.Radius ClientsJedes Netzwerkgerät das über NPS authentifizieren will muss dort als RADIUS Client angelegt werden, in diesem Schritt werden der Name, die IP Adresse und der Pre-Shared Key für jeden Client festgelegt. Der Pre-Shared Key wird verwendet um den RADIUS Client zu authentifizieren, der Benutzer meldet sich mit seinem Benutzernamen und Passwort an.Um einen RADIUS Client anzulegen erweitert man den Ordner “RADIUS Clients and Servers” in der NPS Konsole, Rechtslick auf “RADIUS Clients” und “New” öffnet den Dialog “New RADIUS Client”.Unter dem Reiter “Settings” wird der Friendly name konfiguriert, dieser ist später wichtig für die Konfiguration der Regeln. Außerdem gibt man hier die IP Adresse des Clients an, der Pre-Shared Key kann manuell eingegeben werden, ich empfehle jedoch ihn automatisch zu generieren. (Achtung: einige alte Geräte unterstützen nur Keys bis zu einer bestimmten Länge)Unter Advanced könnte man noch ein bestimmtes RADIUS Feature Set auswählen, normalerweise reicht aber der Standard aus. Connection Request PolicyÜber die Connection Request Policy wird definiert welcher RADIUS Client wie authentifiziert wird. NPS kann auch als RADIUS Proxy arbeiten und könnte daher anfragen eines Clients selbst authentifizieren und die eines andern an einen Remote RADIUS Server weiterleiten, dieser Server muss zuerst unter “RADIUS Clients and Servers” angelegt werden.Die Standardregel ist so konfiguriert dass alle anfragen Lokal, also gegenüber Active Directory, authentifiziert werden.Network PolicyDie Network Policy definiert wer sich unter welchen Umständen authentifizieren darf. Da beide Standardregeln keinen Zugriff zulassen müssen wir eine neue Network Policy anlegen, Rechtsklick auf “Network Policy” und “New” öffnet den Dialog “New Network Policy”.Auf der ersten Seite wird eine Name für die neue Richtlinie konfiguriert, der Rest bleibt Standard.Auf dieser Seite werden die Konditionen definiert unter welchen die Authentifizierung erfolgreich ist. Man kann z.B. den RADIUS Client und eine bestimmt AD Gruppe hinzufügen, die beiden Kriterien sind “AND” verknüpft, müssen also beide zutreffen. Der Benutzer der sich am Client “cisco_1” anmeldet muss also Mitglied der Gruppe NetworkAdmins sein damit er sich authentifizieren darf.Im nächsten Schritt wird festgelegt ob diese Regel den Zugriff erlaubt oder verweigert.PAP muss als Authentifizierungsmethode hinzugefügt werden, man wird darauf hingewiesen dass diese Methode nicht sicher ist da das Passwort in Clear-Text über die Leitung geht, das muss man wohl oder übel in kauf nehmen.Hier könnte man weitere verbindungsspezifische Einstellungen machen, für die Authentifizierung an Netzwerkgeräte wird das allerdings nicht benötigt.&#160;Im letzten Schritt werden die Einstellungen konfiguriert die der RADIUS Server in der Antwort mitschickt, hier kann man sogenannte Attribute-Value (AV)-Pairs konfigurieren. Diese AV-Pairs sind Herstellerabhängig, bei Cisco z.B. kann man mit Attribut 6 den Service-Type definieren, gibt man “Administrative” an landet ein authentifiziert User direkt im “enable” Mode. Framed-Protcol PPP kann gelöscht werden, Service-Type ändere ich auf “Administrative”&#160;Somit ist der NPS Server fertig konfiguriert und bereit Anfragen von einem RADIUS Client mit der IP 10.1.1.254 und dem richtigen Pre-Shared Key zu beantworten. Nur Benutzer die Mitglied der Gruppe NetworkAdmins sind dürfen sich am RADIUS Client anmelden, ist die Authentifizierung erfolgreich sollte der Benutzer gleich im “enable” Mode sein.&#160;Im nächsten Artikel konfiguriere ich einen Cisco Switch für RADIUS Authentifizierung.tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/cisco-aaa-nps-radius-server/\\\"},{  \\\"id\\\": \\\"post-one-note-kleiner-tipp\\\",  \\\"title\\\": \\\"One Note–Kleiner Tipp\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Client\\\"],  \\\"content\\\": \\\"Ich werde von Tag zu Tag ein gr&ouml;&szlig;erer Fan von Microsoft OneNote. Dokumentationen und Notizen lassen sich perfekt mit diesen starken Tool verwalten und pflegen. (Ich liebe die eingebaute Funktion &ldquo;Bildschirmausschnitt&rdquo;)Vor ein paar Tagen ist mir aufgefallen, dass die Suche in OneNote ein tolles Feature beinhaltet: Es kann Screenshots nach Text durchsuchen!!Testet es einfach aus, erstellt einen Screenshot und sucht im Suchfeld nach Text, welcher sich im Screenshot befindet. Ihr werdet &uuml;berrascht sein &nbsp;&nbsp;Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/one-note-kleiner-tipp/\\\"},{  \\\"id\\\": \\\"post-subdomain-certificate-enrollment\\\",  \\\"title\\\": \\\"Subdomain Certificate Enrollment\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Wenn man f&uuml;r einen Server aus einer Subdomain ein Zertifikat aus der Zertifizierungsstelle in der Root-Domain ausstellen m&ouml;chte, wird das aufgrund fehlender Berechtigungen nicht funktionieren. Um das Zertifikat erfolgreich ausstellen zu k&ouml;nnen muss der Computer bzw. die Dom&auml;nencomputer Mitglieder der Gruppe CERTSVC_DCOM_ACCESS der Root-Domain sein:Danach ist es notwendig den Server neu zu starten, welcher das Zertifikat erhalten soll.Nun kann das Zertifikat ausgestellt werden.Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/subdomain-certificate-enrollment/\\\"},{  \\\"id\\\": \\\"post-installing-vsphere-powercli\\\",  \\\"title\\\": \\\"Installing vSphere PowerCLI\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"VMware\\\"],  \\\"content\\\": \\\"Mit vSphere PowerCLI bietet VMware ein PowerShell Snapin das mit &uuml;ber 250 cmdlets die Verwaltung der vSphere Umgebung vereinfacht bzw. Automatisierung&nbsp; erm&ouml;glicht.Die aktuelle Version kann unter http://vmware.com/go/powercli heruntergeladen werden.&nbsp;Die Installationsroutine installiert au&szlig;er den PowerShell Snapins die VMware VIX API, die das Management von virtuellen Maschinen erm&ouml;glicht. Diese API erlaubt es Programme direkt im Gastsystem der VM ausf&uuml;hren bzw. Dateien zu manipulieren.Nachdem das License Agreement akzeptiert wurde, kann man den Pfad f&uuml;r die Installation festlegen, jetzt noch auf installieren klicken und das wars.Auf dem Desktop wurde eine Verkn&uuml;pfung zu PowerCLI angelegt, sonst findet man sie unter Start, Programme, VMware, VMware vSphere PowerCLI.Wenn man die PowerCLI startet wird das PSSnapin &ldquo;VMware.VimAutomation.Core&rdquo; geladen, dieses kann nat&uuml;rlich auch in einer &ldquo;normalen&rdquo; PowerShell Session mit Add-PSSnapin hinzugef&uuml;gt werden.Wie in der Titelleist zu erkennen ist, ist die PowerCLI standardm&auml;&szlig;ig &ldquo;not connected&rdquo;, um auf die Virtuelle Umgebung zugreifen zu k&ouml;nnen muss man eine Verbindung mit dem vCenter Server herstellen. Dazu verwendet man das Connect-VIServer cmdlet, z.B.:Connect-VIServer vcenter.ntsystems.local &ndash;credential (Get-Credential)Mit diesem Befehl verbindet man die PowerCLI mit dem vCenter Server und kann alternative Anmeldeinformationen mitgeben, wenn der Benutzer mit dem die PowerCLI gestartet wurde ausreichende Rechte im vCenter hat kann man &ndash;credential nat&uuml;rlich weglassen.Wenn die Verbindung hergestellt wurde kann man mit PowerCLI arbeiten und sich z.B. eine Liste der VMs ausgeben lassen die nicht eingeschaltet sind:Get-VM | ?{$_.PowerState -notlike \\\\\\\"*On*\\\\\\\"}Alternativ kann man PowerCLI auch direkt mit einem ESX/ESXi Host verbinden, das ist z.B n&ouml;tig um mit Get-ESXTop Performance Informationen &uuml;ber einen Host zu sammeln.&nbsp;Die Hilfe zur PowerCLI kann einfach mit dem cmdlet Get-PowerCLIHelp aufgerufen werden, empfehlenswert ist auch Get-PowerCLICommunity.&nbsp;Hier noch ein kleiner Tipp: Wer die PowerShell ISE verwendet kann eigene Add-Ons hinzuf&uuml;gen. Ich habe ein einfaches Add-On gebastelt um das PowerCLI Snapin in die ISE Session zu laden. Dazu einfach folgendes Script in das ISE Profil kopieren. Um die ISE Profil Datei zu &ouml;ffnen &ldquo;notepad $profile.CurrentUserCurrentHost&rdquo; in der ISE ausf&uuml;hren.&nbsp;$psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add(     &nbsp; \\\\\\\"Connect to vCenter\\\\\\\",      &nbsp;&nbsp;&nbsp; {      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Add-PSSnapin VMware.VimAutomation.Core      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $VIServer = Read-Host -Prompt \\\\\\\"ESX/ESXi Host or vCenter Server FQDN\\\\\\\"      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Test-Connection $VIServer -Quiet) {Connect-VIServer $VIServer}      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {Write-Output \\\\\\\"Server not reachable\\\\\\\"}      &nbsp;&nbsp;&nbsp; },      &nbsp; \\\\\\\"Control+Alt+V\\\\\\\"      )Die Profildatei sollte signiert sein, wie man das macht habe ich hier beschrieben.&nbsp;so long   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/installing-vsphere-powercli/\\\"},{  \\\"id\\\": \\\"post-upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht\\\",  \\\"title\\\": \\\"Upgrade Windows Server 2008R2 Sp1 - BlackBerry Monitoring Service startet nicht\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Nach dem Update auf Windows Server 2008R2 Sp1 starten die Monitoring Services des BlackBerry Enterprise Servers nicht mehr. Betroffen sind folgende Dienste:BBMonitoringService_APP - BlackBerry Monitoring Service - Application Core&lt;/p&gt;    BBMonitoringService_DCS - BlackBerry Monitoring Service - Data Collection Subsystem    BBMonitoringService_ENG - BlackBerry Monitoring Service - Polling Engine&lt;/code&gt;  Im Eventlog (Application) werden folgende Fehler protokolliert:  Source: BBMonitoringService_ENG Event ID: 3&lt;/p&gt;    Source: BBMonitoringService_DCS Event ID: 3    Source: BBMonitoringService_APP Event ID: 3&lt;/code&gt;  Die Lösung: Im %temp% Verzeichnis gibt es einen Ordner “gen_py”, die Inhalte dieses Ordners müssen gelöscht werden, dann starten die Dienste wieder.  Achtung: Der Ordner “gen_py” muss in allen Temp Verzeichnissen gelöscht werden, also C:\\\\\\\\Windows\\\\\\\\Temp und im User Verzeichnis des BesAdmin Accounts.  Hier ein Link zum Artikel in der RIM KB.  tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht/\\\"},{  \\\"id\\\": \\\"post-forefront-tmg-console-error\\\",  \\\"title\\\": \\\"Forefront TMG Console – Script Error\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"de\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Seit der Installation von Internet Explorer 9 bekomme ich auf meinem Windows 7 Client folgende Fehlermeldungen beim &Ouml;ffnen der Forefront TMG Management Console:Script Error: An Error has occurred in the script on this page.Forefront TMG Error: Refresh failed Error 0x80020003: Member not foundDieses Problem kann man einfach l&ouml;sen, man schnappt sich ein Notepad (Achtung: mit administrativen Rechten) und &ouml;ffnet die Datei &ldquo;TabsHandler.htc&rdquo;. Diese befindet sich standardm&auml;&szlig;ig unter folgendem Pfad: &ldquo;C:\\\\\\\\Program Files\\\\\\\\Microsoft Forefront Threat Management Gateway\\\\\\\\UI_HTMLs\\\\\\\\TabsHandler&rdquo;In dieser Datei gibt es drei Zeilen die mit &ldquo;m_aPages [niPage].m_tdMain.style.paddingTop&rdquo; beginnen. Diese drei Zeilen m&uuml;ssen mit &ldquo;//&rdquo; auskommentiert werden und schon l&auml;uft die Konsole wieder normal. Hier noch ein Beispiel:// m_aPages [niPage].m_tdMain.style.paddingTop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ((m_nBoostUp &lt; 0) ? -m_nBoostUp : 0) ;&nbsp;so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/forefront-tmg-console-error/\\\"},{  \\\"id\\\": \\\"post-remotefx\\\",  \\\"title\\\": \\\"RemoteFX\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Hyper-V\\\"],  \\\"content\\\": \\\"Windows Server 2008 R2 bringt mit dem SP1 ein neues Feature für Remote Desktop mit: RemoteFX. RemoteFX verwendet die Hardware des Servers um die Grafikverarbeitung zu beschleunigen.Für RemoteFX gibt es 2 Verwendungsbereiche:&#160;1) RemoteDesktop Virtualization HostAuf dem Host ist dafür folgendes notwendig:   SLAT-enabled CPU     Zertifizierte Grafikkarte      RemoteFX encoder      Hyper-V INFO: Wenn Live-Migration verwendet wird, müssen alle Server dieselbe Grafikkarte haben.RemoteFX benötigt für die Grafikkarte einen WDDM Treiber, ist dieser nicht verfügbar (z.B. ILO), muss entweder die Grafikkarte im BIOS deaktiviert, oder der RemoteFX CAP-Treiber installiert werden. Bevor aber der RemoteFX CAP Treiber installiert wird, sollte der WDDM Treiber installiert und RemoteFX aktiviert sein. Danach kann der CAP Treiber über folgenden Befehl installiert werden:dism /online /enable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageUm den CAP Treiber zu deinstallieren reicht folgender Befehl: dism /online /disable-feature /featurename:Microsoft-Windows-RemoteFX-EmbeddedVideoCap-Setup-PackageVerwendet der Client mehrere Monitore, so muss folgende Tabelle bezüglich der RAM Benutzung auf der Grafikkarte beachtet werden:&#160;            Maximun resolution        1 monitor        2 monitor        3 monitor        4 monitor                  1024 x 768        75 MB        105 MB        135 MB        165 MB                  1280 x 1024        125 MB        175 MB        225 MB        275 MB                  1600 x 1200        184 MB        257 MB        330 MB        N/A                  1920 x 1200        220 MB        308 MB        N/A        N/A                  &nbsp;        &nbsp;        &nbsp;        &nbsp;        &nbsp;        &#160;2) Remote Desktop Session HostDamit RemoteFX für Remote Desktop Session läuft, muss der Prozessor zwingend das Feature SSE2 unterstützen. Zusätzlich kann noch ein sog. „Remote FX Hardware Decoder“ eingebaut werden um die Leistung zu erhöhen.&#160;Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/remotefx/\\\"},{  \\\"id\\\": \\\"post-softap-windows-7-wireless-access-point\\\",  \\\"title\\\": \\\"SoftAP - Windows 7 Wireless Access Point\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"de\\\"],  \\\"content\\\": \\\"Hinter dem Namen SoftAp oder Virtual WIFI verbirgt sich ein tolles Feature von Windows 7, es erm&ouml;glicht durch das Erstellen eines virtuellen Netzwerkadapters das Betreiben eines Access Point mit Windows 7. Damit man einen virtuellen Wlan Adapter erstellen kann muss nat&uuml;rlich ein Wlan Adapter installiert und aktiviert sein.Man erstellt den Virtual WIFI Adapter mit Hilfe des Command-Line Tools \\\\\\\"netsh\\\\\\\", dazu ben&ouml;tigt man eine Administrative Eingabeaufforderung in die man dann folgenden Befehl eintippt:netsh wlan set hostednetwork mode=allow ssid=* key=* keyUsage=persistentAn der Stelle der \\\\\\\"*\\\\\\\" kommt die SSID (ohne Leerzeichen) und der WPA2 Key, wurde dieser Befehl abgesetzt wird der virtuelle Adapter erstellt.&nbsp;Jetzt muss das Hostednetwork gestartet werden, damit sich Clients verbinden k&ouml;nnen:netsh wlan start hostednetworkInternet Connection SharingWenn man auf dem Windows 7 Rechner eine Internetverbindung hat kann man diese dem Hostednetwork zur Verf&uuml;gung stellen. Dazu &ouml;ffnet man die Eigenschaften des Adapters der die Internetverbindung herstellt und w&auml;hlt \\\\\\\"Freigabe\\\\\\\". Hier muss man die Checkbox bei \\\\\\\"Anderen Benutzern im Netzwerk gestatten....\\\\\\\" setzen und darunter den Virtual WIFI Adapter ausw&auml;hlen.Bei einem Neustart des Rechners startet das Wlan nicht automatisch mit. Ohne neustart kann das Hostednetwork mit folgendem Befehl gestoppt werden:netsh wlan stop hostednetworkUm den Status des Hostednetwork zu sehen verwendet man folgenden Befehl:netsh wlan show hostednetworkDaniel Melanchthon beschreibt in diesem Artikel weitere Details zu Virtual WIFI.&nbsp;UpdateDas Ganze funktioniert nat&uuml;rlich auch unter Windows 8 :)Gut zu wissen: Das \\\\\\\"hostednetwork\\\\\\\" unterst&uuml;tzt leider&nbsp;nur das v&ouml;llig &uuml;berf&uuml;llte 2,4 GHz Band: \\\\\\\"Radio types supported (Direct Sequence Spread Spectrum [DSSS], 802.11g, 802.11b)\\\\\\\"Hier der Link zur entsprechenden TechNet Seite: http://technet.microsoft.com/en-us/library/cc755301(v=WS.10).aspx&nbsp;Tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/softap-windows-7-wireless-access-point/\\\"},{  \\\"id\\\": \\\"post-appv-streaming-server\\\",  \\\"title\\\": \\\"AppV Streaming Server\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"AppV\\\",\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Verwendet man AppV für Applikationsvirtualisierung mit Clients in Standorten mit langsamer Anbindung (WAN) kann ein Updates eines Paketes ziemlich lange dauern, außerdem wird es von jedem Client einzeln heruntergeladen.Der AppV Streaming Server könnte die Lösung für dieses Problem sein. Mit dem Desktop Optimization Pack kommen neben den Installationsdateien für den AppV Management (Full) Server auch die Dateien für den Streaming Server. Die Installation gestaltet sich einfach, man wählt das Streaming Protokoll, sollte natürlich jenes sein das der Management Server verwendet. Außerdem muss man den Pfad für den “Content” Ordner angeben, diesen muss man manuell anlegen und freigeben (\\\\\\\\\\\\\\\\servername\\\\\\\\Content, Leseberechtigungen für Benutzer reichen aus).Die Installation ist abgeschlossen und der Dienst “Application Virtualization Streaming Server” (AppVirtServer) sollte gestartet sein.Im Application Event Log wird bei jedem Start des AppVirtServer Dienstes folgender Fehler Protokolliert:Error:&lt;/p&gt;    Source: Application Virtualization Server    Event ID: 44937    Empty package map for package content root: [D:\\\\\\\\Content\\\\\\\\].&lt;/code&gt;  Dieser Fehler wird für jedes Packet das auf dem AppV Management Server verfügbar ist einmal Protokolliert, und zwar so lange bis man die Daten aus dem Content Share des AppV Management Servers auf den Streaming Server kopiert. Es reicht aus die .sft Files zu kopieren, wichtig ist dabei dass eventuelle Unterordner auch angelegt werden.  Sind die Daten kopiert (d.h. beide Content Shares gleich) kann ist der Streaming Server bereit.  &#160;  Die Clients im Remote Netzwerk wissen allerdings nichts von diesem Server, d.h. Updates werden immer noch vom Management Server heruntergeladen. Über folgenden Registry Key gibt man den Clients die Information, in diesem Fall verwendet der Streaming Server RTSP:  HKEY_LOCAL_MACHINE\\\\\\\\SOFTWARE\\\\\\\\Wow6432Node\\\\\\\\Microsoft\\\\\\\\SoftGrid\\\\\\\\4.5\\\\\\\\Client\\\\\\\\Configuration&lt;/p&gt;    REG_SZ ApplicationSourceRoot    rtsp://servername:554/&lt;/code&gt;  Ab jetzt ist es nur mehr Wichtig bei Paket Updates daran zu denken alle Content Shares zu aktualisieren.   &#160;  tomt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/appv-streaming-server/\\\"},{  \\\"id\\\": \\\"post-create-vmware-esxi-flash-drive\\\",  \\\"title\\\": \\\"Create VMWare ESXi Flash Drive\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"VMware\\\"],  \\\"content\\\": \\\"Der Hypervisor von VMWare kann auf einem USB Stick installiert werden, so kann man die vorhandenen Festplatten des Servers als Datastore f&uuml;r Virtuelle Maschinen verwenden oder Server ohne interne Festplatten als ESXi Hosts verwenden.Dazu braucht man:einen USB Stick (min. 2GB)VMWare Workstation (oder Player)VMWare ESXi Installationsimage (VMWare ESXi)Dann kanns losgehen, mit VMWare Workstation (oder Player) wird eine neue Virtuelle Maschine erstellt.Als Pfad f&uuml;r das Installationsimage wird das Image von ESXi 4.1 angegeben.Als Gastbetriebssystem wird VMware ESX ausgew&auml;hlt.Ein Ordner f&uuml;r die Konfigurationsdateien und die virtuelle Festplatte muss angegeben werden, hier kann einfach ein Ordner auf der Lokalen Festplatte verwende werden.Die Gr&ouml;&szlig;e der virtuellen Festplatte kann man so akzeptieren, diese wird nicht verwendet.Die virtuelle Maschine ist eigentlich erstellt, allerdings muss noch ein USB Controller hinzugef&uuml;gt werden, dazu auf &ldquo;Customize Hardware&rdquo; klickenund den USB Controller hinzuf&uuml;gen.Jetzt kann man die virtuelle Maschine starten, und auch gleich &uuml;ber &ldquo;VM&rdquo; und &ldquo;Removable Devices&rdquo; den USB Stick verbinden (muss nat&uuml;rlich am PC angeschlossen sein&hellip;)Bei der Installation des ESXi Servers wird der USB Stick als Ziel angegeben, ACHTUNG: Alle Daten auf dem USB Stick werden gel&ouml;scht, der Stick wird neu formatiert.Sobald die Installation abgeschlossen ist, kann man die VM herunterfahren, auf dem USB Stick ist jetzt VMWare ESXi installiert. Von diesem Stick kann man jeden (unterst&uuml;tzten) Server booten und als ESXi Host verwenden.&nbsp;Achtung: bei der Installation auf USB wird keine Scratch Partition erstellt, Infos dazu hier: /post/ESXi&ndash;Persistent-Scratch-Location.aspx&nbsp;so long,   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/create-vmware-esxi-flash-drive/\\\"},{  \\\"id\\\": \\\"post-sharepoint-dienstkonto-wechseln\\\",  \\\"title\\\": \\\"SharePoint–Dienstkonto wechseln, Probleme mit Kerberos\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Wird das Dienstkonto f&uuml;r die SharePoint-Webseite vom Netzwerk-Konto auf ein Dom&auml;nen-Konto ge&auml;ndert, und Kerberos in Kombination mit Windows-Authentifizierung verwendet wird, k&ouml;nnen sich die Clients nicht mehr an der Webseite authentifizieren.Der Dialog zum Eingeben der Credentials wird immer wieder angezeigt, die Authentifizierung kann jedoch nicht richtig verarbeitet werden.Um das Problem zu beheben, muss im IIS die Kernelmodus-Authentifizierung aktiviert werden, die standardm&auml;&szlig;ig nach der Installation von SharePoint deaktiviert ist:Nun k&ouml;nnen sich die Clients wieder ganz normal an der SharePoint-Webseite authentifizieren.&nbsp;Gr&uuml;&szlig;e   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-dienstkonto-wechseln/\\\"},{  \\\"id\\\": \\\"post-outlook-gesendete-objekte-shared-mailbox\\\",  \\\"title\\\": \\\"Outlook–gesendete Objekte–Shared Mailbox\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Client\\\"],  \\\"content\\\": \\\"Wie in diesem Post beschrieben kann man mit Exchange 2010 einfach Shared Mailboxen verbinden. Wenn ein User Send-As Berechtigungen auf eine solche Mailbox hat und ein Mail schickt, wird das Mail im Ordner “Sent Items” des jeweiligen Users gespeichert. Damit die gesendete Nachricht in den Sent Items der shared Mailbox gespeichert wird muss man folgenden Eintrag in der Registry erstellen (auf den Clients).Unter dem Schlüssel: “HKEY_CURRENT_USER\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Office\\\\\\\\14.0\\\\\\\\Outlook\\\\\\\\Preferences” wird ein REG_DWORD mit dem Namen “DelegateSentItemsStyle” und dem Wert “1” erstellt.In einer Active Directory Umgebung bieten sich natürlich die Group Policy Preferences dafür an.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/outlook-gesendete-objekte-shared-mailbox/\\\"},{  \\\"id\\\": \\\"post-tmge28093fehler-beim-ausfuhren-von-abfragen-im-log\\\",  \\\"title\\\": \\\"TMG–Fehler beim Ausführen von Abfragen im Log\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Security\\\",\\\"SQL\\\"],  \\\"content\\\": \\\"Letztens hatte ich ein seltsames Problem auf meinen TMG 2010 Server. Ich logge auf die lokale SQL Express Datenbank und konnte keine Abfragen im Log aus der TMG Konsole mehr machen. Nach dem Start einer Abfrage erscheint der folgende Fehler:&nbsp;Daraufhin habe ich den SQL Server &uuml;berpr&uuml;ft, konnte aber keine Probleme feststellen. Im Management Studio lie&szlig;en sich die Logs durch SELECT Anweisung abfragen.Das Problem liegt an der Formatierung des Datums und taucht durch das Service Pack 1 (KB2288910) auf TMG&rsquo;s in deutscher Sprache auf.Das Problem l&auml;sst sich aber relativ einfach beheben: Man verbindet sich mit dem Management Studio auf die SQL Instanz und &auml;ndert die Standard-Sprache des Benutzerkontos &ldquo;NT Authority\\\\\\\\NetworkService&rdquo; auf Schwedisch um. Nachdem man nun die SQL Dienste neu startet kann man problemlos wieder das Abfragen im LOG starten.Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/tmge28093fehler-beim-ausfuhren-von-abfragen-im-log/\\\"},{  \\\"id\\\": \\\"post-zertifizierungsstelle-verschiebene28093neuer-servername\\\",  \\\"title\\\": \\\"Zertifizierungsstelle verschieben–neuer Servername\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"In diesem Beitrag habe ich beschrieben wie man eine Zertifizierungstele sichert, den alten Server abbaut und die CA auf einem neuen Server mit dem selben Namen wiederherstellt. Will man allerdings die CA umziehen und den aktuellen Server nicht abbauen sind ein paar zusätzliche Schritte nötig. Wichtig ist hier zu sagen dass man zwar den Servernamen ändern kann, allerdings nicht den Namen der Zertifizierungsstelle!Tipp: Auch wenn die Microsoft Dokumentation das nicht wirklich bestätigt funktioniert eine Migration von 32Bit auf 64Bit. Also Backup auf x86 Restore auf x64 ist Möglich.Backup   Auf jeden Fall eine komplette Sicherung des Servers erstellen!     CA Datenbank und Key sichern     CA Konfiguration (Registry) sichern             Mit dem Registrierungseditor zu folgendem Schlüssel navigieren, rechtsklick und “Export”         HKEY_LOCAL_MACHINE\\\\\\\\SYSTEM\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\CertSvc\\\\\\\\Configuration         reg export HKEY_LOCAL_MACHINE\\\\\\\\SYSTEM\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\CertSvc\\\\\\\\Configuration RegBackup.reg             CA Templates notieren oder mit certutil.exe –catemplates &gt; templates.txt exportieren     CA Deinstallieren             Im Server Manager mit Remove Role die Active Directory Certificate Services deinstallieren         Achtung: wie bereits im alten Beitrag erwähnt bleiben gewisse Daten auf dem Server          Restore   alle Dateien (und Ordner) die von der Sicherung erstellt wurden auf den neuen Server kopieren             Achtung: caname.p12 enthält den private Key der CA!             Private Key importieren             certutil –importpfx caname.p12             CA Dienste installieren             Server Manager                     Im Servermanager mit Add Roles die Active Directory Certificate Services hinzufügen             Bei der Installation den richtigen CA Typ auswählen und das Richtige Zertifikat mit vorhandenem private Key wählen                         setupca.vbs                     auf einem Core Server wird die CA am besten mit diesem Script installiert             Bei der Installation muss der Wert im “Key Container” des installierten private Key angegeben werden, diesen kann man so herausfinden: certutil.exe -store my | find &quot;Key Container&quot;             setupca.vbs hat verschiedene Parameter um den entsprechenden CA Typ auszuwählen, folgendes Beispiel installiert eine Subordinate Enterprise CA: cscript setupca.vbs /IF /RC /SN WertKeyContainer             hier die Wichtigsten Parameter              /IE – Enterprise Root CA Service               /IS – Standalone Root CA Service               /IF – Enterprise Subordinate CA Service               /IT – Standalone Subordinate CA Service               /RC – Reuse Certificate and Key               /SN – CA Name                             CA Datenbank wiederherstellen             dazu muss der Dienst certsvc gestoppt werden, net stop certsvc         Im Server Manager mit rechtsklick, Restore CA kann die Datenbank wiederhergestellt werden         mit certutil –f –restoreDB PfadZumDataBaseOrdner kann man dasselbe erreichen             Konfiguration wiederherstellen: die Sicherung der Registry muss wieder importiert werden, dabei gilt es allerdings einiges zu beachten:             Backup der Registry auf dem neuen Server vor dem Import!         CAServerName anpassen, muss den neuen Servernamen enthalten         Die Pfade für folgende Werte kontrollieren, wenn sie auf dem alten Server nicht geändert wurden sollten kein Anpassungen nötig sein:                     DBDirectory, DBLogDirectory, DBSystemDirectory, DBTempDirectory                         Den Inhalt für folgende Werte zu kontrollieren um sicherzustellen dass CDP und AIA Informationen richtig veröffentlicht werden                     CACertPublicationURLs. CRLPublicationURLs                         Den Wert von CACertHash kontrollieren, wenn das CA Zertifikat erneuert wurde beinhaltet dieser Wert mehrere Thumbprints der CA Zertifikate. Wenn ein Thumbprint importiert wird und das zugehörige Zertifikat nicht installiert ist startet der Zertifikatsdienst (certsvc) nicht und protokollieret folgenden Fehler im Application Log:                     Active Directory Certificate Services did not start: Could not load or verify the current CA certificate.&#160; CAName The system cannot find the file specified. 0x80070002 (WIN32: 2).                             Berechtigungen auf CDP und AIA Container             Das Computerkonto des neuen Servers muss FullControl für die AIA und CDP Objekte des alten Server haben um CRLs und neue Root Zertifikate veröffentlichen zu können.         Berechtigungen werden mit ADSI Edit gesetzt, die Objekte finden sich unter CN=Public Key Services,CN=Services,CN=Configuration,DC=domain,DC=local          CheckUm zu überprüfen ob alles läuft kann man ein Zertifikat anfordern. Funktioniert das ausstellen der Zertifikate sollte man noch überprüfen ob der Zugriff auf die Sperrlisten funktioniert. Dazu Exportiert man das Zertifikat (in eine .cer Datei) und führt “certutil –url datei.cer” aus.&#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/zertifizierungsstelle-verschiebene28093neuer-servername/\\\"},{  \\\"id\\\": \\\"post-signing-powershell-scripts\\\",  \\\"title\\\": \\\"Signing PowerShell Scripts\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"PowerShell\\\"],  \\\"content\\\": \\\"Damit ein PowerShell Script signiert werden kann muss man im besitz eines Zertifikates mit dem “Intended Purpose” Code Signing sein. So ein Zertifikat kann man sich selbst ausstellen, oder von einer Enterprise CA anfordern. Natürlich kann man es auch kaufen…Wie man ein SelfSigned Zertifikat erstellt ist ausführlich in der Hilfe beschrieben, einfach “Get-Help about_signing” ausführen.Um ein Code Signing Zertifikat von Enterprise Zertifizierungsstelle anzufordern muss man “Enroll” Berechtigungen auf die Zertifikatsvorlage haben, oder man kopiert die Vorlage und erstellt eine eigene, z.B. mit längerer Gültigkeit.Hat man also ein Zertifikat erhalten findet man es mit folgendem cmdlet:Get-ChildItem cert:\\\\\\\\CurrentUser\\\\\\\\My –codesigningMit Set-AuthenticodeSignature wird ein Script signiert, dieses cmdlet benötigt zwei Parameter, das zu Signierende Script und das Zertifikat.Im Folgenden Beispiel signiere ich die Datei C:\\\\\\\\scripts\\\\\\\\my-test.ps1 mit dem einzigen Zertifikat das in meinem Zertifikatsstore ist.$cert = Get-ChildItem cert:\\\\\\\\CurrentUser\\\\\\\\My –codesigning&lt;/p&gt;    Set-AuthenticodeSignature C:\\\\\\\\scripts\\\\\\\\my-test.ps1 $cert&lt;/code&gt;  Erscheint folgender Fehler, hat man das Script mit PowerShell ISE erstellt. Diese verwendet eine Codierung mit der Set-AuthenticodeSignature nicht zurechtkommt. Man erhält den vielsagenden Fehler: UnknonError.    Um das Script trotzdem zu signieren erstellt man ein einfach eine neue Textdatei und speichert das Scripts mit notepad ab.    Und schon ist das Script signiert.  Wenn man das Script jetzt auf einem Host ausführt auf dem die ExecutionPolicy auf AllSigned gesetzt ist wird man informiert dass der Herausgeber unbekannt ist. Das Zertifikat welches zum Signieren verwendet wurde muss im TrustedPublisher Zertifikatstore sein.    Um das Zertifikat zu exportieren kann man die MMC Certficates verwenden, das Code Signing Zertifikat auswählen und auf Export klicken. Den Privat Key kann man nicht exportieren, dieser wird auch nicht benötigt um die Signatur zu bestätigen.  Die .cer Datei die man nach dem Export erhält kann man mit Gruppenrichtlinien auf alle Clients/Server verteilen oder manuell in den Store für Vertrauenswürdige Herausgeber importieren.  Gruppenrichtlinie:    Nach dem nächsten GP Refresh läuft das Script ohne Fehlermeldung.      Wird ein Script verändert nachdem es signiert wurde, wird die Ausführung verhindert. Folgende Fehlermeldung erscheint.    &#160;  tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/signing-powershell-scripts/\\\"},{  \\\"id\\\": \\\"post-powershell-scripts\\\",  \\\"title\\\": \\\"PowerShell Scripts\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Achtung: Diese Scripts sind Beispiele, sie sind nicht f&uuml;r die Verwendung in Produktivsystemen gedacht! Die Autoren von ntSystems.it k&ouml;nnen keine Haftung f&uuml;r eventuelle Sch&auml;den durch diese Scripts &uuml;bernehmen.&nbsp;Exchange: Set SimpleDisplayName on all Mailboxes where this Attribute is empty; change characters like &ouml; to oe; send E-Mail if script fails   1: Import-Module 'C:\\\\\\\\Users\\\\\\\\daniel nitz\\\\\\\\AppData\\\\\\\\Roaming\\\\\\\\Microsoft\\\\\\\\Exchange\\\\\\\\RemotePowerShell\\\\\\\\ex2k10.domain.local\\\\\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.SimpleDisplayName -eq \\\\\\\"\\\\\\\"}   4: if($Mailboxes -ne $null)   5: {   6:     try {   7:         ForEach ($Mailbox in $Mailboxes)   8:         {   9:             $NameString = $Mailbox.Name  10:             if($NameString -match \\\\\\\"&uuml;\\\\\\\")  11:                 {  12:                 $NameString = ($NameString -replace \\\\\\\"&uuml;\\\\\\\",\\\\\\\"ue\\\\\\\")  13:                 }  14:             if($NameString -match \\\\\\\"&auml;\\\\\\\")  15:                 {  16:                 $NameString = ($NameString -replace \\\\\\\"&auml;\\\\\\\",\\\\\\\"ae\\\\\\\")  17:                 }  18:             if($NameString -match \\\\\\\"&ouml;\\\\\\\")  19:                 {  20:                 $NameString = ($NameString -replace \\\\\\\"&ouml;\\\\\\\",\\\\\\\"oe\\\\\\\")  21:                 }  22:             Set-Mailbox -Identity $Mailbox.Name -SimpleDisplayName ($NameString + \\\\\\\" - COMPANY\\\\\\\")  23:         }  24:     } Catch {  25:         Send-MailMessage -to daniel.nitz@domain.local -Subject \\\\\\\"Exchange Shell Script Error\\\\\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  26:     }                 27: }  28:     &nbsp;Exchange: Set Out of Office Assistent on Mailboxes where the &ldquo;Office&rdquo; property isn&acute;t empty   1: Import-Module 'C:\\\\\\\\Users\\\\\\\\daniel nitz\\\\\\\\AppData\\\\\\\\Roaming\\\\\\\\Microsoft\\\\\\\\Exchange\\\\\\\\RemotePowerShell\\\\\\\\ex2k10.domain.local\\\\\\\\ex2k10.domain.local.psm1'   2:&nbsp;    3: $Mailboxes = get-Mailbox | where {$_.Office -ne \\\\\\\"\\\\\\\"}   4: try {   5:     $OOFTextExternal = ${E:\\\\\\\\OOF-Text\\\\\\\\External-Text.txt}   6:     $OOFTextInternal = ${E:\\\\\\\\OOF-Text\\\\\\\\Internal-Text.txt}   7:        8:     ForEach ($Mailbox in $Mailboxes)   9:     {  10:         Set-MailboxAutoReplyConfiguration -Identity $Mailbox.Name -AutoReplyState scheduled -StartTime \\\\\\\"2011.01.21T07:00\\\\\\\" -EndTime \\\\\\\"2011.01.21T19:00\\\\\\\" -ExternalAudience All -ExternalMessage $OOFTextExternal -InternalMessage $OOFTextInternal     11:     }  12: } Catch { Send-MailMessage -to daniel.nitz@domain.local -Subject \\\\\\\"Exchange Shell Script Error\\\\\\\" -from ex2k10@domain.local -SmtpServer ex2k10.domain.local  13: }\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/powershell-scripts/\\\"},{  \\\"id\\\": \\\"post-tmg-2010-unable-to-authenticate-users\\\",  \\\"title\\\": \\\"TMG 2010 unable to authenticate users after reboot\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Nach dem Upgrade von ISA Server 2006 auf TMG 2010 musste ich eine Reihe von Probleme bez&uuml;glich der Authentifizierung feststellen. Nach jedem Neustart des Servers dauerte es zwischen einer halben und 2 Stunden bis der TMG Clients gegen AD erfolgreich authentifizierte. In der Zwischenzeit wurden die Verbindung aufgrund fehlender Authentifizierung abgelehnt.Auch das EventLog protokollierte folgende Fehler:Im ADAM Log wurde folgender Fehler protokolliert:&nbsp;Mein Problem habe ich dadurch gel&ouml;st, indem ich ein Computer-Zertifikat f&uuml;r den FQDN des TMG von meiner Zertifizierungsstelle angefragt und installiert habe. Anschlie&szlig;end habe ich den Netzwerkdienst Lesen-Berechtigungen f&uuml;r das Verzeichnis C:\\\\\\\\ProgramData\\\\\\\\Microsoft\\\\\\\\Crypto\\\\\\\\RSA\\\\\\\\MachineKeys gegeben (hier werden die Computerzertifikate gespeichert).INFO: Wenn der Request f&uuml;r das Zertifikat fehschl&auml;gt, muss in den Systemregeln der strikte RPC Filter deaktiviert werden:&nbsp;Nachdem diese Schritte abgeschlossen wurden, konnte ich im EventLog sehen wie die SSL-Verbindungen erfolgreich hergestellt wurden:&nbsp;Nach einem Neustart werden Verbindungen nun sofort authentifiziert.Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/tmg-2010-unable-to-authenticate-users/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-change-display-name-for-outgoing-mails\\\",  \\\"title\\\": \\\"Exchange 2010, change Display Name for outgoing Mails\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Mit Exchange Server 2010 ist es sehr einfach den Display Name für ausgehende Mails zu ändern.Zunächst muss das Feature für die Remote-Domänen aktiviert werden. Mit den folgenden Befehl wird das Feature für alle Remote-Domänen aktiviert:Get-RemoteDomain | Set-RemoteDomain –UseSimpleDisplayName $trueIn den Einstellungen der Mailbox&#160; befindet sich die Eigenschaft Simple display name. Hier lässt sich der angepasste Display Name einfügen. ACHTUNG: Befindet sich kein Wert im Feld Simple Display Name nachdem das Feature aktiviert wurde, sendet Exchange die Mail-Adresse.&#160;Alle Mails, die nun die Organisation verlassen, werden mit den angepassten Display Name versendet:&#160;Anbei noch ein Shell-Beispiel um schnell für eine Liste (CSV-Import Datei) von Benutzern den Simple Display Name mit&#160; Name + Firma GmbH zu setzen.Import-CVS &quot;C:\\\\\\\\Import-File.csv&quot; | Foreach {Set-Mailbox -Identity $_.Name -SimpleDisplayName ($_.Name + &quot; - Firma GmbH/Srl&quot;)}           Beispiel für CSV-Import DateiName     Daniel Nitz      Max MustermannGrüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-change-display-name-for-outgoing-mails/\\\"},{  \\\"id\\\": \\\"post-zertifizierung\\\",  \\\"title\\\": \\\"Zertifizierung\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Heute ist ein guter Tag f&uuml;r beide Autoren von ntSystems.it.Nachdem wir &uuml;ber eine halbe Stunde vor dem Prometric Test Centre warten mussten weil es dort Probleme mit den PCs gab konnten wir unsere Examen in Angriff nehmen.Daniel hat erfolgreich das &ldquo;70-432 TS: Microsoft SQL Server 2008, Implementation and Maintenance&rdquo; Examen absolviert und erweitert so seinen MCITP: Enterprise Administrator mit dem&nbsp; MCTS: SQL Server 2008, Implementation and Maintenance.Ich habe mit dem &ldquo;70-663 Pro: Designing and Deploying Messaging Solutions with Microsoft Exchange Server 2010&rdquo; nun den Status MCITP: Enterprise Messaging Administrator 2010 erreicht.In diesem Sinne,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/zertifizierung/\\\"},{  \\\"id\\\": \\\"post-mail-sensitivity-header-exchange-2010-sp1\\\",  \\\"title\\\": \\\"Mail Sensitivity Header Exchange 2010 SP1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Wer Shared Mailboxes mit Exchange 2010 verwendet kann folgendes Verhalten beobachten:· wird eine Mailbox über das AD Attribut msExchDelegateListLink verbunden sehen Benutzer keine als „Privat“ markierten Mails· verbindet ein User die Mailbox über Datei -&gt; Konto hinzufügen sind alle Objekte sichtbar, auch die als „Privat“ markiertenDie Vertraulichkeit einer Nachricht wird mit dem Sensitivity Header geregelt, dieser wird in dem Fall auf “private” gesetzt. Mit Transportregeln in Exchange kann man Message Header löschen oder bearbeiten. In diesem Fall reicht das Löschen des Headers nicht aus, man muss ihn auf “Normal” ändern. Man erstellt also eine neue Transportregel für alle eingehenden Nachrichten welche an die Shared Mailbox gesendet werden. Diese Regel soll der Wert des Headers “Sensitivity” von “private” auf “normal” ändern.Transportregeln kann man an drei verschiedenen Orten pflegen, EMS, EMC und ECP. Natürlich muss man die entsprechenden Berechtigungen besitzen. Exchange Control PanelDas Exchange Control Panel ist über https://meinexchange/ecp erreichbar, dort muss unter Options “My Organization” ausgewählt werden. Dann kann man unter “Mail Control” Regeln mit Hilfe eines Wizards erstellen.Exchange Management ConsoleIn der Management Console sind die Regeln unter “Organization Configuration” – “Hub Transport” und “Transport Rules” zu finden, auch hier kann man Regeln einfach über einen Wizard erstellen.Exchange Management ShellNatürlich kann man Transportregeln auch mit der Managment Shell erstellen. Dazu am Besten im TechNet vorbeischauen.Hier ein Beispiel:New-TransportRule -Name 'Remove Header' -Comments '' -Priority '0' -Enabled $true -SentTo 'shared.mailbox@domain.com' -HeaderMatchesMessageHeader 'Sensitivity' -HeaderMatchesPatterns 'private' -SetHeaderName 'Sensitivity' -SetHeaderValue 'normal'&#160;so long,    tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/mail-sensitivity-header-exchange-2010-sp1/\\\"},{  \\\"id\\\": \\\"post-sharepoint-2010-external-list-bcs-sql\\\",  \\\"title\\\": \\\"Sharepoint 2010, external List, BCS, SQL\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\",\\\"SQL\\\"],  \\\"content\\\": \\\"In diesem Post werde ich die einzelnen Schritte erklären um in Sharepoint eine SQL Tabelle einzubinden. Dazu erforderlich ist:   Sharepoint 2010 Foundation / Server     SQL Server     Sharepoint Designer 2010  Externen Inhaltstyp definierenIn diesem Schritt definieren wir den Inhaltstyp und somit die Verbindung zu SQL Server. Dies kann alles mit dem Sharepoint Designer erledigt werden. Unter Externe Inhaltstypen definieren wir die Verbindung.Nun kann ein Name und die Verbindung zu SQL Server angegeben werden, indem wir auf “Klicken Sie hier, um externe Datenquellen zu ermitteln und Vorgänge zu definieren” klickenWir erstellen eine neue Verbindung vom Typ SQL Server und geben die Datenbankinformationen anNun können wir die Tabellen auswählen, die für diesen Inhaltstyp zur Verfügung stehen. Dabei klicken wir auf die Tabelle und können verschiedene Vorgänge definieren:   Element lesen     Liste lesen     Erstellen     Aktualisieren     Löschen  Nun ist der Inhaltstyp definiert und steht in Sharepoint zur Verfügung.&#160;BCS Berechtigungen definierenStandardmäßig haben wir keine Berechtigung um auf den Inhaltstyp zuzugreifen. Dies müssen wir erst in den BCS Einstellungen definieren. Am schnellsten kann dies über die Zentraladministration erledigt werden.Zentraladministration / Anwendungsverwaltung / Dienstanwendungen verwaltenNun wählen wir den Business Data Connectivity-Dienst und definieren die Berechtigungen für den Inhaltstyp.Info: Mindestens 1 Account muss das Buntzerrecht “Berechtigungen festlegen” haben.Jetzt können wir die externe Liste erstellen und hätten theoretisch Zugriff darauf, wäre da nicht das Double-Hop Problem. Beim Zugriff erhalten wir folgende Fehlermeldung:&#160;Double-Hop Problem behebenUm das Double-Hop Problem zu lösen gehen wir folgendermaßen vor:1. Zunächst erstellen wir einen neuen SPN (Service Principal Name) für unseren SQL Server:setspn –A MSSQLsvc/NETBIOSNAME.DOMAIN:1433 DOMAIN\\\\\\\\SQL-Service-AccountDer SQL Service Account kann am schnellsten unter den Diensten ermittelt werden.2. Danach müssen wir in ActiveDirectory die Delegierungen für folgende Objekte aktivieren   Sharepoint Computer-Objekt     SQL-Service Account  Ich empfehle den Sharepoint sowie den SQL Server neu zu starten um sicherzugehen, dass die Konfiguration aktiv ist.Jetzt haben wir Zugriff auf die SQL Tabelle über Sharepoint.&#160;Nähere Informationen zur Double-Hop Problematik unter folgenden Link&#160;Grüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-2010-external-list-bcs-sql/\\\"},{  \\\"id\\\": \\\"post-sharepoint-foundation-2010-insufficient-sql-permissions\\\",  \\\"title\\\": \\\"Sharepoint Foundation 2010, insufficient SQL permissions\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\",\\\"SQL\\\"],  \\\"content\\\": \\\"Wenn man Sharepoint Foundation 2010 mit den integrierten SQL Server 2008 Express installiert, hat man recht wenig Möglichkeiten Eigenschaften für den SQL Server zu definieren (Benutzerkonten, Logs, Backup).Wenn man nun über das Management Studio eine Verbindung mit SQL Server herstellen möchte, kann es vorkommen, dass man selbst mit dem Farm-Administratorkonto keine Änderungen an den entsprechenden Datenbanken vornehmen kann. Ein Blick auf die verbunden Gruppen des Farm-Administratorkontos verrät, dass sich das Benutzerkonto nur in der Gruppe public befindet und somit keine Einstellungen ändern darf.Zudem ist kein Benutzerkonto ersichtlich mit dem man sich anmelden könnte um das Farm-Administratorkonto den entsprechen Gruppen zuzuweisen. Mit dem Benutzer SA kann man sich ebenfalls nicht anmelden, da der “SQL Server- und Windows-Authentifizerungsmodus” nicht aktiviert ist.Der Grund dafür liegt hier: Wenn man Sharepoint Foundation 2010 über den Rechtsklick auf das Setup-File und “Als Administrator ausführen” installiert, wird das Produkt über das lokale Administratorkonto mit logischerweise den entsprechenden Administratorrechten installiert. Das wäre eigentlich auch kein Problem, wäre nicht die folgende Änderung ab SQL Server 2008 fest implementiert:In den Versionen vor SQL 2008 wurde der Gruppe lokale Administratoren (die enthält wiederum den Domain-Admin und geg. andere Benutzer) das SQL Benutzerrecht sysadmin zugewiesen. Folglich konnte jeder Admin,die Datenbanken verwalten. Ab SQL Server 2008 erhält diese Gruppe nicht mehr das sysadmin-Recht. Bei der manuellen Installation von SQL wird man danach gefragt welche Benutzer das sysadmin-Recht erhalten sollen. Als die Installation mit der Option “Als Administrator ausführen” durchgeführt wurde, hat der lokale Administrator die sysadmin-Rechte erhalten.Lösung: Wir erhalten mit dem Farm-Administrator Konto keine Ändern-Rechte in SQL, bis wir uns mit dem lokalen Administrator anmelden, Management Studio öffnen und den Benutzerkonten die entsprechenden Rechte zuweisen.PS: Wenn die Datenbank in den Sinlge User Mode geschalten wird, erhält die Gruppe lokale Administratoren (folglich auch Domain-Admins) die sysadmin-Rechte.Grüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-foundation-2010-insufficient-sql-permissions/\\\"},{  \\\"id\\\": \\\"post-migration-isa-server-2k4-2k6-zu-tmg-wpad\\\",  \\\"title\\\": \\\"Migration ISA Server 2k4, 2k6 zu TMG, WPAD\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"de\\\",\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Wenn der ISA Server zu TMG oder einem anderen physischen Server migriert wird und sich dadurch der Servername &auml;ndert, funktioniert unter Umst&auml;nden die automatische Browserkonfiguration &uuml;ber WPAD bei DHCP Clients nicht mehr.WPADDas Web Proxy Autodiscovery Protocol (WPAD) ist ein Protokoll, mit dem Web-Clients automatisiert zu verwendende Web-Proxies innerhalb eines Computernetzwerkes finden k&ouml;nnen, indem eine Proxy autoconfiguration (PAC)-Datei unter einer erratbaren URL gespeichert wird, beispielsweise http://wpad.example.com/wpad.datWPAD wird in den DHCP Einstellungen sowie in DNS konfiguriert um DHCP Clients und jene Ger&auml;te mit den automatischen Einstellungen zu versorgen, die eine statische IP Adresse besitzen.Das Problem nach Migrationen / Serverumzug des ISA / TMG Servers bei DHCP Clients erkl&auml;rt sich so:Am DHCP Server wird eine neue Option (252) konfiguriert, die den Pfad zur WPAD.dat Datei bereitstellt. Sobald ein neuer DHCP Client sich vom DHCP Server eine IP Adresse holt, bekommt er auch eine Lease-Zeit zugewiesen, wie lange er die Adresse verwenden darf. Die Lease wird standardm&auml;&szlig;ig nach der H&auml;lfte der Lease-Zeit verl&auml;ngert. Solange sich der Client in dieser Lease befindet und die IP Adresse dem DHCP Server anbietet, wird die WPAD Datei nicht aktualisiert.&Auml;ndert sich jetzt der Servername des ISA / TMG Servers und ist in der Option 252 vom DHCP Server der jeweilige Servername eingetragen, so erhalten die DHCP Clients nicht die neue Konfiguration. Man m&uuml;sste bei jedem Client, der sich in einer Lease befindet die Befehle ipconfig /release und ipconfig /renew ausf&uuml;hren um einen manuellen Refresh durchzuf&uuml;hren.Es gibt mehrere Methoden das Problem zu umgehen:Methode 1 &ndash; Option 252 von Anfang an mit dem CNAME WPAD konfigurierenWenn man in den DHCP Einstellungen nicht den FQDN des Servers verwendet, sondern den CNAME WPAD (so wie man es f&uuml;r DNS konfigurieren muss), so wird der CNAME WPAD immer auf den jeweiligen aktuellen Server zeigen. ACHTUNG: Dies muss nat&uuml;rlich von Anfang an so erfolgen!!Methode 2 &ndash; Clients daran hindern die WPAD Option von DHCP zu zeihen.Durch hinzuf&uuml;gen des Registry Keys: AutoProxyDetectType mit dem Wert 2 unter HKEY_CURRENT_USER\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\CurrentVersion\\\\\\\\Internet Settingswerden die Clients angewiesen das WPAD File &uuml;ber DNS anzufragen.Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migration-isa-server-2k4-2k6-zu-tmg-wpad/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-pfad-einer-mailboxdatenbank-andern\\\",  \\\"title\\\": \\\"Exchange 2010 Pfad einer Mailboxdatenbank ändern\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Der Pfad zu einer Exchange 2010 Mailboxdatenbank kann geändert werden, die Datenbank muss dazu allerding “dismounted” also offline sein. Das heißt die Benutzer deren Mailbox sich in der betreffenden Datenbank befinden habe für die Zeit der Änderung keinen Zugriff auf ihre Mailbox.Ich werde im Beispiel zwischen einer einzelnen Datenbank und einer Datenbank in einer DAG mit mehreren Kopien unterscheiden. Einzelne DatenbankDer Datenbankpfad kann mit der EMC sowie mit der EMS verschoben werden.Exchange Management Console   Rechtsklick auf Datenbank, Dismount     Wenn die Datenbank offline ist, wieder Rechtsklick und Move Databse Path auswählen.     Exchange Management Shell   Datenbank offline nehmen mit      Dismount-Database DB01     Pfad ändern      Move-DatabaseFilePath DB01 –EdbFilePath M:\\\\\\\\db01\\\\\\\\db01.edb –LogFolderPath L:\\\\\\\\     Datenbank wieder online nehmen      Mount-Database DB01  Datenbank in DAGAchtung:       Wenn Circular Logging für die Datenbank aktiviert ist muss das vor der Änderung deaktiviert werden!      Einstellungen wie ReplayLagTime und TruncationLagTime notieren, durch das entfernen und wieder erstellen der Datenbankkopien gehen diese Einstellungen verloren!   Alle Datenbankkopien entfernen, d.h. Datenbank wird nur auf einem Server belassen, auf diesem wird der Pfad geändert      Remove-MailboxDatabaseCopy     Datenbank offline nehmen (einzige verbleibende Kopie)      Dismount-Database     Datenbankpfad verschieben      Move-DatabasePath –EdbFilePath –LogFolderPath     Auf allen Servern die eine Kopie der Datenbank enthalten sollen muss der neue Pfad existieren, durch kopieren der alten Files an den neuen Pfad kann man zeit und Replikationstraffic sparen, die Datenbank muss so nicht neu geseedet werden     Datenbank wieder online nehmen      Mount-Database     Datenbankkopien wieder erstellen      Add-MailboxDatabaseCopy     Index und Search Dienste neu starten      net stop msftesql-Exchange        net start MSExchangeSearch     Replikation überprüfen      Test-ReplicationHealth        Get-MailboxDatabaseCopyStatus  &#160;Fehler beim entfernen/hinzufügen von KopienBeim entfernen einer Mailboxdatenbankkopie kann es zu einem Fehler mit folgender Meldung kommen: Error:      Registry key has subkeys and recursive removes are not supported by this method.&lt;/p&gt;    Warning:      An unexpected error has occurred and a Watson dump is being generated: Registry key has subkeys and recursive removes are not supported by this method.&lt;/code&gt;  Obwohl der Fehler auftritt wird die Datenbankkopie gelöscht. Allerdings bekommt man beim wiedererstellen der Datenbankkopie den selben Fehler und die Kopie wird nicht erstellt. Es hilft folgender Workaround.     GUID der betreffenden Datenbank herausfinden     Get-MailboxDatabase db01 | fl name,guid     Auf dem Server, auf dem die Datenbankkopie erstellt werden soll muss folgender Registry Key gelöscht werden     HKEY_LOCAL_MACHINE\\\\\\\\SOFTWARE\\\\\\\\Microsoft\\\\\\\\ExchangeServer\\\\\\\\v14\\\\\\\\Replay\\\\\\\\State\\\\\\\\{GUID}\\\\\\\\DumpsterInfo    Jetzt wird das Add-MailboxDatabaseCopy cmdlet erneut ausgeführt und die Kopie wird erstellt.  &#160;  tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-pfad-einer-mailboxdatenbank-andern/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben\\\",  \\\"title\\\": \\\"Exchange 2010 SP1 Online Archive in eigene Datenbank verschieben\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Mit Exchange 2010 wurden Online Archive eingeführt, mit SP1 hat man die Möglichkeit Archive in einer eigenen Datenbank zu verwalten. Die Vorteile liegen auf der Hand, man kann Archivdaten so auf billigeren, langsamen Storge legen, kann verschiedene Backup/Restore SLAs für Produktiv- und Archivdaten anbieten usw…Wer Online Archive bereits mit Exchange 2010 RTM verwendet hat und diese jetzt auf eine andere Datenbank schieben muss kann wie folgt vorgehen.EMCIn der EMC wurden mit SP1 die Wizards für einen neuen Move Request angepasst, dort kann man das Archiv auswählen und nur dieses verschieben.EMSIn der EMS gibt es neue Parameter für das cmdlet New-MoveRequest, hier ein Beispiel in dem das Archiv des Benutzers test.user in die Datenbank adb01 verschoben wird.new-MoveRequest test.user –ArchiveOnly –ArchiveTargetDatabase adb01tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-zertifikat-anfordern\\\",  \\\"title\\\": \\\"Exchange 2010 Zertifikat anfordern\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Um OWA, Active Sync usw. betreiben zu können benötigt Exchange ein entsprechendes Zertifikat. Seit Exchange 2010 hat Microsoft hierfür einen komfortablen Wizard zur Verfügung gestellt.Der Wizard befindet sich unter der Serverkonfiguration und wird über den Menüpunkt “New Exchange Certificate” aufgerufen.Sobald der Wizard startet, muss zunächst ein Namen vergeben werden. Auf der nächsten Seite kann das Zertifikat noch für alle Subdomains freigegeben werden.Nun können die Einstellungen gesetzt werden, wie der Certificate-Request erstellt werden soll. Als Beispiel habe ich hier einige Parameter aufgelistet:OWAActiveSyncOutlook Anywhere und AutodiscoverAls Ergebnis werden dann die Domains angezeigt, die im Zertifikat registriert werdenNachdem die Informationen zu Organisation und Standort ausgefüllt wurde, kann der Certficate-Request abgespeichert und bei der CA eingereicht werden. Bevor die CA das Zertifikat ausstellen kann, muss die CA noch für die Registrierung mehrere Subject Names aktiviert werden.Nachdem die CA das Zertifikat ausgestellt hat, muss der Request noch abgeschlossen werden. Hier klickt man rechts auf das Zertifikat in der EMC und wählt die Option “Complete Pending Request”.Sobald das Zertifikat installiert ist, muss es noch mit den jeweiligen Diensten verbunden werden. Hier ist uns wieder ein Wizard behilflich. Rechtslick auf das Zertifikat und “Assign Services to Certificate”Nun kann man sämtliche Services auswählen, für die das Zertifikat zuständig ist.Mit Assign wird das Zertifikat dann hinzugefügt.Grüße   dnlive vom ntSystems techDAY :)\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-zertifikat-anfordern/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-san-zertifikate28093server-2008-pki\\\",  \\\"title\\\": \\\"Exchange 2010 SAN Zertifikat–Server 2008 PKI\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Zertifikate f&uuml;r den Exchange 2010 Client Zugriff beinhalteten mehrere Subject Names. Standardm&auml;&szlig;ig werden sogenannte SAN Zertifikate von Server 2008 Certificate Authorities nicht unterst&uuml;tzt.Damit die CA ein SAN Zertifikat ausstellen kann muss folgender Befehl von einer Eingabeaufforderung mit administrativen Rechten ausgef&uuml;hrt werden:certutil &ndash;setreg policy\\\\\\\\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2Anschlie&szlig;end m&uuml;ssen die CA Dienste neu gestartet werden. Am besten mit \\\\\\\"net stop certsvc &amp;&amp; net start certsvc&rdquo;.Will man jetzt einen Certificate Request &uuml;ber die MMC einreichen erscheint folgender Fehler:&ldquo;The request contains no Certificate template information. 0x80094801 (-2146875391) Denied by Policy Module 0x80094801, the request does not contain a Certificate template extension or the Certificate Template request attribute.&rdquo;Man muss den Request &uuml;ber die Certificate Web Services einreichen, standardm&auml;&szlig;ig l&auml;uft die auf der CA unter /certsrv, in unserem Fall also: http://dc01.ntsystems.local/certsrv. Dort w&auml;hlt man Request a Certificate, advanced certificate request und submit a certificate using a (&hellip;) file. In das Textfeld wird der gesamte Inhalt der .req Datei kopiert, bei Certificate Template wird Web Server ausgew&auml;hlt. Wenn der Request erfolgreich war, kann man die .cer Datei herunterladen und in Exchange den Request fertigstellen (Complete Pending Request).Alternativ kann der Request mit &ldquo;certutil&rdquo; eingereicht werden, wobei mit dem Parameter &ldquo;/attrib&rdquo; das Template gew&auml;hlt wird.Beispiel: certreq.exe -submit -attrib \\\\\\\"CertificateTemplate:WebServer\\\\\\\" c:\\\\\\\\certreq.req&nbsp;tomlive vom ntSystems techDAY :)\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-san-zertifikate28093server-2008-pki/\\\"},{  \\\"id\\\": \\\"post-webdav-iis7-publishing-ober-isa-server-part-2\\\",  \\\"title\\\": \\\"WebDav, IIS7 publishing over ISA Server Part 2\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Wie versprochen hier der 2. Teil meiner WebDav Reihe. In diesem Post geht es darum das WebDav Verzeichnis mit dem ISA Server zu veröffentlichen.Als erstes erstellen wir eine neue Webveröffentlichungsregel:Wir geben an, dass wir eine einzelne Webseite veröffentlichen und wählen bei Sicherheit SSL ausNun müssen wir den Sitenamen inkl. IP Adresse (sofern dieser nicht aufgelöst werden kann) vergebenDanach geben wir den Pfad an, für welchen die Veröffentlichungsregel wirken soll, bzw. auf welchen Ordner der externe Zugriff beschränkt werden soll.Nun tragen wir noch den externen Namen einINFO: Sollte euer Pfad Leerzeichen haben, ist das für den ISA Server kein Problem. Man muss die Leerzeichen nicht durch %20 ersetzen, sondern kann die URL ganz normal eingeben.Als nächstes erstellen wir einen neuen Listener und weisen ihn an, dass eine SSL Verbindung erforderlich istJetzt wählen wir IP Adresse und das entsprechende Zertifikat aus. Sofern dies noch nicht auf dem ISA Server installiert wurde, muss es jetzt nachinstalliert werden.Als Authentifizierung wählen wir die HTTP Authentifizierung – StandardAls Authentifizierungsdelegierung nehmen wir NTLMZum Schluss kann man noch eine Gruppe angeben, auf welche die Veröffentlichungsregel beschränkt ist.&#160;Das Standardverhalten des Client ist es, den veröffentlichen Ordner selbst durch die HTTP Methode OPTIONS abzufragen. Damit die Verbindung nicht fehlschlägt, müssen wir dies zulassen und dürfen es nicht wie durch die bereits erstellte Regel mit den zugelassenen Pfaden blockieren. Wir kopieren die neu erstelle Regel und platzieren sie unter der ersten Regel. Danach werden die die HTTP Methode auf OPTIONS beschränken.Nun geben wir der kopierten Regel einen neuen Namen (Bsp: WebDav – OPTIONS) um sie von der ersten Regel zu unterscheiden. Wir löschen zudem unter dem Reiter Pfade die Ordnerbeschränkung.Als nächstes wird die HTTP Methode auf OPTIONS beschränkt. Wir öffnen die HTTP Richtlinie und tragen die Methode ein:&#160;ACHTUNG: Ordner mit UmlauteWenn ihr Ordner mit Umlaute verwendet, wird die Verbindung beim versuch die Ordner zu öffnen, immer zusammenbrechen. Der Grund hierfür liegt darin, dass das High Bit-Zeichen standardmäßig deaktiviert ist. Dieses High Bit-Zeichen lässt Umlaute in der URL zu. Ich empfehle auf beiden Veröffentlichungen WebDav und WebDav Options das High Bit-Zeichen zu erlauben.     Dies kann ebenfalls in der jeweiligen HTTP Richtlinie vorgenommen werden:Nun kann der Client den Ordner via HTTPS von Extern mappen.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/webdav-iis7-publishing-ober-isa-server-part-2/\\\"},{  \\\"id\\\": \\\"post-webdav-iis7-publishing-over-isa-server-part-1\\\",  \\\"title\\\": \\\"WebDav, IIS7 publishing over ISA Server Part 1\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Dies ist der erste aus 2 Teilen zum Thema WebDav. WebDav (Web-based Distributed Authoring and Versioning) ist ein offizieller Standard, Dateien im Internet bereitzustellen.&lt;/p&gt;Der Vorteil von WebDav ist, dass es nicht wie FTP oder SSH spezielle Ports verwendet, sondern &uuml;ber HTTP und HTTPS &uuml;bertragen wird und somit durch jede Firewall kommt, welche Port 80 und 443 ge&ouml;ffnet hat.Im ersten Teil werde ich zeigen wie ein Verzeichnis unter IIS7 erstellt und &uuml;ber WebDav freigegeben wird. Im 2. Teil werde ich beschreiben wie man das Ganze &uuml;ber den ISA Server ver&ouml;ffentlicht.&nbsp;ServerSofern IIS nicht installiert ist, besteht der erste Schritt darin den Webserver zu installierenZus&auml;tzlich zum Webserver muss das Feature WebDav hinzugef&uuml;gt werden.Der n&auml;chste Schritt besteht darin, eine neue Webseite in IIS zu erstellen. Als physikalischen Pfad geben wir das Verzeichnis ein, welches &uuml;ber WebDav freigegeben werden soll.Zus&auml;tzlich binden wir die Webseite auf Port 443 HTTPS und w&auml;hlen das jeweilige Zertifikat aus.Als n&auml;chstes m&uuml;ssen unter Authentifizierung die Anonyme Authentifizierung deaktivieren und Windows- und Standardauthentifizierung aktivieren.Bei den Webseiteneinstellung befindet sich das Feature WebDav-Erstellungsregeln.In den Einstellungen muss zun&auml;chst WebDav aktiviert werden und danach eine neue Erstellungsregel erstellt werden. Die Erstellungsregel definiert die jeweiligen Zugriffsrechte.Die Konfiguration ist nun abgeschlossen. Ich empfehle jedoch um Probleme mit&nbsp;Zielpfade auf &nbsp;entfernten Servern zu vermeiden, zus&auml;tzlich unter den Verbindungseinstellungen der Webseite, einen Benutzer anzugeben, der Zugriffsrechte auf die Webseite hat.&nbsp;ClientUm das WebDav-Verzeichnis zu mappen, muss der Client ein neues Netzlaufwerk verbinden und die Option &ldquo;Verbindung mit einer Webseite herstellen, auf der Sie Dokumente und Bilder speichern k&ouml;nnen&rdquo; ausw&auml;hlen.Als Adresse geben wir https://Servername einJetzt k&ouml;nnen wir auf das Verzeichnis &uuml;ber HTTPS zugreifen.Gr&uuml;&szlig;e dn&lt;/code&gt;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/webdav-iis7-publishing-over-isa-server-part-1/\\\"},{  \\\"id\\\": \\\"post-rbac\\\",  \\\"title\\\": \\\"Exchange 2010–Role Based Access Control\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"In Exchange 2010 wurde ein neues Berechtigungsmodell eingef&uuml;hrt, Role Based Access Control. Es basiert auf sogenannten Rollen anstelle von ACLs, diese Rollen (eigentlich die Role Entries) steuern den Zugriff auf cmdlets. Um dieses neue Modell zu verstehen muss man die Grundbausteine verstehen aus denen es besteht. Vereinfacht gesagt wird festgelegt wer was wo machen darf.&nbsp;Scope (wo)Definiert die Objekte im Active Direcotry auf welchen die Rolle Berechtigungen hat. New-ManagementScope Role/Role Entry (was)Eine Rolle ist eine Sammlung von Role Entries, sie definiert welche cmdlets und welche Parameter ausgef&uuml;hrt werden d&uuml;rfen. New-ManagementRole Add-ManagementRoleEntry, Remove-ManagementRoleEntry RoleGroup (wer)Universelle Sicherheitsgruppe deren Mitglieder die Rechte bekommen die in der Role definiert sind. Verkn&uuml;pft Rolle und Scope. New-RoleGroup &ndash;Roles &ldquo;&rdquo; &ndash;CustomRecipientWriteScope &ldquo;&rdquo; Role AssignmentVerbindet die oben genannten Elemente, legt fest wer was wo machen darf. Das cmlet New-RoleGroup erzeugt den ManagementRoleAssignmenteintrag Get-ManagementRoleAssignment Es gibt in Exchange 2010 65 vordefinierte Rollen die man sich mit Get-ManagementRole anzeigen lassen kann.Will man die Role Entries zu einer Rolle sehen f&uuml;hrt man folgendes cmdlet aus: Get-ManagementRoleEntry Rolle\\\\\\\\*Beispiel: Get-ManagementRoleEntry \\\\\\\"Move Mailboxes\\\\\\\\*\\\\\\\"&nbsp;Benutzerdefinierte Rolle erstellenSoll eine Benutzerdefinierte Rolle bzw. ein Scope erstellt werde, dann in dieser Reihenfolge:New-ManagementScope \\\\\\\"Gruppe1Scope\\\\\\\" -RecipientRestrictionFilter {memberofgroup -eq \\\\\\\"CN=Gruppe1,OU=users,DC=domain,DC=local} Diese Rolle darf nur Mitglieder der Gruppe1 bearbeiten. New-ManagementRole \\\\\\\"Create Move Request Gruppe1\\\\\\\" &ndash;Parent &ldquo;Move Mailboxes&rdquo; Eine neue Rolle wird erstellt New-RoleGroup \\\\\\\"Gruppe1 Movers\\\\\\\" -roles \\\\\\\"Create Move Request Gruppe1\\\\\\\" -CustomRecipientWriteScope \\\\\\\"Gruppe1Scope\\\\\\\" Eine neue Gruppe wird erstellt (Universelle Sicherheitsgruppe im AD), die Rolle sowie der Scope werden dieser Gruppe zugewiesen Add-RoleGroupMember \\\\\\\"Gruppe1 Movers\\\\\\\" -members \\\\\\\"username\\\\\\\" Benutzer werden der Gruppe hinzugef&uuml;gt, kann auch im AD gemacht werden So sieht die soeben erstellte Rolle aus:Get-ManagementRoleEntry \\\\\\\"Create Move Request Gruppe1\\\\\\\\*\\\\\\\"&nbsp;Benutzerdefinierte Rolle anpassenMeine soeben erstellte Rolle soll nur Berechtigungen haben einen Move Request zu erstellen. Mitglieder sollen den Move Request nicht l&ouml;schen, anhalten oder weiterf&uuml;hren k&ouml;nnen. Also passe ich die RoleEntries entsprechend an.Nicht gew&uuml;nschte cmdlets entfernen mit remove-ManagementRoleEntry remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\\\\\Remove-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\\\\\Suspend-MoveRequest&rdquo; remove-ManagementRoleEntry &ldquo;Create Move Request Gruppe1\\\\\\\\Resume-MoveRequest&rdquo; Mit add-ManagmentRoleEntry &ldquo;Create Move Request Gruppe1\\\\\\\\RoleEntry&rdquo; kann man weitere Eintr&auml;ge erstellen und die Rolle weiter personalisieren. Nachdem die nicht erw&uuml;nschten cmdlets entfernt wurden sieht das Ganze so aus:Get-ManagementRoleEntry \\\\\\\"Create Move Request Gruppe1\\\\\\\\*\\\\\\\"&nbsp;Wichtig: RBAC Rollen sind nicht gleichzusetzen mit ACLs (Sicherheitsberechtigungen), das hei&szlig;t es wird nicht die restriktivste Rolle angewandt. Benutzer erhalten durch alle Rollen die ihnen zugewiesen sind Zugriff auf ein bestimmtes &ldquo;Set&rdquo; an Funktionen. Mehr Rollen = Mehr Funktionen.Wenn man das Prinzip einmal verstanden hat, wird einem schnell bewusst wie m&auml;chtig dieses neue Berechtigungsmodell ist. Da die Exchange Management Konsole auch nichts anderes macht also PowerShell Befehle abzusetzen kann man so wirklich alles genau an seine Bed&uuml;rfnisse anpassen.tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/rbac/\\\"},{  \\\"id\\\": \\\"post-shared-mailboxes-und-auto-mapping-e14-sp1\\\",  \\\"title\\\": \\\"Shared Mailboxes und Auto Mapping E14 Sp1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Shared und Ressourcen Postf&auml;cher gibt es schon l&auml;nger. Mit Exchange 2010 SP1 kommt aber ein neues Feature das den Admins das leben um einiges erleichtert. Wie das Kind hei&szlig;t ist noch nicht zu erfahren, es wird in div. Blogs und Foren &ldquo;Auto Mapping&rdquo; genannt.Um dieses neue Feature zu verwenden muss man nur auf einem Exchange 2010 SP1 Server Berechtigungen auf eine Shared Mailbox setzen, existieren die Berechtigungen bereits m&uuml;ssen sie entfern und nochmal gesetzt werden.&nbsp; Beim setzen der Berechtigungen werden n&auml;mlich die Benutzer, die von der Berechtigung profitieren, in das ActiveDirectory Attribut msExchDelegatedListLink aufgenommen.Outlook sucht beim starten nach Mailboxen mit dem DN des Benutzers und verbindet diese automatisch. Ein weiterer Vorteil ist dass die Mailbox vom Benutzer nicht geschlossen oder entfernt werden kann, so werden die Helpdesk Calls weiter reduziert ;)Das Ganze funktioniert &uuml;brigens auch f&uuml;r Ressourcen (Room/Equipment) Mailboxen.tomspecial thanks to: Steve Goodman\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/shared-mailboxes-und-auto-mapping-e14-sp1/\\\"},{  \\\"id\\\": \\\"post-e14-sp1-importexport-update\\\",  \\\"title\\\": \\\"E14 SP1 Import/Export Update\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Vor kurzem habe ich in diesem Post &uuml;ber die Import/Export-Mailbox cmdlets geschrieben.Mit Exchange 2010 SP1 wurde die Import/Export Funktionalit&auml;t ge&auml;ndert und die cmdlets werden durch MailboxImportRequest und MailboxExportRequest ersetzt. Die Vorteile die daraus Resultieren sind folgende:Import/Export von Online ArchivenVerwendet Exchange MAPI Provider, Outlook muss nicht mehr auf dem Server installiert werdencmdlets verwenden UNC Pfade (PST Files m&uuml;ssen nicht mehr auf den Server kopiert werden)Beispiel:New-MailboxImportRequest-Mailbox&nbsp;test -IsArchive&nbsp;-FilePath \\\\\\\\\\\\\\\\server\\\\\\\\test.pstDieser Befehl Importiert den Inhalt der Datei test.pst in das Online Archiv der Mailbox \\\\\\\"test\\\\\\\".\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/e14-sp1-importexport-update/\\\"},{  \\\"id\\\": \\\"post-sharepoint-2010-fehler-in-der-sql-datenbank-beheben\\\",  \\\"title\\\": \\\"Sharepoint 2010, Fehler in der SQL Datenbank beheben\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Letztens wollte ich einen Test-Restore meiner Sharepoint Datenbank durchführen. Normalerweise hat das immer problemlos funktioniert, jedoch beim letzten Backup gab es große Probleme mit dem Sharepoint-Inhalt. Der Restore-Vorgang wurde erfolgreich beendet, jedoch war lediglich die halbe Sharepoint Struktur und keine Daten enthalten.Nachdem ich das Eventlog des Quellservers durchforstet habe, bin ich auf folgende Fehler im Anwendungs-Log gestoßen:Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 18053    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Fehler: 7884, Schweregrad: 20, Status: 1. (Parameter: ). Der Fehler wird aufgrund eines Formatierungsfehlers im nicht ausführlichen Modus gedruckt. Ablaufverfolgung, ETW, Benachrichtigungen usw. werden ausgelassen.    Protokollname: Application   Quelle:&#160;&#160;&#160;&#160;&#160;&#160;&#160; MSSQL$SHAREPOINT    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 24.08.2010 15:46:37    Ereignis-ID:&#160;&#160; 7105    Aufgabenkategorie:Server    Ebene:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Fehler    Schlüsselwörter:Klassisch    Benutzer:&#160;&#160;&#160;&#160;&#160; ******\\\\\\\\daniel nitz    Computer:&#160;&#160;&#160;&#160;&#160; Miami.*****.local    Beschreibung:    Die Datenbank-ID '6', Seite '(0:0)', Slot '0' für den LOB-Datentypknoten ist nicht vorhanden. Dies ist gewöhnlich auf Transaktionen zurückzuführen, die Daten, für die kein Commit ausgeführt wurde, auf einer Datenseite lesen können. Führen Sie DBCC CHECKTABLE aus.    Um den Fehler zu analysieren muss man zunächst das SQL Server 2008 Management Studio Express installieren. Über das Management Studio erhält man Zugriff auf dem SQL Server und kann mit dem Troubleshooting beginnen.    Zunächst meldet man sich am SQL Server an. Als Servername verwenden wir SERVER\\\\\\\\SharepointNun ist die Verbindung zum Server hergestellt. Jetzt muss die Datenbank mit der ID ‘6’ (wie in der Fehlermeldung 2) gefunden werden. Als erstes öffnen wir ein Abfragefenster und gehen jede Datenbank mit use NAME-DER-DATENBANK     select db_id()durch, bis uns die entsprechende ID im Fenster “Meldungen” ausgegeben wird. In meinen Fall war das die Datenbank WSS_CONTENT.Nun führen wir den Befehl DBCC CHECKDB (WSS_CONTENT) WITH NO_INFOMSGS, ALL_ERRORMSGS aus und bekommen eine Liste mit den entsprechenden FehlernIn meinem Fall:Meldung 8965, Ebene 16, Status 1, Zeile 1     Tabellenfehler: Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594043760640 (LOB data-Typ). Auf den Datenknoten außerhalb von Zeilen auf Seite (0:0), Slot 0, Text-ID 1759772672 wird von Seite (1:4986), Slot 6 verwiesen, er wurde jedoch im Scan nicht betrachtet.     Meldung 8929, Ebene 16, Status 1, Zeile 1     Objekt-ID 69575286, Index-ID 1, Partitions-ID 72057594113359872, Zuordnungseinheits-ID 72057594123255808 (In-row data-Typ): Es wurden Fehler in Daten außerhalb von Zeilen gefunden mit der ID 1759772672, im Besitz von data, Datensatz identifiziert durch RID = (1:4986:6).     Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'AllDocs'-Tabelle (Objekt-ID 69575286) gefunden.    Von CHECKDB wurden 0 Zuordnungsfehler und 2 Konsistenzfehler in der 'WSS_Content'-Datenbank gefunden.    repair_allow_data_loss ist die minimale Reparaturstufe für die Fehler, die mit DBCC CHECKDB (WSS_Content) gefunden wurden.&#160;Die Meldungen weisen darauf hin, dass eine Inkonsistenz in der Datenbank vorliegt. Höchstwahrscheinlich handelt es sich dabei um eine Datei, die auf dem Sharepoint Server upgeloaded wurde. Um die Inkonsistenz zu beheben muss DBCC CHECKDB mit dem Parameter repair_allow_data_loss ausgeführt werden. Dafür müssen zunächst alle Sharepoint Dienste und der IIS Dienst beendet werden.   Danach müssen die folgenden Kommandos ausgeführt werden:Mit dem Befehl ALTER DATABASE WSS_Content SET SINGLE_USER, wird die Datenbank in den Sinlge_Mode gesetzt, der Befehl DBCC CHECKDB (WSS_Content, REPAIR_ALLOW_DATA_LOSS) startet die Reparatur.Nachdem die Reparatur abgeschlossen wurde und DBCC CHECKDB keine Fehler mehr protokolliert, kann der Modus wieder zu MULTI_USER geändert werden.Jetzt können alle Dienste wieder gestartet werden. Die Datenbank sollte jetzt konsistent sein und die Sicherung vollständig durchlaufen.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-2010-fehler-in-der-sql-datenbank-beheben/\\\"},{  \\\"id\\\": \\\"post-appv-46e28093sccm-2007r2-streaming-applications\\\",  \\\"title\\\": \\\"AppV 4.6–SCCM 2007R2 Streaming Applications\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"AppV\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Seit System Center Configuration Manager 2007 R2 kann man Virtuelle Applikationen verteilen. Daf&uuml;r m&uuml;ssen ein paar Einstellungen im SCCM gemacht werden, der SCCM Advanced Client sowie der AppV Client m&uuml;ssen auf den Clients installiert werden.Einstellungen SCCM 2007R2Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Client Agents, Advertised Programs Client Agent&rdquo; &ouml;ffnen unter General muss &ldquo;Allow virtual application package advertisemet&rdquo; muss werden  Eigenschaften von &ldquo;Site Database, Site Management, Sitename, Site Settings, Site Systems, Servername, ConfigMgr distribution point&rdquo; &ouml;ffnen unter General muss &ldquo;Allow Clients to transfer content from this distribution Point using BITS, HTTP, and HTTPS&rdquo; aktiviert werden unter Virtual Application muss &ldquo;Enable virtual application streaming&rdquo; aktiviert werden &nbsp; AppV Client deploymentUnter &ldquo;%ProgramFiles%\\\\\\\\Microsoft Configuration Manager\\\\\\\\Tools\\\\\\\\VirtualApp&rdquo; die Datei &ldquo;AppVirtMgmtClient.sms&rdquo; anpassen. Version=4.6 (wenn AppV Client 4.6 verwendet wird) Commandline=setup.exe /s /v\\\\\\\"/quiet /norestart /qn\\\\\\\"0\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\" (Application Virtualization Client Installer Command-Line Parameters) Ein neues Paket aus einer Definition erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Package From Definition&rdquo; w&auml;hlen. Mit &ldquo;Browse&rdquo; die Datei AppVirtMgmtClient.sms ausw&auml;hlen  Im n&auml;chten Fenster &ldquo;Always obtain files from a source directory&rdquo; w&auml;hlen  Als Pfad wird ein Netzwerkfreigabe gew&auml;hlt auf welcher der AppV Client entpackt wurde, folgende Dateien und Ordner sollten vorhanden sein: setup.exe setup.msi Support\\\\\\\\Watson\\\\\\\\dw20shared.msi Auf Finish klicken und das Paket wurde erstellt Jetzt muss noch ein Advertisement f&uuml;r das Paket erstellt werden.Rechtsklick auf &ldquo;Site Database, Computer Management, Software Distribution, Advertisements&rdquo; und New Advertisement w&auml;hlen. Einen Namen eingeben, das Paket ausw&auml;hlen welches im vorigen Schritt erstellt wurde und eine Collection ausw&auml;hlen welche den Client erhalten soll.  Mandatory Assignment hinzuf&uuml;gen  Art der Verteilung w&auml;hlen, in dem Fall &ldquo;Download from distribution point and run locally&rdquo;  An dieser Stelle kann auf Finish geklickt werden, f&uuml;r die &uuml;brigen Einstellungen akzeptiere ich die Standards. Jetzt wurde das Paket und die Zuweisung erstellt, die Clients die in der Collection sind erhalten die Software.Virtuelle Applikation importierenNachdem die Virtuelle Applikation im Sequencer erstellt wurde (wie z.B. hier erkl&auml;rt) muss sie im System Center Configuration Manager importiert werden.Ein neues virtuelles Paket erstellen: &ldquo;Site Database, Computer Management, Software Distribution, Packages&rdquo; Rechtsklicken und &ldquo;New, Virtual Application Package&rdquo; w&auml;hlen. Im ersten Fenster muss die XML Datei des Pakets angegeben werden.  Das Fenster &ldquo;General&rdquo; ist eigentlich selbsterkl&auml;rend, Name, Hersteller usw. k&ouml;nnen eingegeben werden. Im Fenster &ldquo;Data Source&rdquo; wird eine Netzwerkfreigabe angegeben auf der das Paket erstellt wird, von dieser Freigabe wird das Paket dann auf die Distribution Points verteilt (Achtung: der Angegebene Order muss existieren und vorhandene Daten werden &uuml;berschrieben!)  Jetzt kann wieder auf Finish geklickt werden, die Standards der restlichen Einstellungen sind ok. Das Virtuelle Paket wurde nun also auch erstellt. Jetzt fehlt noch ein Advertisement f&uuml;r dieses.Das Advertisement wird genau gleich erstellt wie jenes f&uuml;r den AppV Client, der einzige unterschied liegt in der Auswahl der Verteilungsmethode hier w&auml;hlt man &ldquo;Stream virtual applications from distribution point&rdquo; &nbsp; Nach kurzer Zeit werden die Clients auch dieses Advertisement erhalten. Sind Desktopverkn&uuml;pfungen oder Dateizuordnungen konfiguriert werden diese auf dem Client bereits angewandt. Das hei&szlig;t ein .pdf File bekommt in diesem Beispiel bereits den virtuellen Adobe Reader zugewiesen. Beim ersten Starten des Programmes wird der Inhalt des Paketes heruntergeladen, d.h. der erste Start dauert ein bisschen, alle weiteren Starts verlaufen wesentlich schneller, dabei wird nur auf Updates &uuml;berpr&uuml;ft, alle anderen Files sind bereits lokal vorhanden.tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/appv-46e28093sccm-2007r2-streaming-applications/\\\"},{  \\\"id\\\": \\\"post-sharepoint-web-apps-lassen-sich-nicht-installieren\\\",  \\\"title\\\": \\\"Sharepoint Web Apps lassen sich nicht installieren\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Wenn man die Sharepoint Webseite nicht über den default Port 80 betreibt, bricht die Installation der Sharepoint Webservices bei der Erstellung der Beispieldaten ab. &#160;Um das Problem zu umgehen empfiehlt es sich die Sharepoint Webseite während der Installation auf Port 80 zu binden. Dazu sind folgende 2 Schritte notwendig:   In der Sharepoint Zentraladministration muss der alternative Zugriff auf Port 80 gebunden werden    Im IIS Manger muss ebenfalls die Bindung neu festgelegt werden Danach läuft die Installation vollständig durch und die Webseite kann wieder auf den ursprünglichen Port gebunden werden.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-web-apps-lassen-sich-nicht-installieren/\\\"},{  \\\"id\\\": \\\"post-appv-46e28093sccm-2007r2e28093streaming-issue\\\",  \\\"title\\\": \\\"AppV 4.6–SCCM 2007R2–Streaming Issue\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\",\\\"AppV\\\"],  \\\"content\\\": \\\"Hi, tom here again. Talking about AppV and System Center Configuration Manager 2007R2 today.I was stumbling upon this error while I was trying to stream virtual Applications with SCCM. If I set the advertisement to &ldquo;Stream virtual applications from distribution point&rdquo; the following error occurred, though if I set the advertisement to &ldquo;Download content from distribution point and run locally&rdquo; everything worked without any problem.The problem was caused by the malware inspection feature of my ForeFront TMG Web Proxy Server.If you see &ldquo;an unexpected error&rdquo; with the Error Code like: 0A-400000C8 try to disable the Proxy on the Clients for further research.If you are using Forefront TMG be sure to add the SCCM (streaming enabled) Distribution Point to the Malware Destination Exceptions.You wont see this error with Application Virtualization Management Server when using RTSP or RTSPS as streaming protocol. You wont see it even with SCCM&nbsp;if &ldquo;Download content from distribution point and run locally&rdquo; is selected because this uses BITS to transfer the whole package to the client and run it locally. Since SCCM uses HTTP/HTTPS for streaming the connection will go to the proxy server and will be killed by Malware Inspection.tomps. special thanks go to J.C. Hornbeck (http://blogs.technet.com/b/appvcallback/)\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/appv-46e28093sccm-2007r2e28093streaming-issue/\\\"},{  \\\"id\\\": \\\"post-sharepoint-foundation-serach-14\\\",  \\\"title\\\": \\\"Sharepoint Foundation Serach, 14\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Wenn ihr auf folgende Fehlermeldung auf eurem Sharepoint 2010 Server stoßt:&#160;Protokollname: Application     Quelle: Microsoft-SharePoint Products-SharePoint Foundation Search      Datum: 09.08.2010 16:51:10      Ereignis-ID: 14      Aufgabenkategorie:Gatherer      Ebene: Warnung      Schlüsselwörter:      Benutzer: LOKALER DIENST      Computer: Miami.domain.local      Beschreibung:      Die Startadresse 'sts4://jobportal:8015/contentdbid={4cee0e9c-fee5-498f-86b7-9855d89539ff}' kann nicht durchforstet werden.Kontext: Anwendung 'Suchabfragen_über_Hilfethemen_bedienen', Katalog 'Search'Details:Zugriff verweigert. Vergewissern Sie sich, dass das Standardkonto für den Inhaltszugriff Zugriff auf dieses Repository hat, oder fügen Sie eine Durchforstungsregel zum Durchforsten dieses Repositorys hinzu. Wenn es sich bei dem zu durchforstenden Repository um ein SharePoint-Repository handelt, vergewissern Sie sich, dass das verwendete Konto über die Berechtigung &quot;Alles lesen&quot; für die durchforstete SharePoint-Webanwendung verfügt. (0x80041205)   bedeutet das, dass ihr eine Webanwendung unter einer URL betreibt, die nicht dem Computername des Server entspricht. Dafür verantwortlich ist das sog. Loopback check security feature, welches ab Windows Server 2003 SP1 implementiert ist. Es lehnt die Authentifizierung ab, wenn die URL nicht mit dem Computernamen übereinstimmt und verhindert somit, dass die Sharepoint Suche die Webseite indiziert.Hier ein Workaround um das Problem zu beheben:In der Registry des Sharepoint Servers muss unter HKEY_LOCAL_MACHINE\\\\\\\\SYSTEM\\\\\\\\CurrentControlSet\\\\\\\\Control\\\\\\\\Lsader Schlüssel (DWORD) “DisableLoopbackCheck” mit Wert 1 erstellt werden. Nach einem Neustart ist das Security Feature deaktiviert und es werden keine Warnungen mehr ins EventLog geschrieben.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-foundation-serach-14/\\\"},{  \\\"id\\\": \\\"post-exchange-2010e28093database-restore\\\",  \\\"title\\\": \\\"Exchange 2010–Database Restore\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Nachdem die Exchange Datenbank erfolgreich gesichert wurde, sollte man sich den Recovery Vorgang mal genauer anschauen.Man kann jetzt einzelne Elemente oder ganze Mailboxen löschen um diese vom Backup wieder zurück zu holen. Zwar gibt es mit Single Item Recovery eine bessere Möglichkeit für das Widerherstellen einzelner Mails, dazu aber mehr in einem anderen Beitrag.Die Datenbank wird also von der Sicherung zurückgeholt, dazu starte ich Windows Backup und wähle Recovery. Ich kann nun aus den erstellten Backups wählen und entscheide mich für eines auf einem Netzlaufwerk.&#160;Nun kann ich wählen was ich Widerherstellen möchte, in meinem Fall einzelne Dateien oder Ordner. Ich hole mir also die *.edb Datei der Datenbank und den kompletten Log Folder derselben zurück. Das Ganze darf natürlich nicht an der ursprünglichen Stelle widerhergestellt werden, sondern in einem neuen Ordner.Wurden die Files zurückgeholt, kann man die Recovery Database erstellen. Dazu brauchen wir mal wieder die dunkle Seite der Macht, also öffne ich die Exchange Management Shell. Dort wird mit dem cmdlet new-MailboxDatabase eine Recovery Database aus der widerhergestellten *.edb Datei erstellt.Dieses Beispiel erstellt die Recovery Database RDB01 auf dem Server mbx01, X:\\\\\\\\restore ist dabei der Ort an dem die Edb Datei und der Log Ordner Widerhergestellt wurden.   New-MailboxDatabase –Recovery Rdb01 –Server mbx01 –EdbFilePath x:\\\\\\\\restore\\\\\\\\db.edb –LogFolderPath x:\\\\\\\\restore  Die Datenbank wurde erstellt, jedoch wird man darauf hingewiesen dass die Datenbank noch nicht gemounted wurde, sie muss erst in einen “Clean Shutdown State” gebracht werden.Um die Recovery Datenbank in einen “Clean Shutdown State” zu bringen wird das Tool eseutil.exe verwendet. Dafür öffnet man eine Eingabeaufforderung (oder EMS) und lässt eseutil –p auf die edb Datei los. Der Parameter –p steht hier für Repair. In meinem Beispiel lautet der Befehl:    eseutil.exe –p x:\\\\\\\\restore\\\\\\\\db.edb  Nachdem Eseutil durchgelaufen ist, die Datenbank sich also im Clean Shutdown State befindet kann sie gemounted werden, das geht in der EMC mit einem Rechtsklick oder in der Shell mit Mount-Database RDB01.Die Datenbank wurde erfolgreich gemounted und ich habe jetzt Zugriff auf die Daten.Mit dem cmdlet Export-Mailbox können jetzt einzelne Mails oder ganze Mailboxen widerhergestellt werden, mehr zum cmdlet Export-Mailbox gibt es hier.&#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010e28093database-restore/\\\"},{  \\\"id\\\": \\\"post-importexport-mailbox\\\",  \\\"title\\\": \\\"Import/Export Mailbox\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Mit den cmdlets import-Mailbox und export-Mailbox kann Inhalt von einer Mailbox exportiert oder in eine Mailbox importiert werden. Soviel sagt eigentlich der Name auch ;)Diese cmdlets sind standardm&auml;&szlig;ig aber nicht verf&uuml;gbar, bzw. hat ein &bdquo;normaler&ldquo; Exchange Organization Administrator keine Berechtigungen sie zu verwenden. Bevor diese Berechtigungen gesetzt werden sollte man RBAC (Role Based Access Control) verstehen.Man erstellt eine neue Universelle Gruppe im Active Directory, ich gebe ihr einen beschreibenden Namen &bdquo;Enterprise Import Export Users&ldquo;. Jetzt wei&szlig;e ich dieser Gruppe die Management Rolle &bdquo;Mailbox Import Export&ldquo; zu, dazu verwende ich folgendes cmdlet in der Exchange Management Shell:New-ManagementRoleAssignment -Name \\\\\\\"Import Export Role\\\\\\\" -SecurityGroup \\\\\\\"Enterprise Import Export Users\\\\\\\" -Role \\\\\\\"Mailbox Import Export\\\\\\\"Mitglieder dieser Gruppe haben jetzt die notwendigen Berechtigungen um die Import/Export cmdlets zu verwenden, die Exchange Management Shell bzw. Management Konsole m&uuml;ssen neu gestartet werden.Import-MailboxWird verwendet um PST Daten in Mailboxen zu importieren. Wenn die PST Dateien im Format &lt;Exchange Alias&gt;.pst vorhanden sind kann man auch mehrere Imports gleichzeitig machen.Mit diesem Befehlt werden alle Elemente aus c:\\\\\\\\pst\\\\\\\\test.pst in die Mailbox &ldquo;test&rdquo; importiert.Import-Mailbox &ndash;identity test &ndash;PstFolderPath c:\\\\\\\\pst\\\\\\\\test.pstMit diesem Befehl werden alle Dateien im Ordner c:\\\\\\\\pst in die entsprechenden Mailboxen importiert, wichtig ist dabei der Name der PST Files.Dir c:\\\\\\\\pst |Import-MailboxExport-MailboxWird verwendet um Objekte von Mailboxen zu exportieren, als Ziel kann eine andere Mailbox oder eine PST Datei anagegeben werden. H&auml;ufig wird dieses cmdlet verwendet um Objekte aus einer Recovery Datenbank wieder in der urspr&uuml;nglichen Mailbox herzustellen.Mit diesem Befehl werden alle Elemente aus der Mailbox &ldquo;test&rdquo; in den Ordner &ldquo;testdata&rdquo; der Mailbox &ldquo;export&rdquo; kopiert.Export-Mailbox -Identity test -TargetMailbox export -TargetFolder testdataMit diesem Befehl werden alle Element aus der Mailbox \\\\\\\"test\\\\\\\" in die PST Datei auf C:\\\\\\\\pst exportiert. Achtung: F&uuml;r diesen Befehl wird Outlook (x64)&nbsp;auf dem Exchange Server ben&ouml;tigt der den Export durchf&uuml;hren soll. Nach Best Practice sollte das ein separater Server sein der sonst keine Mailboxen h&auml;lt.Export-Mailbox -Identity test -PstFolderPath c:\\\\\\\\pst\\\\\\\\test.pstGenauere Informationen gibts im Technet: Export-Mailbox, Import-Mailboxtom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/importexport-mailbox/\\\"},{  \\\"id\\\": \\\"post-appve28093adobe-reader-sequencing-receipe\\\",  \\\"title\\\": \\\"AppV–Adobe Reader Sequencing Receipe\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Anhand des Adobe Readers möchte ich hier zeigen wie man eine virtuelle Applikation erstellt.Wie der&#160; Sequencer vorbereitet wird habe ich hier beschrieben.&#160;Der Sequencer wird gestartet und die AppV Sequencer Console wird geöffnet. Man wählt “Paket erstellen” um ein neues Paket zu erstellen.Im nächsten Dialog wird der Name und eventuell eine Beschreibung vergeben.Nachdem man auf “Weiter” geklickt hat kann man mit dem Sequencing beginnen. Durch klicken auf “Überwachung starten” wird man aufgefordert einen Ordner auszuwählen den der Sequencer überwachen soll.Es wird ein Ordner auf dem Q-Drive erstellt, dieser sollte einen Namen im 8.3 Format haben, also maximal acht Zeichen vor dem Punkt und maximal drei danach.Jetzt wird das Setup von Adobe Reader gestartet (nicht der Web Installer, sondern das offline Installationspaket). Wichtig ist dabei das man den eben erstellten Ordner auf dem Q-Drive als Zielordner angibt.Wenn die Installation erfolgreich abgeschlossen ist kann man die Überwachung beenden.Im nächsten Schritt werden Dateizuordnungen und Verknüpfungen konfiguriert, man kann z.B. wählen ob eine Verknüpfung auf dem Desktop der Clients erstellt werden soll oder nicht.Jetzt kann die Applikation personalisiert werden, durch klicken auf “Starten” wird Adobe Reader gestartet und man kann die EULA akzeptieren, dann muss das nicht der Benutzer machen. Außerdem empfiehlt es sich die Automatischen Updates des Readers zu deaktivieren. Wenn man alle Einstellungen gemacht hat wird die Applikation wieder beendet.Noch einmal auf “Weiter” klicken und das Paket ist vorerst fertig.In den folgenden Fenstern können noch diverse Einstellungen getroffen werden, wichtig ist im Reiter “Bereitstellung” das richtige Protokoll zu wählen, für Testumgebungen wird das RTSP sein. Außerdem kann man hier die unterstützten Betriebssysteme und die “Ausgabeoptionen” wählen. Wird das Paket per Streaming verteilt sollte man die Komprimierung aktivieren. Wenn man die Applikation an “Standalone” Clients verteilt dann muss man auch ein MSI File generieren.Eine weitere wichtigie Einstellung ist der Hostname des Servers, standardmäßig wird die Variable %SFT_SOFTGRIDSERVER% verwendet, diese muss auf den Clients als Umgebungsvariable mit dem Hostnamen des Servers konfiguriert werden.Man kann noch mehr personalisieren und sogar die virtuelle Registry bearbeiten, allerdings ist das für Adobe Reader nicht notwendig. Also kann das Paket gespeichert werden.Wurde das Paket gespeichert erhält man folgende Dateien. Diese können mit einem Application Virtualization Management Server, mit System Center Configuration Manager oder direkt per MSI an die Clients verteilt werden.Um die Applikation mit dem AppV Management Server zu verteilen wird in der Management Console mit rechts auf Applications gecklickt, dort kann man die *.sprj Datei auswählen und so die virtuelle Applikation erstellen. Die Dateien die mit dem Sequencer erstellt wurden müssen dazu in den “Content” Ordner des AppV Management Servers kopiert werden. &#160;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/appve28093adobe-reader-sequencing-receipe/\\\"},{  \\\"id\\\": \\\"post-appve28093sequencer\\\",  \\\"title\\\": \\\"AppV–Sequencer\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Der Microsoft Application Virtualization Sequencer ist ein Client oder Server der verwendet wird um virtuelle Applikationen zu erstellen.Der Sequencer ist im Idealfall eine virtuelle Maschine, vor jedem „Sequencing“ sollte der Ausgangszustand des Sequencers der Selbe sein.Man erstellt also eine neue virtuelle Maschine und installiert ein Betriebssystem seiner Wahl. Es müssen zwei Partitionen vorhanden sein, eine für das System und eine für das sogenannte Q-Drive.Zu diesem Zeitpunkt sollte man so wenig Software wie möglich installieren, alles was auf dem Sequencer installiert wird muss auch auf den Clients installiert werden damit die virtuellen Applikationen laufen.Es wird also der AppV Sequencer installiert und die zweite Partition mit NTFS Formatiert, dieser Partition weist man den Laufwerksbuchstaben Q: zu. Der Client soll in der Domain hängen und folgende Dienste sollten gestoppt und deaktiviert werden:· Windows Update· Windows SearchJetzt wird die virtuelle Maschine heruntergefahren und das Feature UnDo Disk (VMWare: Nonpersistent Disk) wird aktiviert. Ab jetzt ist die Maschine bei jedem Start auf dem gleichen Stand und bereit ein Paket zu erstellen.Wie ein Paket erstellt wird erkläre ich in diesem Post.tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/appve28093sequencer/\\\"},{  \\\"id\\\": \\\"post-keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)\\\",  \\\"title\\\": \\\"Keine Mailzustellung auf Öffentliche Ordner nach Exchange 2010 Upgrade (von Exchange 2k3)\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Nachdem der letzte Exchange 2003 Server aus der Struktur entfernt wird, bleiben dennoch die Administrative Gruppe und verschiedene Ordner-Strukturen in der AD Konfiguration zurück.Dies kann unter Umständen den Mailfluss zu den Öffentlichen Ordnern stören. Man erhält dann folgende&#160; Unzustellbarkeitsberichte vom Exchange Server: Um das Problem zu beheben muss zunächst der ADSI Editor geöffnet werden. In der Unterstruktur&#160;Configuration / CN=Configuration,DC=YOURDOMAIN / CN= Services / CN= YOUR ORGANISATION / CN= Administrative Groups / CN= First administrative Group /&#160;der Ordner CN=Servers gelöscht werden (sofern dieser auch leer ist)&#160;Nun werden Mails den Öffentlichen Ordnern wieder zugestelltGrüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)/\\\"},{  \\\"id\\\": \\\"post-appv-46e28093fehler-beim-starten\\\",  \\\"title\\\": \\\"AppV 4.6–Fehler beim Starten\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Heute mal ein neues Thema auf ntSystems, Applikations Virtualisierung. Viele Hersteller setzen auf diese Technologie, unter anderem Microsoft mit SoftGrid bzw. AppV.Erscheint beim Starten der Applikation der Fehler: &ldquo;Auf die Angegebene Instanz von Application Virtualization Server konnte nicht zugegriffen werden&rdquo; mit einem Fehlercode wie &ldquo;xxxxxxx-xxxxxx0A-10000002&rdquo; dann wurde die Umgebungsvariable SFT_SOFTGRIDSERVER am AppV Client nicht gesetzt.Beim Erstellen der virtuellen Applikation (sequencing) wird standardm&auml;&szlig;ig diese Variable verwendet, der Client kann damit allerdings nicht viel anfangen. Also einfach auf den AppV Clients die Variable setzen und als Wert den FQDN des AppV Management Servers eintragen.Tipp: Daf&uuml;r bieten sich nat&uuml;rlich Group Policy Preferences an.Erscheint der Fehler: &ldquo;Die angegeben Anwendung ist nicht vorhanden&rdquo; mit einem Fehlercode wie dem &ldquo;xxxxxxx-xxxxxxxx-00000A09&rdquo; deutet das auf einen falschen Namen hin. Der Fehler kann auch auftreten w&auml;hrend ein Programm l&auml;uft, z.B. wenn es sich bei der Anwendung um einen Proxy des Office Deplyment Kit for AppV handelt. Beim Ausf&uuml;hren von \\\\\\\"msiexec /i offvirt.msi\\\\\\\" muss auf die richtigen Namen geachtet werden. Mehr dazu in einem separaten Post.&nbsp;Ein weiterer Fehler ist folgender:Am AppV Sequenzer wird standardm&auml;&szlig;ig das RTSPS (322) Protokoll verwendet, das muss allerdings erstmal konfiguriert werden (Zertifikat usw.). Zum Testen eignet sich auch RTSP das Port 554 verwendet. Das kann direkt beim Erstellen des Paketes ausgew&auml;hlt werden, alternativ kann man auch die .osd Datei bearbeiten und den Link anpassen.Anstelle von \\\\\\\"RTSPS://%SFT_SOFTGRIDSERVER%:322/DefaultApp.sft\\\\\\\" wird also \\\\\\\"RTSP://%SFT_SOFTGRIDSERVER%:554/DefaultApp.sft\\\\\\\" gesetzt.&nbsp;Soviel zum Thema Applikations Virtualisierung. Ich arbeite an weiteren Posts die den Vorgang des Sequencen und Verteilen von Applikationen beschreiben.stay tuned, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/appv-46e28093fehler-beim-starten/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-w3wpexe-belegt-sehr-viel-ram\\\",  \\\"title\\\": \\\"Exchange 2010, w3wp.exe belegt sehr viel RAM\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Heute musste ich auf meinen Exchange Server 2010 feststellen, dass eine Instanz vom w3wp.exe Dienst läuft, die über 1 GB an RAM beansprucht.Um die RAM-Auslastung zu verringern müssen die Recycling Einstellungen für den entsprechenden Applikation Pool im IIS konfiguriert werden.Als erstes öffnet man den IIS Manager und wechselt zu den “Application Pools”&#160;    Um den verantwortlichen Application Pool zu finden kann jeder einzelne Pool durch Rechtsklick / Recycling zum Aufräumen gezwungen werden. Ist der verantwortliche Pool gefunden kann man die Recycling Vorgänge in den Eigenschaften automatisieren. Bsp: Alle 12 Stunden den Recycling-Vorgang starten.&#160; &#160;Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-w3wpexe-belegt-sehr-viel-ram/\\\"},{  \\\"id\\\": \\\"post-exchange-2010e28093gal-fotos\\\",  \\\"title\\\": \\\"Exchange 2010–GAL Fotos\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Schon in fr&uuml;heren Exchange Versionen wurden Drittherstellertools eingesetzt um ein Foto in der Globalen Adressliste zu ver&ouml;ffentlichen und in diversen Clients anzuzeigen.Exchange 2010 und Outlook 2010 k&ouml;nnen das mit Bordmitteln, das Bild wird dabei in der Active Directory gespeichert.&nbsp;&nbsp; Foto in Active Directory ladenDas Foto wird &uuml;ber die Exchange Management Shell importiert und zwar mit folgendem cmdlet.Import-RecipientDataProperty -Identity user.name -Picture -FileData ([Byte[]]$(Get-Content -Path \\\\\\\"C:\\\\\\\\path\\\\\\\\to\\\\\\\\picture.jpg\\\\\\\" -Encoding Byte -ReadCount 0))Dieses cmdlet enkodiert das Bild und speichert die Daten im Active Directory Attribute &ldquo;thumbnailPhoto&rdquo;. Wenn man sich dieses Attribut jetzt ansieht (AC Users and Computers, ADSI Edit) dann sieht man die &ldquo;Rohdaten&rdquo;.Achtung: Das Attribut &ldquo;thumbnailPhoto&rdquo; kann eine maximale Gr&ouml;&szlig;e von 10k haben, das Bild sollte 96x96 Pixel messen um in Outlook optimal dargestellt zu werden.Durch die Gr&ouml;&szlig;enbeschr&auml;nkung von 10k wird ein &ldquo;&uuml;berf&uuml;llen&rdquo; der Active Direcotry verhindert, man sollte allerdings die Zunahme des Replikationstraffic bedenken wenn man GAL Fotos einf&uuml;hrt, diese Zunahme ist tempor&auml;r schlie&szlig;lich &auml;ndert man das Foto nicht t&auml;glich.Damit ist das Foto zwar im Active Directory hinterlegt, allerdings ist in Outlook noch nichts davon zu sehen.Schema &Auml;nderungDaf&uuml;r muss man eine kleine Schema&auml;nderung durchf&uuml;hren, und zwar muss das Attribut &ldquo;thumbnailPhoto&rdquo; an den Globalen Catalog Server repliziert werden.Daf&uuml;r &ouml;ffnet man das Active Directory Schema Snap-In in einer MMC und navigiert zum Attribut, in den Eigenschaften wird die Checkbox bei &ldquo;Replicate this Attribute to the Global Catalog&rdquo; gesetzt.Die schmmgmt.dll muss Registriert werden damit das Schema Snap-In zur Verf&uuml;gung steht In einer Administrativen CMD: &ldquo;regsvr32 schmmgmt.dll&rdquo; MMC &ouml;ffnen (Start, Ausf&uuml;hren, mmc) File, Add/Remove Snap-in&hellip;, Active Directory Schema Unter &ldquo;Attributes&rdquo; rechtsklick auf &ldquo;thumbnailPhoto&rdquo; und die oben genannte Checkbox setzenOffline Address Book aktualisierenJetzt muss nur noch das Offline Adressbuch aktualisiert werden um das Ergebnis gleich zu sehen, alternativ kann man auch warten bis das automatisch geschieht (default: 5 Uhr). Das OAB kann einfach &uuml;ber folgendes cmdlet aktualisiert werden:&nbsp;Get-OfflineAddressBook | Update-OfflineAddressBookOutlook l&auml;dt aktualisiert das Offlineadressbuch nur einmal in 24h also muss auch dort noch ein Download durchgef&uuml;hrt werden, dann ist das Foto schlie&szlig;lich sichtbar.Hinweis: Das Offline Adressbuch wird durch die Fotos nicht gr&ouml;&szlig;er, es wird nur ein Pointer auf das Foto im OAB gespeichert, nicht das Foto selbst. Das hei&szlig;t allerdings auch dass ein Offline Client das Foto nicht sieht.tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010e28093gal-fotos/\\\"},{  \\\"id\\\": \\\"post-sharepoint-foundation-2010\\\",  \\\"title\\\": \\\"Sharepoint Foundation 2010, Fehler Web.config, requestFiltering\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Wer im Eventlog des Sharepoint-Foundation-Servers auf folgende Fehlermeldung st&ouml;&szlig;t:TEXT:Protokollname: Application Quelle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft-SharePoint Products-SharePoint Foundation Datum:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20.07.2010 00:00:01 Ereignis-ID:&nbsp;&nbsp; 2137 Aufgabenkategorie:Integrit&auml;t Ebene:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Fehler Schl&uuml;sselw&ouml;rter: Benutzer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NETZWERKDIENST Computer:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Miami.**** Beschreibung: SharePoint-Integrit&auml;tsanalyse: Fehler. Die Datei 'Web.config' weist falsche Einstellungen f&uuml;r das Element 'requestFiltering' auf. F&uuml;r das requestFiltering-Element in der Datei 'web.config' muss das Attribut 'allowDoubleEncoding ' auf 'true' festgelegt sein, damit Dateinamen, die das Zeichen + enthalten, unterst&uuml;tzt werden. Au&szlig;erdem muss es &uuml;ber ein untergeordnetes Element 'requestLimits' verf&uuml;gen, dessen Attribute 'maxAllowedContentLength' auf '2147483647' festgelegt ist, um Konflikte mit Dateiuploads zu vermeiden. Stellen Sie sicher, dass das Element 'requestFiltering' in der Datei 'web.config' vorhanden ist, dass das Attribut 'allowDoubleEncoding' auf 'true' festgelegt ist, dass ein untergeordnetes Element 'requestLimits' vorhanden ist und dass der Wert 'maxAllowedContentLength' auf '2147483647' festgelegt ist. Weitere Informationen zu dieser Regel finden Sie unter http://go.microsoft.com/fwlink/?LinkID=163442.dem wird dieser Fix helfen:IIS Manager &ouml;ffnen Zur Sharepoint webseite wechseln Den Konfigurationseditor &ouml;ffnen Abschnitt &ldquo;requestFiltering&rdquo; w&auml;hlen Zu &ldquo;requestLimits&rdquo; wechseln und den Wert maxAllowedContentLenght in 2147483647 &auml;ndern, danach Konfiguration &uuml;bernehmen Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-foundation-2010/\\\"},{  \\\"id\\\": \\\"post-upgrade-exchange-2k3-2010\\\",  \\\"title\\\": \\\"Upgrade Exchange 2k3 - 2010\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"&#160;In diesem Post werde ich das Upgrade von Exchange 2k3 zu 2010 beschreiben und einige bekannte Fehler und deren Lösung aufzeigen.&#160;Upgrade&#160;Um einen groben Überblick zu bekommen ob die Infrastruktur Exchange 2010 tauglich ist, empfehle ich den “Microsoft Exchange Pre-Deployment Ananlyzer” auszuführen. Dieses Tool führt einige Checks an der Struktur aus.&#160;   Exchange Organisation in native mode setzen &#160;Sofern das nicht schon passiert ist, muss die Organisation im nativen Modus geschalten werden.&#160; &#160;   Active Directory Schema upgrade &#160;Jetzt muss das Schema geupdatet werden. Dazu startet man vom Schema Master folgende Setup Kommandos von der Exchange CD aus:&#160;Setup /PrepareLegacyExchangePermissionsSetup /PrepareSchemaSetup /PrepareAD [/OrganizationName:YOUR_DOMAIN]Setup /PrepareDomain&#160;   Link state suppression deaktivieren &#160;In Exchange Server 2003 wurde für einen Server, der keine Connectoren besitzt ein anderer Pfad für den Versand gesucht. Diese Option wird ab Exchange 2007 nicht mehr unterstützt. Um die Koexistenz zu gewährleisten muss dieses Feature auf allen Exchange 2003 Server deaktiviert werden&#160;   Open Registry Editor.    Locate HKEY_LOCAL_MACHINE\\\\\\\\System\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\RESvc\\\\\\\\Parameters.    Right-click Parameters and select New | DWORD value. Name the new DWORD value SuppressStateChanges.    Double-click SuppressStateChanges.    In the Value data field, enter 1.    Close Registry Editor, and then restart the SMTP service, the Microsoft Exchange Routing Engine service, and the Microsoft Exchange MTA Stacks services for the change to take effect. &#160;   Exchange 2010 System Requirements &#160;Mit folgendem Kommando werden die nötigen Requirements auf dem Exchange Server installiert&#160;Add-WindowsFeature NET-Framework,RSAT-ADDS,Web-Server,Web-Basic-Auth,Web-Windows-Auth,Web-Metabase,Web-Net-Ext,Web-Lgcy-Mgmt-Console,WAS-Process-Model,RSAT-Web-Server,Web-ISAPI-Ext,Web-Digest-Auth,Web-Dyn-Compression,NET-HTTP-Activation,RPC-Over-HTTP-Proxy –Restart&#160;Zudem beim Dienst NetTCPPortSharing den Starttyp auf Automatisch setzen:&#160;Set-Service NetTcpPortSharing -StartupType Automatic&#160;&#160;Installation Client Access Rolle&#160;Als erstes wird die Rolle “Client Access” installiert&#160; &#160; &#160;Wenn der Server z.B. über OWA erreicht werden soll muss noch die externe Adresse angegeben werden (Bsp: mail.contoso.com)&#160; &#160;Zertifikate installieren&#160;Der nächste Schritt besteht darin die Zertifikate einzufügen und zu registrieren. Über den Exchange Zertifikatwizzard kann ein neues Exchange Zertifikat erstellt werden:&#160; &#160;Jetzt müssen noch alle erforderlichen Optionen angegeben werden bevor die Anforderung erstellt werden kann:&#160; &#160;Die Anforderung kann jetzt gespeichert werden. Diese muss dann über die Zertifizierungsstelle eingereicht werden und man erhält sein Zertifikat. Nachdem das Zertifikat ausgestellt wurde kann es über die Console der Anfrage hinzugefügt werden. Jetzt muss man dem Zertifikat noch die entsprechenden Dienste zuweisen:&#160; &#160;Installation Hub Transport Rolle&#160;Jetzt wird die Rolle “Hub Transport” installiert.&#160; &#160;Das Setup Programm weist darauf hin, dass es einen Connector benötigt um Mails von / zu den Exchange 2003 Servers zu senden. Es muss der Server ausgewählt werden, der zur gleichen Routinggruppe wie der Exchange Server 2010 zählt sofern mehrere 2003 Server in unterschiedlichen Standorten vorhanden sind.&#160;Wenn das Microsoft Filter Pack nicht installiert wurde wird man darauf hingewiesen es nach zu installieren:&#160; &#160;Damit Active Sync in einer Exchange 2003 / 2010 Umgebung weiterhin funktioniert, muss die Authentifizierung für die Virtual Directory auf integrierte Windows Authentifizierung geändert werden.Zuerst muss der Hotfix KB937031 auf den Exchange 2003 Servern installiert werden um die entsprechende Einstellung setzen zu können.Nachdem der Hotfix auf dem Exchange Server 2003 installiert wurde, lassen sich die Einstellungen für das ActiveSync virtuelle Verzeichnis ändern. Die Authentifizierung kann jetzt auf &quot;Integrierte Windows-Authentifizierung&quot; geändert werden&#160; &#160;Installation Mailbox Rolle&#160;Jetzt wird die Mailbox Rolle installiert.&#160; &#160;Jetzt verfügt man über ein vollwertige Exchange 2010 Installation. Für den Betrieb des Servers müssen noch einige Einstellungen vorgenommen werden.&#160;Offline Adressbuch&#160;Das offline Adressbuch muss auf den Exchange 2010 verschoben werden. Dies kann über die Console unter den Organisationseinstellungen gemacht werden. Zudem muss die Einstellung für den Webverteilung aktiviert werden. (Ab Outlook 2007 wird das Adressbuch über die Webservices geladen)&#160; &#160;Send Connector erstellen&#160;Es wird ein neuer Send Connector erstellt, der für Exchange 2010 fungiert. Danach wird der alte Exchange 2003 Connector gelöscht.&#160; &#160;Receive Connector konfigurieren&#160;Damit der Exchange Server Mails annimmt, muss ein neuer Connector erstellt werden, der für den anonymen Zugriff freigeschalten wird.&#160; &#160;Kompatibilität Outlook 2003&#160;Outlook 2010, 2007 verwenden Standardmäßig die PRC Verschlüsselung, 2003 nicht. Bei Exchange Server 2010 werden per default nur verschlüsselte RPC Verbindungen angenommen. Dies kann jedoch mit folgendem Befehl über die Shell abgeschaltet werden:&#160;Set-RPCClientAccess – Server –YOURSERVER –EncryptionRequired $false&#160;&#160; Öffentliche Ordner, Free / Busy Informationen synchronisieren&#160;Um die Öffentlichen Ordner auf Exchange 2010 zu verschieben müssen diese repliziert werden. Diese Einstellungen werden auf dem Exchange 2003 vorgenommen. Hierzu wird der Exchange Server 2010 als Replikationspartner den Ordnern “Offline Address Book” und “Schedule + Free Busy” hinzugefügt.&#160; &#160;Nachdem die Informationen repliziert wurden kann das Replikat von den Exchange 2003 Servern entfernt werden.&#160;Adresslisten konvertieren&#160;Um die Exchange 2003 Adresslisten in Exchange 2010 bearbeiten zu können müssen diese erst konvertiert werden (Exchange 2003 benutzte LDAP Filter). Dies wird über die Shell gemacht. &#160;Die Adresslisten können mit den folgenden Kommandos geupdatet werden:&#160;Bsp: Adressliste Verwaltung die auf die Abteilung gefiltert wird&#160;Set-AddressList &quot;Verwaltung&quot; -IncludedRecpients MailboxUsersSet-AddressList &quot;Verwaltung&quot; -ConditionalDepartment Verwaltung&#160;Addresspolicy updaten&#160;Auch die Addresspolicy muss geupdatet werden, sonst erhält man folgende Meldung:&#160; &#160;Das Update kann über folgenden Befehl gemacht werden:&#160;Set-EmailAddressPolicy “Default Policy” –IncludedRecipients AllRecipients&#160;&#160;Die Exchange Installation ist nun komplett und man kann beginnen die Mailboxen zu verschieben.     Wichtig: Nach der Installation sollte der Exchange BPA ausgeführt werden um sämtliche Einstellungen und Funktionen zu verifizieren.&#160;Fehler&#160;Während dem Upgrade bin ich auf mehrere Fehler gestoßen die ich hier kurz samt Lösung erläutere:&#160;Fehler 1&#160;Log Name: ApplicationSource: MSExchange MailTipsDate: 12.07.2010 15:40:53Event ID: 14003Task Category: MailTipsLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Unable to create Group Metrics distribution share.Share: GroupMetricsDirectory: C:\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V14\\\\\\\\GroupMetricsMessage: 00000842&#160;Um diese Fehlermeldung zu beheben habe ich den Starttyp des Dienstes “Microsoft Echange Service Host” auf Automatic (Delayed Start) gesetzt&#160;Fehler 2&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:07:45Event ID: 9323Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Entry 'Benutzer1' has invalid or expired e-mail certificates. These certificates will not be included in the offline address list for '\\\\\\\\oGAL'. - \\\\\\\\Offline-EX2k10 &#160;Das bedeutet, dass Benutzer1 Fehlerhafte Zertifikate in AD besitzt. Diese müssen gelöscht werden (vorher in AD die erweiterten Eigenschaften einblenden).&#160; &#160;Fehler 3&#160;Log Name: ApplicationSource: MSExchangeSADate: 12.07.2010 16:14:01Event ID: 9359Task Category: (13)Level: WarningKeywords: ClassicUser: N/AComputer: EX2k10.***Description:OALGen truncated or dropped properties for entry 'Discovery Search Mailbox' in address list '\\\\\\\\oGAL’ because they exceeded the configured size limits for the version 4 offline address list. The affected MAPI ids are: 8cd8. - \\\\\\\\Offline-EX2k10 &#160;Dieser Fehler kann ignoriert werden, er ist ab Design so.&#160;Fehler 4&#160;Log Name: ApplicationSource: MSExchange ActiveSyncDate: 15.07.2010 09:50:07Event ID: 1053Task Category: ConfigurationLevel: ErrorKeywords: ClassicUser: N/AComputer: EX2k10.***Description:Exchange ActiveSync doesn't have sufficient permissions to create the &quot;CN=Daniel Nitz,OU=***,OU=****,DC=***,DC=local&quot; container under Active Directory user &quot;Active Directory operation failed on **********. This error is not retriable. Additional information: Access is denied.Active directory response: 00000005: SecErr: DSID-03151E04, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0&quot;.Make sure the user has inherited permission granted to domain\\\\\\\\Exchange Servers to allow List, Create child, Delete child of object type &quot;msExchangeActiveSyncDevices&quot; and doesn't have any deny permissions that block such operations.&#160;&#160;Hier gibt es ein Rechte-Problem. Bei den User wurde wahrscheinlich in AD die Vererbung deaktiviert.&#160;Fehler 5&#160;Fehler beim Download des Offline Adressbuches:&#160; &#160;Dieser Fehler kann behoben werden, indem im IIS des Exchange Servers im virtual Directory “OAB” die Einstellung gesetzt wird, dass nicht mehr SSL erzwunden werden muss.&#160; &#160;Viel Spaß bei der Migration zu Exchange Server 2010!&#160;Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/upgrade-exchange-2k3-2010/\\\"},{  \\\"id\\\": \\\"post-forefront-tmg-2010e28093rsa-authentication-manager-71\\\",  \\\"title\\\": \\\"Forefront TMG 2010–RSA Authentication Manager 7.1\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"&nbsp;Wer das Vergn&uuml;gen hat die beiden genannten Systeme zum kommunizieren zu bewegen wird sich &uuml;ber die &uuml;ppige Dokumentation freuen die es zu den Vorg&auml;ngerprodukten gibt&hellip; die&nbsp;hilft so gut wie gar nicht weiter.&nbsp;Ich gehe davon aus das RSA Authentication Manager 7.1 Sp3 bereits installiert wurde, ein Realm bzw. Security Domain eingerichtet wurde. Man meldet sich also an der RSA Security Console an und erstellt einen neuen &ldquo;Authentication Agent&rdquo;. Dazu klickt man auf Access, Authentication Agents, Add New.&nbsp;&nbsp;Jetzt m&uuml;ssen die Felder ausgef&uuml;llt werden, also der Hostname des TMG Servers (Array), die IP Adressen die dazu geh&ouml;ren (nat&uuml;rlich nur die vom betreffenden Netzwerk). Bei Agent Type habe ich Standard Agent verwendet und das funktioniert, habe leider keine Dokumentation gefunden aus der hervorgeht welchen Typ man verwenden sollte. Bei &ldquo;Agent may be Accessed by&rdquo; kann konfiguriert werden ob sich alle (aktiven) Benutzer &uuml;ber den Authentication Agent anmeldn k&ouml;nnen oder nur Mitglieder bestimmter Gruppen.Anschli&szlig;end muss man nur noch auf Save klicken und der Authentication Agent ist erstellt.&nbsp;Jetzt braucht man eine Konfigurationsdatei f&uuml;r TMG Server. Also wieder auf Access, Authentication Agents klicken und dieses mal &ldquo;Genereate Configuration File&rdquo; w&auml;hlen.&nbsp;&nbsp;Wenn man dann auf &ldquo;Generate Config File&rdquo; klickt, erh&auml;lt man eine Zip Datei die eine Datei sdconf.rec beinhaltet. Diese Datei muss auf allen TMG Array Mitgliedern in folgende Pfade kopiert werden.%windir%\\\\\\\\system32%programfiles%\\\\\\\\Microsoft Forefront Threat Management Gateway\\\\\\\\sdconfig&nbsp;Achtung: Die Datei muss unbedingt an beiden Orten vorhanden sein, sonst kommt es zu Fehlern wie: &ldquo;106: The Web Server is busy. Try again later.&rdquo;&nbsp;Die RSA betreffende Konfiguration ist damit eigentlich schon abgeschlossen. Also sehen wir uns die Ver&ouml;ffentlichung am TMG an.&nbsp;Es wird einfach eine normale Web Ver&ouml;ffentlichung konfiguriert, beim erstellen des Web Listeners ist auf folgendes Acht zu geben:&nbsp;&nbsp;Die Authentifizierung erfolgt &uuml;ber ein HTML Formular, wenn hier noch &ldquo;Collect addinoal delegation in the form&rdquo; ausgew&auml;hlt wird kann der Benutzer zus&auml;tzlich zum Username und RSA Passcode noch sein Active Directory Kennwort eingeben und TMG leitet es an den Web Server weiter. Daf&uuml;r muss dann bei der Ver&ouml;ffentlichungsregel die Authentication Delegation auf Basic gesetzt werden und der Web Server dahinter muss nat&uuml;rlich Basic Authentication akzeptieren.&nbsp;&nbsp;Das Integrierte HTML Formular von TMG sieht dann je nach Einstellung so aus. Will man OWA ver&ouml;ffentlichen kann man verwendet man nat&uuml;rlich besser den Assistant &ldquo;Publish Exchange Web Client Access&rdquo;. Achtung: Auf den Client Access Servern muss Basic Authentication aktiviert werden (Server Configuration, Client Access, owa).&nbsp;&nbsp;Achtung: Mutlihomed TMGForefront TMG wird in den allermeisten Konfigurationen mit mehreren Netzwerkkarten installiert, ist ja schlie&szlig;lich eine Firewall. Dadurch wei&szlig; TMG (genauer gesagt ACEClient) nicht &uuml;ber welche Netzwerkkarte er den RSA Server erreichen kann, man sieht im Event Log die Warnung: &ldquo;Multihomed host detected; Primary IP assumed is : x.x.x.x&rdquo;. Die Event ID ist 1012 die Source ACECLIENT.Das kann man beheben indem man zu Schl&uuml;ssel HKLM\\\\\\\\Software\\\\\\\\SDTI einen Schl&uuml;ssel ACIClient hinzuf&uuml;gt. Dieser bekommt dann einen String Value mit dem Namen &ldquo;PrimaryInterfaceIP&rdquo;. Der Wert entspricht der IP Adresse, des TMG, &uuml;ber die der RSA Server erreicht werden kann.&nbsp;&nbsp;Viele Gr&uuml;&szlig;etom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/forefront-tmg-2010e28093rsa-authentication-manager-71/\\\"},{  \\\"id\\\": \\\"post-apple-ipad\\\",  \\\"title\\\": \\\"Apple IPad\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Gerade eben hatte ich zum ersten Mal das Vergn&uuml;gen ein IPad zu testen. Es waren zwar nur wenige Minuten aber einen ersten Eindruck habe ich von dem Ding:Die Verarbeitung scheint sehr gut, das Ger&auml;t f&uuml;hlt sich hochwertig an. Mit 730 Gramm ist das 3G Modell allerdings ziemlich schwer.Das Display ist sehr scharf, wie es in der Sonne ist kann ich nicht sagen, im Raum ist es jedoch ausreichend hell und klar. Wird das IPad auf die Seite gedreht, dreht sich das Bild mit, sowas kennt man ja schon.Die Bedienung finde ich innovativ, ist ja auch von Apple ;) Der EBook Reader ist einfach zu bedienen, sonstige Features wie IPod und Web Browser sind nat&uuml;rlich super und bereiten dem Benutzer viel spa&szlig;. Sogar Filme kann man mit dem Ding anschauen.F&uuml;r mich w&auml;re das Ger&auml;t dennoch nichts, ich habe keinen wirklichen Verwendungszweck und nur zum Rumspielen ist Preis (in dem Fall 702&euro;) einfach zu hoch.Das Beste zum Schluss: als ich den Browser &ouml;ffnete kam als Startseite&hellip; na was schon&hellip; Bing zum Vorschein! Da konnte ich mir ein Grinsen nicht verkneifen.so long, tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/apple-ipad/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-entourage-web-services-edition-ews-attachement-size\\\",  \\\"title\\\": \\\"Exchange 2010 Entourage Web Services Edition- EWS Attachement Size\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"&nbsp;Auch MAC Clients k&ouml;nnen mit Exchange 2010 arbeiten. Daf&uuml;r gibt es entweder den Microsoft Entourage Client oder den integrierten MAC Mail Client. Entourage muss in der Web Services Edition verwendet werden, da Exchange 2010 kein WebDAV mehr unterst&uuml;tzt, die aktuelle Version von MAC Mail (Snow Leopard) macht das von Haus aus.&nbsp;Will man allerdings einen Anhang gr&ouml;&szlig;er als ca. 12MB verschicken meckert sowohl Entourage als auch MAC Mail. Entourage bringt folgende Fehlermeldung: &ldquo;HTTP-Fehler: Die Anforderung kann vom Server nicht verarbeitet werden&rdquo;.&nbsp;&nbsp;Man kontrolliert also erstmal die Gr&ouml;&szlig;enbeschr&auml;nkungen der betreffenden Mailbox, die der Send und Receive Connectoren und in der Transport Konfiguration, am schnellsten geht das wohl in der Management Shell mit folgenden cmdlets:get-TransportConfig | fl maxSendSize get-SendConnector | fl name, maxMessageSize get-ReceiveConnector | fl name, maxMessageSize get-Mailbox name | fl maxSendSize&nbsp;Sind die Werte an diesen Stellen ok, dann kann der User mit dem Microsoft Office Outlook Client den Anhang ohne Probleme senden, nur mit Entourage bzw. Mac Mail tritt das Problem auf.&nbsp;Das Problem liegt am Exchange Web Service, das ist eine ASP.NET Applikation und verwendet daher Konfigurationsdateien aus der IIS Konfiguration. Diese k&ouml;nnen in weder in der EMS noch in EMC gesehen bzw. ge&auml;ndert werden.&nbsp;Nun gibt es leider keine ausreichende Dokumentation von Microsoft, also versuche ich hier alles, was in den tiefen des Internet herumschwirrt, zusammenzufassen.&nbsp;BackupAchtung: Vor der Bearbeitung von Konfigurationsdateien unbedingt ein Backup der Datei erstellen!!&nbsp;EWS Treten die Probleme nur im Zusammenhang mit EWS auf reicht folgende &Auml;nderung der Konfiguration am Client Access Server (bzw. an alles CAS wenn mehrere im Einsatz sind):&nbsp;In der Datei %windir%\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V14\\\\\\\\ClientAccess\\\\\\\\exchweb\\\\\\\\ews\\\\\\\\web.config muss der Wert von &ldquo;maxReceivedMessageSize&rdquo; unter &lt;EWSMessageEncoderSoap11Element /&gt; ge&auml;ndert werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;EWSMessageEncoderSoap11Element /&gt; &lt;httpsTransport maxReceivedMessageSize=\\\\\\\"52428800\\\\\\\" &hellip;.&gt; &nbsp;Mit appcmd.exe muss noch der Wert von maxAllowedContentLength angepasst werden, ACHTUNG: Angabe in Byte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt appcmd set config \\\\\\\"Default Web Site/ews\\\\\\\" -section:requestFiltering /requestLimits.maxAllowedContentLength:52428800 &nbsp;In manchen Foren bzw. anderen Blogs findet man immer wieder den Parameter &ldquo;maxRequestLength&rdquo; der auch in der web.config Datei vom EWS angepasst werden soll. Allerdings hat dieser Parameter per Default schon den gr&ouml;&szlig;tm&ouml;glichen Wert eingestellt, ich rate also davon ab diesen Parameter zu ver&auml;ndern.&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;OWADieses Problem gibt es auch in Outlook Web App, man kann standardm&auml;&szlig;ig keine Anh&auml;nge &uuml;ber 30MB hochladen. Auch hier ist wieder eine Einstellung in der web.config schuld. OWA ist eine ASP.NET Anwendung und die maximale Gr&ouml;&szlig;e der zu &uuml;bertragenden Daten wird mit dem Parameter maxRequestLength konfiguriert.Hier wird also diese Einstellung interessant, in der web.config von OWA ist diese n&auml;mlich per Default auf 30000 gesetzt.&nbsp;In der Datei %windir%\\\\\\\\Program Files\\\\\\\\Microsoft\\\\\\\\Exchange Server\\\\\\\\V14\\\\\\\\ClientAccess\\\\\\\\Owa\\\\\\\\web.config muss der Wert von maxRequestLength ge&auml;ndert werden, ACHTUNG: Angabe in KiloByte!! Im folgenden Beispiel wird der Wert auf 50MB gesetzt &lt;httpRuntime maxRequestLength=\\\\\\\"51200\\\\\\\" /&gt;&nbsp;Die Internet Information Services m&uuml;ssen neu gestartet werden (iisreset) um die &Auml;nderung zu &uuml;bernehmen.&nbsp;F&uuml;r dieses Problem gibt es sogar einen Artikel im TechNet: Configure Maximum Message Size in Outlook Web App&nbsp;&nbsp;Tipp: Man kann mit der PowerShell ganz einfach Werte in Byte und wieder Retour konvertieren. Einfach mal 50mb eintippen und versuchen.&nbsp;&nbsp;Naja, ich hoffe ich kann damit einigen weiterhelfen.&nbsp;Gr&uuml;&szlig;etom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-entourage-web-services-edition-ews-attachement-size/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-backup\\\",  \\\"title\\\": \\\"Exchange 2010 – Backup\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Dies ist der erste Teil einer Exchange Backup und Restore Serie.    Der zweite Teil folgt in kürze.Datensicherung ist in Exchange 2010 ein umfangreiches Thema. Für die Widerherstellung von einzelnen Elementen (Mails, Kontakte…) bietet sich z.B. der Dumpster an, dazu aber ein anderes Mal mehr. In diesem Beitrag möchte ich Datensicherung im klassischen Sinn behandeln, also Backup von Servern und Datenbanken.Backup SoftwareExchange 2010 verwendet den Windows eigenen VSS Dienst, kann also nur mit einer Backup Applikation gesichert werden die diesen Service unterstützt. Für Tests eignet sich natürlich Windows Backup von Server 2008R2, will man das Ganze in einer größeren Umgebung betreiben empfiehlt sich der Data Protection Manager.System State BackupJeder Server sollte regelmäßig gesichert werden, dazu gehört ein Backup des System Volumes und des System State. System State Backups enthalten die Registry sowie die Boot Dateien und COM+ Class Registration Datenbank. Je nach installierter Serverrolle (ADDS, IIS…) werden weitere Informationen gesichert.Mit einem System State Backup kann der Zustand des Servers (und der installierten Rollen/Applikationen) zum Zeitpunkt des Backups widerhergestellt werden.Single Server BackupWenn alle Rollen auf einem Server installiert sind müssen der System State sowie die Volumes mit den Datenbanken und Logdateien gesichert werden.Backup von Client Access ServernAuf CA Servern befinden sich keine Daten die speziell gesichert werden müssen, diese Serverrolle sollte ohnehin ausfallsicher designed werden, da der Clientzugriff im Fehlerfall sonst nicht mehr möglich ist. Die Konfiguration kann aus dem System State Backup widerhergestellt werden.Allerdings sollte man nicht vergessen das IIS Log Verzeichnis (C:\\\\\\\\inetpub\\\\\\\\logs\\\\\\\\LogFiles\\\\\\\\W3SVC1) zu überwachen bzw. alte Logs kontinuierlich zu löschen.Backup von Hub Transport ServernEs sind keine Daten auf Hub Transport Servern vorhanden ohne die eine Exchange Umgebung nicht widerhergestellt werden könnte, allerdings ist es für spätere Analyse Sinnvoll die Message Tracking Logs sowie die Protocol Logs zu sichern. Diese befinden sich im Exchange Installationsordner unter \\\\\\\\Transportroles\\\\\\\\Logs und können einfach auf File-Ebene gesichert werden.Die Konfiguration des Transport Servers wird im Active Directory gespeichert, auch diese Serverrolle sollte ausfallsicher designed werden.Backup von Edge Transport ServernEdge Transport Server speicher die Konfiguration im Active Directory, im Fehlerfall kann man einfach den Server neu aufsetzen und die EdgeSync neu einrichten. Alternativ kann man mit Cloned Configuration arbeiten, also die Konfiguration exportieren und auf dem neuen Server wieder importieren, dazu mehr in einem anderen Beitrag. Die Logs die auf Hub Transport Servern gesichert werden sollten befinden sich bei Edge Transport Servern an der selben Stelle und sollten aus dem selben Grund gesichert werden.Backup von Unified Messaging ServernDie für die Konfiguration relevanten Informationen werden in der Active Directory gespeichert, einzig die Audio Prompts können auf File- Ebene gesichert werden, diese befinden sich im Exchange Installationsordner unter \\\\\\\\UnifiedMessaging\\\\\\\\Prompts.Backup von Mailbox ServernAuf den Servern auf denen die Mailbox Rolle installiert ist befinden sich die Datenbank und Transaction Log Files, diese müssen auf jeden Fall gesichert werden. Wird eine Sicherung mit Windows Backup durchgeführt muss jeweils das gesamte Volume auf dem die Datenbank bzw. Log Files liegen ausgewählt werden. Von diesen Volumes muss ein “Full VSS&quot; Backup gemacht werden, nur so merkt Exchange dass die Daten gesichert wurden und löscht die entsprechenden Log Files.Backup der Active DirectoryExchange Server speichert viele Daten und Einstellungen in der Active Directory und ist extrem Abhängig von einer funktionstüchtigen Umgebung. Daher sollten natürlich auch Domain Controller regelmäßig gesichert werden. Hierfür reicht ein System State Backup aus, dieses enthält alle Daten/Einstellungen der AD.Backups und DAGSind die Exchange Server die gesichert werden sollen Mitglieder einer Database Availability Group (DAG) ändern sich die Gründe für eine Datensicherung. Da es bis zu 16 Kopien einer Mailbox innerhalb der DAG geben kann, ist das Backup nicht mehr der einzige Ausweg wenn die aktive Kopie der Datenbank offline geht. Fällt ein Mitglied einer DAG aus, werden die Datenbanken die auf diesem Server aktiv waren vom Server mit der nächst-höheren Priorität übernommen (natürlich muss es eine Kopie der Datenbank dort geben). So ist man bei einem Ausfall eines Mailboxservers gut gerüstet, allerdings kann es auch zu einem Datenbankfehler kommen, dafür gibt es aber folgende alternative zum Backup.Datenbank Kopien werden standardmäßig aktuell gehalten, d.h. eine Änderung wird sofort an alle Mitglieder der DAG repliziert. Man kann allerdings eine Verzögerung (ReplayLagTime) konfigurieren und so z.B. auf einem Server ältere Versionen der Datenbanken halten. Tritt nun ein Datenbankfehler auf, kann die ältere Datenbank verwendet werden ohne umständliches Restore von Tape oder woher auch immer.Ein weiterer Effekt des Backups ist das löschen der Log Files, sollte man also auf regelmäßige Backups verzichten muss man wohl oder übel Circular Logging für die Datenbanken aktivieren um ein überlaufen der Festplatten zu verhindern.Diese neue Möglichkeit der Hochverfügbarkeit bringt sicher viele Vorteile, jedoch sollte man meiner Meinung nach nicht auf ein Backup verzichten. Ich empfehle regelmäßige System State Backups von allen Servern. Die Datenbanken würde ich auf jeden Fall auch sichern und das Backup und Restore Szenario ausreichend testen und dokumentieren!Soweit mal zum Thema Backup, viele Grüße   tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-backup/\\\"},{  \\\"id\\\": \\\"post-migration-sharepoint-services-v3-zu-sharepoint-foundation-2010\\\",  \\\"title\\\": \\\"Migration Sharepoint Services v3 zu Sharepoint Foundation 2010\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Heute habe ich die Migration von den Sharepoint Services 3 auf die Version 2010 Foundation abgeschlossen. Während der Umstellung bin ich auf mehrere Probleme gestoßen, die ich mit diesem Post im einzelnen aufzeigen werden. Vielleicht erspart das dem ein oder anderen von euch Zeit nach einer Lösung zu suchen.Problem 1 – Fehler 7043 (Sharepoint Foundation) im EventLog Anwendung Lösung: Im Ordner C:\\\\\\\\Program Files\\\\\\\\Common Files\\\\\\\\Microsoft Shared\\\\\\\\Web Server Extensions\\\\\\\\14\\\\\\\\TEMPLATE\\\\\\\\CONTROLTEMPLATES befindet sich die Datei SearchArea.ascx. Diese Datei wird in der Version 2010 nicht benötigt und kann umbenannt werden (Bsp: SearchArea.ascx.old)Problem 2 – Fehler 7009 und 7000 (Service Control Manager) im EventLog System  Lösung: Es kann passieren, dass der Dienst “Claim to Windows Token Service” beim Systemstart nicht starten kann. Sobald der Start-Typ von “Automatisch” auf “Automatisch (Verzögerter Start)” gesetzt wird, startet der Dienst normal, jedoch ein wenig später als die anderen Dienste.&#160;Problem 3 – Fehler 6398 und 5586 (Sharepoint Foundation) im EventLog Anwendung  Lösung: Sharepoint Zentraladministration öffnen und zum Punkt Sicherheit wechseln. Im Menüpunkt Dienstkonten konfigurieren den richtigen Webanwendungspool auswählen und das entsprechende Konto angeben. Mit OK bestätigen sodass das Konto nochmal registriert wird.&#160;Problem 4: Backup der Sharepoint FarmWenn ihr Versucht ein Backup der Sharepoint Farm zu erstellen, bekommt ihr den Hinweis, dass der Verwaltungsdienst angehalten wurde. ACHTUNG: Es geht auch noch schlimmer: Wenn ihr wie ich eure Sharepoint Farm über das Befehlszeilentool stsadm.exe sichert, sind die Menüelemente auf der Sharepoint Webseite während und nach der Sicherung gesperrt. Wenn ihr die Berechtigungen prüft werdet ihr sehen, dass ihr nicht mehr über ausreichend Berechtigungen verfügt um irgendwas an der Webseite zu ändern bzw. hochzuladen zu löschen usw. Auch könnt ihr die Eigenschaften der Webseite nicht mehr öffnen oder bearbeiten.Lösung: Das Problem lässt sich durch einen ganz einfachen Handgriff beheben. Nach der Installation ist der Dienst “Sharepoint 2010 Administration” auf Start-Typ Manuell gesetzt und somit nicht aktiv. Ändert das Startverhalten des Dienstes auf Automatisch und ihr könnt wieder normal Backups ziehen und die Steuerelemente aktivieren sich nach der Sicherung wieder.Viel Spaß beim Upgrade auf Foundation 2010, Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/migration-sharepoint-services-v3-zu-sharepoint-foundation-2010/\\\"},{  \\\"id\\\": \\\"post-sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen\\\",  \\\"title\\\": \\\"Sharepoint Foundation 2010 Dateien lassen sich nicht öffnen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Nach einer Standardinstallation von Sharepoint Foundation 2010 lassen sich gewisse Dateien (z.B. PDF) nur downloaden, nicht aber direkt aus der Bibliothek abrufen.&#160;Das ist ein neues Sicherheitsfeature, welches den Browser zwingt die Datei nur zum Download anzubieten. Das Sicherheitsfeature kann in der Sharepoint Zentraladministration deaktiviert werden.Anwendungsverwaltung / Webanwendungen verwalten die entsprechende Webanwendungs auswählen, unter Allgemeine Einstellungen kann nun die Option “Dateiverarbeitung durch den Browser” auf Berechtigt gesetzt werden.  Nun können die Dateien wieder direkt aus der Bibliothek geöffnet werden.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen/\\\"},{  \\\"id\\\": \\\"post-distributedcom-fehler-10016-fehlende-berechtigungen\\\",  \\\"title\\\": \\\"DistributedCOM Fehler 10016, fehlende Berechtigungen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2008\\\",\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Wenn auf euren Server DistributedCOM Fehler mit der ID 10016 vorkommen, so bedeutet das meist, dass erforderliche Berechtigungen fehlen.Beispiel: Der Benutzer NETZWERKDIENST hat keine Berechtigung die Komponente mit der ID 000C101C-0000-0000-C000-000000000046 zu aktivieren In diesem Fall muss dem Benutzer NETZWERKDIENST lediglich das Benutzerrecht gegeben werden um die jeweilige Komponente zu starten. Als erstes wird die Komponente über das Tool Komponentendienste gesucht. Wenn ihr die Einstellungen der Komponente nicht ändern könnt, habt ihr selbst nicht die notwendigen Berechtigungen.  Die könnt ihr euch aber selber zuweisen indem ihr in der Registry unter HKEY_CLASSES_ROOT\\\\\\\\AppID den Schlüssel mit der ID sucht und in den Berechtigungen der Gruppe Administratoren oder euch selbst den Besitz übertragt und das Recht Vollzugriff gebt. Danach lassen sich die Einstellungen der Komponente ändern und ihr könnt den jeweiligen Benutzer die erforderlichen Rechte geben.&#160;Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/distributedcom-fehler-10016-fehlende-berechtigungen/\\\"},{  \\\"id\\\": \\\"post-windows-virtual-pc-interner-dhcp-server\\\",  \\\"title\\\": \\\"Windows Virtual PC / interner DHCP Server\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Wenn man mit Windows Virtual PC eine DHCP Infrastruktur virtualisiert, wird der Client keine IP-Adresse bekommen, sofern die Netzwerke auf “Internes Netzwerk” geschalten wurden.    Das Verhalten ist weniger ein Problem, sondern ein Feature, das sich leicht deaktivieren lässt.     Sobald man die Netzwerkeinstellungen des Clients auf “Internes Netzwerk” ändert, erhalt er eine Adresse aus dem Pool 196.254.0.16 – 196.254.10.254 (APIPA ist von 169.254.0.0-196.254.255.255)        Um diesen internen DHCP Server zu deaktivieren müssen zuerst alle VM’s heruntergefahren bzw. gespeichert werden. Dann muss folgende Datei geöffnet werden:%localappdata%\\\\\\\\microsoft\\\\\\\\Windows Virtual PC\\\\\\\\options.xml        In dieser Datei tauschen wir im Abschnitt dhcp enabled den Wert TRUE durch FALSE.         Nach dieser Änderung kann der Client IP Adressen vom aufgesetzten DHCP Server empfangen.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-virtual-pc-interner-dhcp-server/\\\"},{  \\\"id\\\": \\\"post-ntsystems-update\\\",  \\\"title\\\": \\\"ntSystems - Update\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Heute habe ich die Blog Platform von ntSystems aktualisiert. Wir verwenden nun die aktuellste Version von BlogEngine.NET.Das neue Theme ist in Bearbeitung, wird in den n&auml;chsten Tagen Online sein.Bis dahin, stay tuned!twitter.com/torgglertwitter.com/nitz_d\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/ntsystems-update/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-safelist-aggregation\\\",  \\\"title\\\": \\\"Exchange 2010 – SafeList Aggregation\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"In Exchange 2010 gibt es viele M&ouml;glichkeiten sich vor Spam zu sch&uuml;tzen, unter anderem kann jeder User seine pers&ouml;nliche Black- und White List in den Outlook Junk-E-Mail Optionen pflegen.Ist ein Edge Transport Server in der Exchange Organisation vorhanden, kann man diese pers&ouml;nlichen Listen direkt an der Edge, also an der ersten M&ouml;glichkeit anwenden und so die Effizienz steigern und false positives verringern. Ist die SafeList Aggregation aktiviert werden sichere Mails dem Empf&auml;nger direkt zugestellt, ohne von weitern Filter Agents gepr&uuml;ft zu werden. Au&szlig;erdem werden die blockierten Absender bei der ersten M&ouml;glichkeit blockiert.Sichere Absender sind alle (E-Mail Adressen oder Domains) die in der entsprechenden Liste eingetragen sind. Outlook Kontakte und E-Mail Adressen an die der Benutzer eine Nachricht sendet k&ouml;nnen optional ausgew&auml;hlt werden. Die Informationen die der Benutzer in Outlook konfiguriert werden als sogenannte SafeList Collection auf dem Mailbox Server des Benutzers gespeichert. Eine SafeList Collection kann bis zu 1024 Eintr&auml;ge beinhalten.Das Update-SafeList cmdlet aktualisiert diese Collection im ActiveDriectory, dort werden die Informationen (Hashes) in den Attributen msExchSafeSenderHash, msExchSafeRecipientHash, und msExchBlockedSendersHash gespeichert.&Uuml;ber den EdgeSync Service werden die Attribute dann mit der ADLDS Instanz am Edge Transport Server synchronisiert (one-way).Will man also die SafeList Collection eines einzelnen Users aktualisieren verwendet man &ldquo;update-safelist mail.box&rdquo;.Sollen die Collections aller Mailboxen aktualisiert werden dann kann man das z.B. so machen: Get-Mailbox | Update-SafeList. Um die Edge Synchronisierung anzusto&szlig;en (Testumgebung) kann man noch Start-EdgeSychronization verwenden.Wenn es sich um eine gr&ouml;&szlig;ere Organisation handelt werden mit Get-Mailbox wom&ouml;glich nicht alle Mailboxen zur&uuml;ckgegeben, daf&uuml;r eignet sich folgende Kommandos.Set-AdServerSettings -ViewEntireForest $true Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox | Update-SafelistWenn man diese beiden Kommandos in einer Datei speichert kann man einfach einen geplanten Task erstellen der die SafeList automatisch aktualisiert.Achtung: Damit die SafeList Aggregation funktioniert muss der Content Filtering Agent am Edge Transport Server laufen. Das kann mit &ldquo;Get-ContentFilterConfig&rdquo; einfach &uuml;berpr&uuml;ft werden.tomt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-safelist-aggregation/\\\"},{  \\\"id\\\": \\\"post-tpm-bitlocker-schlussel-in-ad-ds-speichern\\\",  \\\"title\\\": \\\"TPM / BitLocker Schlüssel in AD DS speichern\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"de\\\",\\\"Server\\\",\\\"Server-2008\\\",\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Wenn BitLocker im Unternehmen aktiviert wird, empfiehlt es sich die Wiederherstellungsinformationen in Active Directory zu sichern. Diese Anleitung richtet sich an Windows Server 2008 / 2008 R2 und Windows 7 als Client-Betriebssystem. Die Anleitung beschreibt, welche Schritte erforderlich sind um TPM- und BitLocker Schl&uuml;ssel in AD DS zu speichern, als Beispiel wird jenes Volume verschl&uuml;sselt, welches das Betriebssystem enth&auml;lt.  Wir unterscheiden hier zwischen 2 diverse Schl&uuml;ssel:TPM: Hierbei wird der Besitzerschl&uuml;ssel des TPM Bausteins in AD DS gespeichert BitLocker: Hierbei handelt es sich um den Wiederherstellungsschl&uuml;ssel f&uuml;r die betreffende PartitionSchritt 1: AD DS zum speichern von TPM Besitzerschl&uuml;ssel vorbereitenAls erstes muss AD DS f&uuml;r das speichern des TPM Besitzerschl&uuml;ssels konfiguriert werden. Sofern Server 2003 als DC verwendet wird, muss vorher noch ein Schema-Update durchgef&uuml;hrt werden. F&uuml;r die Betriebssysteme Server 2008 und Server 2008 R2 ist dies nicht notwendig, da diese die Erweiterung bereits mitbringen.Damit der Client den TPM Besitzerschl&uuml;ssel in AD DS speichern kann, muss das Script Add-TPMSelfWriteACE.vbs auf dem DC ausgef&uuml;hrt werden. Dieses Script setzt die Berechtigungen des Attributs msTPM-OwnerInformation so, dass der Client seinen TPM Schl&uuml;ssel einf&uuml;gen kann.ACHTUNG: Sollte man nicht das Server-Betriebssystem in englischer Sprachversion verwenden, so muss das Script noch angepasst werden: Anstatt die Berechtigung &ldquo;SELF&rdquo; zu setzen, muss diese z.B. f&uuml;r Deutsch in &ldquo;SELBST&rdquo; ersetzt werden. Sonst l&auml;uft das Script nicht erfolgreich durch.Schritt 2: Setzen der GPO&rsquo;sDa nun Active Directory zum speichern von TPM Schl&uuml;sseln vorbereitet ist, setzten wir die Gruppenrichtlinien und weisen den Client an, die Wiederherstellungsschl&uuml;ssel in Active Directory zu speichern.BitLockerComputerkonfiguration / Administrative Vorlagen / Windows-Komponenten / BitLocker Laufwerksverschl&uuml;sselung / Betriebssystemlaufwerke&rdquo;Festlegen, wie BitLocker-gesch&uuml;tzte Betriebssystemlaufwerke wiederhergestellt werden k&ouml;nnen&rdquo;Anhand dieser Richtlinie wei&szlig;en wir den Client an die Wiederherstellungsinformationen in der Active Directory zu speichern. BitLocker kann erst aktiviert werden, sobald die Widerherstellungsinformationen in Active Directory hinterlegt sind.TPMComputerkonfiguration / Administrative Vorlagen / System / Trusted Platform Module-Dienste&ldquo;TPM-Sicherung in Active-Directory-Dom&auml;nendienste aktivieren&rdquo;Anhand dieser Richtlinie wird der Client angewiesen den TPM Besitzerschl&uuml;ssel in der Active Directory zu speichern.Schritt 3: TPM am Client initialisierenWenn der TPM am Client initialisiert wird, wird ein Besitzerschl&uuml;ssel generiert.In Active Directory werden die Informationen im Attribut msTPM-OwnerInformation mitgeschrieben.Schritt 4: Verwaltungsprogramm f&uuml;r BitLocker-Schl&uuml;ssel installierenServer 2008 liefert eine zus&auml;tzliche Registerkarte f&uuml;r Active Directory um BitLocker-Schl&uuml;ssel anzuzeigen. Vorher muss jedoch das Feature Verwaltungsdienstprogramm f&uuml;r BitLocker aktiviert werden.Nach der Aktivierung findet man eine neue Registerkarte in den Computerkonten.&nbsp;Schritt 5: BitLocker aktivieren und Wiederherstellungsschl&uuml;ssel einsehenNun k&ouml;nnen wir am Client BitLocker f&uuml;r das Volume aktivieren, welches das Betriebssystem enth&auml;lt.Nach der Aktivierung kann der Wiederherstellungsschl&uuml;ssel im jeweiligen Computerkonto in der Registerkarte &ldquo;BitLocker-Wiederherstellung&rdquo; eingesehen werden.Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/tpm-bitlocker-schlussel-in-ad-ds-speichern/\\\"},{  \\\"id\\\": \\\"post-wsus-auf-neuen-server-verschieben\\\",  \\\"title\\\": \\\"WSUS auf neuen Server verschieben\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Daniel hat in diesem Artikel bereits dar&uuml;ber geschrieben.Im Gro&szlig;en und Ganzen habe ich die Migration genau gleich gemacht. Also WSUS auf dem neuen Server installiert, WSUS Content kopiert und mit \\\\\\\"wsutil export datei.cab datei.log\\\\\\\" und \\\\\\\"wsutil import datei.cab datei.log\\\\\\\" die Updates importiert. Allerdings wollte ich die Einstellungen nicht manuell &uuml;bernehmen, daf&uuml;r gibt es WSUSMigrate.Man findet das Tool im WSUS TechCenter unter API Samples and Tools. Installiert man diese, erh&auml;lt man diverse zus&auml;tzliche Tools f&uuml;r WSUS, unter anderm WSUSMigrationImport und WSUSMigrationExport mitsamt kurzem HowTo.Also habe ich diese Tools auf dem alten sowie auf dem neuen Server installiert und mit \\\\\\\"WSUSMigrationExport datei.xml\\\\\\\" die Gruppen und Approvals exportiert. Auf dem neuen Server kann man dann mit Parametern entscheiden welche Einstellungen man importieren m&ouml;chte. Die verf&uuml;gbaren Parameter f&uuml;r WSUSMigrationImport sind:TargetGroups -&gt; Importiert nur GruppenApprovals -&gt; Importiert nur Update ApprovalsAll -&gt; Importiert Gruppen und ApprovalsMan kann auch entscheiden was mit den Gruppen passieren soll die es auf dem Zielserver eventuell schon gibt, daf&uuml;r gibt es diese Parameter:None -&gt; Beh&auml;lt die bestehenden GruppenDeleteUnmatchedGroups -&gt; L&ouml;scht Gruppen vom Zielserver die nicht in der XML Datei vorhanden sindNoch ein Beispiel f&uuml;r den Import Befehl:\\\\\\\"WSUSMigrationImport datei.xml All None\\\\\\\" -&gt; Importiert alle Gruppen und Approvals und ver&auml;ndert bestehende Gruppen auf dem Zielserver nicht.so long!tomt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wsus-auf-neuen-server-verschieben/\\\"},{  \\\"id\\\": \\\"post-buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3\\\",  \\\"title\\\": \\\"Buchen einer Ressource in Outlook 2010 mit Exchange 2k3\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Wenn man mit Outlook 2010 &uuml;ber einen Exchange Server in der Version 2003 eine Ressource buchen m&ouml;chte (z.B. Konferenzraum f&uuml;r eine Besprechung) wird das unter Umst&auml;nden nicht funktionieren. Die Besprechungsanfrage wird zwar allen Teilnehmern gesendet und auch im eigenen Kalender eingetragen, die Ressource jedoch nicht gebucht, sprich im Ressourcenkalender nicht eingetragen.  Dieses Problem tretet nur in der Konstellation von Outlook 2010 auf einem Exchange Server 2003 SP* auf.L&ouml;sung: Damit die Ressource wieder gebucht werden kann, muss in der Registry des PC&rsquo;s wo Outlook 2010 installiert ist, folgender Schl&uuml;ssel angelegt werden:HKCU\\\\\\\\Software\\\\\\\\Microsoft\\\\\\\\Office\\\\\\\\14.0\\\\\\\\Outlook\\\\\\\\Options\\\\\\\\CalendarREG_DWORD EnableDirectBooking 1 (HEX)Gr&uuml;&szlig;e dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3/\\\"},{  \\\"id\\\": \\\"post-nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules\\\",  \\\"title\\\": \\\"NLB – Unicast vs. Multicast, Konfiguration, Port Rules\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"UnicastIm Unicast Mode tauscht jeder NLB Knoten seine MAC Adresse mit der Cluster MAC Adresse aus, d.h. alle Knoten haben die gleiche “virtuelle” MAC Adresse.Dieses Konfiguration zwingt den Switch zu “suboptimalem” Verhalten, da die selbe MAC Adresse über mehrere Switchports erreichbar ist, kann der Switch die Adresse nicht “lernen” also sie nicht in seine MAC Address Table aufnehmen und an ein Switchport binden. Alle Pakete an diese MAC Adresse werden vom Switch über alle Ports geflutet. Das führt zu überflüssiger Last am Switch und im gesamten Netzwerk.Ein weiteres Problem ist dass die einzelnen NLB Knoten so nicht mehr miteinander kommunizieren können, dafür wird eine zusätzliche Netzwerkkarte benötigt. Aus diesem Grund wird Unicast Mode mit nur einer Netzwerkkarte nicht empfohlen.Das Fluten von Paketen kann durch erstellen eines eigenen VLAN für die NLB Knoten vermindert werden. So werden Pakete nur innerhalb dieses VLANs geflutet und nicht über den ganzen Switch. MulticastBeim Multicast Mode wird jedem Konten eine Multicast MAC Adresse hinzugefügt, so dass alle Knoten mit zwei Layer2 Adressen ausgestattet sind. Das ermöglicht dem Switch das “lernen” der echten MAC Adressen und den einzelnen Knoten eine Kommunikation untereinander.Damit ein Multicast Cluster auch erreichbar wird müssen statische ARP Einträge am Switch konfiguriert werden, denn Standardmäßig wird die Auflösung von Unicast IPs in Multicast MAC Adressen blockiert. So werden Pakete an die Multicast Adressen nur an die festgelegten Ports weitergeleitet.Cluster im Multicast Mode können auch mit nur einer Netzwerkkarte betrieben werden, aus Performancegründen und verbessertem Management empfehle ich aber die Verwendung zweier Netzwerkkarten.NLB KonfigurationWie bereits oben beschrieben muss im Unicast Mode jeder Knoten zwei Netzwerkkarten besitzen. Im Multicast Mode reicht eine Karte, allerdings ist es eine “Best Practice” zwei zu verwenden.Als erstes muss das Feature installiert werden, ich habe hier deutsch Server, also heißt das Ding: Netzwerklastenausgleich. Das geht entweder über die GUI, oder mit “servermanagercmd –i nlb”. Auch mit PowerShell kann man Features installieren, und zwar mit dem Add-WindowsFeature cmdlet. Dann werden die beiden Netzwerkkarten konfiguriert. Eine wird die Netzwerkkarte für das LAN, sie wird mit IP, Gateway und DNS Server konfiguriert. Ich habe sie in LAN umbenannt. Die zweite Netzwerkkarte wird der dedizierte Adapter für NLB. Diese wird nur mit einer IP Adresse konfiguriert.Ich verwende im LAB 192.168.1.10 als Cluster Adresse. 192.168.1.11 und 192.168.1.12 als Adressen für die Netzwerkkarten “LAN”. Für die NLB Adapter verwende ich 192.168.1.21 und 192.168.1.22.Wichtig ist dass man auf die Bindings achtet, d.h. der Adapter LAN muss der erste in der Auswahl sein. Die Bindings werden in den Erweiterten Netzwerkeinstellungen konfiguriert. Jetzt wird mit dem NLB-Manager der Cluster erstellt. Dazu wird auf Cluster und Neu geklickt, dann wird der erste Knoten hinzugefügt: Wichtig: Der dedizierte NLB Adapter wird verwendet!Als dedizierte Adresse wird als 192.168.1.21 angezeigt, auf dieser NIC wird NLB aktiviert und die Cluster Adresse gebunden. Im nächsten Fenster wird die Cluster Adresse festgelegt, ich verwende wie oben beschrieben 192.168.1.10/24.Der Modus, also Unicast oder Multicast wird im nächsten Fenster konfiguriert. Außerdem wird der FQDN für den Cluster hier gesetzt. Mein Testcluster heißt nlb.ntsystems.it und läuft im Multicast Mode.&#160;  Jetzt werden noch die Port Rules konfiguriert, ich akzeptiere vorläufig mal die Standardeinstellungen, dazu aber später mehr.So, jetzt habe ich NLB mal soweit eingerichtet. Natürlich muss noch der zweite Knoten hinzugefügt werden. Dazu einfach auf den Clusternamen klicken und Host hinzufügen wählen. Wichtig auch hier wieder dass die Netzwerkkarte NLB verwendet wird, also die dedizierte Adresse 192.168.1.22.Ist der zweite Knoten hinzugefügt und der Status im NLB Manager auf “Converged” oder “Zusammengeführt” ist der Cluster erstellt.Allerdings ist die Konfiguration damit noch nicht fertig. Die Cluster IP ist noch nicht erreichbar. Das hat zwei Gründe, erstens muss am Switch noch der statische ARP Eintrag erstellt werden (Cisco: arp 192.168.1.10 03bf.c08a.010a). Außerdem muss IP Forwarding noch konfiguriert werden, dazu brauchen wir folgenden netsh Befehl: “netsh int ipv4 set int “NLB” forwarding=enabled”NLB Port RulesAls letzter Schritt bei der Konfiguration des Clusters werden die Port Rules konfiguriert. Standardmäßig werden einfach alle Ports (0-65535) egal ob TCP oder UDP an alle Clusterknoten weitergeleitet. Nun um die Angriffsfläche oder( “Attack Surface”) zu verringern und die Konfiguration zu optimieren sollten nur diese Ports weitergeleitet werden die auch wirklich benötigt werden. Ein weiterer Vorteil von einer eigenen Regel für jedes Protokoll ist dass man die Affinität so für jedes Port einstellen kann.Mein NLB Cluster soll ein Webserver werden, also werde ich nur die Ports 80 und 443 weiterleiten, ich möchte die Affinität für beide Ports “Einfach” haben, es wird also die IP Adresse jedes Clients verwendet um die Affinität zu steuern. Ich lösche also die Default Port Rule und erstelle zwei neue. Die Port Rules werden entweder in den Clustereigenschaften konfiguriert, oder direkt beim erstellen des Clusters.Jetzt erkennen wir einen weiteren Vorteil der Konfiguration mit zwei Netzwerkkarten: Der NLB Manager kann weiterhin mit beiden Knoten kommunizieren, obwohl ich für die Protokolle die verwendet keine Port Rules erstellt habe. Der NLB Manager verwendet für die Konfiguration die dedizierten Adressen.ChecklistHier die einzelnen Schritte nochmal im Überblick.        Feature installieren       zusätzliche Netzwerkkarte installieren    Netzwerkkarten konfigurieren (IP, Bindings!)    Cluster erstellen (Unicast/Multicast)    Hosts hinzufügen    evtl. Statische ARP Einträge    IP Forwarding aktivieren (netsh int ipv4 set int “NLB” forwarding=enabled)    Port Rules erstellen &#160;so long!   tomt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules/\\\"},{  \\\"id\\\": \\\"post-installation-der-sharepoint-services-30-auf-server-2008\\\",  \\\"title\\\": \\\"Installation der Sharepoint Services 3.0 auf Server 2008\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2008\\\",\\\"Server-2008-R2\\\",\\\"Sharepoint\\\"],  \\\"content\\\": \\\"Die Installation der Sharepoint Services kann sich unter Server 2008 / 2008 R2 als schwierig erweisen, wenn der Windows Installer während der Installationsphase einen falsch angegeben Parameter meldet: Das Problem hängt hierbei mit der “Windows Internal Database” zusammen.Lösung: Vor der Installation folgendes Kommando eingeben:    ocsetup.exe &quot;WSSEE&quot; /quiet /norestart /x:&quot; /lv* C:\\\\\\\\bak.logGrüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/installation-der-sharepoint-services-30-auf-server-2008/\\\"},{  \\\"id\\\": \\\"post-office-2010-fertig!!\\\",  \\\"title\\\": \\\"Office 2010 fertig!!\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Kurze Info: Office 2010 ist fertig!! Ab sofort ist es für TechNet und MSDN Abonnenten zum Download verfügbar!Lasst die Leitungen glühen!! :)\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/office-2010-fertig!!/\\\"},{  \\\"id\\\": \\\"post-programme-vom-server-core-hyper-v-server-deinstallieren\\\",  \\\"title\\\": \\\"Programme vom Server Core / Hyper-V Server deinstallieren\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Hyper-V\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Der Server 2008 Core und der Hyper-V Server haben keine Oberfläche um Programme zu deinstallieren (Add/Remove programs).Um Programme deinstallieren zu können, öffnen wir die Registrierung. (Üblicherweise Remoteregistrierung von einem Client aus). Unter    HKLM\\\\\\\\SOFTWARE\\\\\\\\Microsoft\\\\\\\\Windows\\\\\\\\CurrentVersion\\\\\\\\Uninstall    werden die installierten Programme gelistet. Wenn man den Wert im Schlüssel “UninstallString” in der Kommandozeile des Servers eingibt, wird der Windows Installer gestartet und deinstalliert das Programm.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/programme-vom-server-core-hyper-v-server-deinstallieren/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-active-sync-funktioniert-nicht\\\",  \\\"title\\\": \\\"Exchange 2010 - Active Sync funktioniert nicht\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Events\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Ja es ist ruhig zur Zeit auf ntSystems&hellip; das liegt daran dass die beiden Autoren zur Zeit ihre MCSA/MCSE Zertifizierungen auf MCITP-EA aktualisieren. Wir sind auch ganz gut im Rennen, aber einige Pr&uuml;fungen fehlen noch. Naja, bald gibt&rsquo;s hoffentlich wieder mehr zum Lesen.Inzwischen die L&ouml;sung f&uuml;r folgendes Problem:ActiveSync funktioniert mit Exchange 2010 nicht, Event ID: 1053 Source: MSExchange ActiveSync wird Protokolliert. Aus der Beschreibung des Fehlers erkennt man auch schon das Problem, fehlende Berechtigungen.Exchange ActiveSync doesn't have sufficient permissions to create the container &ldquo;CN&rdquo; under Active Directory &hellip; &lt;/p&gt;Active directory response: 00000005: SecErr: DSID-03152492, problem 4003 (INSUFF_ACCESS_RIGHTS), data 0 Make sure the user has inherited permission granted to domain\\\\\\\\Exchange Servers to allow List, Create child, Delete child of object type \\\\\\\"msExchangeActiveSyncDevices\\\\\\\" and doesn't have any deny permissions that block such operations.&lt;/code&gt;Also einfach die in der Fehlermeldung beschriebenen Berechtigungen setzen, oder die Vererbung auf dem Active Directory User Objekt wieder aktivieren.Um Berechtigungen im Active Directory zu setzen muss unter &ldquo;View&rdquo; die Option &ldquo;Advanced Features&rdquo; aktiviert werden. Dann&nbsp;wird unter den Eigenschaften des Benutzers der Reiter &ldquo;Security&rdquo; angezeigt.tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-active-sync-funktioniert-nicht/\\\"},{  \\\"id\\\": \\\"post-wds-remoteinstallationsordner-verschieben\\\",  \\\"title\\\": \\\"WDS Remoteinstallationsordner verschieben\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Um in den Deployment Services den Installationsorder zu verschieben müssen folgende Befehle ausgeführt werden:wdsutil /uninitialize-serverDann den Ordner an seinen neuen Platz verschiebenwdsutil /initialize-server /reminst:Laufwerksbuchstabe\\\\\\\\OrdnerGrüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wds-remoteinstallationsordner-verschieben/\\\"},{  \\\"id\\\": \\\"post-wsus-content-auf-anderes-volume-verschieben\\\",  \\\"title\\\": \\\"WSUS content / database auf anderes Volume verschieben\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"ContentUm den WSUS content auf einem anderen Volume zu verschieben, reicht es ein einfaches Command auszuführen:wsusutil.exe movecontent “neuer Pfad” “Pfad für das entstehende LogFile”Das Tool wsusutil befindet sich unter Program Files\\\\\\\\ Update Services \\\\\\\\ ToolsDatabaseUm die Datenbank zu verschieben gibt es 2 Möglichkeiten, einmal über das Management Studio oder über SQLCMD. In diesem Post gehe ich lediglich auf die Methode anhand des Management Studio ein1) Datenbank über folgenden Pfad öffnen\\\\\\\\\\\\\\\\.\\\\\\\\pipe\\\\\\\\MSSQL$MICROSOFT##SSEE\\\\\\\\sql\\\\\\\\query 2) Datenbank trennenBevor die Datenbank getrennt wird, sollte der Dienst “update services” beendet werden. Die Datenbank SUSDB trennen und bei den Optionen muss noch angegeben werden, dass die Verbindungen mit getrennt werden sollen. 3) Datenbank auf neuem Volume kopieren4) Datenbank wieder anfügen&#160; Danach kann der Dienst “update services” wieder gestartet werden.Grüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wsus-content-auf-anderes-volume-verschieben/\\\"},{  \\\"id\\\": \\\"post-forefront-2010-e28093-dienste-starten-nicht-automatisch\\\",  \\\"title\\\": \\\"Forefront 2010 – Dienste starten nicht automatisch\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Wer Forefront 2010 installiert und das Logging nicht separat konfiguriert wird sich wom&ouml;glich wundern warum bei einem Neustart folgende Dienste nicht starten:Microsoft Forefront TMG ControlMicrosoft Fronfront TMG FirewallMicrosoft Forefront TMG Job SchedulerMicrosoft Forefront TMG Managed ControlForefront beantwortet somit keine Anfragen und jeglicher Zugriff von allen au&szlig;er den Management Computern wird blockiert.Das liegt daran dass Standardm&auml;&szlig;ig eine Lokale SQL Instanz also Logging Ziel konfiguriert ist, der SQL Dienst aber erst nach den Forefront Diensten startet&hellip; Und wenn Forefront nicht Protokollieren kann dann wird der Dienst beendet. Im Eventlog steht:The Microsoft Forefront TMG Control service terminated with service-specific error %%278540.L&ouml;sen l&auml;sst sich das Problem ganz einfach, entweder man stellt auf Logging to File&nbsp;oder man Konfiguriert die vier oben genannten Dienste f&uuml;r verz&ouml;gerten Start.&nbsp;&Uuml;ber die Sinnhaftigkeit dieser Standardkonfiguration muss man wohl nichts mehr sagen&hellip;tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/forefront-2010-e28093-dienste-starten-nicht-automatisch/\\\"},{  \\\"id\\\": \\\"post-wds-tftp-timeout\\\",  \\\"title\\\": \\\"WDS TFTP TimeOut\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2008-R2\\\",\\\"Server-2008\\\",\\\"Server-2003\\\"],  \\\"content\\\": \\\"Wenn die Windows Deployment Services auf derselben Maschine wie der DNS Server laufen, wird WDS nach der Installation des DNS-Patches KB953230 (wird auch über Windows Updare verteilt) möglicherweise nicht mehr funktionieren. Wenn der Client versucht über PXE zu booten erscheint folgende Meldung: PXE-E32: TFTP open timeoutUm dieses Problem zu beheben muss folgendes an den WDS Diensten verändert werden:Server 2003 – 2008In den Eigenschaften des WDS Servers muss der UDP Portbereich zu den Werten 50000 bis 65000 verändert werden.      Server 2008 R2Wenn als OS Server 2008 R2 verwendet wird, kann auch die Option aktiviert werden, dass WDS automatisch nach verfügbaren WinSock Ports abfragt und nicht den vorkonfigurierten UDP Portbereich verwendet. Dazu muss der Schlüssel UDPPortPolicy unter HKLM\\\\\\\\System\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\WDSServer\\\\\\\\Parameters von 1 auf 0 gesetzt werden.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wds-tftp-timeout/\\\"},{  \\\"id\\\": \\\"post-terminal-lizenzserver-4105\\\",  \\\"title\\\": \\\"Terminal-Lizenzserver, 4105\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2008\\\",\\\"Server-2003\\\"],  \\\"content\\\": \\\"Nach der Domänenmigration von 2003 zu 2008 kann es geg. zu Problemen am Terminal-Lizenzserver kommen, dass Lizenzattribute für Benutzer nicht aktualisiert werden können. Das Problem ist, dass nach der Migration der Domäne die Benutzer-Berechtigungen für die Gruppe “Terminalserver-Lizenzserver” nicht aktualisiert werden.Um die Benutzerberechtigungen für die bestehenden Benutzer manuell zu setzen müssen der Gruppe Terminalserver-Lizenzserver folgende Berechtigungen zugewiesen werden: “Terminalserver-Lizenzserver lesen” und ”Terminalserver-Lizenzserver schreiben”  Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/terminal-lizenzserver-4105/\\\"},{  \\\"id\\\": \\\"post-bootmgr-is-missing\\\",  \\\"title\\\": \\\"BOOTMGR is missing\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Gestern habe ich meinen Windows Server 2008 R2 für den Cluster vorbereitet. Aus versehen habe ich eine Daten-Partition als aktiv markiert. Das habe ich natürlich sofort rückgängig gemacht.Heute habe ich meinen Server neu gestartet und musste feststellen, dass er nicht mehr bootet. Als Fehlermeldung wurde angezeigt, dass der Bootloader fehlt (BOOTMGR is missing). Nach ein wenig Recherche über Bing (ehemals Google :) ) bin ich auf 2 Methoden gestoßen um das Problem zu beheben:Methode 1: Den BCD Speicher neu erstellen   Server CD in einlegen und Server damit starten     Die Option “Computerreparatur” auswählen     CMD starten und den Befehl Bootrec /RebuildBcd eingeben. Nun sollte das Betriebssystem aufgelistet werden. Nun bestätigt man mit YES, dass der BCD Speicher neu geschrieben wird. Sollte das Betriebssystem nicht aufgelistet werden, so muss folgende durchgeführt werden: Export der Konfiguration: Bcedit /export C:\\\\\\\\BCD_Export Alte Konfiguration umbenennen: ren c:\\\\\\\\boot\\\\\\\\bcd bcd.old Und die Konfiguration nochmal erstellen lassen: Bootrec /RebuidlBcd     Server neu starten  Methode 2: Den BCD Speicher manuell neu erstellenDiese Methode habe ich noch nicht versucht, aber hier der KB-Artikel zum nachlesen.Nachdem Methode 1 bei mir nicht funktionierte und nach mehreren Anläufen über /fixboot usw. sich nichts getan hat, erinnerte ich mich, dass auf der Windows 7 DVD eine Reparaturoption für den Startvorgang enthalten ist. Nachdem ich den Server mit der Windows 7 DVD gestartet hatte, wählte ich die Option “Startup Repair” aus und lies die Diagnose durchlaufen. Nach 1 Minute und einem Neustart später startete der Server wieder ordnungsgemäß.ACHTUNG: Das funktioniert nicht für den Microsoft Hyper-V Server. Dieser hat eine andere Bootkonfiguration, die vor dem Start des Betriebssystems den Hypervisor startet.Grüße    dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/bootmgr-is-missing/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-this-attachment-was-removed\\\",  \\\"title\\\": \\\"Exchange 2010 – This Attachment was removed\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\"],  \\\"content\\\": \\\"Ich betreibe seit einiger Zeit eine Exchange 2010 Umgebung bestehend aus einem Edge Transport Server und einem Multi-Role Exchange Server im Lan.Standardm&auml;&szlig;ig ist am Edge Transport Server der &ldquo;Attachment Filter Agent&rdquo; aktiv, dieser ist daf&uuml;r verantwortlich, potentiell gef&auml;hrliche Anh&auml;nge zu filtern. Will man also z.B. eine .exe Datei verschicken muss man diesen Agent deaktivieren. Das wird auf dem Edge Transport Server gemacht und zwar per PowerShell.Disable-TransportAgent -Identity \\\\\\\"Attachment Filter agent\\\\\\\"Ich schlage allerdings vor dieses Sicherheitsfeature nicht auszuschalten. Man kann diverse Einstellungen vornehmen, so kann z.B. festgelegt werden dass ein unsicherer Anhang nicht entfernt wird sondern das Mail direkt &ldquo;rejected&rdquo; wird.Man kann die Attachment Filter Eintr&auml;ge &uuml;ber folgendes cmdlets selbst bearbeiten.Add-AttachmentFilterEntry -Name &lt;FileName&gt; -Type FileNameAdd-AttachmentFilterEntry -Name &lt;MIMEContentType&gt; -Type ContentTypeAu&szlig;erdem kann man das Verhalten des Attachment Filter Agent festlegen und zwar &uuml;ber das set-AttachmentFilterListConfig cmdletSet-AttachmentFilterListConfig -Action -Reject -RejectResponse \\\\\\\"Versenden von Mails mit unsicheren Anh&auml;ngen nicht erlaubt!\\\\\\\"Genauere Syntax und Infos zu den Parametern findet man im TechNet:Set-AttachmentFilterListConfig Add-AttachmentFilterEntry&nbsp;na dann, sch&ouml;nes Wochenende! tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-this-attachment-was-removed/\\\"},{  \\\"id\\\": \\\"post-nvspbind-fur-hyper-v\\\",  \\\"title\\\": \\\"NVSPBIND für Hyper-V\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Hyper-V\\\"],  \\\"content\\\": \\\"In einem meiner letzten Posts (Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben) habe ich erklärt, wie man über die Registry die Bindungen an den Netzwerkschnittstellen verändern kann.     Die Microsoft Entwickler haben dazu jetzt ein Tool veröffentlich, mit dem das Ganze etwas komfortabler gemanagt werden kann: NVSPBIND.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/nvspbind-fur-hyper-v/\\\"},{  \\\"id\\\": \\\"post-wsus-verschieben\\\",  \\\"title\\\": \\\"WSUS auf anderen Server verschieben\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Um den WSUS Server auf einer anderen physischen Maschine zu verschieben müssen folgende Schritte unternommen werden:1) WSUS auf dem Zielserver installieren2) Einstellungen manuell vom Quellserver zum Zielserver übernehmen3) Mit NTBackup das Verzeichnis WSUSContent vom Quellserver sichern (Kopieren ist auch möglich) 4) Daten mit NTBackup auf dem Zielserver in den entsprechenden Ordner wiederherstellen5) Metadaten vom Quellserver exportieren   CMD öffnen und zum Ordner Tools unter C:\\\\\\\\Programme\\\\\\\\Update Services\\\\\\\\ wechseln    Folgenden Befehl eintippen um die Metadaten zu exportieren: wsusutil.exe export export.cab export.log    2 Files wurden erstellt (Export.cab und Export.log)  6) Metadaten zum Zielserver importieren   Mit dem Befhl wsusutil.exe import export.cab import.log werden die zuvor exportierten Metadaten am Zielserver importiert             Info: Es kann einige Zeit vergehen, bis der Import Vorgang vollständig abgeschlossen wurde. 7) GPO abändern und auf den neuen WSUS Server verweisen    Grüße     dn \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wsus-verschieben/\\\"},{  \\\"id\\\": \\\"post-wpad-und-server-2008\\\",  \\\"title\\\": \\\"WPAD und Server 2008\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2008\\\",\\\"Server-2008-R2\\\",\\\"Server\\\",\\\"Client\\\"],  \\\"content\\\": \\\"Heute habe ich meinen Windows Server 2008 R2 Server zum Domänencontroller promoted. D.h. Domänendienste, GC und DNS wurden installiert. Zudem habe ich als primären DNS Server die lokale Maschine angegeben.Nach einiger Zeit wunderte ich mich, dass das Internet nicht mehr funktioniert. Als Gateway betreibe ich eine ISA Server 2006, der Proxy wird über WPAD automatisch konfiguriert.Windows Server 2008 besitzt für DNS ein neues Sicherheitsfeature, welches WPAD nicht zulässt (DNS Global Query Blocklist).dnscmd /info /enableglobalqueryblocklist –&gt; zeigt ob das Sicherheitsfeature aktiv ist. 1 = True, 0 Falsednscmd /config /enableglobalqueryblocklist 0 –&gt; schaltet das Sicherheitsfeature ausWenn das Sicherheitsfeature abgeschaltet wird, muss der DNS Server noch neu gestartet werden.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/wpad-und-server-2008/\\\"},{  \\\"id\\\": \\\"post-hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben\\\",  \\\"title\\\": \\\"Hyper-V Server / Core Bindungen der Netzwerkadapter aufheben\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Hyper-V\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Wenn man den Hyper-V Server bzw. den Server Core verwendet und an den Netzwerkschnittstellen die Bindungen verändern möchte, kommt man um das Editieren der Registry nicht herum.   In meinen Fall möchte ich die “Datei und Druckerfreigabe” von den iSCSI Adaptern loslösen.Als erstes muss die ID der Netzwerkadapter ermittelt werdenwmic nicconfig get Description,SettingIDDanach erhält man eine Liste mit den Adaptern und deren ID Nun beginnt die Arbeit in der Registry: Zunächst muss der Schlüssel Bind unter HKEY_LOCAL_MACHINE\\\\\\\\system\\\\\\\\currentcontrolset\\\\\\\\services\\\\\\\\lanmanserver\\\\\\\\     linkagegeöffnet werden. Hier erhält man eine Liste mit den Netzwerkadaptern und ihren Bindungen zum Protokoll der “Datei und Druckerfreigabe”. Der nächste Schritt besteht darin, die Bindungen aufzuheben, indem man alle Zeilen wo die entsprechende Adapter-ID vorkommt löscht.   Änderungen werden nach einem Reboot aktiv.Anbei noch eine Liste mit den Protokollen und ihren Schlüsseln:File and Printer Sharing: LanmanServer     Client for MS Networks: LanmanWorkstation      Link-Layer Discovery Mapper I/O Driver: lltdio      Link-Layer Topology Discovery Responder: rspndr      TCP/IP v4: tcpip      TCP/IP v6: tcpip6Grüße   dn    \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben/\\\"},{  \\\"id\\\": \\\"post-bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung\\\",  \\\"title\\\": \\\"BlueScreen “Stop 0x0000007E” beim aktivieren der Virtualisierungs-Technologie\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Hyper-V\\\",\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Nachdem im BIOS die Virtualisierungs-Technologie aktiviert wird, kann es zu einem BlueScreen bei starten des Servers kommen. Im BlueScreen wird folgender Fehlercode mitgeteilt: 0x0000007E.Betroffen sind folgende Produkte: Windows Server 2008 R2 Standard  Windows Server 2008 R2 Enterprise  Windows Server 2008 R2 Datacenter Hyper-V Server 2008 R2&#160;Microsoft hat dazu den KB-Artikel 974598 und einen Hotfix veröffentlicht. Um den Server wieder flott zu bekommen, muss die Virtualisierungs-Technologie deaktiviert werden. Danach muss der Server gestartet und der Hitfix installiert werden.   Nachdem der Hotfix installiert wurde, kann die Virtualisierungs-Technologie wieder aktiviert und das System gestartet startet.Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung/\\\"},{  \\\"id\\\": \\\"post-server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen\\\",  \\\"title\\\": \\\"Server 2008 Core / Hyper-V Netzwerkschnittstelle umbenennen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Hyper-V\\\"],  \\\"content\\\": \\\"Um auf einem Server Core oder auch Hyper-V Server die Netzwerkschnittstelle umzubenennen, wird das Tool netsh verwendet.Um z.B. “LAN-Verbindung 5” in “iSCSI 10” umzubenennen, muss folgender Befehl ausgeführt werden:netsh interface set interface name=”LAN-Verbindung 5” newname=”iSCSI 10”Grüße   dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen/\\\"},{  \\\"id\\\": \\\"post-disclaimer\\\",  \\\"title\\\": \\\"disclaimer\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"  &lt;p&gt;1. Inhalt des Onlineangebotes &lt;/p&gt;  &lt;p&gt;Der Autor übernimmt keinerlei Gewähr für die Aktualität, Korrektheit, Vollständigkeit oder Qualität der bereitgestellten Informationen. Haftungsansprüche gegen den Autor, welche sich auf Schäden materieller oder ideeller Art beziehen, die durch die Nutzung oder Nichtnutzung der dargebotenen Informationen bzw. durch die Nutzung fehlerhafter und unvollständiger Informationen verursacht wurden, sind grundsätzlich ausgeschlossen, sofern seitens des Autors kein nachweislich vorsätzliches oder grob fahrlässiges Verschulden vorliegt. &lt;/p&gt;  &lt;p&gt;Alle Angebote sind freibleibend und unverbindlich. Der Autor behält es sich ausdrücklich vor, Teile der Seiten oder das gesamte Angebot ohne gesonderte Ankündigung zu verändern, zu ergänzen, zu löschen oder die Veröffentlichung zeitweise oder endgültig einzustellen. &lt;/p&gt;  &lt;p&gt;2. Verweise und Links &lt;/p&gt;  &lt;p&gt;Bei direkten oder indirekten Verweisen auf fremde Webseiten (&quot;Hyperlinks&quot;), die außerhalb des Verantwortungsbereiches des Autors liegen, würde eine Haftungsverpflichtung ausschließlich in dem Fall in Kraft treten, in dem der Autor von den Inhalten Kenntnis hat und es ihm technisch möglich und zumutbar wäre, die Nutzung im Falle rechtswidriger Inhalte zu verhindern. &lt;/p&gt;  &lt;p&gt;Der Autor erklärt hiermit ausdrücklich, dass zum Zeitpunkt der Linksetzung keine illegalen Inhalte auf den zu verlinkenden Seiten erkennbar waren. Auf die aktuelle und zukünftige Gestaltung, die Inhalte oder die Urheberschaft der verlinkten/verknüpften Seiten hat der Autor keinerlei Einfluss. Deshalb distanziert er sich hiermit ausdrücklich von allen Inhalten aller verlinkten /verknüpften Seiten, die nach der Linksetzung verändert wurden. Diese Feststellung gilt für alle innerhalb des eigenen Internetangebotes gesetzten Links und Verweise sowie für Fremdeinträge in vom Autor eingerichteten Gästebüchern, Diskussionsforen, Linkverzeichnissen, Mailinglisten und in allen anderen Formen von Datenbanken, auf deren Inhalt externe Schreibzugriffe möglich sind. Für illegale, fehlerhafte oder unvollständige Inhalte und insbesondere für Schäden, die aus der Nutzung oder Nichtnutzung solcherart dargebotener Informationen entstehen, haftet allein der Anbieter der Seite, auf welche verwiesen wurde, nicht derjenige, der über Links auf die jeweilige Veröffentlichung lediglich verweist. &lt;/p&gt;  &lt;p&gt;3. Urheber- und Kennzeichenrecht &lt;/p&gt;  &lt;p&gt;Der Autor ist bestrebt, in allen Publikationen die Urheberrechte der verwendeten Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu beachten, von ihm selbst erstellte Bilder, Grafiken, Tondokumente, Videosequenzen und Texte zu nutzen oder auf lizenzfreie Grafiken, Tondokumente, Videosequenzen und Texte zurückzugreifen. &lt;/p&gt;  &lt;p&gt;Alle innerhalb des Internetangebotes genannten und ggf. durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind! &lt;/p&gt;  &lt;p&gt;Das Copyright für veröffentlichte, vom Autor selbst erstellte Objekte bleibt allein beim Autor der Seiten. Eine Vervielfältigung oder Verwendung solcher Grafiken, Tondokumente, Videosequenzen und Texte in anderen elektronischen oder gedruckten Publikationen ist ohne ausdrückliche Zustimmung des Autors nicht gestattet. &lt;/p&gt;  &lt;p&gt;4. Datenschutz &lt;/p&gt;  &lt;p&gt;Sofern innerhalb des Internetangebotes die Möglichkeit zur Eingabe persönlicher oder geschäftlicher Daten (Emailadressen, Namen, Anschriften) besteht, so erfolgt die Preisgabe dieser Daten seitens des Nutzers auf ausdrücklich freiwilliger Basis. Die Inanspruchnahme und Bezahlung aller angebotenen Dienste ist - soweit technisch möglich und zumutbar - auch ohne Angabe solcher Daten bzw. unter Angabe anonymisierter Daten oder eines Pseudonyms gestattet. Die Nutzung der im Rahmen des Impressums oder vergleichbarer Angaben veröffentlichten Kontaktdaten wie Postanschriften, Telefon- und Faxnummern sowie Emailadressen durch Dritte zur Übersendung von nicht ausdrücklich angeforderten Informationen ist nicht gestattet. Rechtliche Schritte gegen die Versender von sogenannten Spam-Mails bei Verstössen gegen dieses Verbot sind ausdrücklich vorbehalten. &lt;/p&gt;  &lt;p&gt;5. Rechtswirksamkeit dieses Haftungsausschlusses &lt;/p&gt;  &lt;p&gt;Dieser Haftungsausschluss ist als Teil des Internetangebotes zu betrachten, von dem aus auf diese Seite verwiesen wurde. Sofern Teile oder einzelne Formulierungen dieses Textes der geltenden Rechtslage nicht, nicht mehr oder nicht vollständig entsprechen sollten, bleiben die übrigen Teile des Dokumentes in ihrem Inhalt und ihrer Gültigkeit davon unberührt. &lt;/p&gt;  &lt;p&gt;1. Content&lt;/p&gt;  &lt;p&gt;The author reserves the right not to be responsible for the topicality, correctness, completeness or quality of the information provided. Liability claims regarding damage caused by the use of any information provided, including any kind of information which is incomplete or incorrect,will therefore be rejected. &lt;/p&gt;  &lt;p&gt;All offers are not-binding and without obligation. Parts of the pages or the complete publication including all offers and information might be extended, changed or partly or completely deleted by the author without separate announcement. &lt;/p&gt;  &lt;p&gt;2. Referrals and links&lt;/p&gt;  &lt;p&gt;The author is not responsible for any contents linked or referred to from his pages - unless he has full knowledge of illegal contents and would be able to prevent the visitors of his site fromviewing those pages. If any damage occurs by the use of information presented there, only the author of the respective pages might be liable, not the one who has linked to these pages. Furthermore the author is not liable for any postings or messages published by users of discussion boards, guestbooks or mailinglists provided on his page. &lt;/p&gt;  &lt;p&gt;3. Copyright&lt;/p&gt;  &lt;p&gt;The author intended not to use any copyrighted material for the publication or, if not possible, to indicate the copyright of the respective object. &lt;/p&gt;  &lt;p&gt;The copyright for any material created by the author is reserved. Any duplication or use of objects such as images, diagrams, sounds or texts in other electronic or printed publications is not permitted without the author's agreement. &lt;/p&gt;  &lt;p&gt;4. Privacy policy&lt;/p&gt;  &lt;p&gt;If the opportunity for the input of personal or business data (email addresses, name, addresses) is given, the input of these data takes place voluntarily. The use and payment of all offered services are permitted - if and so far technically possible and reasonable - without specification of any personal data or under specification of anonymized data or an alias. The use of published postal addresses, telephone or fax numbers and email addresses for marketing purposes is prohibited, offenders sending unwanted spam messages will be punished. &lt;/p&gt;  &lt;p&gt;5. Legal validity of this disclaimer&lt;/p&gt;  &lt;p&gt;This disclaimer is to be regarded as part of the internet publication which you were referred from. If sections or individual terms of this statement are not legal or correct, the content or validity of the other parts remain uninfluenced by this fact. &lt;/p&gt;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/disclaimer/\\\"},{  \\\"id\\\": \\\"post-zertifizierungsstelle-verschieben-(backuprestore)\\\",  \\\"title\\\": \\\"Zertifizierungsstelle verschieben (Backup/Restore)\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Eine Zertifizierungsstelle geh&ouml;rt zu den Serverrollen die &uuml;ber viele Jahre gleich bleiben und einige Hardware- bzw. Betriebsystem- Lifecycles &uuml;berdauern. Aus diesem Grund kann es vorkommen dass man eine CA von einem Server auf einen anderen migrieren muss.Wichtig dabei ist dass der Name des Servers sich nicht &auml;ndern sollte, kann man eine &Auml;nderung nicht verhindern gibt es hier einen KB Artikel der die Vorgehensweise beschreibt. Aber wie gesagt, besser/einfacher ist es den Namen nicht zu &auml;ndern.Nun denn, zuerst gilt es eine Strategie zu w&auml;hlen, ich habe es so gemacht dass ich die CA gesichert habe, CA deinstalliert, DC heruntergestuft, Server aus der Domain genommen. Neuen Server mit gleichem Namen installiert, zum DC hochgestuft, CA installiert, CA widerhergestellt und l&auml;uft.Also zum ersten Schritt, Sichern einer Zertifizierungsstelle:Im CA SnapIn auf den CA Namen klicken und All Tasks &ndash;&gt; Backup CA w&auml;hlenBeide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenEinen Ordner angeben wohin das Ganze gesichert wird (sollte leer sein)Ein Kennwort f&uuml;r den Private Key angeben (sollte man sich nat&uuml;rlich merken)regedit &ouml;ffnen und zum Schl&uuml;ssel HKEY_LOCAL_MACHINE\\\\\\\\SYSTEM\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\CertSvc\\\\\\\\Configuration wechseln, Rechtsklick auf den Schl&uuml;ssel und Export w&auml;hlen. Wieder einen Ordner w&auml;hlen um den Registry Key abzulegen.Deinstallieren einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Remove Roles w&auml;hlenActive Directory Certificate Services entfernenNeu Starten und fertigfolgende Daten bleiben auf dem Server (Achtung bei Entsorgung!!)CA database, CA public and private keys, CA's certificates in the Personal storeCA chain's root certificate in the Trusted Root Certification Authorities storeCA chain's intermediate certificates in the Intermediate Certification Authorities storeThe CA's CRLWiederherstellen einer Zertifizierungsstelle:Server Manager &ouml;ffnen, Add Roles w&auml;hlenActive Directory Certificate Services hinzuf&uuml;genBei &ldquo;Specify Type&rdquo; den entsprechenden Typ ausw&auml;hlen, Standalone oder EnterpriseBei &ldquo;Set up Private Key&rdquo; muss man &ldquo;Use existing private Key&rdquo; w&auml;hlen, darunter &ldquo;Select a certificate and use its associated private key&rdquo;Jetzt wird das vorher gesicherte Zertifikat (*.p12 Datei) ausgew&auml;hlt und das entsprechende Passwort eingegebenBei &ldquo;Configure Database&rdquo; ist noch darauf zu achten dass der CertLog Ordner im gleichen Pfad liegt wie auf dem alten Server (Standard %systemroot%\\\\\\\\system32\\\\\\\\CertLog)Jetzt wird die CA installiert Ist die Installation abgeschlossen, die Dienstkonsole &ouml;ffnen (services.msc) und den Dienst &ldquo;Active Directory Certificate Services&rdquo; beendenJetzt das vorher exportierte Registry File doppelklicken und die Einstellungen importierenCA SnapIn &ouml;ffnen und auf den CA Namen klicken, All Tasks &ndash;&gt; Restore CA w&auml;hlenWieder beide Checkboxen (Private key and CA certificate and Certificate database, certificate database log) aktivierenJetzt kann der Dienst &ldquo;Active Directory Certificate Services&rdquo; wieder gestartet werden und die CA l&auml;uft wiederWeihnachtliche Gr&uuml;&szlig;e tom&nbsp;\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/zertifizierungsstelle-verschieben-(backuprestore)/\\\"},{  \\\"id\\\": \\\"post-domain-controller-umbenennen\\\",  \\\"title\\\": \\\"Domain Controller umbenennen\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server-2008-R2\\\",\\\"Server-2008\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Es kann vorkommen dass man bei der Wahl der Servernamen mal danebengreift oder einfach im Nachhinein einen anderen Namen braucht. Wenn z.B. eine Zertifizierungsstelle wiederhergestellt werden soll dann ist der Computername wichtig.Um also einen Domain Controller (2008, 2008R2) umzubenennen geht man am besten so vor (Achtung: Ein Neustart ist nötig).Zuerst wird ein zusätzlicher DNS-Hostname hinzugefügt.netdom computername altername.domain.local /add:neuername.domain.localWichtig ist nun die Replikation mit allen anderen DCs abzuwarten oder manuell anzustoßen (repadmin, AD Sites and Services). Alle DCs müssen die Änderung im Computerkonto mitbekommen, in allen DNS Servern muss der zusätzliche Namen als Ressource Record aufscheinen. Erst nachdem die Replikation abgeschlossen ist darf man zum nächsten Schritt gehen. Man kann das Ergebnis der Replikation sehen indem man mit ADSI Edit die Eigenschaften des entsprechenden Computerkontos anzeigt, dort muss das Attribut &quot;msDS-AdditionalDnsHostName” den Wert neuername.domain.local haben. Alternativ zu ADSI Edit kann man auch das SnapIn Active Directory Users and Computers verwenden, allerdings muss man dazu unter “View” die “Advanced Features” aktivieren damit man die Attribute sieht.Ist die Replikatoin erfolgt wird der neue Computername als Primärer gesetzt.netdom computername altername.domain.local /makeprimary:neuername.domain.localNach diesem Schritt ist wiederum die Replikation abzuwarten/anzustoßen. Es ändert sich der Name des Computerobjektes und das Attribut “msDS-AdditionalDnsHostName” bekommt den Wert “altername.domain.local”.Jetzt muss der Server neu gestartet werden.Zum Schluss wird der alte Namen noch entfernt.netdom computername neuername.domain.local /remove:altername.domain.localMan kommt nicht um den Neustart herum, so funktioniert aber alles reibungslos.Grüße.   tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/domain-controller-umbenennen/\\\"},{  \\\"id\\\": \\\"post-forefront-thread-management-gateway-2010\\\",  \\\"title\\\": \\\"Forefront Threat Management Gateway 2010\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"de\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Der Nachfolger des beliebten MS Internet Security and Acceleration Servers (ISA) ist seit Mitte November verf&uuml;gbar. Nat&uuml;rlich wurde der Name ge&auml;ndert&nbsp;sowas ist&nbsp;nach einigen Versionen&nbsp;immer n&ouml;tig ;) Das Ding wurde in die Forefront Produktlinie aufgenommen und hei&szlig;t jetzt Forefront Threat Management Gateway 2010. TMG gibt es wie ISA als Standard und Enterprise Edition, die Unterschiede findet man hier.Wichtig zu erw&auml;hnen ist dass Forefront TMG nur mehr als 64 Bit Version verf&uuml;gbar ist, es gibt eine Testversion f&uuml;r 32 Bit Systeme, ist Produktiv allerdings nicht unterst&uuml;tzt. Die Genauen Systemvoraussetzungen gibt es hier.Die wichtigsten neuen Features kurz im &Uuml;berblick:Web Protection Subscription ServiceBietet HTTP/HTTPS Traffic InspectionURL Filterung in Zusammenarbeit mit MRS (Microsoft&nbsp;Reputation Services) mehr dazu z.B. bei Technet EdgeE-Mail Supportarbeitet mit Exchange Edge Transport zusammenNIS Network Inspection SystemIntrusion PreventionEnhanced NATendlich eine 1-to-1 NAT Funktion, d.h. man kann selbst entscheiden welche interne Adresse auf welche externe &uuml;bersetzt wirdVoIP Support64 Bit SupportStartet man das Setup bekommt man mal etwas wirklich cooles, das Preparation Tool.&nbsp;Dieses Tool installiert alle&nbsp;ben&ouml;tigten Serverrollen und Features. Diese sind je nach Installation unterschiedlich:Forefront TMG servicesWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellWindows Web Services API (WWSAPI)Network Policy Server (NPAS-Policy-Server)NPAS Routing and Remote Access Services (NPAS-RRAS-Services)Active Directory Lightweight Directory Services (ADLDS)Network Load Balancing (NLB)Forefront TMG management onlyWindows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellForefront TMG EMS (nur Enterprise Version)Windows Installer 4.5.Net Framework 3.5 SP1Windows PowerShellActive Directory Lightweight Directory Services (ADLDS)Ist der Preparation Wizard abgeschlossen, kann mit der Installation des TMG begonnen werden.Die Installation dauert einige Zeit, wenn sie abgeschlossen ist kann man die Management Konsole &ouml;ffnen und mit der Konfiguration beginnen. Zuerst sind noch mit einfachen Wizards die Netzwerkeinstellungen, Updates und URL Filtering bzw. Web Protection Subscription zu konfigurieren.Wenn jetzt noch der Web Access Wizard ausgef&uuml;hrt wird kann man gleich noch eine erste Regel erstellen. Man kann ausw&auml;hlen welche URL Kategorien man sperren m&ouml;chte, ob man Web und HTTPS inspection aktivieren m&ouml;chte und wenn ja mit welchem Zertifikat. Au&szlig;erdem kann hier gleich das Caching aktiviert werden.Alles in allem scheint TMG wirklich ein sehr interessantes Produkt zu werden, das deutlich mehr kann als nur den ISA Server zu ersetzen. In n&auml;chster Zeit werde ich sicher noch einiges dar&uuml;ber berichten.viele Gr&uuml;&szlig;e.tom\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/forefront-thread-management-gateway-2010/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-anonymous-relay\\\",  \\\"title\\\": \\\"Exchange 2010 – Anonymous Relay\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Exchange\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Immer wieder gibt es Gründe (z.B. SharePoint) um bestimmten Hosts anonymes Relaying über Exchange zu erlauben. Man muss sich so eine Konfiguration natürlich gut überlegen und die entsprechenden Hosts müssen vertrauenswürdig bzw. sicher sein.Man erstellt also einen neuen “Custom” Receive Conenctor, dem man erst mal einen Namen geben muss (Server Configuration, Hub Transport). Unter “Local Network Settings” kann man die IP Adresse angeben über welche der Exchange Server am besten mit dem Host reden kann. Wenn man nur eine Netzwerkkarte im Hub Transport Server hat kann man sich diese Einstellung schenken und einfach alle verfügbaren IPv4 Adressen verwenden. Außerdem kann man noch den FQDN eingeben mit dem sich der Exchange Server melden soll. Unter “Remote Network Settings” wird jetzt der Host (bzw. die Hosts) hinzugefügt der anonym über den Exchange Relayen darf. Wichtig: der Host muss wirklich vertrauenswürdig sein und AntiVirus bzw. Firewall sollen laufen, damit man nicht selbst zur Spamschleuder wird. Man kann einzelne Hosts, IP Bereiche oder ganze Subnets angeben. Durch klicken auf weiter und wird der Connector erstellt. Jetzt muss man noch die benötigten Berechtigungen setzen. Dazu Rechtsklick auf den Connector und die Eigenschaften öffnen. Unter “Authentication” werden alle Felder deaktiviert, unter “Permission Groups” wird die Gruppe Anonymous Users hinzugefügt.   Das Ganze kann man natürlich auch wieder mit der PowerShell machen, dazu einfach das New-ReceiveConnector cmdlet verwenden. Hier ein Beispiel:New-ReceiveConnector -Name &quot;SharePoint Relay&quot; -Usage Custom -PermissionGroups AnonymousUsers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.1.10,192.168.1.15-192.168.1.18Jetzt gibt es also den Connector und die angegeben Hosts verwenden diesen, das Relaying funktioniert allerdings noch nicht.    Dazu muss man dem User “NT AUTHORITY\\\\\\\\ANONYMOUS LOGON” die Berechtigung “Ms-Exch-SMTP-Accept-Any-Recipient” geben. Diese Aktion kann man nur in der EMS (Exchange Management Shell) durchführen.Get-ReceiveConnector &quot;SharePoint Relay&quot; | Add-ADPermission -User &quot;NT AUTHORITY\\\\\\\\ANONYMOUS LOGON&quot; -ExtendedRights &quot;Ms-Exch-SMTP-Accept-Any-Recipient&quot;Hat man auch das gemacht funktioniert das Realying.tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-anonymous-relay/\\\"},{  \\\"id\\\": \\\"post-ersten-ws08r2-dc-im-vorhandenen-forest-installieren\\\",  \\\"title\\\": \\\"Ersten WS08R2 DC im vorhandenen Forest installieren\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Neue Features wie das AD Administrative Center (hat Daniel hier&nbsp;schon&nbsp;vorgestellt)&nbsp;oder der AD Recycle Bin erfordern Windows Server 2008 R2 Domain Controller. Das Administrative Center braucht nur einen neuen DC, f&uuml;r den Recycle Bin muss das Forest Functional Level auf WS08R2 gestuft werden, mehr dazu in einem n&auml;chsten Beitrag.Um die Domain auf den ersten 2008 R2 DC vorzubereiten muss wie auch schon bei fr&uuml;heren Updates zuerst das AD Schema aktualisiert werden (auf Version 47). Dazu wird auf einem bestehenden DC die Windows Server 2008 R2 CD eingelegt, man muss nat&uuml;rlich mit einem Benutzer mit Schema Admin Rechten anmelden. Im Ordner Support\\\\\\\\adprep befinden sich die Dateien adprep.exe und adprep32.exe. Wie der Dateiname schon sagt wird mit adprep.exe die Schemaerweiterung bei x64 Systemen durchgef&uuml;hrt, mit adprep32.exe wird das Schema auf x86 DCs erweitert.Folgende Parameter werden ben&ouml;tigt:adprep[32].exe /forestprep Bereitet den gesamten Forest auf WS08R2 voradprep[32].exe /domainprep /gpprep Muss auf dem Infrastruktur Master ausgef&uuml;hrt werdenBereitet die Domain vor und setzt Berechtigungen auf Sysvol Share f&uuml;r RSoP Planning Modeadprep[32].exe /rodcprep Muss nur ausgef&uuml;hrt werden wenn ein RODC vorhanden ist, bzw. installiert werden sollJetzt sind Domain und Forest bereit f&uuml;r den neuen DC und der Windows Server 2008R2 kann mit dcpromo hochgestuft werden.viele Gr&uuml;&szlig;e tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/ersten-ws08r2-dc-im-vorhandenen-forest-installieren/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-edge-subscription\\\",  \\\"title\\\": \\\"Exchange 2010 – Edge Subscription\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Exchange 2010 bringt wie sein Vorg&auml;nger die Edge Transport Rolle mit. In Exchange 2007 wurde bei jeder Synchronisation die gesamte Konfiguration repliziert, dieser Prozess wurde mit Exchange 2010 verbessert, jetzt ist die erste Replikation vollst&auml;ndig, bei allen weiteren werden nur noch die &Auml;nderungen repliziert (incremental updates).Diese Serverrolle kann als einzige nicht mit anderen Rollen auf einem Server installiert werden, der Grund daf&uuml;r ist auch einfach erkl&auml;rt: der Edge Transport Server wird als Mail Relay in der DMZ eingesetzt und ist kein Dom&auml;nenmitglied bzw. hat nur sehr eingeschr&auml;nkten Zugriff auf das LAN.Vor der Installation des Edge Transport Servers muss die interne Hub Transport Rolle konfiguriert werden. Das hei&szlig;t Accepted Domains und die Connectoren m&uuml;ssen konfiguriert werden. Hier ein Link zur entsprechenden Technet Seite.Die Installation des Edge Transport Servers gestaltet sich sehr einfach. Man braucht einen x64 Server 2008 (am besten R2) in der Standard Edition. Dort wird das .net Framework installiert. Au&szlig;erdem wird ein Verzeichnisdienst ben&ouml;tigt, der Edge Transport Server muss ja wissen welche Empf&auml;nger es im Active Directory gibt. Active Direcotry Lightweight Directory Services (ADLDS), der Nachfolger des ADAM, und die entsprechende Verwaltungskonsole werden also auch installiert.Am schnellsten geht das wohl &uuml;ber die PowerShell:Import-Module ServerManagerAdd-WindowsFeature NET-Framework,RSAT-ADDS,ADLDS &ndash;RestartNach dem Neustart muss noch der Starttyp eines Dienstes ge&auml;ndert werden, auch wieder in der PowerShell:Set-Service NetTcpPortSharing -StartupType AutomaticDer Server ist jetzt soweit vorbereitet, man muss (wenn nicht schon passiert) noch den DNS Suffix der internen Domain (z.B: domain.local) eintragen.Da der Server in der DMZ stehen soll, muss auf der Firewall folgendes konfiguriert werden:DNS: Port 53 (tcp/udp) Richtung interne DNS ServerSMTP:&nbsp;Port 25 (tcp)&nbsp;Richtung interner Hub Transport ServerEdgeSync:&nbsp;Port 50636 (tcp)&nbsp;Richtung interner Hub Transport Server (Replikationspartner)Jetzt kann das Exchange 2010 Setup ausgef&uuml;hrt werden, bei dem die &ldquo;Custom Installation&rdquo; gew&auml;hlt wird und dort nur die Edge Transport Rolle und die Management Tools installiert werden. Die Installation ist schnell abgeschlossen, was jetzt noch ben&ouml;tigt wird ist die Synchronisation zwischen Edge Transport und internem Exchange (HUB) Server. Wichtig: Auf dem Edge Transport Server ist keine Konfiguration (Accepted Domains usw.) n&ouml;tig, diese Einstellungen werden mit der Edge Synchronisierung &uuml;bernommen.Auf dem Edge Transport Server ein neues Subscription File erstellt. Es wird einfach New-EdgeSubscription -FileName \\\\\\\"C:\\\\\\\\filename.xml\\\\\\\" in der EMS eingegeben. Die eben erstellte Datei wird auf den Hub Transport Server &uuml;bertragen, dort wird&nbsp;mit dem selben cmdlet die EdgeSync erstellt. New-EdgeSubscription -FileName \\\\\\\"C:\\\\\\\\EdgeSubscriptionInfo.xml\\\\\\\" -Site \\\\\\\"Name-der-AD-Site\\\\\\\". Nat&uuml;rlich kann man die EdgeSync auch in der EMC erstellen, dazu in der Organization Configuration die Hub Transport Rolle ausw&auml;hlen, dort auf den Edge Subscription Tab wechseln und New Edge Subscription w&auml;hlen. Jetzt muss noch der Active Directory Standort gew&auml;hlt werden und das xml File angegben werden. Auch hier k&ouml;nnen die Connectoren auf Wunsch automatisch erstellt werden.Wichtig: Der interne Hub Transport Server muss den Edge Transport Server per DNS Name aufl&ouml;sen k&ouml;nnen!Durch die EdgeSync werden die ben&ouml;tigten Connectoren erstellt und die relevanten Einstellungen &uuml;bernommen. So wird z.B. die Konfiguration des Default Recipient Connector sowie die Accepted Domains vom internen Server &uuml;bernommen.Weiterf&uuml;hrend kann ich das Exchange 2010 TechCenter empfehlen.Sehr lesenswert ist auch der Exchange Team Blog, zu finden in der Blogroll.viele Gr&uuml;&szlig;ett\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-edge-subscription/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-get-owavirtualdirectory-access-denied\\\",  \\\"title\\\": \\\"Exchange 2010 – Get-OwaVirtualDirectory Access Denied\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Exchange\\\"],  \\\"content\\\": \\\"Wird Exchange 2010 Server in einer Exchange 2007 Umgebung installiert erscheint folgender Fehler wenn man in der Exchange Management Console unter “Server Configuration” die Client Access Rolle verwalten möchte. “An IIS directory entry couldn't be created. The error message is Access is denied. HResult = -2147024891. It was running the command 'Get-OwaVirtualdirectory'”Den selben Fehler erhält man wenn man in der Exchange Management Shell den Befehl “Get-OwaVirtualDirectory” ausführt, macht die EMC eigentlich auch, nur mit Bild drum herum :).Der Grund dafür ist wohl dass Exchange 2010 keine Berechtigungen auf der entsprechenden Website im IIS auf dem 2007 Client Access Server erhält.Die Lösung: Alle Exchange 2010 Server sollen Mitglied der lokalen Administratoren auf allen Exchange 2007 Servern sein. Also am besten die Gruppe “Exchange Trusted Subsystems” zu den Lokalen Admins auf den Exchange 2007 Server hinzufügen.Alternativ kann man der Gruppe “Exchange Trusted Subsystems” auch Berechtigungen (Full Control) auf der entsprechenden Website (Default Website) im direkt im IIS geben.viele Grüße   tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-get-owavirtualdirectory-access-denied/\\\"},{  \\\"id\\\": \\\"post-dhcp-fehler-1003\\\",  \\\"title\\\": \\\"DHCP Fehler 1003\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Letztens konnte ich auf mehreren meiner Client-PC’s Fehlermeldungen im Eventlog bezüglich fehlerhafter Anmeldungen feststellen:Ereignistyp:&#160;&#160;&#160; Warnung   Ereignisquelle:&#160;&#160;&#160; Dhcp    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 1003    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:25    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****    Beschreibung:    Der Computer konnte die Netzwerkadresse, die durch den DHCP-Server für die Netzwerkkarte mit der Netzwerkadresse ******A98F0 zugeteilt wurde, nicht erneuern. Der folgende Fehler ist aufgetreten:     Das Zeitlimit für die Semaphore wurde erreicht. . Es wird weiterhin im Hintergrund versucht, eine Adresse vom Netzwerkadressserver (DHCP) zu erhalten. Ereignistyp:&#160;&#160;&#160; Fehler   Ereignisquelle:&#160;&#160;&#160; NETLOGON    Ereigniskategorie:&#160;&#160;&#160; Keine    Ereignis-ID:&#160;&#160;&#160; 5719    Datum:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 26.11.2009    Zeit:&#160;&#160;&#160;&#160;&#160;&#160;&#160; 11:19:33    Benutzer:&#160;&#160;&#160;&#160;&#160;&#160;&#160; Nicht zutreffend    Computer:&#160;&#160;&#160; ****Beschreibung:   Es steht kein Domänencontroller für die Domäne ***** aus folgendem Grund zur Verfügung:     Es sind momentan keine Anmeldeserver zum Verarbeiten der Anmeldeanforderung verfügbar.    Stellen Sie sicher, dass der Computer mit dem Netzwerk verbunden ist, und versuchen Sie es erneut. Wenden Sie sich an den Domänenadministrator, wenn das Problem weiterhin besteht. Als erstes habe ich die DNS Struktur gecheckt. Danach mit den beiden Tools dcdiag und netdiag mehrfach Diagnosen gestartet und ausgewertet. Laut den Diagnosetools war alles OK.    Nach ein wenig Recherche habe ich das Problem entdeckt: Es war der Switch.     Auf den Switch ist das STP Protokoll aktiv. Dieses braucht üblicherweise 30-60 Sekunden um den Switchport von Listening und Learning Status auf Forwarding zu bringen. Da die PC’s schneller starten als der Switchport aktiv ist, kann der PC seine IP nicht erneuern bzw. anfordern.Das Problem kann man umgehen indem man die Client-Switchports auf “PortFast” stellt und somit der Switchport sofort in den Forwarding-Status geht.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/dhcp-fehler-1003/\\\"},{  \\\"id\\\": \\\"post-windows-7-usbdvd-download-tool\\\",  \\\"title\\\": \\\"Windows 7 USB/DVD Download Tool\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Microsoft hat nun ein kostenloses Tool zur Verfügung gestellt um einen USB Stick Bootfähig zu machen, die Windows 7 Installationsdateien darauf zu kopieren und damit die Windows 7 Installation durchzuführen.Windows 7 USB/DVD Download ToolDer USB Stick muss mindestens 4 GB groß sein. Wie ein USB Stick manuell für die Installation präpariert werden kann, hat Thomas in einen vorhergehenden Post erklärt.Viel Spaß beim installieren!!    Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-usbdvd-download-tool/\\\"},{  \\\"id\\\": \\\"post-microsoft-techday-dezember-2009\\\",  \\\"title\\\": \\\"Microsoft TechDay Dezember 2009\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Events\\\"],  \\\"content\\\": \\\"Die jährlichen Microsoft Techdays stehen wieder vor der Tür. Vorgestellt werden folgende Produkte: Office, Sharepoint und Exchange in der Version 2010.   Steffen Krause und Daniel Melanchton präsentieren alle wesentlichen Neuerungen anhand von vielen Demos.Termine:     08.12.2009: Stuttgart    09.12.2009: München    15.12.2009: Düsseldorf    16.12.2009: BerlinZur Anmeldung und Agenda über den LinkGrüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/microsoft-techday-dezember-2009/\\\"},{  \\\"id\\\": \\\"post-microsoft-hyper-v-server-2008-v1-vs-v2\\\",  \\\"title\\\": \\\"Microsoft Hyper-V Server 2008 V1 vs. V2\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Hyper-V\\\"],  \\\"content\\\": \\\"Der neue Microsoft Hyper-V Server 2008 R2 steht ja nun seit einigen Wochen auf TechNet zum downloaden bereit. Hier erkläre ich nochmal kurz alle Neuerungen.In der folgenden Tabelle werden die Features von Hyper-V V1 und V2 gegenübergestellt. Neu in V2 ist außerdem:   Hochverfügbarkeit und Live-Migration (nettes Feature)    Bis zu 384 virtuelle Maschinen und 512 virtuelle Prozessoren werden unterstützt    Virtuelle Festplatten können ab jetzt im laufenden Betrieb hinzugefügt bzw. entfernt werden. Ein Neustart ist nicht mehr nötig    Für die Netzwerkunterstützung: VMQ, TOE, Jumbo Frames    Möglichkeit von einem Flash-Speicher zu booten Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/microsoft-hyper-v-server-2008-v1-vs-v2/\\\"},{  \\\"id\\\": \\\"post-netlogon-fehler-5719-auf-server-(nicht-dc)\\\",  \\\"title\\\": \\\"Netlogon Fehler 5719 auf Server (nicht DC)\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Wenn der Fehler NETLOGON 5719 direkt nach dem starten des Servers (nicht DC) protokolliert wird, bedeutet das folgendes: Die Netlogon-Prozess hat stattgefunden bevor das Netzwerk bereit war und somit standen beim Anmeldeprozess keine Domänencontroller für die Authentifizierung zur Verfügung.Es gibt 2 Möglichkeiten das Problem zu beheben:1) Update des NetzwerkkartentreibersAls allererstes sollte der Netzwerkkartentreiber geupdated werden. In den meisten Fällen erledigt sich das Problem damit. Ich empfehle den Treiber immer von der Support-Webseite des Servers herunterzuladen, nicht vom NIC-Hersteller direkt (Bsp: Server von HP und Netzwerkkarte von Intel). Diese Treiber auf der Support-Webseite des Servers sind getestet und für das System freigegeben.2) Den Netlogon Service zwingen auf das Netzwerk zu wartenWenn der aktuelle Netzwerkkartentreiber nichts bringt, kann man den Netlogon-Prozess so zum warten zwingen:In der Registry muss der Eintrag “TermService” dem Schlüssel “DependOnService” hinzugefügt werden.    HKEY_LOCAL_MACHINE\\\\\\\\SYSTEM\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\NetlogonNachdem der Server neu gestartet wurde, sollte das Problem behoben sein.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/netlogon-fehler-5719-auf-server-(nicht-dc)/\\\"},{  \\\"id\\\": \\\"post-windows-7-e28093-update-von-rc-auf-rtm\\\",  \\\"title\\\": \\\"Windows 7 – Update von RC (7100) auf RTM (7600)\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Es ist zwar nicht wirklich empfohlen, gewünscht oder supported aber es geht. Windows 7 RTM Installationsdateien auf einen (vorbereiteten) USB Stick kopieren. In der Datei \\\\\\\\Sources\\\\\\\\cversion.ini muss der Wert MinClient auf 7100.0 (die entsprechende Build Nr. von der man updaten will) gesetzt werden. Man sollte für so ein Update einige Zeit einplanen, bei mir dauerte es ca. zwei Stunden. Das gilt übrigens auch für unterstützte Updates. Eine normale Windows 7 Installation ist bekanntlich in 20 Minuten abgeschlossen.Ein Update von x86 auf x64 oder umgekehrt lässt sich so natürlich auch nicht machen, dafür ist immer eine neuinstallation nötig. In diesem Post erklärt Daniel nochmal genau welche Updates unterstützt werden.Nochmal: ich empfehle dieses Workaround nicht für produktive Systeme, ich habe mein Notebook so aktualisiert und alles läuft wunderbar, aber es ist wie gesagt kein produktiv genutzter PC.Gruß    tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-e28093-update-von-rc-auf-rtm/\\\"},{  \\\"id\\\": \\\"post-windows-7-bootloader-os-hinzufugen\\\",  \\\"title\\\": \\\"Windows 7 Bootloader, OS hinzufügen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Der Windows Vista / 7 Bootloader hat sich ja im vergleich zu Windows XP geändert. In den früheren Windows Version konnte man die Datei Boot.ini bearbeiten um den Bootloader zu sagen was er tun soll. Ab der Version Vista nutzt man das Commandline-Tool bcdedit.exe.     Auf meinen Computer habe ich 2 Windows 7 Installationen. Auf C:\\\\\\\\befindet sich die erste, die zweite auf der Partition D:\\\\\\\\     Da ich das zweite Windows 7 durch den Restore eines Images aufgespielt habe, erscheint dies natürlich nicht automatisch in der Betriebssystemauswahl. Um das zweite Betriebssystem dem Bootloader hinzuzufügen, müssen folgende Schritte durchgeführt werden:1) Commandline mit Administratorrechte öffnen2) Einen neuen Eintrag dem Bootloader hinzufügenbcdedit /create /d “Windows 7 zweite Installation” /application osloader            Nachdem dieser Befehl ausgeführt wurde, bekommen wir eine ID       Bsp: {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395}3) Nun müssen wir den Bootloader noch sagen wo sich das zweite Betriebssystem befindet (D:)bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} device partition=C:      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} osdevice partition=D:4) Nun fügen wir den Pfad für den Bootloader und dem System Root Verzeichnis hinzubcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} path \\\\\\\\Windows\\\\\\\\system32\\\\\\\\winload.exe      bcdedit /set {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} systemroot \\\\\\\\Windows5) Als letztes stellen wir noch die Reihenfolge der Auflistung der Betriebssysteme festbcdedit /displayorder {34jhjsk5-34j4-33jj-b6ne-99ggfjej48776395} /addlastNoch zur Info: Den Namen, der bei der Betriebssystemauswahl angezeigt wird, könnt ihr mit diesen Command ändern:bcdedit /set {current} description &quot;Windows 7 erste Installation&quot;Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-bootloader-os-hinzufugen/\\\"},{  \\\"id\\\": \\\"post-servergespeicherte-ts-profile-fehler-1543\\\",  \\\"title\\\": \\\"Servergespeicherte TS-Profile, Fehler 1543\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Client\\\",\\\"Server-2008\\\",\\\"Server-2003\\\"],  \\\"content\\\": \\\"Auf meinem Terminalserver-Cluster 2008 habe ich mehrere EventLog Warnungen mit der ID 1543 (User Profile Service) bemerkt. Die Einträge deuten darauf hin, dass das UserProfil nicht synchronisiert werden konnte. Die Einträge konnte man auf allen Servern im TS Cluster finden. Etwas zur Struktur: Als Server setze ich Windows Server 2008 ein, die Server sind auf Hyper-V Servern virtualisiert. Als Speicherort für die Profile benutze ich das DSF Feature von Server 2003 R2.Zuerst dache ich mir, dass es da Probleme mit dem Netzwerk gibt. Eines wollte ich aber noch versuchen bevor ich mit der Analyse des Netzwerkes starte: Windows-Defender.Nachdem ich den Windows-Defender auf allen Terminalservern deaktiviert hatte, konnte das Problem nicht mehr reproduziert werden. Anscheinend blockiert der Windows-Defender bei der Anmeldungen bestimmte Vorgänge, die der Server braucht um das User-Profil herunterzuladen. Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/servergespeicherte-ts-profile-fehler-1543/\\\"},{  \\\"id\\\": \\\"post-netzwerkprobleme-lassen-dynamics-absturzen\\\",  \\\"title\\\": \\\"Netzwerkprobleme lassen Dynamics abstürzen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Wie ich in einem meiner letzten Posts versprochen hatte, hier der Post über die Dynamics Netzwerkprobleme.Mein Microsoft Dynamics Server arbeitete immer sehr zuverlässig, das EventLog war frei von den unbeliebten “roten Kreuzen”. Bis an den Tag x, an dem der Dynamics Service seinen Dienst verweigerte und im laufenden Betrieb stoppte. Im EventLog wurden folgende Fehlermeldungen protokolliert: Der Fehler “Error 1450 in module 1..\\\\\\\\server.cpp(498) weißt auf zu wenig Server-Ressourcen hin. Dieser Fehler konnte durch die Korrektur nicht optimaler Einstellungen an der Auslagerungsdatei behoben werden.Der Fehler “Error 3 in module 244..\\\\\\\\server.cpp(351) weißt auf einen TCP-Fehler hin. Durch die Installation der neuesten Soft- und Firmware der Netzwerkkarte konnte ich das Problem beheben.Nun ist das EventLog wieder sauber und der Server hat bisher seinen Betrieb nicht wieder unterbrochen.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/netzwerkprobleme-lassen-dynamics-absturzen/\\\"},{  \\\"id\\\": \\\"post-upgrade-auf-windows-7\\\",  \\\"title\\\": \\\"Upgrade auf Windows 7\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Die beiden Betriebssysteme Windows XP und Vista können durch eine Upgrade-Lizenz auf Windows 7 geupdated werden. Für alle anderen Betriebssysteme braucht es eine Vollversion.Beim Upgrade unterscheiden wir 2 Szenarien:    Custom Install: Das Betriebssystem muss komplett neu installiert werden.    In-Place Upgrade: Das bestehende Betriebssystem kann auf Windows 7 geupdatet werden und übernimmt somit alle vorhandenden Einstellungen bzw. Programme.Anhand dieser Matrix kann man feststellen in welchen Fällen ein In-Place Upgrade möglich ist.&#160; Quelle der Grafik: http://blogs.technet.com/dmelanchthon/Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/upgrade-auf-windows-7/\\\"},{  \\\"id\\\": \\\"post-sharepoint-logfiles-verkleinern\\\",  \\\"title\\\": \\\"Sharepoint LogFiles verkleinern\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Sharepoint\\\"],  \\\"content\\\": \\\"In letzter Zeit ist mir aufgefallen, dass der freie Speicherplatz auf meinem Sharepoint-Server immer kleiner wird. Nachdem ich mich ein bisschen auf der Partition umgesehen hatte fielen mir die großen LOG Files der Sharepoint Datenbank auf.    Wenn ihr wie ich Sharepoint in den Standardeinstellungen inkl. der Windows Internal Database installiert habt, so legt Sharepoint die Files unter C:\\\\\\\\WINDOWS\\\\\\\\SYSMSI\\\\\\\\SSEE\\\\\\\\MSSQL.2005\\\\\\\\MSSQL\\\\\\\\Data ab.         In meinem Fall hat das Content-Log 8 GB und das Config-Log 5 GB verbraten.         Um die LogFiles nun zu verkleinern muss zunächst SQL Server Management Express installiert werden.Danach muss die Datenbank mit den folgenden Parameter geöffnet werden: \\\\\\\\\\\\\\\\.\\\\\\\\pipe\\\\\\\\MSSQL$MICROSOFT##SSEE\\\\\\\\sql\\\\\\\\query Nachdem die Datenbank geöffnet wurde wählt man die Datenbank aus, deren LogFiles verkleinert werden sollen. Nach einem Rechtsklick auf die Datenbank wählt man Tasks / Verkleinern / DateienNun erscheint das Optionsfenster. Hier muss als Dateityp Protokoll ausgewählt werden. Als Information erhält man hier wie groß das aktuelle LogFile und zu wie viel es belegt ist. Im unteren Bereich kann der Speicherplatz neu organisiert werden. (In meinem Fall 2 GB) Nachdem die Eingaben bestätigt werden, schrumpft das LogFile auf die angegebene Größe zusammen.    Dieser Schritt kann für alle Datenbanken vorgenommen werden, dessen LogFile zu groß ist.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/sharepoint-logfiles-verkleinern/\\\"},{  \\\"id\\\": \\\"post-exchange-2010-e28093-dynamic-signature\\\",  \\\"title\\\": \\\"Exchange 2010 – Dynamic Signature\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Ein leidiges Thema mit den bisherigen Exchange und Outlook Versionen war die zentrale Verwaltung von Signaturen. Die meisten Administratoren verwendeten Skripts oder dritthersteller Tools um das Problem einigerma&szlig;en in den Griff zu bekommen.Mit Exchange 2010 stellt Microsoft (endlich) eine M&ouml;glichkeit vor um die Signaturen zentral zu verwalten und dynamisch zu erstellen. Verwendet wird dazu der seit Exchange 2007 bekannte Disclaimer, dieser wurde erweitert und kennt jetzt HTML Tags und Attribute aus dem Active Directory.Konfiguriert wird der Disclaimer in der Hub Transport Rolle auf Organisationsebene. Man erstellt eine neue Transport Rule indem man einfach mit rechts auf den Knoten Hub Transport klickt und &ldquo;New Transport Rule&rdquo; ausw&auml;hlt.Nachdem man Namen und Beschreibung vergeben hat, kann per Filter festgelegt werden f&uuml;r welche Mails diese Regel gelten soll. Mehr Details zu den Filterm&ouml;glichkeiten: Exchange 2010 Transport Rule Predicates.&nbsp;Als Action w&auml;hlt man &ldquo;Append disclaimer text and fallback to action if unable to apply&rdquo;. Dort kann ein beliebiger Text eingegeben werden den man mit HTML Tags formatieren und mit Platzhaltern wie %%DisplayName%% personalisieren kann. Neben dem Text kann man auch die Fallback Action festlegen, d.h. was Exchange mit der Nachricht machen soll wenn der Disclaimer nicht angewendet werden kann. Es gibt drei M&ouml;glichkeiten:wrap: die originale Nachricht wird in einen Anhang gepackt, und der Disclaimer wird in die neue Nachricht eingef&uuml;gt.reject: die Nachricht wird nicht &uuml;bermittelt, der Sender erh&auml;lt ein NDR in dem steht warum die Nachricht nicht &uuml;bermittelt werden konnte.ignore: die Nachricht wird unver&auml;ndert &uuml;bermittelt, es wird kein Disclaimer angeh&auml;ngt.Einige Details noch im Technet: Understanding DisclaimersZum Schluss kann man noch Au&szlig;nahmen definieren, f&uuml;r welche die Regel nicht zutreffen soll:Jetzt fehlt noch der klick auf New und die Regel wird erstellt. Es wird ab jetzt also jedem Mail das den Konditionen entspricht der Disclaimer Text angef&uuml;gt, egal ob es von OWA oder Outlook kommt.Eine endg&uuml;ltige L&ouml;sung stellt diese Funktion nicht dar, denn ein Nachteil des Disclaimers ist dass er am Ende der Nachricht eingef&uuml;gt wird. Antwortet man also auf ein Email so steht die Signatur (Disclaimer) ganz unten, unter dem zitiertem Mail. Alles in allem ist das meiner Meinung nach ein Schritt in die richtige Richtung, allerdings fehlt noch einiges bis zum Ziel.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/exchange-2010-e28093-dynamic-signature/\\\"},{  \\\"id\\\": \\\"post-fehler-bei-hp-netzwerkkarten-update\\\",  \\\"title\\\": \\\"Fehler bei HP Netzwerkkarten Update\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Zu Abwechslung mal ein Problem aus der HP Welt:Für heute habe ich das Firmware / Treiber Update meiner HP ML 350 G5 Server geplant. Zuerst habe ich mir die neueste Firmware-CD von HP gezogen und diese dann installieren lassen. Alles verlief ohne Probleme.    Danach wollte ich die Treiber updaten und habe bemerkt, dass jede Komponente geupdated wurde, nur der Treiber der Netzwerkkarte (v. 5.0.16.0) nicht.     Das war sehr ärgerlich, denn dieser Treiber war der Wichtigste, denn es gab Netzwerkprobleme mit Microsoft Dynamics. Folgender Fehler wurde ausgegeben: “HP Virtual Bus Device installation requires a newer version. Version 4.6.16.0 is required.”Um den Treiber dennoch installieren zu können, muss zuerst auf die Version 4.6.16.0 geupdated werden, dann kann man erst die neueste Version installieren: Link zum Treiber v4.6.16.0 Grüße, dnPS: Wenn die Netzwerkprobleme mit Dynamics behoben sind, werde ich dazu noch einen Post veröffentlichen. (kleiner Ausflug in die ERP-Software :) )\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/fehler-bei-hp-netzwerkkarten-update/\\\"},{  \\\"id\\\": \\\"post-e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung\\\",  \\\"title\\\": \\\"“DATA ENCRYPTION” Fehler bei RDP Verbindung\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2003\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Kürzlich hatte ich ein seltsames Problem mit der RDP Verbindung auf einem meiner Server die im Ausland stehen und nur über RDP erreichbar sind.   Jedes Mal wenn ich eine RDP Verbindung starten wollte, erschien die Fehlermeldung, dass ein Netzwerkfehler vorliegt.Im Eventlog wurde ein Fehler protokolliert, dass die RDP-Protokollkomponente “DATA ENCRYPTION” ein Problem verursachte. Glücklicherweise funktionierte der Zugriff durch AdminMagic noch, sodass ich mit der Fehlerbehebung beginnen konnte.Um die RDP Verbindung wieder flott zu bekommen muss folgender Registry-Eintrag gelöscht werden:HKEY_LOCAL_MACHINE\\\\\\\\System\\\\\\\\CurrentControlSet\\\\\\\\Services\\\\\\\\TermService\\\\\\\\     Parameters\\\\\\\\ CertificateNach einem Neustart des Servers konnte ich mich wieder via RDP auf dem Server verbinden.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung/\\\"},{  \\\"id\\\": \\\"post-windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden\\\",  \\\"title\\\": \\\"Windows Server / Hyper-V Server 2008; storflt kann nicht geladen werden\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Nachdem ich alle meine Hyper-V Server 2008&#160; auf SP2 aktualisiert habe, erhalte ich beim Start der Maschinen einen Fehler im Ereignisprotokoll, dass storflt nicht geladen werden konnte. Dieser Fehler ergibt sich aus upgedateten Treibern für den Hypervisor durch SP2 und wird nur auf physischen Maschinen protokolliert. Der Eventlog-Eintrag kann einfach ignoriert werden.Mit dem Befehl sc delete storflt wird der Dienst storflt gelöscht und der Fehler nicht mehr protokolliert. Dies darf jedoch nur für den Windows Server 2008 gemacht werden, nicht für den Hyper-V Server, da dieser den Service für die virtuellen Maschinen braucht.Sollte der Service auf einem Hyper-V Server gelöscht werden, bleibt dieser beim Starten mit einem Bluescreen stehen. Durch die “Letzte bekannte Konfiguration” kann der Server aber wieder gestartet werden.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden/\\\"},{  \\\"id\\\": \\\"post-active-directory-verwaltungscenter\\\",  \\\"title\\\": \\\"Active-Directory-Verwaltungscenter\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\"],  \\\"content\\\": \\\"Mit dem Windows Server 2008 R2 ist ein neues Verwaltungs-Feature hinzugekommen: “Active-Directory-Verwaltungscenter”. Das neue Verwaltungscenter basiert auf der PowerShell v2 was bedeutet, dass jede Aktion im Hintergrund einen PowerShell Befehl startet.     Durch dieses neue Feature soll dem Administrator die tägliche AD-Objektverwaltung vereinfacht werden. Für folgende Aufgaben kann die neue Konsole verwendet werden (Auszug aus technet.microsoft.com)   Erstellen neuer Benutzerkonten oder Verwalten vorhandener Benutzerkonten     Erstellen neuer Gruppen oder Verwalten vorhandener Gruppen     Erstellen neuer Computerkonten oder Verwalten vorhandener Computerkonten     Erstellen neuer Organisationseinheiten und Container oder Verwalten vorhandener Organisationseinheiten     Herstellen von Verbindungen mit einer oder mit mehreren Domänen bzw. Domänencontrollern in derselben Active Directory-Verwaltungscenterinstanz und Anzeigen oder Verwalten der Verzeichnisinformationen für diese Domänen oder Domänencontroller     Filtern von Active Directory-Daten mithilfe der abfragegenerierenden Suche  Die Oberfläche Die Oberfläche wirkt strukturiert und Übersichtlich. Die Suche Häufig verwendete Kriterien lassen sich schnell der Suche hinzufügen. Neuen Benutzer anlegen Einfache Navigation durch die Container&#160;Auf mich wirkt die Oberfläche sehr übersichtlich und durchdacht. Alle Aufgaben lassen sich jedoch nicht abbilden, sodass man auf die Konsole “Active-Directory-Benutzer und Computer” nicht völlig verzichten kann.    Im täglichen AD-gebrauch spricht einer Verwendung der neuen Konsole jedoch nichts dagegen.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/active-directory-verwaltungscenter/\\\"},{  \\\"id\\\": \\\"post-language-pack-fur-windows-7\\\",  \\\"title\\\": \\\"Language Pack für Windows 7\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Für Windows 7 in der Enterprise und Ultimate Edition sind die Language Packs nun verfügbar.Im Windows Update Fenster lassen sich die Pakete herunterladen und installieren. Nachdem das Paket heruntergeladen und installiert wurde, kann es in der Systemsteuerung unter “Region und Sprache” bei “Anzeigesprache” aktiviert werden.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/language-pack-fur-windows-7/\\\"},{  \\\"id\\\": \\\"post-hyper-v-server-2008-r2-cluster\\\",  \\\"title\\\": \\\"Hyper-V Server 2008 R2 Cluster\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Hyper-V\\\",\\\"Server\\\",\\\"Server-2008-R2\\\"],  \\\"content\\\": \\\"Da der Hyper-V Server 2008 R2 und der Windows Server 2008 R2 nun RTM sind, habe ich mir den Hyper-V Cluster näher angeschaut.        Für die Simulation habe ich 3 physische Computer verwendet:2 Hyper-V Server 2008 R2   1 Windows Server 2008 R2 (inkl. iSCSI Target)Das zentrale Storage wird über iSCSI angebunden. Dafür verwenden wir den Windows Server 2008 R2.Topologie&#160; Um den Cluster zu erstellen müssen 8 Schritte durchgeführt werden:Schritt 1 Hyper-V Server und Server 2008 R2 auf den 3 Computern installierenDie beiden Hyper-V Server werden mit der Standard-Installation installiert. Der Windows Server 2008 R2 wird zusätzlich zum DC heraufgestuft um die Domäne hyper.local bereit zu stellen.Schritt 2 Firewall deaktivierenFür den Test habe ich auf den 3 Servern die Firewall deaktiviert, um nicht die entsprechenden Ports öffnen zu müssen.Schritt 3 Hyper-V Server in Domäne aufnehmenAls nächstes werden die Hyper-V Server in die Domäne aufgenommen.Schritt 4 Verwaltungstools auf dem Windows Server installierenUm den Cluster später steuern zu können müssen wir 2 Konsolen installieren: Clusterverwaltung und die Hyper-V Tools. Die Konsolen können unter den Features aktiviert werden. Schritt 5 iSCSI Target installieren und konfigurierenAls iSCSI Target Software habe ich das Tool von StarWind verwendet. Nachdem das Programm installiert wurde, kann man sich unter den Benutzernamen “test”, Password “test” anmelden und das Target entsprechen konfigurieren.Am iSCSI Target erstellen wir zunächst 2 virtuelle Volumes. 1 Volume wird als Quorumdatenträger für den Cluster verwendet, das andere als Storage für die VHD’s. Wichtig ist dabei, dass die Option “Allow multiple concurrent iSCSI connections (clustering)” verwendet wird, somit können beide Hyper-V Knoten gleichzeitig auf die Volumes zugreifen.Schritt 6 Hyper-V Server mit den iSCSI Volumes verbindenJetzt muss noch die Verbindung zwischen den Hyper-V Server und dem iSCSI Target hergestellt werden. In der Version R2 des Hyper-V Servers wurde eine grafische Oberfläche für den iSCSI-Initiator hinzugefügt. Der Initiator wird mit den Command iscsicpl gestartet. Nachdem wir zugestimmt haben den iSCSI Dienst zu starten, erhalten wir die Oberfläche wo wir die IP Adresse des iSCSI Targets eintragen und uns zunächst nur mit dem Quorum Volume verbinden.Jetzt muss das Volume noch entsprechend Formatiert werden.Schritt 7 Cluster einrichtenNun können wir den Cluster erstellen. Wir verbinden uns auf die Hyper-V Server und aktivieren mit Option 11 die Failoverclusterfeatures.Nachdem die Features auf beiden Servern aktiviert sind, öffnen wir den Failovercluster-Manager auf dem Windows Server und starten die Clusterkonfiguration.Nachdem wir beide Hyper-V Server für den Cluster angegeben haben, startet die Konfigurationsüberprüfung. Sofern bis hierhin alle richtig Konfiguriert wurde, sollte der Check keine Fehler aufzeigen.&#160; Nachdem der Cluster vollständig erstellt wurde, werden beide Hyper-V Server im Manager angezeigt.Da wir den Quorumdatenträger bereits mit beiden Cluster-Knoten verbunden haben, wurde dieser erkannt und schon als Quorumdatenträger konfiguriert.Jetzt verbinden wir das Storage-Volume mit den beiden Cluster Knoten um auf die VHD’s zuzugreifen. Bevor das Volume benutzt werden kann, muss es noch formatiert werden.    Jetzt aktivieren wir im Failovercluster-Manager die “Cluster Shared Volumes” und erlauben somit gleichzeitigen Zugriff auf die VHD’s. Um nun das Storage-Volume einzubinden, müssen wir es zunächst dem “Speicher” und dann den “Freigegeben Clustervolumes” (Cluster Shared&#160; Volumes) hinzufügen.Sobald Cluster Shared Volumes verwendet werden, kann man auf diese unter C:\\\\\\\\ClusterStorage\\\\\\\\ zugreifen. Für jedes Volume wird ein eigener “Ordner” erstellt.Schritt 7 Virtuelle Maschine erstellenAls nächstes erstellen wir eine virtuelle Maschine (z.B. Windows XP) und ein virtuelles Netzwerk über die zuvor installierte Hyper-V Konsole auf einem der Hyper-V Server. Die VHD und entsprechende Konfigurationsdatei wird dabei auf dem Storage-Volume erstellt. Wichtig: Die virtuelle Maschine muss mit dem Netzwerkadapter verbunden werden bevor sie hochverfügbar gemacht wird, sonst kann die Maschine nicht auf den anderen Knoten verschoben werden.Schritt 8 Virtuelle Maschine hochverfügbar machenUm die virtuelle Maschine hochverfügbar zu machen, fügen wir einen neuen Dienst hinzu. Dabei muss geachtet werden, dass sich die Maschine im Status beendet oder gespeichert befindet. Ich empfehle die Maschine komplett herunterzufahren um Probleme zu vermeiden. Wir erhalten danach eine Liste mit den virtuellen Maschinen. Nachdem wir die Testmaschine ausgewählt haben, startet die Konfiguration um den Host hochverfügbar zu machen.Die Konfiguration ist soweit abgeschlossen.Test 1 Quick- und Live-MigrationQuick- und Live-Migration sind beides Verfahren um virtuelle Maschine auf einen anderen Knoten zu verschieben.&#160; Mehr Infos (Whitepapers) zu Live- und Quick-MigrationLive Migration    In meinen Test habe ich für die Live-Migration lediglich 1 Ping verloren.&#160;Quick-Migration     Für den Umzug auf den 2. Knoten durch Quick-Migration gingen 9 Pings an die virtuelle Maschine verloren.&#160; Test 2 Ausfall von einem Hyper-V Server simulierenAls 2. Test habe ich den Stromstecker des Hyper-V Servers gezogen, der aktuell die virtuelle Maschine hostet. Der Failovercluster hat nach wenigen Sekunden die virtuelle Maschine auf dem 2. Konten neu gestartet.   Grüße,dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/hyper-v-server-2008-r2-cluster/\\\"},{  \\\"id\\\": \\\"post-applocker\\\",  \\\"title\\\": \\\"AppLocker\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"In einem meiner letzten Beiträge habe ich kurz über ein paar Neuerungen von Windows 7 berichtet. Mittlerweile habe ich mir das Feature “AppLocker” näher angeschaut:Mit AppLocker kann man den Clientcomputer noch besser schützen, indem man nun sehr viel genauer vorgeben kann welche Anwendungen ein Benutzer ausführen bzw. installieren darf. AppLocker kann über ein Domänen- oder über die lokale-GPO konfiguriert werden.Wie man AppLocker verwendet zeige ich Anhand von folgendem Beispiel: Benutzern ist es nur erlaubt Applikationen auszuführen, die sich unter %Programfiles% und %Windir% befinden. Benutzer die der Gruppe “Not Restr Access” angehören ist es außerdem erlaubt das Testprogramm “Excel Viewer 2003” aus dem Verzeichnis “C:\\\\\\\\Program Files 2” zu starten. Als erstes öffnet man das GPO und wechselt zur Option “AppLocker”&#160;Für die Option Executable Rules lassen wir die Standardregeln generieren (“Create default Rules”). Nachdem diese konfiguriert sind, findet man 3 Regeln vor:        1. Admins dürfen alle Programme aufrufen    2. User dürfen Programme aus %Windir% starten    3. User dürfen Programme aus “%Programfiles% starten Jetzt müssen wir eine neue Regel erstellen, die der Benutzergruppe “Not Restr Access” erlaubt unsere Testapplikation zu starten. Über “Create New Rule” wird der entsprechende Wizard gestartet. Wir wählen die Option “Allow” und beziehen die Regel auf die Gruppe “Not Restr Access”. Jetzt haben wir 3 Möglichkeiten. Über die Option Publisher kann ein einzelnes signiertes Programm freigegeben oder gesperrt werden, über die Option Path ein ganzer Pfad und über die Option File Hash eine nicht-signierte Applikation. Im unseren Beispiel wählen wir die Option Publisher, da der Excel Viewer von Microsoft zertifiziert ist. Nachdem die Applikation ausgewählt wurde, kann über einen Schieberegler die Genauigkeit der Prüfung von AppLocker eingestellt werden. (Bsp. AppLocker soll nur den Dateinamen, nicht die Dateiversion prüfen) Wenn nötig können im nächsten Schritt noch Ausnahmen definiert werden. Somit haben wir unsere Regel definiert.Wichtig: AppLocker ist auf einen Dienst angewiesen der aus Sicherheitsgründen nicht automatisch startet. Damit die Einstellungen greifen, muss der Dienst “Application Identity” gestartet werden. Ich empfehle den Dienst solange im Startmodus “Manuell” zu belassen, bis alle Einstellungen passen. Wenn wir jetzt den Test machen, können Benutzer aus der Gruppe “Not Restr Access” problemlos den Excel Viewer starten. Benutzer, die nicht dieser Gruppe angehören, erhalten eine Fehlermeldung. Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/applocker/\\\"},{  \\\"id\\\": \\\"post-windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn\\\",  \\\"title\\\": \\\"Windows 7, Server 2008 R2 und Hyper-V Server 2008 R2 in Deutsch auf TechNet/MSDN\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\",\\\"Server-2008-R2\\\",\\\"Hyper-V\\\"],  \\\"content\\\": \\\"Für TechNet bzw. MSDN Abonnenten stehen nun auch die deutschen ISO’s zu Windows 7 bereit. Zeitgleich wurde der Server 2008 R2 und der Hyper-V Server 2008 R2 zum downloaden bereit gestellt.TechNet    MSDNGrüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn/\\\"},{  \\\"id\\\": \\\"post-windows-virtual-pc-e28093-undo-und-differencing-disks\\\",  \\\"title\\\": \\\"Windows Virtual PC – UnDo und Differencing Disks\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"In meinem letzen Beitrag über den Windows Virtual PC habe ich die Undo und differenzierenden Festplatten erwähnt, hier die versprochenen Details.UnDo Disks – Snapshots für Virtual PC!?Bei den UnDo Disks handelt es sich um ein Feature das ich in bisherigen Virtual PC Versionen immer vermisste: Man kann den Status einer VM vor einer Änderung sichern und kann auf den Punkt der Sicherung zurückspringen wenn die Änderung nicht so funktioniert wie man sich das vorgestellt hat.UnDo Disks werden in den Einstellungen der VM aktiviert. Die Virtuelle Maschine muss ausgeschaltet (heruntergefahren) sein damit die Option zur Verfügung steht. Beim nächsten Start der VM wird eine .vud Datei erstellt, in dieser werden (wie bei einem Snapshot in der Enterprise Umgebung) ab jetzt&#160; alle Änderungen gespeichert. Die VHD bleibt unverändert. In der Zwischenzeit habe ich um eine Änderung zu simulieren einfach mal ein Programm installiert. Man sieht auch gleich dass die .vud Datei größer wird. Um die Änderungen in die VHD zu übernehmen bzw. diese zu verwerfen muss man die VM wieder schließen (herunterfahren/Ruhezustand) und in den Einstellungen den entsprechenden Punkt auswählen. Ich habe mich entschieden die Änderungen zu verwerfen also wird meine .vud Datei gelöscht. Nach dieser Aktion wird wieder von der VHD gestartet und alles ist so wie es vorher war.     Wenn man Änderungen übernimmt werden diese in die VHD geschrieben.Lässt man die Undo Disk aktiv und startet die Virtuelle Maschine wieder, wird erneut eine .vud Datei erstellt in der alle Änderungen bis zum Übernehmen oder Verwerfen separat gespeichert werden. Um die Undo Disk zu deaktivieren muss die virtuelle Maschine heruntergefahren werden, im Ruhezustand geht das nicht.Insgesamt also ein super Feature, spart einem sicher ‘ne Menge Arbeit.Differencing DisksIm zweiten Beispiel installiere ich mehrere neue VMs in differenzierenden Disks auf Basis einer bereits bestehenden Maschine.Wichtig: Differenzierende Virtuelle Maschinen basieren auf einer bereits installierten VM, wenn ich also für eine Testumgebung mehrere VMs brauche kann ich eine bestehende beliebig oft duplizieren und so Zeit sparen. Ich habe die Quell-VM mit sysprep vorbereitet um Probleme mit gleichen SID und Computernamen zu verhindern. Wichtig ist außerdem dass man die Quell-VHD herunterfährt und auf Schreibgeschützt setzt, denn wenn diese geändert wird sind alle erstellten Differenzierenden Disks ungültig.Update: Wenn man die VMs so dupliziert erhalten alle “Child” VMs die gleiche MAC Adresse. Die einzige Lösung die ich im Moment gefunden habe ist in der .vmc Datei die MAC Adresse zu löschen, dann wird einen neue generiert. Also kann man sagen um die Quell VM richtig vorzubereiten muss man 3 Punkte beachten:   Betriebssystem vorbereiten (sysprep)     Quell VM herunterfahren und VHD als Read-Only markieren     MAC Adresse aus der Konfigurationsdatei der Quell VM löschen     Man erstellt also eine neue VM über den Button “Create virtual machine” und gibt ihr einen Namen. Bei Add Disk wählt man “Create a Virtual Hard Disk using advanced options” und dann “Differencing Hard Disk”. Der neuen HD kann man einen Namen geben und dann muss man die Quell-VHD (parent) angeben. Wenige Sekunden später hat man eine neue VM bei der man nur noch die Windows Einstellungen anpassen muss. Der Vorteil ist dass nicht die ganze Quell-VM kopiert wird, sondern nur der Teil ab dem man die Differenzierende HD erstellt. So spart man neben viel Zeit auch noch einiges an Speicherplatz.viele Grüße!    tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-virtual-pc-e28093-undo-und-differencing-disks/\\\"},{  \\\"id\\\": \\\"post-windows-virtual-pc\\\",  \\\"title\\\": \\\"Windows Virtual PC\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Mit Windows 7 wurde auch der Windows XP Mode vorgestellt. Dieser basiert auf der neuen Virtualisierungstechnologie Windows Virtual PC.Voraussetzung für die Verwendung des Windows VPC ist dass die CPU Virtualisierungstechnologien unterstützt. Mit diesen Tools kann man überprüfen ob Virtualisierung unterstützt wird: Intel, AMDDie Virtualisierungstechnologien müssen im BIOS noch aktiviert werden, also am besten im Handbuch des Mainboard Herstellers nachschlagen.    Tipp: Bei HP Computern ist die Einstellung unter “Sicherheit” versteckt, nicht unbedingt logisch aber bitte.Auf die Installation des XP-Mode möchte ich nicht weiter eingehen, den kann man sich selbst herunterladen und mit wenigen Klicks installieren.Ich habe die Virtuellen Maschinen selbst installiert und die Integration Features und Auto Publish aktiviert, so kann ich in Windows 7 Programme aus meinen virtuellen Vista und XP Maschinen verwenden. So präsentiert sich der neue Virtual PC, integriert in ein normales Explorer Fenster hat man die Möglichkeit Virtuelle Maschinen und Festplatten zu erstellen, zu bearbeiten oder zu löschen. Durch einen rechtsklick auf die VM kommt man zu den bekannten Einstellungen. Eine neue virtuelle Maschine wird einfach durch klicken auf “Create virtual machine” erstellt, in den folgenden Dialogen wird der Speicherort für VHD und Konfigurationsdateien festgelegt. Im nächsten Dialog kann der Arbeitsspeicher festgelegt werden und Networking für die VM aktiviert oder deaktiviert werden. Abschließend entscheidet man sich für einen VHD Typ (Fix, Dynamisch, Differenzierend) seiner Wahl und klickt auf Create. Ein genauerer Blick lohnt sich auf die Undo Disk Option, bei dieser werden die Änderungen die man in der VM macht in einem separatem File gespeichert. So kann man fehlgeschlagenen Änderungen immer wieder verwerfen. Dazu (und zum Thema Differenzierende Festplatte) gibts einen eigenen Artikel.&#160;Und schon haben wir eine VM erstellt. In den Einstellungen (rechtsklick auf die VM) kann man noch genauere Einstellungen definieren, für mich reicht es aber vorerst das CD Image für die Installation auszuwählen. Wenn man die VM startet wird von “CD” gestartet und die Windowsinstallation beginnt. Hat man das Betriebssystem installiert, sollte man die Integration Features aktivieren (Klick auf Tools, Enable Integration Features). Mit diesen Features kann man Sound, Zwischenablage, Drucker, Smart Cards und die Laufwerke des Lokalen Computers in der VM verwenden.Möchte man außerdem die Programme der VM auf dem physikalischen Computer verwenden muss man noch ein Update Installieren und “Auto publish” in den Einstellungen der VM aktivieren.Update for Windows XP SP3 to enable RemoteApp     Update for Windows Vista SP1 or above to enable RemoteApp Im Startmenü von Windows 7 werden nun die Programme angezeigt die in den Virtuellen Maschinen installiert sind.&#160; Wichtig: Es muss eine Verknüpfung mit dem Programm und All Users/Startmenü erstellt werden, nur dann werden die Programme korrekt angezeigt. Um ein Virtuelles Programm zu starten muss die Virtuelle Maschine geschlossen sein. Wenn sie sich im Ruhezustand befinden wird sie im Hintergrund automatisch gestartet.viele Grüße!   tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-virtual-pc/\\\"},{  \\\"id\\\": \\\"post-bitlocker-to-go\\\",  \\\"title\\\": \\\"BitLocker To Go\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Mit BitLocker To Go lassen sich lokale / externe Datenträge sowie USB Sticks einfach verschlüsseln. Eine neue Funktion ist zudem, dass die Partition bzw. das Laufwerk nicht nur verschlüsselt, sondern auch mit Passwort geschützt wird. Die Verschlüsselungsstärke kann über eine GPO von 128 auf 256 Bit erhöht werden.Um den mit BitLocker verschlüsselten Datenträger auf Windows Vista bzw. XP verwenden zu können muss der Datenträger zwingend mit FAT formatiert sein. In diesem Legacy-Modus kann mit Vista und XP auf dem Datenträger nur gelesen, nicht geschrieben werden.Anleitung um BitLocker To Go zu aktivieren1) Datenträger mit FAT formatieren   2) BitLocker für den Datenträger aktivieren 3) Art des Schutzes wählen (Passwort oder Smart Card) 4) Nun muss gewählt werden, in welcher Form der Wiederherstellungsschlüssel&#160; gespeichert wird. Der Wiederherstellungsschlüssel dient dazu den Datenträger zu entschlüsseln, sollte man das Passwort vergessen haben. Man hat hier 2 Möglichkeiten: Den Key speichern oder drucken.5) Nun kann das Laufwerk verschlüsselt werden Windows 7    Steckt man den Datenträger nun in den Windows 7 Computer, so erscheint folgende Passwortabfrage bevor auf dem Datenträger lesen und schreiben werden kann. Windows Vista bzw. XP     Steckt man den Datenträger in einem Vista oder XP Rechner startet das “BitLocker To Go-LeseTool”. Nach Eingabe des Passwortes kann auf dem Datenträger gelesen werden.&#160;Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/bitlocker-to-go/\\\"},{  \\\"id\\\": \\\"post-windows-7-sicherheitsproblem-in-uac\\\",  \\\"title\\\": \\\"Windows 7 - Sicherheitsproblem in UAC\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Auf diversen Blogs ist zu lesen dass es ein Problem mit der Benutzerkontensteuerung (UAC, User Account Control) in Windows 7 gibt. Das habe ich mir gestern kurz angesehen und hier ist das Ergebnis. (getestet mit Windows 7 RC, 7100)Es war möglich mit dem Tool von Leo Davidson ein beliebiges Programm mit administrativen Rechten zu starten ohne eine UAC abfrage hervorzurufen. Aber ich musste Mitglied einer Gruppe mit administrativen Rechten sein (z.B. Administratoren), als normaler User funktionierte es nicht. Wenn man also mit in der UAC nur noch “Ja ich will&quot; klicken müsste, dann kann man sie mit dem Code Injection Issue umgehen, wird ein Passwort abgefragt funktioniert das Ganze anscheinend nicht.Meiner Meinung nach handelt es sich hier also um ein Problem, jedoch ist es in meinen Augen nicht so dramatisch. Im Enterprise Umfeld sollte eh kein User Mitglied in administrativen Gruppen sein und zu Hause wird man wohl kaum (gewollt) seinen eigenen PC abschießen. Trotzdem sollte sich Microsoft das Problem zu Herzen nehmen, denn der Entwickler hat es genau Dokumentiert und laut eigenen Angaben MS schon seit längerem informiert.Links zu Artikeln Rund um dieses Thema:Long Zheng 1, 2, Video    Leo Davidsonviele Grüße   tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-sicherheitsproblem-in-uac/\\\"},{  \\\"id\\\": \\\"post-windows-7-neuerungen-auf-den-ersten-blick\\\",  \\\"title\\\": \\\"Windows 7 Neuerungen auf den ersten Blick\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Benutzeroberfl&auml;che Was einem sofort ins Auge sticht ist die v&ouml;llig &uuml;berarbeitete Oberfl&auml;che. Ge&ouml;ffnete Programme scheinen als Icons in der Taskleiste auf und genehmigen Einblicke auf die ge&ouml;ffneten Fenster.WLAN Auf der rechten Seite der Taskleiste findet sich eine &Uuml;bersicht der verf&uuml;gbaren Drahtlosnetzwerke. Die Verbindungen lassen sich mit einen klick auf Connect z&uuml;gig herstellen.BitLocker to Go Mit dieser Erweiterung von BitLocker lassen sich Wechseldatentr&auml;ger verschl&uuml;sseln. Somit sind auch Daten die unterwegs mitgenommen werden gesch&uuml;tzt. Einfach den USB Stick anschlie&szlig;en und im BitLocker Men&uuml; die Verschl&uuml;sselung aktivieren.&nbsp;Oberfl&auml;che Die Verwaltung zu Oberfl&auml;chenanpassung wurde sehr viel &Uuml;bersichtlicher gestaltet. Neue Styles lassen sich einfach ausw&auml;hlen und aktivieren.Media Center + Media Player 12 Das Media Center wurde &uuml;berarbeitet. Die Men&uuml;s sind klarer strukturiert und die Konfiguration l&auml;sst sich in wenigen Schritten beenden.Der Media Player hat auch ein neues Gesicht bekommen. Die Multimedia-Unterst&uuml;tzung wurde durch zus&auml;tzliche Codes f&uuml;r langsame Systeme optimiert.Die Installation vom USB Stick hat keine halbe Stunde gedauert und schon war Windows 7 betriebsbereit. Auf den ersten Blick macht Windows 7 RTM einen sehr guten Eindruck. Was das Betriebssystem in Sachen Performance und Alltagstauglichkeit leisten kann wird sich in den n&auml;chsten Wochen zeigen. Es wird sicher noch der ein oder andere Post von Thomas und mir diesbez&uuml;glich erscheinen.Gr&uuml;&szlig;e, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-neuerungen-auf-den-ersten-blick/\\\"},{  \\\"id\\\": \\\"post-remoteapp-mit-zertifikat\\\",  \\\"title\\\": \\\"RemoteApp mit Zertifikat\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\",\\\"Server\\\",\\\"Server-2008\\\"],  \\\"content\\\": \\\"Die Sicherheit von RemoteApp Programmen kann erh&ouml;ht werden indem die Echtheit des Servers mit einem Zertifikat best&auml;tigt wird. Daf&uuml;r habe ich ein Computerzertifikat f&uuml;r den Terminal Server ausgestellt der die RemoteApp Programme hosted. Das ausgestellte Zertifikat muss nat&uuml;rlich g&uuml;ltig sein, d.h. Datum und Namen m&uuml;ssen stimmen und die ausstellende CA (Enterprise CA in meinem Fall) muss vertrauensw&uuml;rdig sein.&nbsp;Um RemoteApp Programme mit Zertifikaten zu signieren muss man nicht wie bei den Makros (wie Daniel schreibt) eine Richtlinie f&uuml;r Softwareeinschr&auml;nkung erstellen, sondern man erstellt ein GPO in dem man den Fingerabdruck des Zertifikates zu den Vertrauensw&uuml;rdigen RDP-Herausgebern hinzuf&uuml;gt. Die entsprechende Einstellung findet sich als Computer oder Benutzerkonfiguration unter:Administrative Vorlagen/Windows-Komponenten/Remote Desktop Services/Remotedesktopverbindungs-Client/SHA1-Fingerabdr&uuml;cke von Zertifikaten angeben, die vertrauensw&uuml;rdige RDP-Herausgeber darstellenSo wird die Identit&auml;t des Remotecomputers verifiziert und beim verbinden erh&auml;lt der Benutzer keine Abfrage ob er dem Herausgeber auch wirklich vertraut.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/remoteapp-mit-zertifikat/\\\"},{  \\\"id\\\": \\\"post-doch-kein-windows-7-e\\\",  \\\"title\\\": \\\"Doch kein Windows 7 E\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Nachdem man schon ein paar Tage etwas dar&uuml;ber lesen konnte scheint es nun fix zu sein: Windows 7 kommt mit Internet Explorer f&uuml;r alle, also kein \\\\\\\"E\\\\\\\" Version f&uuml;r den europ&auml;ischen Markt.Alle die&nbsp;Windows 7 E Vorbestellt haben werden eine Vollversion des jeweiligen Produktes erhalten.Als alternative wird vermutlich eine Browserauswahl beim Start von Windows 7 zur Verf&uuml;gung stehen, so kann der Benutzer sich f&uuml;r seinen bevorzugten Browser entscheiden.Der gr&ouml;&szlig;te Vorteil dieser Aktion ist wohl die Upgrade Funktion die nun auch f&uuml;r uns Europ&auml;er verf&uuml;gbar ist. So kann man von Windows Vista bequem updaten ohne seine Einstellungen zu verlieren. F&uuml;r Windows XP wird es keine Upgrade Funktion geben, man kann jedoch eine g&uuml;nstigere Upgrade Version kaufen und diese installieren.Hier&nbsp;gehts zum Artikel von Daniel Melanchthon wo man genaueres nachlesen kann.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/doch-kein-windows-7-e/\\\"},{  \\\"id\\\": \\\"post-windows-7-joint-launch-roadshow\\\",  \\\"title\\\": \\\"Microsoft Roadshow zu neue Produkte\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Events\\\"],  \\\"content\\\": \\\"Microsoft startet Roadshow zu Windows 7, Windows Server 2008 R2, Exchange Server 2010 in f&uuml;nf deutsche St&auml;dte.Steve Ballmer selbst wird in M&uuml;nchen die neuen Produkte vorstellen.Eventtermine07. Oktober 2009 ICM M&uuml;nchen 18. November 2009 Maritim Airport Hotel Hannover20. November 2009 Swiss&ocirc;tel D&uuml;sseldorf23. November 2009 Congress Center Frankfurt am Main25. November 2009 Stadthalle KarlsruheMehr zum Event Agenda Anmeldung Gr&uuml;&szlig;e, dnDanke an Daniel f&uuml;r die Info. \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-joint-launch-roadshow/\\\"},{  \\\"id\\\": \\\"post-windows-home-server-pp3-(beta)-e28093-windows-7\\\",  \\\"title\\\": \\\"Windows Home Server PP3 (Beta) – Windows 7\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Home-Server\\\",\\\"Client\\\"],  \\\"content\\\": \\\"Mit dem Power Pack 3 wird Windows 7 besser in den Home Server integriert und man hat folgende Vorteile:   Backup &amp; Restore von Clients mit Windows 7     bessere Integration in das Windows 7 Media Center     Integration in die Bibliotheken (Libraries) von Windows 7     Verbesserungen der Suche     Besserer Support von Netbooks  Um die Beta Version des neuen Power Packs herunterzuladen muss man sich auf der Microsoft Connect Seite Registrieren.Nach dem Download erhält man ein Verzeichnis dass drei Updates, die Release Dokumentation und jeweils eine Batch Datei für Installation und Deinstallation beinhaltet. Die Batch Datei macht nichts anderes als der Reihe nach folgende Updates zu installieren: (es empfiehlt sich die Verwendung der Batch Datei, so erspart man sich einige Reboots :)).   WindowsSearch-KB940157-Srv2K3-x86-enu.exe (Installiert Windows Search 4.0)     WindowsServer2003.WindowsXP-KB969949-x86-ENU.exe (Hotfix für Windows Search 4.0 und WHS)     WHS-KB968349-v1-x86-ENU.exe (WHS Power Pack 3)  Nach der Installation wird der WHS Connector auf den Clients automatisch aktualisiert. Die neuen Features sind nach dem Update verwendbar. Für die Integration in das Media Center muss man den Media Center Connector (Start Menü) ausführen. Nach einem Neustart sind die Bibliotheken des WHS im Media Center verfügbar. Wann die endgültige Version des Power Pack 3 verfügbar sein wird ist noch nicht bekannt, man spekuliert auf eine Veröffentlichung zeitgleich mit Windows 7, also vermutlich im Oktober.Viele Grüße!\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-home-server-pp3-(beta)-e28093-windows-7/\\\"},{  \\\"id\\\": \\\"post-server-logs-in-sql-datenbank-importieren\\\",  \\\"title\\\": \\\"Server Logs in SQL Datenbank importieren\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Security\\\",\\\"SQL\\\"],  \\\"content\\\": \\\"Als ich letztens die &Uuml;berwachungsrichtlinien der Dom&auml;ne &uuml;berarbeitet habe, sind mir mehrfach fehlgeschlagene &ldquo;Objektzugriffe&rdquo; von Clients aufgefallen, die versuchten in Bereiche einzudringen, f&uuml;r die sie keine Berechtigung haben. Da das EventLog am Server jedoch kein dauerhafter Speicher f&uuml;r Log Files und f&uuml;r Auswertungen relativ umst&auml;ndlich ist, schreibe ich die Logs in eine SQL Datenbank. Anschlie&szlig;end werden die Daten so bereinigt, dass nur noch Ereignisse des Typs &ldquo;Objektzugriff&rdquo; enthalten sind.Wie ich dabei vorgegangen bin erkl&auml;rt dieser BeitragSchritt 1 &ndash; SQL Server installieren Als erstes habe ich mir einen neuen Server auf meiner Hyper-V Umgebung bereitgestellt und auf diesen dann Microsoft SQL Server 2008 installiert.Schritt 2 &ndash; Tabellen erstellenUm meine EventLogs zu speichern habe ich 2 gleiche Tabelle erstellt. Eine f&uuml;r das tempor&auml;re Speichern der EventLogs (&ldquo;tblTMPLog&rdquo;) und eine f&uuml;r das dauerhafte Speichern (&ldquo;tblSecurityObject&rdquo;). Die tempor&auml;re Tabelle wird deshalb verwendet, da die Daten vor dem eigentlichen Speichern noch bereinigt werden.Schritt 3 &ndash; EventLogs exportierenUm die Event Logs vom Server zu exportieren hilft uns das Tool &ldquo;DUMPEVT&rdquo;. Es exportiert Logs vom Server und schreibt sie in ein File. Die Logs werden dabei vom Server nicht gel&ouml;scht. Auch merkt sich das Tool welche Logs vom Server schon exportiert wurden, sodass ein Mehrfach-Export nicht passieren kann.DUMPEVT habe ich heruntergeladen, und unter C:\\\\\\\\DUMPEVT entpackt.Nun kann man sich schon von der Befehlszeile Logs vom Server holen&ldquo;C:\\\\\\\\DUMPEVT\\\\\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\\\\\DUMPEVT\\\\\\\\evtlog.csv /computer=localhostDie Logs werden wie angegeben in die Datei evtlog.csv geschriebenEs ist auch m&ouml;glich DUMPEVT vom SQL Server aus zu steuern. Daf&uuml;r muss als erstes das Feature &ldquo;xp_cmdshell&rdquo; aktiviert werden (sofern nicht nicht geschehen).Mit den folgenden Code kann man sich dann die Logs holenmaster..xp_cmdshell 'C:\\\\\\\\DUMPEVT\\\\\\\\DUMPEVT.exe /logfile=sec /outfile=C:\\\\\\\\DUMPEVT\\\\\\\\evtlog.csv /computer=localhost'Schritt 4 &ndash; Logs in die SQL Datenbank importierenUm die Logs in SQL zu importieren wird zun&auml;chst die tempor&auml;re Tabelle gel&ouml;scht und dann &uuml;ber den BULK INSERT Befehl eingelesen.DELETE FROM tblTMPLog BULK INSERT tblTMPLog FROM 'c:\\\\\\\\dumpevt\\\\\\\\evtlog.csv' WITH (FIELDTERMINATOR = ',')Schritt 5 &ndash; Tabelle bereinigenWenn ich jetzt ein SELECT * FROM tblTMPLog ausf&uuml;hre, erhalte ich folgende Ausgabe:Um die Daten zu bereinigen, entferne ich alle Ereignisse, die nicht die Kategorie &ldquo;Objektzugriff&rdquo;, ID &ldquo;560&rdquo; aufweisen. Im Field Data werden Sonderzeichen entfernt, die vom Export des Logs entstanden sind.DELETE FROM tblTMPLog WHERE NOT Category = 'Objektzugriff' DELETE FROM tblTMPLog WHERE NOT EventID = '560' Update tblTMPLog Set Data = Replace(Data, ' ', '') Update tblTMPLog Set Data = Replace(Data, '^', '') Update tblTMPLog Set Data = Replace(Data, '`', '')Schritt 6 &ndash; Tempor&auml;re Tabelle &uuml;bertragenNachdem die Daten bereinigt wurden, kann die tempor&auml;re Tabelle in die fixe Tabelle &uuml;bertragen werden. Wenn n&ouml;tig, kann man sich an dieser Stelle die Daten noch ein wenig zurechtr&uuml;cken.Bsp: Nur die Information &ldquo;Objektname&rdquo; wird f&uuml;r das Field Data &uuml;bertragen.&nbsp; &nbsp;&nbsp; UPDATE tblSecurityObject SET Data = SUBSTRING(Data,CHARINDEX('Objektname:', Data)+12,CHARINDEX('Handlekennung:', Data) - CHARINDEX('Objektname:', Data)-12) WHERE CHARINDEX('Objektname:', Data) &gt; 0Schritt 7 &ndash; AuswertungNachdem die Daten sich auf dem SQL Server befinden, kann man diese entsprechend sauber auswerten und speichern.Bsp: Programm in C# um die SQL Daten anzuzeigen&nbsp;Viel Spa&szlig; beim importieren und auswerten, dn- Vielen Dank an Robert van den Berg, der in seinem Blog das Thema bereits &auml;hnlich behandelt hat -\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/server-logs-in-sql-datenbank-importieren/\\\"},{  \\\"id\\\": \\\"post-mehrere-externe-ipe28099s-am-isa-server\\\",  \\\"title\\\": \\\"Mehrere externe IP’s am ISA Server\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server\\\",\\\"Security\\\"],  \\\"content\\\": \\\"Stellt euch folgende Situation vor:Ihr habt einen ISA Server als Firewall und mehrere öffentliche IP Adressen zur Verfügung. Die Adressen werden dem externen Interface des ISA Servers zugewiesen.    Beispiel:200.200.200.1 –&gt; VPN   200.200.200.2 –&gt; OWA    200.200.200.3 –&gt; Veröffentlichte Webseite    200.200.200.4 –&gt; SonstigesDer MX-Reccord der Domäne leitet Mails der IP Adresse 200.200.200.2 weiter. Von der 200.200.200.2 werden die Mails dem internen Mailserver zugestellt. Der Zielverkehr für das externe Netzwerk wird über die erste IP Adresse am externen Interface geleitet. Folglich wird Internetverkehr, sowie Mails über die öffentliche IP 200.200.200.1 geleitet (nach Standardkonfiguration).Wenn eurer Mailserver selbst die DNS-Auflösung vornimmt und Mails dem Ziel zustellt, tut er das mit der 200.200.200.1Mailserver führen vermehrt ein Reverse-DNS-Lookup durch, um den Versender zu verifizieren. In dieser Konfiguration stellt das aber ein Problem dar, da die Mails über die 200.200.200.1 versendet werden, der MX aber auf die 200.200.200.2 zeigt. Folglich kann es passieren, dass Mails nicht angenommen werden oder man landet gleich direkt auf der Blacklist.Um dieses Problem zu beheben hat man 2 Möglichkeiten:   Mails über einen Smarthost senden    Die öffentliche IP Adresse des Mail Servers am externen Interface des ISA Servers als erste Adresse eintragen &#160;ISA Server unterstützt bis jetzt (aktuelle Version 2006) nicht die Anbindung mehrerer öffentlicher IP Adressen.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/mehrere-externe-ipe28099s-am-isa-server/\\\"},{  \\\"id\\\": \\\"post-ein-paar-infos-zu-e2809cdirectaccesse2809d\\\",  \\\"title\\\": \\\"Ein paar Infos zu “DirectAccess”\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [\\\"Server-2008-R2\\\",\\\"Client\\\",\\\"Server\\\"],  \\\"content\\\": \\\"Mit Windows 7 und Windows Server 2008 R2 kommt ein neues Remote-Verbindungs-Feature: DirectAccess. DirectAccess ist der traditionellen VPN Verbindung sehr ähnlich, bietet jedoch entscheidende Vorteile: Clientcomputer initiieren automatisch eine gesicherte Verbindung zum Ziel. Somit bedarf es keinen Eingriff des Users, denn er ist sofort mit dem Zielnetzwerk verbunden. DirectAcces baut eine IPv6 Verbindung zum DirectAccess Server auf. Sollte die Firewall den IPv6 Verkehr blocken, so wird IP over HTTPS verwendet. Somit kann also jede Firewall mit geöffneten Web-Ports passiert werden.Man kann DirectAccess in 3 verschiedene Modi betreiben:   Full Intranet Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt     Selected Server Access: Die Verbindung vom Clientcomputer über das Internet ist authentifiziert und verschlüsselt. Die Verbindung vom Clientcomputer zum internen Netzwerk ist authentifiziert     End-to-End Access: Die Verbindung vom Clientcomputer über das Internet zum internen Netzwerk ist verschlüsselt und authentifiziert   Ein weiterer Vorteil bezieht sich auf das Patch- und Richtlinienmanagement. Befindet sich der Client mehrere Wochen nicht im internen Netzwerk, könnte es unter Umständen sein, dass er in dieser Zeit keine Updates vom Server bezieht. Mit DirectAccess ist der Client ständig in Verbindung mit den internen Servern und kann Updates sowie die aktuellen GPO’s beziehen.Um DirectAccess benutzen zu können ist zwingend Windows 7, Windows Server 2008 R2 und eine PKI nötig. Der Client muss außerdem der Domäne angehören.Grüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/ein-paar-infos-zu-e2809cdirectaccesse2809d/\\\"},{  \\\"id\\\": \\\"post-windows-7-e28093-nativer-vhd-support\\\",  \\\"title\\\": \\\"Windows 7 – Nativer VHD Support\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Das neue Windows kann von Haus aus VHDs als Festplatten einbinden. So kann man sich z.B. ein Testsystem installieren ohne die Festplatt partitionieren zu m&uuml;ssen.Virtuelle Festplatten k&ouml;nnen direkt in der Datentr&auml;gerverwaltung erstellt werden (rechtsklick auf Datentr&auml;gerverwaltung, neue virtuelle Festplatte).Will man Windows 7 auf der zu erstellenden VHD installieren muss man die Festplatte mit fester Gr&ouml;&szlig;e erstellen.&nbsp;Windows 7 von einem beliebigem Installationsmedium (USB Stick, DVD) starten und mit Shift-F10 eine Eingabeaufforderung starten. Jetzt muss man die vorhin erstellte VHD mit diskpart einbinden. Dazu wird die VHD mit selet vdisk file=c:\\\\\\\\pfad\\\\\\\\zur\\\\\\\\datei.vhd ausgew&auml;lt und mit attach vdisk angebunden.Die Installation von Windows 7 kann jetzt normal fortgesetzt werden, die Warnung dass Windows auf einer virtuellen Festplatte nicht installiert werden kann, ignoriert man einfach.mfg tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-e28093-nativer-vhd-support/\\\"},{  \\\"id\\\": \\\"post-windows-7-e28093-installation-mit-usb-stick\\\",  \\\"title\\\": \\\"Windows 7 – Installation mit USB Stick\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [\\\"Client\\\"],  \\\"content\\\": \\\"Windows 7 kann von einem USB Wechseldatentr&auml;ger aus installiert werden. So kann es problemlos auf Netbooks und anderen Ger&auml;ten ohne ein optisches Laufwerk installiert werden. Ich verwende eigentlich immer diese Variante da USB Sticks in der Regel schneller sind als DVD Laufwerke.Um den USB Stick vorzubereiten verwendet man das Programm diskpart (standartm&auml;&szlig;ig installiert). Diskpart wird in einer Eingabeaufforderung mit administrativen Rechten gestartet.Wenn Diskpart gestartet wurde \\\\\\\"list disks\\\\\\\" ausf&uuml;hren, um die installierten Laufwerke anzuzeigen.Mit \\\\\\\"select disk\\\\\\\" wird der USB Stick ausgew&auml;hlt, dann wird er mit \\\\\\\"clean\\\\\\\" gel&ouml;scht (ACHTUNG: Alle Daten auf dem Stick gehen verloren)Jetzt wird mit \\\\\\\"create partition primary\\\\\\\" eine Prim&auml;re Partition erstellt die mit \\\\\\\"active\\\\\\\" als Aktiv gesetzt wird (damit das BIOS davon booten kann). Jetzt fehlt noch das Dateisystem das mit \\\\\\\"format fs=fat32 quick\\\\\\\" festgelegt wird. Mit \\\\\\\"assign\\\\\\\" wei&szlig;t man noch einen Laufwerksbuchstaben zu.Dieser Prozess kann auch &uuml;ber GUI ausgef&uuml;hrt werden, wichtig ist nur dass am Ende eine prim&auml;re, aktive Fat32 Partition auf dem USB Stick vorhanden ist.Zu Schluss kopiert man noch alle Daten von der Windows 7 DVD auf den USB Stick. So erstellt man einen Bootf&auml;higen Stick, man muss nur noch dem BIOS beibringen davon zu starten und schon kann Windows installiert werden.Genauere Details zu Diskpart gibts im entsprechenden KB Artikel.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-e28093-installation-mit-usb-stick/\\\"},{  \\\"id\\\": \\\"post-msat-deckt-schwachstellen-in-der-it-umgebung-auf\\\",  \\\"title\\\": \\\"MSAT deckt Schwachstellen in der IT Umgebung auf\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Microsoft bietet das kostenlose Tool MSAT (Microsoft Security Assessment Tool) Unternehmen an, ihre IT-Sicherheitsumgebung zu bewerten. Als erstes wird der aktuelle Stand der IT-Sicherheit ermittelt, das Tool gibt eine nach Priorität geordnete Liste mit Problemen und Verbesserungsmöglichkeiten aus.Folgende Features sind im Tool enthalten:   Einfach zu verwendende, umfassende und kontinuierliche Sicherheitsinformationen     Ein Defense-in-Depth-Framework mit branchenbezogener vergleichender Analyse     Detailliertes, kontinuierliches Reporting mit Vergleich von Ausgangsbasis und Fortschritt     Empfehlungen und nach Priorität geordnete Maßnahmen zur Verbesserung der Sicherheit     Strukturierte Anleitungen von Microsoft und anderen Branchenvertretern   Downloaden kann man das Tool hierGrüße, dn\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/msat-deckt-schwachstellen-in-der-it-umgebung-auf/\\\"},{  \\\"id\\\": \\\"post-windows-7-e28093-rtm-verfugbarkeit\\\",  \\\"title\\\": \\\"Windows 7 – RTM Verfügbarkeit\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Wie im Windows 7 Team Blog zu lesen ist steht nun das RTM Datum fest.Die wichtigsten Daten im Überblick:   MSDN &amp; Technet ab 6. August&#160;    Volume License mit SA ab 7. August    Volume License ohne SA ab 1. September    Microsoft Partner Network Portal ab 16. August    Microsoft Action Pack ab 23. August Bei diesen Daten handelt es sich um die englischen Versionen, andere Sprachen folgen am 1. Oktober und in den Regalen steht Windows 7 ab 22. Oktober.viele Grüße    tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/windows-7-e28093-rtm-verfugbarkeit/\\\"},{  \\\"id\\\": \\\"post-zertifikat-fur-makros-der-domane-bereitstellen\\\",  \\\"title\\\": \\\"Zertifikat für Makros der Domäne bereitstellen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Letzens habe ich mir vorgenommen alle von mir geschriebenen Makros digital zu signieren, sodass die User beim Öffnen der Dateien keine Abfragen bekommen ob sie den Code aktivieren möchten oder nicht. Um einen Makro digital zu signieren und das Zertifikat der Domäne zur Verfügung zu stellen bedarf es mehrerer Schritte:    Zertifikatdienste auf einem Server installieren     Zertifikat zur Codesignatur ausstellen     Makros digital signieren und die Office-Files ablegen  Nun muss nur mehr das Zertifikat den Usern bereit gestellt werden. Wenn man das mit einem GPO macht, muss darauf geachtet werden, dass man die Einstellungen für Computer vornimmt. Das Zertifikat muss als erstes unter die Vertrauenswürdigen Stammzertifizierungsstellen Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Vertrauenswürdige Stammzertifizierungsstellen  Bis hierher wird das Zertifikat in den lokalen Zertifikat-Speicher “Vertrauenswürdigen Stammzertifizierungsstellen” geschoben. Das Zertifikat muss aber noch in den Speicher für “Vertrauenswürdige Herausgeber”, sonst erscheinen weiterhin Abfragen. Um das Zertifikat da rein zubekommen muss im vorher konfigurierten GPO eine neue “Richtlinie zur Softwareeinschränkung” erstellt werden. Computerkonfiguration &gt; Windows-Einstellungen &gt; Sicherheitseinstellungen &gt; Richtlinien öffentlicher Schlüssel &gt; Richtlinien für Softwareeinschränkung Danach muss unter “Zusätzliche Regeln” eine neue Zertifikatsregel mit den entsprechenden Zertifikat erstellt werden. Wichtig dabei ist, dass die Sicherheitsstufe “Nicht eingeschränkt” lautet. Nun wird das Zertifikat an alle Computer unter dem GPO verteilt. Alle digital signierten Makros werden ohne Abfrage ausgeführt.\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/zertifikat-fur-makros-der-domane-bereitstellen/\\\"},{  \\\"id\\\": \\\"post-delta-crl-e2809cunable-to-downloade2809d-iis-7\\\",  \\\"title\\\": \\\"Delta CRL “Unable to Download” IIS 7\\\",  \\\"author\\\": \\\"tto\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Erstmal herzlich willkommen in unserem Blog ;)und zweitens ein Problemchen &uuml;ber das ich in dieser Woche gestolpert bin: IIS 7 blockiert aus Sicherheitsgr&uuml;nden sogenannte Double-Escape Sequenzen (\\\\\\\"+\\\\\\\" \\\\\\\"-\\\\\\\"). Da die Delta CRL jedoch standardm&auml;&szlig;ig ein \\\\\\\"+\\\\\\\" im Namen hat schl&auml;gt der Download fehl. M&ouml;chte man die CRL's bzw. Delta CRL's in seiner PKI &uuml;ber http ver&ouml;ffentlichen kann man sich durch abschalten dieser Sicherheitsfunktion f&uuml;r die betreffenden Virtual Directories helfen:%windir%\\\\\\\\system32\\\\\\\\inetsrv\\\\\\\\appcmd.exe set config \\\\\\\"Default Web Site/virtual Directory\\\\\\\" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true \\\\\\\"virtual Directory\\\\\\\" entspricht dem Virtuellen Verzeichnis in dem die Delta CRL ver&ouml;ffentlicht wird.hier der entsprechende KB Artikel: http://support.microsoft.com/kb/942076mfg tt\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/delta-crl-e2809cunable-to-downloade2809d-iis-7/\\\"},{  \\\"id\\\": \\\"post-drucken-mit-internet-explorer-8-nicht-mehr-moglich\\\",  \\\"title\\\": \\\"Drucken mit Internet Explorer 8 nicht mehr möglich\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Letztens hatte ich das Problem, dass mein Internet Explorer plötzlich das Drucken verweigerte. Auch ist mir aufgefallen, dass das „Info-Fenster“ nur mehr ein weißes Fenster zeigte. Es scheint Probleme zu geben, wenn zum Internet Explorer 8 der „Microsoft Software Inventory Analyzer“ installiert wird. Deinstallation des Analyzers hat das Problem behoben. \\\",  \\\"url\\\": \\\"https://onprem.wtf/post/drucken-mit-internet-explorer-8-nicht-mehr-moglich/\\\"},{  \\\"id\\\": \\\"post-willkommen\\\",  \\\"title\\\": \\\"Willkommen\\\",  \\\"author\\\": \\\"dni\\\",  \\\"tags\\\": [],  \\\"content\\\": \\\"Willkommen im Blog von ntSystems – info.tech\\\",  \\\"url\\\": \\\"https://onprem.wtf/post/willkommen/\\\"},{  \\\"id\\\": \\\".well-known-lnurlp-tto\\\",  \\\"title\\\": \\\"Tomt\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"{    \\\\\\\"status\\\\\\\":\\\\\\\"OK\\\\\\\",    \\\\\\\"tag\\\\\\\":\\\\\\\"payRequest\\\\\\\",    \\\\\\\"commentAllowed\\\\\\\":255,    \\\\\\\"callback\\\\\\\":\\\\\\\"https://getalby.com/lnurlp/tomt/callback\\\\\\\",    \\\\\\\"metadata\\\\\\\":\\\\\\\"[[\\\\\\\\\\\\\\\"text/identifier\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"tomt@getalby.com\\\\\\\\\\\\\\\"], [\\\\\\\\\\\\\\\"text/plain\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"Sats for tto\\\\\\\\\\\\\\\"]]\\\\\\\",    \\\\\\\"minSendable\\\\\\\":1,    \\\\\\\"maxSendable\\\\\\\":1000000000,    \\\\\\\"payerData\\\\\\\":    {        \\\\\\\"name\\\\\\\":{\\\\\\\"mandatory\\\\\\\":false},        \\\\\\\"email\\\\\\\":{\\\\\\\"mandatory\\\\\\\":false}    }}\\\",  \\\"url\\\": \\\"https://onprem.wtf/.well-known/lnurlp/tto\\\"},{  \\\"id\\\": \\\"404\\\",  \\\"title\\\": \\\"404\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"404Page not found :(The requested page could not be found.You can search or go back home.\\\",  \\\"url\\\": \\\"https://onprem.wtf/404\\\"},{  \\\"id\\\": \\\"500\\\",  \\\"title\\\": \\\"500\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"500Internal Server Error :(The requested page could not be delivered.\\\",  \\\"url\\\": \\\"https://onprem.wtf/500\\\"},{  \\\"id\\\": \\\"api-v1-docs\\\",  \\\"title\\\": \\\"Index\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"[{% for p in site.resources %}{  \\\\\\\"id\\\\\\\": \\\\\\\"{{ p.relative_url | slugify }}\\\\\\\",  \\\\\\\"title\\\\\\\": {{p.data.title | jsonify}},  \\\\\\\"author\\\\\\\": {{ p.data.author | jsonify }},  \\\\\\\"tags\\\\\\\": {{ p.tags | jsonify }},  \\\\\\\"content\\\\\\\": {{ p.content | strip_html | strip_newlines | jsonify }},  \\\\\\\"url\\\\\\\": {{ p.relative_url | prepend: site.url | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]\\\",  \\\"url\\\": \\\"https://onprem.wtf/api/v1/docs/\\\"},{  \\\"id\\\": \\\"api-v1\\\",  \\\"title\\\": \\\"Index\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"{\\\\\\\"posts\\\\\\\":[{% for post in collections.posts.resources %}{  \\\\\\\"title\\\\\\\": {{post.data.title | jsonify}},  \\\\\\\"url\\\\\\\": {{ post.relative_url | jsonify }},  \\\\\\\"date\\\\\\\": {{ post.data.date | date: '%B %-d, %Y' | jsonify }},  \\\\\\\"category\\\\\\\": {{ post.category | jsonify }},  \\\\\\\"tags\\\\\\\": {{ post.tags | jsonify }},  \\\\\\\"author\\\\\\\": {{ post.data.author | jsonify }},  \\\\\\\"content\\\\\\\": {{ post.content | strip_html | strip_newlines | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}],\\\\\\\"docs\\\\\\\":[{% for p in site.resources %}{  \\\\\\\"id\\\\\\\": \\\\\\\"{{ p.relative_url | slugify }}\\\\\\\",  \\\\\\\"title\\\\\\\": {{p.data.title | jsonify}},  \\\\\\\"author\\\\\\\": {{ p.data.author | jsonify }},  \\\\\\\"tags\\\\\\\": {{ p.tags | jsonify }},  \\\\\\\"content\\\\\\\": {{ p.content | strip_html | strip_newlines | jsonify }},  \\\\\\\"url\\\\\\\": {{ p.relative_url | prepend: site.url | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]}\\\",  \\\"url\\\": \\\"https://onprem.wtf/api/v1/\\\"},{  \\\"id\\\": \\\"api-v1-posts\\\",  \\\"title\\\": \\\"Index\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"{\\\\\\\"items\\\\\\\":[{% for post in site.posts %}{  \\\\\\\"title\\\\\\\": {{post.title | jsonify}},  \\\\\\\"url\\\\\\\": {{ post.url | prepend: site.baseurl | prepend: site.url | jsonify }},  \\\\\\\"date\\\\\\\": {{ post.date | date: '%B %-d, %Y' | jsonify }},  \\\\\\\"category\\\\\\\": {{ post.category | jsonify }},  \\\\\\\"tags\\\\\\\": {{ post.tags | jsonify }},  \\\\\\\"author\\\\\\\": {{ post.author | jsonify }},  \\\\\\\"language\\\\\\\": {{ post.language | jsonify }},  \\\\\\\"content\\\\\\\": {{ post.content | strip_html | strip_newlines | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]}\\\",  \\\"url\\\": \\\"https://onprem.wtf/api/v1/posts/\\\"},{  \\\"id\\\": \\\"\\\",  \\\"title\\\": \\\"Index\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"## Welcome{: .bold-title}**{{ site.metadata.title }}** is the evolution of ntsystems.it. It contains a complete [archive](/post/) of the old site as well as new content. Just like the old site, this site is **free**. There are no trackers, no ads, no cookies. ~~We use a service worker to store pages you visited in your browser's cache storage. That makes the site [installable](https://web.dev/discover-installable/), [fast]({% link _posts/2021-01-16-why-is-this-website-fast.md %}), and it will continue to work even if you're offline.~~## Popular Tags{: .bold-title}Since 2009 we have written {{ collections.posts.resources.size }} posts. You can browse our more popular topics below or find [all tags](/tags) in the menu above.{% assign tags_max = 0 %}{% for tag in site.tags %}    {% if tag[1].size > tags_max %}    {% assign tags_max = tag[1].size %}    {% endif %}{% endfor %}{%- for i in (1..tags_max) reversed -%}{%- for tag in site.tags -%}{% if tag[1].size == i and tag[1].size > 4 %}{{ tag[0] }}{{ i }}{% endif %}{%- endfor -%}{%- endfor -%}## Recent Posts{: .bold-title}    {% for post in collections.posts.resources limit:3 %}            {{ post.data.title }}        {% if post.excerpt %}{{ post.excerpt }}{% else %}{{ post.summary }}{% endif %}        {%- endfor -%}## Archive{: .bold-title}You can find an archive of all posts here: [Archive](/post/)\\\",  \\\"url\\\": \\\"https://onprem.wtf/\\\"},{  \\\"id\\\": \\\"manifest.json\\\",  \\\"title\\\": \\\"Manifest\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"{  \\\\\\\"short_name\\\\\\\": \\\\\\\"onprem\\\\\\\",  \\\\\\\"name\\\\\\\": \\\\\\\"onprem.wtf\\\\\\\",  \\\\\\\"description\\\\\\\": \\\\\\\"My playground\\\\\\\",  \\\\\\\"icons\\\\\\\": [    {      \\\\\\\"src\\\\\\\": \\\\\\\"/assets/icons/android-chrome-192x192.png\\\\\\\",      \\\\\\\"type\\\\\\\": \\\\\\\"image/png\\\\\\\",      \\\\\\\"sizes\\\\\\\": \\\\\\\"192x192\\\\\\\"    },    {      \\\\\\\"src\\\\\\\": \\\\\\\"/assets/icons/android-chrome-512x512.png\\\\\\\",      \\\\\\\"type\\\\\\\": \\\\\\\"image/png\\\\\\\",      \\\\\\\"sizes\\\\\\\": \\\\\\\"512x512\\\\\\\"    }  ],  \\\\\\\"start_url\\\\\\\": \\\\\\\"/index.html\\\\\\\",  \\\\\\\"background_color\\\\\\\": \\\\\\\"#0f0f0f\\\\\\\",  \\\\\\\"display\\\\\\\": \\\\\\\"standalone\\\\\\\",  \\\\\\\"scope\\\\\\\": \\\\\\\"/\\\\\\\",  \\\\\\\"theme_color\\\\\\\": \\\\\\\"#171717\\\\\\\",  \\\\\\\"shortcuts\\\\\\\": [    {      \\\\\\\"name\\\\\\\": \\\\\\\"PowerShell\\\\\\\",      \\\\\\\"short_name\\\\\\\": \\\\\\\"PS\\\\\\\",      \\\\\\\"description\\\\\\\": \\\\\\\"View PowerShell help content\\\\\\\",      \\\\\\\"url\\\\\\\": \\\\\\\"/PowerShell\\\\\\\",      \\\\\\\"icons\\\\\\\": [        {          \\\\\\\"src\\\\\\\": \\\\\\\"/assets/icons/android-chrome-192x192.png\\\\\\\",          \\\\\\\"type\\\\\\\": \\\\\\\"image/png\\\\\\\",          \\\\\\\"sizes\\\\\\\": \\\\\\\"192x192\\\\\\\"        }      ]    }  ]}\\\",  \\\"url\\\": \\\"https://onprem.wtf/manifest.json\\\"},{  \\\"id\\\": \\\"offline\\\",  \\\"title\\\": \\\"Offline\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"Oh snap, looks like you're not connected.\\\",  \\\"url\\\": \\\"https://onprem.wtf/offline/\\\"},{  \\\"id\\\": \\\"powershell\\\",  \\\"title\\\": \\\"PowerShell\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"# Modules{: .bold-title}    {%- for post in collections.Modules.resources -%}            {{ post.data.title }}        {{ post.summary }}        {%- endfor -%}# Scripts{: .bold-title}    {%- for post in collections.Scripts.resources -%}            {{ post.data.title }}        {{ post.summary | strip_html }}        {%- endfor -%}\\\",  \\\"url\\\": \\\"https://onprem.wtf/powershell/\\\"},{  \\\"id\\\": \\\"search\\\",  \\\"title\\\": \\\"Find\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"      Find anything    Search posts, tags, and PowerShell documentation    {% render \\\\\\\"bridgetown_quick_search/search\\\\\\\", placeholder: \\\\\\\"Start typing to search…\\\\\\\", input_class: \\\\\\\"search-input search-focus-input\\\\\\\", snippet_length: 400 %}  \\\",  \\\"url\\\": \\\"https://onprem.wtf/search/\\\"},{  \\\"id\\\": \\\"sitemap.xml\\\",  \\\"title\\\": \\\"Sitemap\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"    {% for post in site.resources %}    {% if post.layout != nil %}    {% if post.layout != 'feed' %}    {% if post.title != 'Find' %}            {{ post.relative_url | remove: 'index.html' | prepend: site.url }}        {{ post.date | site.time | date: \\\\\\\"%F\\\\\\\" }}        {% endif %}    {% endif %}    {% endif %}    {% endfor %}\\\",  \\\"url\\\": \\\"https://onprem.wtf/sitemap.xml\\\"},{  \\\"id\\\": \\\"tags\\\",  \\\"title\\\": \\\"Tags\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"{% assign tags_max = 0 %}{% for tag in site.tags %}    {% if tag[1].size > tags_max %}    {% assign tags_max = tag[1].size %}    {% endif %}{% endfor %}{%- for i in (1..tags_max) reversed -%}{%- for tag in site.tags -%}{% if tag[1].size == i %}{{ tag[0] }}{{ i }}{% endif %}{%- endfor -%}{%- endfor -%}\\\",  \\\"url\\\": \\\"https://onprem.wtf/tags/\\\"},{  \\\"id\\\": \\\"tools\\\",  \\\"title\\\": \\\"Tools\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"# Tools{: .bold-title}    {% for tool in site.data.tools %}            {{ tool.name }}        {{ tool.description }}        source        {% endfor %}\\\",  \\\"url\\\": \\\"https://onprem.wtf/tools/\\\"},{  \\\"id\\\": \\\"bridgetown_quick_search-index.json\\\",  \\\"title\\\": \\\"Index\\\",  \\\"author\\\": null,  \\\"tags\\\": [],  \\\"content\\\": \\\"[  {%- assign looped = false %}  {%- assign documents = site.resources %}  {%- for document in documents %}    {%- if document.title %}      {%- unless document.exclude_from_search or document.id == \\\\\\\"\\\\\\\" %}        {%- assign url = document.relative_url %}        {%- assign content = document.content %}        {%- if document.quick_search_content %}{% assign content = document.quick_search_content %}{% endif %}        {%- if looped %},{% endif %}        {          \\\\\\\"id\\\\\\\": \\\\\\\"{{ url | slugify }}\\\\\\\",          \\\\\\\"title\\\\\\\": {{ document.title | jsonify }},          {%- if document.collection %}          \\\\\\\"collection\\\\\\\": {            \\\\\\\"label\\\\\\\": {{ document.collection.label | jsonify }},            \\\\\\\"name\\\\\\\": {{ document.collection.name | default: \\\\\\\"Posts\\\\\\\" | jsonify }}          },          {%- endif %}          \\\\\\\"categories\\\\\\\": {{ document.categories | join: \\\\\\\", \\\\\\\" | jsonify }},          \\\\\\\"tags\\\\\\\": {{ document.tags | join: \\\\\\\", \\\\\\\" | jsonify }},          \\\\\\\"url\\\\\\\": {{ url | jsonify }},          \\\\\\\"content\\\\\\\": {{ content | strip_html | replace_regex: \\\\\\\"[\\\\\\\\s/\\\\\\\\n]+\\\\\\\",\\\\\\\" \\\\\\\" | strip | jsonify }}        }        {%- assign looped = true %}      {%- endunless %}    {%- endif %}  {%- endfor %}  {%- for document in site.generated_pages %}    {%- if document.name contains \\\\\\\".md\\\\\\\" or document.name contains \\\\\\\".html\\\\\\\" %}      {%- if document.title %}        {%- unless document.exclude_from_search %}          {%- if looped %},{% endif %}          {%- assign content = document.content %}          {%- if document.quick_search_content %}{% assign content = document.quick_search_content %}{% endif %}          {            \\\\\\\"id\\\\\\\": \\\\\\\"{{ document.url | slugify }}\\\\\\\",            \\\\\\\"title\\\\\\\": {{ document.title | jsonify }},            \\\\\\\"categories\\\\\\\": {{ document.categories | join: \\\\\\\", \\\\\\\" | jsonify }},            \\\\\\\"tags\\\\\\\": {{ document.tags | join: \\\\\\\", \\\\\\\" | jsonify }},            \\\\\\\"url\\\\\\\": {{ document.url | jsonify }},            \\\\\\\"content\\\\\\\": {{ content | strip_html | replace_regex: \\\\\\\"[\\\\\\\\s/\\\\\\\\n]+\\\\\\\",\\\\\\\" \\\\\\\" | strip | jsonify }}          }        {%- endunless %}      {%- endif %}    {%- endif %}  {%- endfor %}]\\\",  \\\"url\\\": \\\"https://onprem.wtf/bridgetown_quick_search/index.json\\\"},{  \\\"id\\\": \\\"\\\",  \\\"title\\\": null,  \\\"author\\\": null,  \\\"tags\\\": null,  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf\\\"},{  \\\"id\\\": \\\"\\\",  \\\"title\\\": null,  \\\"author\\\": null,  \\\"tags\\\": null,  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf\\\"},{  \\\"id\\\": \\\"\\\",  \\\"title\\\": \\\"onprem.wtf\\\",  \\\"author\\\": null,  \\\"tags\\\": null,  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf\\\"},{  \\\"id\\\": \\\"\\\",  \\\"title\\\": null,  \\\"author\\\": null,  \\\"tags\\\": null,  \\\"content\\\": \\\"\\\",  \\\"url\\\": \\\"https://onprem.wtf\\\"}]\",\n  \"url\": \"https://onprem.wtf/api/v1/docs/\"\n},{\n  \"id\": \"api-v1\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{\\\"posts\\\":[{% for post in collections.posts.resources %}{  \\\"title\\\": {{post.data.title | jsonify}},  \\\"url\\\": {{ post.relative_url | jsonify }},  \\\"date\\\": {{ post.data.date | date: '%B %-d, %Y' | jsonify }},  \\\"category\\\": {{ post.category | jsonify }},  \\\"tags\\\": {{ post.tags | jsonify }},  \\\"author\\\": {{ post.data.author | jsonify }},  \\\"content\\\": {{ post.content | strip_html | strip_newlines | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}],\\\"docs\\\":[{% for p in site.resources %}{  \\\"id\\\": \\\"{{ p.relative_url | slugify }}\\\",  \\\"title\\\": {{p.data.title | jsonify}},  \\\"author\\\": {{ p.data.author | jsonify }},  \\\"tags\\\": {{ p.tags | jsonify }},  \\\"content\\\": {{ p.content | strip_html | strip_newlines | jsonify }},  \\\"url\\\": {{ p.relative_url | prepend: site.url | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]}\",\n  \"url\": \"https://onprem.wtf/api/v1/\"\n},{\n  \"id\": \"api-v1-posts\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{\\\"items\\\":[{% for post in site.posts %}{  \\\"title\\\": {{post.title | jsonify}},  \\\"url\\\": {{ post.url | prepend: site.baseurl | prepend: site.url | jsonify }},  \\\"date\\\": {{ post.date | date: '%B %-d, %Y' | jsonify }},  \\\"category\\\": {{ post.category | jsonify }},  \\\"tags\\\": {{ post.tags | jsonify }},  \\\"author\\\": {{ post.author | jsonify }},  \\\"language\\\": {{ post.language | jsonify }},  \\\"content\\\": {{ post.content | strip_html | strip_newlines | jsonify }}}{% unless forloop.last %},{% endunless %}{% endfor %}]}\",\n  \"url\": \"https://onprem.wtf/api/v1/posts/\"\n},{\n  \"id\": \"\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"## Welcome{: .bold-title}**{{ site.metadata.title }}** is the evolution of ntsystems.it. It contains a complete [archive](/post/) of the old site as well as new content. Just like the old site, this site is **free**. There are no trackers, no ads, no cookies. ~~We use a service worker to store pages you visited in your browser's cache storage. That makes the site [installable](https://web.dev/discover-installable/), [fast]({% link _posts/2021-01-16-why-is-this-website-fast.md %}), and it will continue to work even if you're offline.~~## Popular Tags{: .bold-title}Since 2009 we have written {{ collections.posts.resources.size }} posts. You can browse our more popular topics below or find [all tags](/tags) in the menu above.{% assign tags_max = 0 %}{% for tag in site.tags %}    {% if tag[1].size > tags_max %}    {% assign tags_max = tag[1].size %}    {% endif %}{% endfor %}{%- for i in (1..tags_max) reversed -%}{%- for tag in site.tags -%}{% if tag[1].size == i and tag[1].size > 4 %}{{ tag[0] }}{{ i }}{% endif %}{%- endfor -%}{%- endfor -%}## Recent Posts{: .bold-title}    {% for post in collections.posts.resources limit:3 %}            {{ post.data.title }}        {% if post.excerpt %}{{ post.excerpt }}{% else %}{{ post.summary }}{% endif %}        {%- endfor -%}## Archive{: .bold-title}You can find an archive of all posts here: [Archive](/post/)\",\n  \"url\": \"https://onprem.wtf/\"\n},{\n  \"id\": \"manifest.json\",\n  \"title\": \"Manifest\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{  \\\"short_name\\\": \\\"onprem\\\",  \\\"name\\\": \\\"onprem.wtf\\\",  \\\"description\\\": \\\"My playground\\\",  \\\"icons\\\": [    {      \\\"src\\\": \\\"/assets/icons/android-chrome-192x192.png\\\",      \\\"type\\\": \\\"image/png\\\",      \\\"sizes\\\": \\\"192x192\\\"    },    {      \\\"src\\\": \\\"/assets/icons/android-chrome-512x512.png\\\",      \\\"type\\\": \\\"image/png\\\",      \\\"sizes\\\": \\\"512x512\\\"    }  ],  \\\"start_url\\\": \\\"/index.html\\\",  \\\"background_color\\\": \\\"#0f0f0f\\\",  \\\"display\\\": \\\"standalone\\\",  \\\"scope\\\": \\\"/\\\",  \\\"theme_color\\\": \\\"#171717\\\",  \\\"shortcuts\\\": [    {      \\\"name\\\": \\\"PowerShell\\\",      \\\"short_name\\\": \\\"PS\\\",      \\\"description\\\": \\\"View PowerShell help content\\\",      \\\"url\\\": \\\"/PowerShell\\\",      \\\"icons\\\": [        {          \\\"src\\\": \\\"/assets/icons/android-chrome-192x192.png\\\",          \\\"type\\\": \\\"image/png\\\",          \\\"sizes\\\": \\\"192x192\\\"        }      ]    }  ]}\",\n  \"url\": \"https://onprem.wtf/manifest.json\"\n},{\n  \"id\": \"offline\",\n  \"title\": \"Offline\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"Oh snap, looks like you're not connected.\",\n  \"url\": \"https://onprem.wtf/offline/\"\n},{\n  \"id\": \"powershell\",\n  \"title\": \"PowerShell\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"# Modules{: .bold-title}    {%- for post in collections.Modules.resources -%}            {{ post.data.title }}        {{ post.summary }}        {%- endfor -%}# Scripts{: .bold-title}    {%- for post in collections.Scripts.resources -%}            {{ post.data.title }}        {{ post.summary | strip_html }}        {%- endfor -%}\",\n  \"url\": \"https://onprem.wtf/powershell/\"\n},{\n  \"id\": \"search\",\n  \"title\": \"Find\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"      Find anything    Search posts, tags, and PowerShell documentation    {% render \\\"bridgetown_quick_search/search\\\", placeholder: \\\"Start typing to search…\\\", input_class: \\\"search-input search-focus-input\\\", snippet_length: 400 %}  \",\n  \"url\": \"https://onprem.wtf/search/\"\n},{\n  \"id\": \"sitemap.xml\",\n  \"title\": \"Sitemap\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"    {% for post in site.resources %}    {% if post.layout != nil %}    {% if post.layout != 'feed' %}    {% if post.title != 'Find' %}            {{ post.relative_url | remove: 'index.html' | prepend: site.url }}        {{ post.date | site.time | date: \\\"%F\\\" }}        {% endif %}    {% endif %}    {% endif %}    {% endfor %}\",\n  \"url\": \"https://onprem.wtf/sitemap.xml\"\n},{\n  \"id\": \"tags\",\n  \"title\": \"Tags\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"{% assign tags_max = 0 %}{% for tag in site.tags %}    {% if tag[1].size > tags_max %}    {% assign tags_max = tag[1].size %}    {% endif %}{% endfor %}{%- for i in (1..tags_max) reversed -%}{%- for tag in site.tags -%}{% if tag[1].size == i %}{{ tag[0] }}{{ i }}{% endif %}{%- endfor -%}{%- endfor -%}\",\n  \"url\": \"https://onprem.wtf/tags/\"\n},{\n  \"id\": \"tools\",\n  \"title\": \"Tools\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"# Tools{: .bold-title}    {% for tool in site.data.tools %}            {{ tool.name }}        {{ tool.description }}        source        {% endfor %}\",\n  \"url\": \"https://onprem.wtf/tools/\"\n},{\n  \"id\": \"bridgetown_quick_search-index.json\",\n  \"title\": \"Index\",\n  \"author\": null,\n  \"tags\": [],\n  \"content\": \"[  {%- assign looped = false %}  {%- assign documents = site.resources %}  {%- for document in documents %}    {%- if document.title %}      {%- unless document.exclude_from_search or document.id == \\\"\\\" %}        {%- assign url = document.relative_url %}        {%- assign content = document.content %}        {%- if document.quick_search_content %}{% assign content = document.quick_search_content %}{% endif %}        {%- if looped %},{% endif %}        {          \\\"id\\\": \\\"{{ url | slugify }}\\\",          \\\"title\\\": {{ document.title | jsonify }},          {%- if document.collection %}          \\\"collection\\\": {            \\\"label\\\": {{ document.collection.label | jsonify }},            \\\"name\\\": {{ document.collection.name | default: \\\"Posts\\\" | jsonify }}          },          {%- endif %}          \\\"categories\\\": {{ document.categories | join: \\\", \\\" | jsonify }},          \\\"tags\\\": {{ document.tags | join: \\\", \\\" | jsonify }},          \\\"url\\\": {{ url | jsonify }},          \\\"content\\\": {{ content | strip_html | replace_regex: \\\"[\\\\s/\\\\n]+\\\",\\\" \\\" | strip | jsonify }}        }        {%- assign looped = true %}      {%- endunless %}    {%- endif %}  {%- endfor %}  {%- for document in site.generated_pages %}    {%- if document.name contains \\\".md\\\" or document.name contains \\\".html\\\" %}      {%- if document.title %}        {%- unless document.exclude_from_search %}          {%- if looped %},{% endif %}          {%- assign content = document.content %}          {%- if document.quick_search_content %}{% assign content = document.quick_search_content %}{% endif %}          {            \\\"id\\\": \\\"{{ document.url | slugify }}\\\",            \\\"title\\\": {{ document.title | jsonify }},            \\\"categories\\\": {{ document.categories | join: \\\", \\\" | jsonify }},            \\\"tags\\\": {{ document.tags | join: \\\", \\\" | jsonify }},            \\\"url\\\": {{ document.url | jsonify }},            \\\"content\\\": {{ content | strip_html | replace_regex: \\\"[\\\\s/\\\\n]+\\\",\\\" \\\" | strip | jsonify }}          }        {%- endunless %}      {%- endif %}    {%- endif %}  {%- endfor %}]\",\n  \"url\": \"https://onprem.wtf/bridgetown_quick_search/index.json\"\n},{\n  \"id\": \"\",\n  \"title\": null,\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n},{\n  \"id\": \"\",\n  \"title\": null,\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n},{\n  \"id\": \"\",\n  \"title\": \"onprem.wtf\",\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n},{\n  \"id\": \"\",\n  \"title\": null,\n  \"author\": null,\n  \"tags\": null,\n  \"content\": \"\",\n  \"url\": \"https://onprem.wtf\"\n}]\n}"
        },
        {
          "id": "api-v1-posts",
          "title": "Index",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/api/v1/posts/",
          "content": "{\"items\":[]}"
        },
        {
          "id": "",
          "title": "Index",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/",
          "content": "Welcome\n\nonprem.wtf is the evolution of ntsystems.it. It contains a complete archive of the old site as well as new content.\n\nJust like the old site, this site is free. There are no trackers, no ads, no cookies. We use a service worker to store pages you visited in your browser’s cache storage. That makes the site installable, fast, and it will continue to work even if you’re offline.\n\nPopular Tags\n\nSince 2009 we have written 316 posts. You can browse our more popular topics below or find all tags in the menu above.\n\n\nServer98\n\nExchange58\n\nClient53\n\nen53\n\nPowerShell45\n\nLync31\n\nSkype4B31\n\nde29\n\nAzure19\n\nSharepoint16\n\nSecurity15\n\nServer-201214\n\nServer-2008-R213\n\nCloud12\n\nHyper-V11\n\nNetwork11\n\nntSystems10\n\nJekyll10\n\nServer-20089\n\nOnlineHelp8\n\nOffice3657\n\nVMware6\n\nGitHub5\n\n\nRecent Posts\n\n\n    \n    \n        lost &amp; found: AI highlights of the week\n        \n    \n    \n        The Ecological Nature of Technological Change\n        Technological change is not additive; it is ecological. A new medium does not add something; it changes everything.\n    \n    \n        Zed and PowerShell on macOS\n        Using the PowerShell extension with Zed.\n    \n\nArchive\n\nYou can find an archive of all posts here: Archive"
        },
        {
          "id": "manifest.json",
          "title": "Manifest",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/manifest.json",
          "content": "{\n  \"short_name\": \"onprem\",\n  \"name\": \"onprem.wtf\",\n  \"description\": \"My playground\",\n  \"icons\": [\n    {\n      \"src\": \"/assets/icons/android-chrome-192x192.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"192x192\"\n    },\n    {\n      \"src\": \"/assets/icons/android-chrome-512x512.png\",\n      \"type\": \"image/png\",\n      \"sizes\": \"512x512\"\n    }\n  ],\n  \"start_url\": \"/index.html\",\n  \"background_color\": \"#0f0f0f\",\n  \"display\": \"standalone\",\n  \"scope\": \"/\",\n  \"theme_color\": \"#171717\",\n  \"shortcuts\": [\n    {\n      \"name\": \"PowerShell\",\n      \"short_name\": \"PS\",\n      \"description\": \"View PowerShell help content\",\n      \"url\": \"/PowerShell\",\n      \"icons\": [\n        {\n          \"src\": \"/assets/icons/android-chrome-192x192.png\",\n          \"type\": \"image/png\",\n          \"sizes\": \"192x192\"\n        }\n      ]\n    }\n  ]\n}"
        },
        {
          "id": "offline",
          "title": "Offline",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/offline/",
          "content": "Oh snap, looks like you’re not connected."
        },
        {
          "id": "powershell",
          "title": "PowerShell",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/powershell/",
          "content": "Modules\n\n\n        PSSpeech\n          PSSpeech is a collection of functions to work with Azure Cognitive Services, more specifically the Speech Service.\n    \n        TAK\n          Tom’s Admin Kit, or TAK, is a PowerShell script module that contains useful tools which I collected or created over the years.\n    \n        ntSystemsPSDrive\n          ntSystemsPSDrive is a SHiPS provider for ntSystems.it.\n    \n\nScripts\n\n\n        New-SfBBackup\n        This script exports Lync Core Data and Settings according to the documentation availabe on TechNet\n    \n        Test-GroupMembership\n        This function uses [ADSI] to test group membership based on the constructed security token of the principal. You can pipe objects to this function. The function writes $true or $false for each tested object.\n    \n        Invoke-SEFAUtil\n        This is a wrapper function for the SEFAUtil.exe tool from the Lync Resource Kit Tools. It’s intended purpose is to make dealing with the cmdline tool easier.\n    \n        Restore-VMPermission\n        Adds permissions for the VMId to all assigned disks.\n    \n        Create-UcsZoningHints\n        This script uses the CiscoUcs PowerTool to get information about one or more service profiles and creates SIST zoning configuration for NX-OS. The Target’s device-alias as well as the name for the ZoneSet and the VSAN can be specified with parameters. Zone names will be automatically created.\n    \n        Start-TestWebServer\n        Start-TestWebServer\n    \n        Send-SplunkEvent\n        SYNOPSIS\n    \n        Remove-LogFile\n        SYNOPSIS"
        },
        {
          "id": "search",
          "title": "Find",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/search/",
          "content": "Find anything\n    Search posts, tags, and PowerShell documentation"
        },
        {
          "id": "sitemap.xml",
          "title": "Sitemap",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/sitemap.xml",
          "content": "https://onprem.wtf/powershell/start-lyncbackup/\n        2013-08-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-groupmembership/\n        2013-09-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/invoke-sefautil/\n        2013-09-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/restore-vmpermission/\n        2013-09-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/create-ucszoninghints/\n        2016-08-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/start-testwebserver/\n        2016-11-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/send-splunkevent/\n        2018-12-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/remove-logfile/\n        2018-12-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/psspeech/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/tak/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/ntsystemspsdrive/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/add-etchostsentry/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/connect-lync/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/connect-sfb/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/convert-subnetmask/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/convert-texttospeech/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/convertfrom-base64/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/convertfrom-sid/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/convertto-base64/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/convertto-sid/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/edit-etchosts/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-dkimrecord/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-dmarcrecord/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-macaddressvendor/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-mxrecord/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-spfrecord/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-speechtoken/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-speechtokenresult/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-speechvoiceslist/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-takhash/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/get-wlanprofile/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/import-csr/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/import-dhcpserverlog/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/import-iislog/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/invoke-whoisrequest/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/new-firewallrule/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/new-rgsreport/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/new-spfrecord/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/remove-etchostsentry/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/show-etchosts/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/show-wlanprofile/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-exchangeautodiscover/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-federationservice/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-lyncdns/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-lyncdiscover/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-oosfarm/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-sfbdns/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-sfbdiscover/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-tcpconnection/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/test-tlsconnection/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/update-filewritetime/\n        2021-01-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/adfs/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/ai/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/asr/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/appv/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/audiocodes/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/azure/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/basics/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/cisco/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/citrix/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/client/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/cloud/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/crypto/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/events/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/exchange/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/firewall/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/github/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/go/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/help/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/home-server/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/hybrid/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/hyper-v/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/intune/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/jekyll/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/lync/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/markdown/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/network/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/office365/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/onlinehelp/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/powershell/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/rds/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/rm/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/sql/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/security/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/server-2003/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/server-2008-r2/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/server-2008/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/server-2012-r2/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/server-2012/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/server/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/sharepoint/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/skype4b/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/teams/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/update/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/vmware/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/veeam/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/wsl/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/workplace/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/zed/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/de/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/en/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/macos/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/ntsystems/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/technology/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/uag/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-ai-highlights/\n        2025-12-05\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/technology-transforms-everything/\n        2025-01-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/zed-pwsh/\n        2024-08-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/setup-sign-in-with-apple-with-azure-swa/\n        2023-07-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/mastodon-and-webfinger/\n        2022-12-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/how-to-connect-exchange-online-managed-identity/\n        2022-08-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/goodbye-jekyll/\n        2022-08-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sender-authentication-exo-2021/\n        2021-01-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/why-is-this-website-fast/\n        2021-01-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/so-long-2020/\n        2020-12-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/converting-powershell-help-to-a-website/\n        2020-12-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/using-powershell-and-azure-cognitive-services-to-convert-text-to-speech/\n        2020-01-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/configuring-policy-based-qos-for-teams-with-intune/\n        2019-11-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/send-check-point-logs-to-azure-sentinel-beta/\n        2019-07-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/create-a-sas-token-for-azcopy/\n        2019-06-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/ntsystemspsdrive-a-ships-drive-for-the-blog/\n        2019-04-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-script-to-enable-specific-office-365-service/\n        2019-02-05\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-2019-radius/\n        2019-01-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sending-events-to-splunks-http-event-collector-with-powershell/\n        2018-12-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-ffmpeg-and-skype4b-security-baseline-for-rs5/\n        2018-10-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/remote-ems-over-ipmi-serial-over-lan/\n        2018-10-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/network-assessment-with-policy-based-qos-and-iperf3/\n        2018-09-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-hybrid-observations/\n        2018-06-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-no-tracking-on-ntsystems/\n        2018-06-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-2/\n        2018-05-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-functions-building-a-telegram-bot-with-powershell-1/\n        2018-05-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-onion-service-cloudflare-dns/\n        2018-04-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/skype-for-business-hybrid-observations/\n        2018-03-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/aad-connect-failed-to-load-configuration-information/\n        2018-02-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/tunneling-ssh-through-tor/\n        2017-12-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/testing-coinhive/\n        2017-09-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/the-invisible-internet-project-and-wsl/\n        2017-08-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-and-variable-references/\n        2017-05-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/jekyll-on-wsl/\n        2017-04-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/keeping-track-of-powershellcore-releases-on-github/\n        2017-04-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/jekyll-fun-consuming-ntsystems-with-powershell/\n        2017-03-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/my-takeaways-from-ms-techsummit/\n        2017-03-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/aure-site-recovery-deployment-planner/\n        2017-03-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/get-going-with-go/\n        2017-02-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/get-started-with-azure-arm-templates/\n        2017-02-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/disable-backup-protection-for-azure-vm/\n        2017-02-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-blogengine-to-github-pages-2/\n        2016-10-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/introducing-tak/\n        2016-10-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-stack-poc-tp2-on-vmware/\n        2016-10-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-blogengine-to-github-pages-1/\n        2016-10-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/welcome-to-the-all-new-ntsystems/\n        2016-10-05\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-on-macos/\n        2016-10-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/deploying-labs-using-azure-resource-manager/\n        2016-07-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/veeam-direct-restore-to-azure/\n        2016-07-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-sdn-api-and-cisco-wlc/\n        2016-06-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-backup-part-three/\n        2016-04-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-nano-server-github-psgallery-pester/\n        2016-04-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-storage-explorer/\n        2016-04-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-backup-part-two/\n        2016-04-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-backup-part-one/\n        2016-03-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-convergence-with-nano-server-part-3/\n        2016-03-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-convergence-with-nano-server-part-2/\n        2016-03-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-file-services/\n        2016-03-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/re-register-azure-mfa-server/\n        2016-02-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-convergence-with-nano-server-part-1/\n        2016-02-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/install-office-web-apps-server-2013-on-server-2012-r2/\n        2016-02-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-convergence-with-nano-server-intro/\n        2016-02-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-onyx/\n        2016-01-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/happy-holidays-and-some-numbers/\n        2015-12-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-openlivewriter-rackhd-ehc-diskspd/\n        2015-12-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/domain-joining-the-vcenter-server-appliance-6/\n        2015-12-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-backup-restore/\n        2015-12-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/installing-nano-server-using-wds-and-pxe/\n        2015-11-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-tp4-th2-win32-openssh-vs-code/\n        2015-11-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/getting-started-with-vcenter-server-appliance-6/\n        2015-11-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/netscaler-as-adfs-proxy/\n        2015-09-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/azure-backup/\n        2015-09-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/getting-started-with-osx/\n        2015-08-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/moving-on!/\n        2015-08-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/how-to-prepare-for-exchange-2013-pf-migration-and-what-the-microsoft-guide-doesnt-tell-you/\n        2015-02-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/netsh-trace-and-the-message-analyzer/\n        2015-02-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/considerations-when-planning-for-directaccess/\n        2015-02-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wmf-5-preview-update-is-not-applicable-to-your-computer/\n        2014-10-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-10-vhd-boot/\n        2014-10-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lost-found-windows-tech-preview-delve-sway-and-keybaseio/\n        2014-10-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/scvmm-hyperv-script-to-reboots-vms-with-powershell/\n        2014-08-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-backend-on-sql-cluster-with-mixed-authentication-mode/\n        2014-08-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/moving-to-azure/\n        2014-08-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/noop-and-nat-traversal/\n        2014-07-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/ipv6-im-unternehmen/\n        2014-06-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/work-folders-demo-mit-microsoft-azure/\n        2014-05-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/activedirectory-displayname-mit-umlauten-und-audiocodes-isdn/\n        2014-05-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/app-v-and-the-start-menu-folder-redirection-issue/\n        2014-04-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-2/\n        2014-03-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-sip-inter-domain-federation-with-cisco-unified-presence-1/\n        2014-03-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-conf-2014-keynote/\n        2014-02-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-update-hybridconfiguration/\n        2014-02-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-hosting-pack-v2-and-skype-federation/\n        2014-02-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-client-certificate-warning-exchange-autodiscover/\n        2014-02-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migration-ntsystems-mail-von-aruba-nach-office-365/\n        2014-02-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/connect-to-office-365-with-powershell/\n        2014-01-05\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/import-certificate-to-rd/\n        2014-01-05\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/pal-performance-analyse/\n        2013-12-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-azure-point-to-site-vpn/\n        2013-12-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/cng-certificates-and-lync-tmg/\n        2013-10-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-2/\n        2013-10-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/connect-sharepoint-2013-with-exchange-2013-to-sync-tasks/\n        2013-10-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/activesync-devices-ask-for-authentication/\n        2013-10-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-survivable-branch-server-installation/\n        2013-10-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-v-general-access-denied-error/\n        2013-09-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-survivable-branch-server-planung/\n        2013-09-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-private-line/\n        2013-09-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/updated-invoke-sefautil/\n        2013-09-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-unified-messaging-sprachauswahl/\n        2013-08-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-server-backup/\n        2013-08-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/outlook-autodiscover-and-what-to-do-when-migrating-from-exchange-2010-to-2013/\n        2013-08-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/troubleshooting-sharepoint-error-messages/\n        2013-08-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-music-on-hold-wartemusik/\n        2013-08-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sip-anruf-halten/\n        2013-08-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/invoke-sefautil-a-powershell-wrapper-function/\n        2013-08-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/your-windows-phone-does-not-support-this-server-version/\n        2013-08-05\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-5/\n        2013-07-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/web-application-proxy-in-windows-2012-r2-preview/\n        2013-06-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-and-exchange-2013-owa-integration/\n        2013-06-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-4/\n        2013-06-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2013-open-public-folder-on-exchange-2010/\n        2013-06-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/configure-exchange-2013-cas-array-with-wnlb-and-enable-kerberos-support-for-oa/\n        2013-06-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-3/\n        2013-05-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2013-clean-install-but-many-msexchange-common-106-errors/\n        2013-05-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/how-to-build-an-uag-2010-array-for-exchange-publishing-part-1/\n        2013-05-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-2/\n        2013-05-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migrating-from-exchange-2010-to-2013-part-1/\n        2013-05-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/whats-happening-these-days/\n        2013-05-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/joining-wifi-before-login-on-mac-os-x-108/\n        2013-04-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/patching-office-web-apps-server/\n        2013-03-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/prepare-windows-server-2012-for-lync-2013/\n        2013-03-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/installing-lync-2013-updates/\n        2013-03-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/activesync-forefront-tmg-and-accountlockoutthreshold/\n        2013-02-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-(client)-and-lyncdiscoverinternal/\n        2013-02-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-installation-and-certificates/\n        2013-02-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-prepare-ad-and-build-topology/\n        2013-02-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-2013-voicemail-escape/\n        2013-01-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-2012-virtualized-domain-controller/\n        2013-01-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-v3-invoke-webrequest/\n        2012-12-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-2/\n        2012-11-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/microsoft-ndes-and-cisco-ios-part-1/\n        2012-11-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/get-access-to-a-windows-2012-server-without-a-password/\n        2012-11-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-2013-change-default-settings-of-upload-image-pop-up/\n        2012-11-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchang-2013-offline-owa/\n        2012-11-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-2012-directaccess/\n        2012-11-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-8-windows-to-go/\n        2012-11-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-2013-search-center-windows-8/\n        2012-11-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/office-2013-web-apps/\n        2012-11-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-and-maxinboundconnectionpersource/\n        2012-09-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/scheduled-jobs-in-powershell-v3/\n        2012-09-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-attachments/\n        2012-08-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/gal-photos-reloaded-batch-import/\n        2012-08-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/server-2008-r2-disk-management-und-diskpart-lasst-sich-nicht-starten/\n        2012-08-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/my-powershell-profile/\n        2012-07-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/vbnet-powershell-script-starten/\n        2012-07-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/nps-migration-von-server-2003-nach-2008-r2/\n        2012-07-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/automatic-ios-configuration-backup/\n        2012-07-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/steve-ballmer-on-exciting-times-office-2013/\n        2012-07-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/why-am-i-learning-powershell-and-why-do-i-think-you-should-give-it-a-try-too/\n        2012-07-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/activesync-organization-settings-mobile-device-management/\n        2012-07-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/passing-an-array-to-a-scriptblock/\n        2012-06-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/we-are-still-out-there-somewhere/\n        2012-06-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wireless-sniffing-mit-netmon-34/\n        2012-04-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-8-virtualized-domain-controller/\n        2012-03-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-send-on-behalf-for-distribution-groups/\n        2012-03-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-8-to-go/\n        2012-03-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/forefront-tmg-2010-sp2-nlb-kerberos/\n        2012-03-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-8-cp-dhcp-server-failover/\n        2012-03-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wireshark-und-windows-8/\n        2012-03-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-8-cp-ad-administrative-center/\n        2012-03-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-8-cp-remote-group-policy-refresh/\n        2012-03-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-8-cp-servermanager/\n        2012-03-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-loves-wmi-os-info/\n        2012-02-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-implicit-remoting/\n        2012-02-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-sp2-installation/\n        2012-02-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-powershell-v30/\n        2012-02-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-recovery/\n        2011-11-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-unified-messaging-cisco-call-manager-86/\n        2011-11-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/citrix-sprache-des-ica-client-andern/\n        2011-09-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-8-installation-in-vhd/\n        2011-09-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-8-developer-preview/\n        2011-09-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/outlook-2003-exchange-2010-probleme-beim-offnen-freigegebener-kalender/\n        2011-09-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-rekursiv-nach-anderungsdatum-sortieren/\n        2011-09-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/diginotar-nur-ein-zufall!/\n        2011-09-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/esxi-persistent-scratch-location/\n        2011-07-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/citrix-ima-dienst-startet-nicht-mehr/\n        2011-07-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/citrix-xenapp6-fehler-beim-starten-des-webservice/\n        2011-07-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/ex2k10-pst-in-archive-importieren/\n        2011-07-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/lync-integration-in-outlook-web-app-2010/\n        2011-07-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/cisco-aaa/\n        2011-07-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/cisco-aaa-nps-radius-server/\n        2011-07-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/one-note-kleiner-tipp/\n        2011-06-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/subdomain-certificate-enrollment/\n        2011-06-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/installing-vsphere-powercli/\n        2011-06-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/upgrade-windows-server-2008r2-sp1-blackberry-monitoring-service-startet-nicht/\n        2011-05-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/forefront-tmg-console-error/\n        2011-05-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/remotefx/\n        2011-04-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/softap-windows-7-wireless-access-point/\n        2011-04-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/appv-streaming-server/\n        2011-03-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/create-vmware-esxi-flash-drive/\n        2011-03-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-dienstkonto-wechseln/\n        2011-03-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/outlook-gesendete-objekte-shared-mailbox/\n        2011-02-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/tmge28093fehler-beim-ausfuhren-von-abfragen-im-log/\n        2011-02-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/zertifizierungsstelle-verschiebene28093neuer-servername/\n        2011-01-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/signing-powershell-scripts/\n        2011-01-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/powershell-scripts/\n        2010-12-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/tmg-2010-unable-to-authenticate-users/\n        2010-11-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-change-display-name-for-outgoing-mails/\n        2010-11-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/zertifizierung/\n        2010-11-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/mail-sensitivity-header-exchange-2010-sp1/\n        2010-11-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-2010-external-list-bcs-sql/\n        2010-10-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-foundation-2010-insufficient-sql-permissions/\n        2010-09-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migration-isa-server-2k4-2k6-zu-tmg-wpad/\n        2010-09-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-pfad-einer-mailboxdatenbank-andern/\n        2010-09-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-sp1-online-archive-in-eigene-datenbank-verschieben/\n        2010-09-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-zertifikat-anfordern/\n        2010-09-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-san-zertifikate28093server-2008-pki/\n        2010-09-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/webdav-iis7-publishing-ober-isa-server-part-2/\n        2010-09-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/webdav-iis7-publishing-over-isa-server-part-1/\n        2010-09-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/rbac/\n        2010-09-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/shared-mailboxes-und-auto-mapping-e14-sp1/\n        2010-08-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/e14-sp1-importexport-update/\n        2010-08-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-2010-fehler-in-der-sql-datenbank-beheben/\n        2010-08-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/appv-46e28093sccm-2007r2-streaming-applications/\n        2010-08-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-web-apps-lassen-sich-nicht-installieren/\n        2010-08-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/appv-46e28093sccm-2007r2e28093streaming-issue/\n        2010-08-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-foundation-serach-14/\n        2010-08-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010e28093database-restore/\n        2010-08-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/importexport-mailbox/\n        2010-08-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/appve28093adobe-reader-sequencing-receipe/\n        2010-08-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/appve28093sequencer/\n        2010-08-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/keine-mailzustellung-auf-offentliche-ordner-nach-exchange-2010-upgrade-(von-exchange-2k3)/\n        2010-07-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/appv-46e28093fehler-beim-starten/\n        2010-07-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-w3wpexe-belegt-sehr-viel-ram/\n        2010-07-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010e28093gal-fotos/\n        2010-07-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-foundation-2010/\n        2010-07-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/upgrade-exchange-2k3-2010/\n        2010-07-19\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/forefront-tmg-2010e28093rsa-authentication-manager-71/\n        2010-07-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/apple-ipad/\n        2010-06-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-entourage-web-services-edition-ews-attachement-size/\n        2010-06-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-backup/\n        2010-06-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/migration-sharepoint-services-v3-zu-sharepoint-foundation-2010/\n        2010-06-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-foundation-2010-dateien-lassen-sich-nicht-offnen/\n        2010-06-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/distributedcom-fehler-10016-fehlende-berechtigungen/\n        2010-06-11\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-virtual-pc-interner-dhcp-server/\n        2010-05-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/ntsystems-update/\n        2010-05-15\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-safelist-aggregation/\n        2010-05-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/tpm-bitlocker-schlussel-in-ad-ds-speichern/\n        2010-05-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wsus-auf-neuen-server-verschieben/\n        2010-05-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/buchen-einer-ressource-in-outlook-2010-mit-exchange-2k3/\n        2010-05-04\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/nlb-e28093-unicast-vs-mulicast-konfiguration-port-rules/\n        2010-05-01\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/installation-der-sharepoint-services-30-auf-server-2008/\n        2010-04-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/office-2010-fertig!!/\n        2010-04-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/programme-vom-server-core-hyper-v-server-deinstallieren/\n        2010-04-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-active-sync-funktioniert-nicht/\n        2010-04-18\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wds-remoteinstallationsordner-verschieben/\n        2010-03-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wsus-content-auf-anderes-volume-verschieben/\n        2010-03-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/forefront-2010-e28093-dienste-starten-nicht-automatisch/\n        2010-02-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wds-tftp-timeout/\n        2010-02-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/terminal-lizenzserver-4105/\n        2010-02-09\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/bootmgr-is-missing/\n        2010-02-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-this-attachment-was-removed/\n        2010-01-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/nvspbind-fur-hyper-v/\n        2010-01-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wsus-verschieben/\n        2010-01-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/wpad-und-server-2008/\n        2010-01-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-v-server-core-bindungen-der-netzwerkadapter-aufheben/\n        2009-12-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/bluescreen-e2809cstop-0x0000007ee2809d-beim-aktivieren-der-virtualisierung/\n        2009-12-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/server-2008-core-hyper-v-netzwerkschnittstelle-umbenennen/\n        2009-12-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/disclaimer/\n        2009-12-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/zertifizierungsstelle-verschieben-(backuprestore)/\n        2009-12-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/domain-controller-umbenennen/\n        2009-12-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/forefront-thread-management-gateway-2010/\n        2009-12-23\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-anonymous-relay/\n        2009-12-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/ersten-ws08r2-dc-im-vorhandenen-forest-installieren/\n        2009-12-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-edge-subscription/\n        2009-12-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-get-owavirtualdirectory-access-denied/\n        2009-12-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/dhcp-fehler-1003/\n        2009-11-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-usbdvd-download-tool/\n        2009-10-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/microsoft-techday-dezember-2009/\n        2009-10-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/microsoft-hyper-v-server-2008-v1-vs-v2/\n        2009-10-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/netlogon-fehler-5719-auf-server-(nicht-dc)/\n        2009-10-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-e28093-update-von-rc-auf-rtm/\n        2009-10-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-bootloader-os-hinzufugen/\n        2009-10-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/servergespeicherte-ts-profile-fehler-1543/\n        2009-09-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/netzwerkprobleme-lassen-dynamics-absturzen/\n        2009-09-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/upgrade-auf-windows-7/\n        2009-09-28\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/sharepoint-logfiles-verkleinern/\n        2009-09-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/exchange-2010-e28093-dynamic-signature/\n        2009-09-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/fehler-bei-hp-netzwerkkarten-update/\n        2009-09-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/e2809cdata-encryptione2809d-fehler-bei-rdp-verbindung/\n        2009-09-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-server-hyper-v-server-20083b-storflt-kann-nicht-geladen-werden/\n        2009-09-07\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/active-directory-verwaltungscenter/\n        2009-09-02\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/language-pack-fur-windows-7/\n        2009-08-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/hyper-v-server-2008-r2-cluster/\n        2009-08-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/applocker/\n        2009-08-17\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-server-2008-r2-und-hyper-v-server-2008-r2-in-deutsch-auf-technetmsdn/\n        2009-08-16\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-virtual-pc-e28093-undo-und-differencing-disks/\n        2009-08-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-virtual-pc/\n        2009-08-13\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/bitlocker-to-go/\n        2009-08-12\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-sicherheitsproblem-in-uac/\n        2009-08-10\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-neuerungen-auf-den-ersten-blick/\n        2009-08-08\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/remoteapp-mit-zertifikat/\n        2009-08-06\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/doch-kein-windows-7-e/\n        2009-08-03\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-joint-launch-roadshow/\n        2009-07-31\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-home-server-pp3-(beta)-e28093-windows-7/\n        2009-07-30\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/server-logs-in-sql-datenbank-importieren/\n        2009-07-29\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/mehrere-externe-ipe28099s-am-isa-server/\n        2009-07-27\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/ein-paar-infos-zu-e2809cdirectaccesse2809d/\n        2009-07-26\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-e28093-nativer-vhd-support/\n        2009-07-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-e28093-installation-mit-usb-stick/\n        2009-07-25\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/msat-deckt-schwachstellen-in-der-it-umgebung-auf/\n        2009-07-24\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/windows-7-e28093-rtm-verfugbarkeit/\n        2009-07-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/zertifikat-fur-makros-der-domane-bereitstellen/\n        2009-07-22\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/delta-crl-e2809cunable-to-downloade2809d-iis-7/\n        2009-07-21\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/drucken-mit-internet-explorer-8-nicht-mehr-moglich/\n        2009-07-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/post/willkommen/\n        2009-07-20\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/404\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/500\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/manifest.json\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/offline/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/powershell/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tags/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/tools/\n        2025-12-14\n    \n    \n    \n    \n    \n    \n    \n    \n    \n        https://onprem.wtf/bridgetown_quick_search/index.json\n        2025-12-14"
        },
        {
          "id": "tags",
          "title": "Tags",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tags/",
          "content": "Server98\n\nExchange58\n\nClient53\n\nen53\n\nPowerShell45\n\nLync31\n\nSkype4B31\n\nde29\n\nAzure19\n\nSharepoint16\n\nSecurity15\n\nServer-201214\n\nServer-2008-R213\n\nCloud12\n\nHyper-V11\n\nNetwork11\n\nntSystems10\n\nJekyll10\n\nServer-20089\n\nOnlineHelp8\n\nOffice3657\n\nVMware6\n\nGitHub5\n\nCisco4\n\nWSL4\n\nCitrix4\n\nAppV4\n\nSQL4\n\nServer-20034\n\nEvents3\n\nHybrid2\n\nRM2\n\nServer-2012-R22\n\nblog1\n\narchives1\n\nAI1\n\ntechnology1\n\nZed1\n\nHelp1\n\nMarkDown1\n\nWorkplace1\n\nIntune1\n\nTeams1\n\nFirewall1\n\nAudioCodes1\n\nCrypto1\n\nASR1\n\nGo1\n\nBasics1\n\nUpdate1\n\nmacOS1\n\nVeeam1\n\nADFS1\n\nRDS1\n\nuag1\n\nHome-Server1"
        },
        {
          "id": "tools",
          "title": "Tools",
          "collection": {
            "label": "pages",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "/tools/",
          "content": "Tools\n\n\n    \n    \n        Cert Tool\n        Public and private key operations\n        source\n    \n    \n    \n        DKIM Validator\n        Validate DKIM signatures\n        source\n    \n    \n    \n        Secure Clip\n        End to end encrypted web clipboard and file sharing\n        source"
        },
        {
          "id": "",
          "title": "onprem.wtf",
          "collection": {
            "label": "data",
            "name": "Posts"
          },
          "categories": "",
          "tags": "",
          "url": "",
          "content": ""
        },
          {
            "id": "post",
            "title": "Archive",
            "categories": "",
            "tags": "",
            "url": "/post/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-2",
            "title": "Archive (Page 2)",
            "categories": "",
            "tags": "",
            "url": "/post/page/2/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-3",
            "title": "Archive (Page 3)",
            "categories": "",
            "tags": "",
            "url": "/post/page/3/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-4",
            "title": "Archive (Page 4)",
            "categories": "",
            "tags": "",
            "url": "/post/page/4/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-5",
            "title": "Archive (Page 5)",
            "categories": "",
            "tags": "",
            "url": "/post/page/5/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-6",
            "title": "Archive (Page 6)",
            "categories": "",
            "tags": "",
            "url": "/post/page/6/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-7",
            "title": "Archive (Page 7)",
            "categories": "",
            "tags": "",
            "url": "/post/page/7/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-8",
            "title": "Archive (Page 8)",
            "categories": "",
            "tags": "",
            "url": "/post/page/8/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-9",
            "title": "Archive (Page 9)",
            "categories": "",
            "tags": "",
            "url": "/post/page/9/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-10",
            "title": "Archive (Page 10)",
            "categories": "",
            "tags": "",
            "url": "/post/page/10/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-11",
            "title": "Archive (Page 11)",
            "categories": "",
            "tags": "",
            "url": "/post/page/11/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-12",
            "title": "Archive (Page 12)",
            "categories": "",
            "tags": "",
            "url": "/post/page/12/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-13",
            "title": "Archive (Page 13)",
            "categories": "",
            "tags": "",
            "url": "/post/page/13/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-14",
            "title": "Archive (Page 14)",
            "categories": "",
            "tags": "",
            "url": "/post/page/14/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-15",
            "title": "Archive (Page 15)",
            "categories": "",
            "tags": "",
            "url": "/post/page/15/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          },
          {
            "id": "post-page-16",
            "title": "Archive (Page 16)",
            "categories": "",
            "tags": "",
            "url": "/post/page/16/",
            "content": "Search the Archive\n    {% render \"bridgetown_quick_search/search\", placeholder: \"Start typing to search…\", input_class: \"search-input search-focus-input\", snippet_length: 200 %}\n  \n\n\n\nArchive\n\n\n{% for post in paginator.resources %}\n\n    {{ post.data.title }}\n    {%- render \"post_meta\", page: post, site: site, home: \"true\" -%}\n\n{% endfor %}\n\n\n{% if paginator.total_pages > 1 %}\n\n  \n    {% if paginator.previous_page %}\n    \n      ← Newer\n    \n    {% endif %}\n    \n    \n      Page {{ paginator.page }} of {{ paginator.total_pages }}\n    \n    \n    {% if paginator.next_page %}\n    \n      Older →\n    \n    {% endif %}\n  \n\n{% endif %}"
          }
]
