Microsoft Dynamics NAV

Team Blog

  • Microsoft Dynamics NAV Team Blog

    Using Windows Powershell cmdlets to modify companies and databases

    • 2 Comments

    Have you been following the coffee break series of blog posts recently? Are you ready to start using Windows PowerShell? If you do not want to get started on your own development database, how about using the Microsoft Dynamics NAV 2015 demonstration database? In this blogpost, we use Windows PowerShell to change the demonstration database into a multitenant environment. Not because we think you should make your own solution multitenant, but because it makes it easier to see what is really going on.

    If we look at the Demo Database NAV (8-0) database which is provided on the product DVD (W1), it has one company called CRONUS International Ltd. The first step towards multitenancy is to create additional companies. For this small task we will use the Windows PowerShell ISE. On your Windows machine, you will need to start the Windows PowerShell ISE in an elevated command prompt (Run as Administrator). After that you will need to set the execution policy. You can read more about this here. After that, we will show the cmdlets that are needed and the modules you need to import.

    Since we will only run scripts that change the demonstration database, we will run the following command:

    Set-ExecutionPolicy unrestricted

    After each command, you must press F5. Now choose File in the menu and then select New to open a new screen or simply press CTRL+N. Type in the following command:

    Import-Module 'C:\Program Files\Microsoft Dynamics NAV\80\Service\NavAdminTool.ps1'

    Press F5, CTRL+N. Now we need to create some new companies.

    Copy-NAVCompany -DestinationCompanyName 'CRONUS Production Ltd.' –SourceCompanyName 'CRONUS International Ltd.' -ServerInstance DynamicsNAV80W1
    Copy-NAVCompany -DestinationCompanyName 'CRONUS Sales Ltd.' -SourceCompanyName 'CRONUS International Ltd.' -ServerInstance DynamicsNAV80W1
    Copy-NAVCompany -DestinationCompanyName 'CRONUS Marketing Ltd.' -SourceCompanyName 'CRONUS International Ltd.'-ServerInstance DynamicsNAV80W1
    Copy-NAVCompany -DestinationCompanyName 'CRONUS Staff Ltd.' -SourceCompanyName 'CRONUS International Ltd.' -ServerInstance DynamicsNAV80W1

    Press F5, CTRL+N. Now we will export the application data into a new database.

    Export-NAVApplication –DatabaseServer SQL\INSTANCE –DatabaseName 'Demo Database NAV (8-0)’ –DestinationDatabaseName 'Demo Database NAV (8-0) App' –Force

    NOTE: Change the value of the DatabaseServer parameter to specify your server name and SQL Server instance that is hosting the Demo Database NAV (8-0) database.

    Press F5, CTRL+N. Now we will prepare the service tier instance

    Set-NavServerInstance DynamicsNAV80W1 –Stop
    Set-NAVServerConfiguration -ServerInstance DynamicsNAV80W1 -Keyname MultiTenant  -KeyValue "True"
    Set-NAVServerConfiguration -ServerInstance DynamicsNAV80W1 -Keyname DatabaseName -KeyValue ""
    Set-NavServerInstance DynamicsNAV80W1 –Start

    Press F5, CTRL+N. Now we will mount the application and first tenant

    Mount-NAVApplication -DatabaseServer SQL\INSTANCE -DatabaseName ‘Demo Database NAV (8-0) App’ -ServerInstance DynamicsNAV80W1
    Mount-NAVTenant -ServerInstance DynamicsNAV80W1 -Id Default –DatabaseName ‘Demo Database NAV (8-0)’ -OverWriteTenantIDInDatabase –AllowAppDatabaseWrite

    NOTE: In a Microsoft Dynamics NAV application that is used in a multitenant deployment, some areas require you to set up web services. Since web services are created in the application database, you must create at least one tenant that has write access to the application database. This setting is determined by the Allow application database writes parameter when you mount a tenant against a Microsoft Dynamics NAV Server instance. For more information, see How to: Mount or Dismount a Tenant on a Microsoft Dynamics Server Instance.

    For example, you can create a dedicated administration tenant that you mount against the Microsoft Dynamics NAV Server instance when you create web services for an application. It is also needed allowing to importing FOB files. For more information see this earlier blog post.

    Press F5, CTRL+N. Now we will import the example Windows PowerShell scripts that you can find on the Microsoft Dynamics NAV 2015 product media:

    Import-Module 'D:\NAV.8.0.39663.W1.DVD\WindowsPowerShellScripts\NAVMultitenancySamples.psm1'

    NOTE: You can copy the WindowsPowerShellScripts folder from the product media to a safe location on your hard drive as long as you do copy all files in that folder
    NOTE: If you are running the PowerShell scripts on a computer that does not have SQL Server / SQL Server tools installed, the following tools are necessary: Microsoft® Windows PowerShell Extensions for Microsoft® SQL Server® 2012

    Press F5, CTRL+N and we will move the companies from the default tenant to newly created tenants.

    HowTo-MoveCompanyToTenant -ServerInstance DynamicsNAV80W1 –FromDatabase 'Demo Database NAV (8-0)' -OldTenantName Default -NewTenantName Production -CompanyName 'CRONUS Production Ltd.' -ToDatabase Production -DatabaseServer SQL\Instance

    HowTo-MoveCompanyToTenant -ServerInstance DynamicsNAV80W1 –FromDatabase 'Demo Database NAV (8-0)' -OldTenantName Default –NewTenantName Sales -CompanyName 'CRONUS Sales Ltd.' –ToDatabase Sales -DatabaseServer SQL\Instance

    HowTo-MoveCompanyToTenant -ServerInstance DynamicsNAV80W1 –FromDatabase 'Demo Database NAV (8-0)' -OldTenantName Default -NewTenantName Marketing -CompanyName 'CRONUS Marketing Ltd.' -ToDatabase Marketing -DatabaseServer SQL\Instance

    HowTo-MoveCompanyToTenant -ServerInstance DynamicsNAV80W1 –FromDatabase 'Demo Database NAV (8-0)' -OldTenantName Default –NewTenantName Staff -CompanyName 'CRONUS Staff Ltd.' –ToDatabase Staff –DatabaseServer SQL\Instance

    Press F5, CTRL+N and we will now remove the companies from the default tenant.

    Remove-NAVCompany -Tenant Default -CompanyName 'CRONUS Production Ltd.' -ServerInstance DynamicsNAV80W1
    Remove-NAVCompany -Tenant Default -CompanyName 'CRONUS Sales Ltd.' -ServerInstance DynamicsNAV80W1
    Remove-NAVCompany -Tenant Default -CompanyName 'CRONUS Marketing Ltd.' -ServerInstance DynamicsNAV80W1
    Remove-NAVCompany -Tenant Default -CompanyName 'CRONUS Staff Ltd.' -ServerInstance DynamicsNAV80W1

    To dismount and mount again, I refer you to my previous posting here. You can simply start the Windows client and if you do not change the config files, you will get a message stating that no tenants were specified. Press OK and change the url like this:

    name_servicetier:7046/DynamicsNAV80W1/default
    name_servicetier:7046/DynamicsNAV80W1/production
    name_servicetier:7046/DynamicsNAV80W1/sales
    name_servicetier:7046/DynamicsNAV80W1/marketing
    name_servicetier:7046/DynamicsNAV80W1/staff

    NOTE: If you set up multitenancy on a machine that is configured with other releases of Dynamics NAV side by side, it could be that the Administration console may generate an error stating in the PowerShell ISE tool that you can only run the Powershell command lets for a specific release. The root cause could be that you installed Dynamics NAV 2013 R2 after you installed Dynamics NAV 2015 or vice versa. You would need to verify the following key in the registry. It should match the release you are using. V7.1 is the build number for Dynamics NAV 2013 R2 and v8.0 is the build number for Dynamics NAV 2015.


    Windows Registry Editor Version 5.00
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellSnapIns\Microsoft.Dynamics.Nav.Management]
    "ApplicationBase"="C:\\\\Program Files\\\\Microsoft Dynamics NAV\\\\71\\\\Service\\\\"
    "AssemblyName"="Microsoft.Dynamics.Nav.Management, Version=7.1.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    "Description"="Microsoft Dynamics Nav Management Snap-in"
    "ModuleName"="C:\\Program Files\\Microsoft Dynamics NAV\\71\\Service\\Microsoft.Dynamics.Nav.Management.dll"
    "PowerShellVersion"="2.0"
    "Vendor"="Microsoft Corporation"
    "Version"="7.1.0.0"

     

    Regards,

    Marco Mels
    CSS EMEA

    This posting is provided "AS IS" with no warranties, and confers no rights

  • Microsoft Dynamics NAV Team Blog

    Coffee Break | Windows PowerShell and Piping

    • 2 Comments

    The | (pipe) functionality in Windows PowerShell offers endless opportunities for formatting and manipulating results from one cmdlet to the next.

    Coffee Break 4: Piping in Windows PowerShell

     Each time we run a Windows PowerShell cmdlet, the resulting output is not text but an Object providing structured information of the result.

    Example:  Get-NAVServerInstance will return existing instances of NAVServerInstance Objects:

    with the following properties:

    •   ServerInstance
    •   DisplayName
    •   State
    •   ServiceAccount
    •   Version
    •   Default

    Windows PowerShell can pipe objects. Pipelines are a series of cmdlets (segments) separated by a Pipeline character ‘|’. Each Item is passed through all segments of the pipeline (left to right) before the next is processed.

    Piping example:

    First import your Dynamics NAV cmdlets (if you are not already in the Microsoft Dynamics NAV Administration Shell, that is):

    Import-Module 'C:\Program Files\Microsoft Dynamics NAV\80\Service\Microsoft.Dynamics.Nav.Management.dll'

    This imports the NAV.Management.dll for version 80 (=NAV 2015). Adjust the path to the version you are working with.

    Get-NAVServerInstance

    In case Get-NAVServerInstance returns more than one, then let's filter the one(s) that we want by piping the original result through a filter. Or said in other words: We pipe it to the Where-Object cmdlet:

    #Filter by version

    Get-NAVServerInstance | where-Object –Property Version -like "8.0*”

    One can also omit the –Property parameter here, and just run:

    Get-NAVServerInstance | where-Object Version -like "8.0*”

     

    Then we will take the result and pipe that to another cmdlet, let's pipe it to Sync-NAVTenant:

    Get-NAVServerInstance | where-Object –Property Version -like "8.0*” | Sync-NAVTenant

    Note also that the syntax of Where-Object cmdlet has changed across Windows PowerShell  versions, so for compatibility, and going forward , the following syntax should be used:

    Get-NAVServerInstance | where-Object  {$_.Version -like "8.0*”} | Sync-NAVTenant

    Where $_ is used to reference the Item returned by the previous pipeline segment (in the above example, it references the instance of NavServerInstance Object returned by Get-NAVServerInstance cmdlet). However running the above will still fail to sync Microsoft Dynamics NAV tenants for instances that are not running (State: stopped).  This will not abort the process, but we can also further filter on only those instances that are running:

    Get-NAVServerInstance | where-Object  {$_.Version -like "8.0*”} | where-Object {$_.State –eq 'Running'} | Sync-NAVTenant

    The two pipline segments filtering the output can of course be combined in one. We join the filtering conditions using –And operator. Note that Logical operators (-And / -Or) are valid only within script blocks.

    Get-NAVServerInstance | where-Object  {$_.Version -like "8.0*” -And $_.State –eq 'Running'} | Sync-NAVTenant

     

    See further content about Piping here: https://technet.microsoft.com/en-us/library/dd347655.aspx

     

    Jasminka Thunes, Escalation Engineer Dynamics NAV EMEA

    Lars Lohndorf-Larsen, Escalation Engineer Dynamics NAV EMEA

  • Microsoft Dynamics NAV Team Blog

    Coffee break in the Cloud with Windows PowerShell

    • 1 Comments

    In this post we will run Windows PowerShell in the cloud. The ability to connect your Windows PowerShell with your Microsoft Azure instances can double the value of Microsoft Dynamics NAV and PowerShell, since you now have tools for both on-premises and cloud deployments. And having the choice of hosted deployments is also one of the first prerequisites for moving to Cloud-first as described in the Are you putting the cloud first? article.

    Coffee Break 3: PowerShell Remoting with Microsoft Dynamics NAV

    Prerequisites:

    Customer Story:

    • Cloud first
    • Running PowerShell remotely will be handy for customers who migrate or automate their system / part of their system or their development environment in / to the cloud.

    Connect

    Open your Windows PowerShell ISE. In order to connect to Azure you must have two things:

    1. Azure Publishsettings file which will have all the details of your subscription.
    2. Your Azure account credentials.

     

    #Connect to Azure

    import-module azure #see pre-requisites from above.

    #Check if we are logged on to our Azure subscriuption - expect this to fail for now:

    Get-AzureVM

    #Log in to your Azure subscription

    Add-AzureAccount

    Get-AzurePublishSettingsFile #After saving your file once, just skip this point and remember where you save it, you don't need to save it every time. But keep the file safe as it contains connection details.

    Import-AzurePublishSettingsFile "C:\Temp\Windows Azure MSDN - Visual Studio Ultimate-5-14-2013-credentials.publishsettings"

    #Check again - this time it should work:

    Get-AzureVM 

     

    You should now be able to run generic Azure commands, like Get-AzureVM and Start-AzureVM and more to access your Virtual Machines, and get some of the same information you get via the Azure management portal. Next, we will connect to a running machine and start running PowerShell remotely.

    For the next steps you need to have at least one Virtual Machine (VM) running in your Azure subscription. You can create a VM easily from your Azure management portal. You will be able to pick a ready-built image with Microsoft Dynamics NAV 2015 from the Azure marketplace under Microsoft -> Dynamics. You can also create your own VM, and you can still continue with the scripts below. 

    Note: When you create a new VM, you need to specify both Machine Name and Service Name. Some of the scripts below assume that these two names are the same. So just to avoid any confusion, keep Service Name and Machine Name the same. 

    To connect to a remote machine we can use the cmdlet New-PSSession. This works nice and easy on your domain. However if the remote machine is in the cloud, connecting becomes a little bit more challenging. Luckily we have helper-scripts, right on the NAV product DVD - for more information, see Deploying and Managing Microsoft Dynamics NAV on Microsoft Azure. In this example, the DVD is in D:\NAVDVD\, and we will import the NAVRemoteAdministration module from the Cloud subfolder.

    #Load NAV remote admin from the product DVD
    Import-Module "C:\NAVDVD\WindowsPowerShellScripts\Cloud\NAVRemoteAdministration\NAVRemoteAdministration.psm1"

    Before continuing lets just stop and check what the NAVRemoteAdministration module contains:

    get-command -module NAVRemoteAdministration

    What we will use first, is New-NAVAdminSession but also notice functions like Copy-FileToRemoteMachine, Get-NAVServerUserRemotely, New-NAVServerInstanceRemotely and Start-ServiceRemotely. We're sure you can imagine how useful these can be. But first we need to create a session object that we can use to connect: Make sure that the VM you refer to exists and is running, and that service and machine names are the same:


    $PsSession = New-NAVAdminSession `
      -RemoteMachineAddress MyTestDynnav2015.cloudapp.net `
      -AzureServiceName MyTestDynnav2015 `
      -VMAdminUserName VMAdmin `
      -VMAdminPassword 1MyPassword2

     

    The 4 parameters in this function all are from when you created your VM.

    You now have a session variable ($PSSession) that you can use to connect to your cloud VM. This is a persistent session but we will come back to session types in more details another time. You can start either an interactive session or just run scripts to this session.

    #Enter an interactive session
    Enter-PSSession $PsSession

    get-navserverinstance #will show you any NAV instances on this VM

    get-service

    dir

    and once you are done checking what you want, return to your own PC:

    EXIT

     

    Run a script remotely. It is a little bit of a problem to list something, since the result may just stay on the remote machine. So for example Get-NAVServerInstance would run, but not necessarily show you something. So instead we run a cmdlet to run an action - let's stop the Microsoft Dynamics NAV Server service remotely:

    Invoke-Command -Session $Pssession -ScriptBlock{Set-NavServerInstance NAV -stop}

    Or run a script from a file, this time adding some parameters:

    Invoke-Command -Session $psSession -FilePath .\MySCriptps1 -ArgumentList Arg1,Arg2

     

    And finally let's run one of the functions we looked at earlier, and again using the $PSSession variable to do the connection

     Copy-FileToRemoteMachine -Session $Pssession -SourceFile c:\Tmp\MyDB.bak -DestinationFile c:\NAV\DB.BAK

     

    As you can imagine, the topic of PowerShell Remoting is much bigger than what can fit in a coffee break, but hopefully this has given some good insights at least.

     

    Jasminka Thunes, Escalation Engineer Dynamics NAV EMEA

    Lars Lohndorf-Larsen, Escalation Engineer Dynamics NAV EMEA

  • Microsoft Dynamics NAV Team Blog

    Importing objects in a multi tenancy environment

    • 5 Comments

    The following posting is based on a support request where a partner wanted specific instructions what the process should be when trying to import a FOB file in a true multi tenant environment. If you simply import the FOB file, the
    following message box will first pop up to you:

    This box is new in Dynamics NAV 2015 and is not part of the scope of this blog posting. It is the other message box that needs more explanation:

    The first suggestion is to verify if the server is indeed running (of course it is) and the suggestion from support would be to always verify if the server is accessible via the mentioned port. If these are all true, then the second suggestion is to ensure all tenants are dismounted except one. This is because there should only be one tenant mounted that does have the option “Allow application database write to” enabled.

    Note that if you import objects into a multitenant deployment of Microsoft Dynamics NAV 2013 R2, you will see a different error message if you have more than one tenant mounted against your service instance:

    Tenant 'Default" could not be found.
    Check that:
    1. Tenant 'default' is mounted on the server, or
    2. Specify a different Tenant in Tools|Options.

    The meaning is the same as shown in the screenshot from Microsoft Dynamics NAV 2015: Before you import objects into a multitenant application, you must ensure that only one tenant is mounted against that Microsoft Dynamics NAV Server instance, and that this tenant is mounted with the database synchronization mode set to Force.

    The following configuration will generate the warning “Unable to process table changes because the request cannot be processed by the specified Dynamics NAV Server instance”:

    If you dismount all the tenants except the one that does have the option “Allow application database writes” enabled, the warning will not pop up and you will be able to continue the object import. The following configuration will therefore not generate the warning “Unable to process table changes because the request cannot be processed by the specified Dynamics NAV Server instance”:

    To dismount a tenant, you can utilize the Microsoft Dynamics NAV 2015 Administration Shell which may need to be start up with Run as Administrator:

    Dismount-NavTenant –ServerInstance DynamicsNAV80SSL –tenant marketing –force
    Dismount-NavTenant –ServerInstance DynamicsNAV80SSL –tenant production –force
    Dismount-NavTenant –ServerInstance DynamicsNAV80SSL –tenant sales –force
    Dismount-NavTenant –ServerInstance DynamicsNAV80SSL –tenant staff –force

    After you have done the necessary work to get the application upgraded with the latest rollup or whatever fob file you are trying to import, you need do mount the tenants again:

    Mount-NavTenant –ServerInstance DynamicsNAV80SSL –DatabaseInstance NAVDEMO –DatabaseName marketing –DatabaseServer SQL-02 –DefaultCompany ‘CONTOSO Marketing Ltd.’ –id marketing
    Mount-NavTenant –ServerInstance DynamicsNAV80SSL –DatabaseInstance NAVDEMO –DatabaseName production –DatabaseServer SQL-02 –DefaultCompany ‘CONTOSO Production Ltd.’ –id production
    Mount-NavTenant –ServerInstance DynamicsNAV80SSL –DatabaseInstance NAVDEMO –DatabaseName sales –DatabaseServer SQL-02 –DefaultCompany ‘CONTOSO Sales Ltd.’ –id sales
    Mount-NavTenant –ServerInstance DynamicsNAV80SSL –DatabaseInstance NAVDEMO –DatabaseName staff –DatabaseServer SQL-02 –DefaultCompany ‘CONTOSO Staff Ltd.’ –id staff

    Last but not least you need to synchronize the tenant with the application
    database:

    Sync-NavTenant –ServerInstance DynamicsNAV80SSL –tenant marketing 
    Sync-NavTenant –ServerInstance DynamicsNAV80SSL –tenant production
    Sync-NavTenant –ServerInstance DynamicsNAV80SSL –tenant staff 
    Sync-NavTenant –ServerInstance DynamicsNAV80SSL –tenant sales

    Hope this makes the process a bit more clear.

    Regards,

    Marco Mels
    CSS EMEA

    This posting is provided "AS IS" with no warranties, and confers no rights

    This blog post was updated on March 21, 2015, to include a note about the same scenario in Microsoft Dynamics NAV 2013 R2.

  • Microsoft Dynamics NAV Team Blog

    Windows PowerShell and Dynamics NAV for your coffee break - Deploy Dynamics NAV via Windows PowerShell

    • 4 Comments

    In this coffee break we will show a way to deploy Microsoft Dynamics NAV automatically. We assume that Microsoft Dynamics NAV is already installed on the machine, but we want to add additional installations / instances of Microsoft Dynamics NAV.

    Coffee Break 2: Automate a Microsoft Dynamics NAV deployment

    User Story:
    The customer has a system where they spin up a new Microsoft Dynamics NAV system every time they
      - Start a new branch
      - Start a new series of testing
      - Start a new Fiscal Year
      - etc
    In practical terms, a "new Microsoft Dynamics NAV system" could mean new Microsoft Dynamics NAV Server instance and database, a new company, or a new tenant. Typically you would end by starting a new Microsoft Dynamics NAV Server service or spinning up a new tenant. For simplicity in this example we just re-use an existing Microsoft Dynamics NAV Server service to start up on our new database.

    Pre requisites:
    We use a SQL Server PowerShell cmdlet: import-module sqlps. SQLPS module is provided with SQL Server installation, but you don't have to install SQL Server to obtain the module.

    If you don't have SQL Server installed on the box you're running PS on, you can install Microsoft SQL Server 2012Feature Pack:

    http://www.microsoft.com/en-us/download/details.aspx?id=29065

    #Preparation
    $MyNAVServerName = "DynamicsNAV80"
    $MySQLServerName = "."
    $MyNewCustomerName = "NewCustomer"
    $MyNewDatabaseName = "NewCustomerDatabase"

    Set-ExecutionPolicy unrestricted
    import-module "C:\Program Files\Microsoft Dynamics NAV\80\Service\NavAdminTool.ps1"
    Push-Location #jump back to standard prompt with pop-location
    import-module sqlps #ignore any warnings you may get

    #Restore SQL db (NAV demo db)
    #Relocate database files http://stackoverflow.com/questions/26400752/cannot-bind-relocatefile-when-using-restore-sqldatabase-cmdlet
    $mdf = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("Demo Database NAV (8-0)_Data", "C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DB_Data_$MyNewCustomerName.mdf")
    $ldf = New-Object Microsoft.SqlServer.Management.Smo.RelocateFile("Demo Database NAV (8-0)_Log", "C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DB_Log_$MyNewCustomerName.ldf")

    restore-SqlDatabase -ServerInstance $MySQLServerName `
                        -Database $MyNewDatabaseName `
                        -BackupFile "C:\NAVDVD\SQLDemoDatabase\CommonAppData\Microsoft\Microsoft Dynamics NAV\80\Database\Demo Database NAV (8-0).bak" `
                        -ReplaceDatabase `
                        -RelocateFile @($mdf,$ldf)
                       

    #Set network service as dbo
    $CreateServiceAccountUser = "CREATE USER [NT AUTHORITY\NETWORK SERVICE] FOR LOGIN [NT AUTHORITY\NETWORK SERVICE]"
    Invoke-Sqlcmd -ServerInstance $MySQLServerName -Database $MyNewDatabaseName -Query $CreateServiceAccountUser
    $AddServiceAccountAsDbo = "exec sp_addrolemember 'db_owner', 'NT AUTHORITY\NETWORK SERVICE'"
    Invoke-Sqlcmd -ServerInstance $MySQLServerName -Database $MyNewDatabaseName -Query $AddServiceAccountAsDbo

    pop-location # Finished with SQL commands so popping back to normal PS prompt

    #For NAV 2013(R2), to convert the database to latest executable version.
    #For NAV 2015 we don't need this (in fact we don't have the Invoke-DatabaseConversion cmdlet).
    import-module "C:\PSscripts\Upgrade\Cmdlets\NAVUpgradeCmdlets.psm1"
    Invoke-NAVDatabaseConversion -DatabaseServer localhost -DatabaseName "Demo Database NAV (7-1)" -FinSqlExeFile "C:\Program Files\Microsoft Dynamics NAV\71\Service\finsql.exe"

    #At this point the next steps depend on whether we want a new NAV Service, connect to an existing one, etc. Here we just reuse existing NAV Service
    #Configure then restart the service and get status
    Set-NAVServerConfiguration $MyNAVServerName -KeyName DatabaseName -KeyValue $MyNewDatabaseName
    Set-NAVServerInstance $MyNAVServerName -restart
    Get-NAVServerInstance $MyNAVServerName

     

     

    Jasminka Thunes, Escalation Engineer Dynamics NAV EMEA

    Lars Lohndorf-Larsen, Escalation Engineer Dynamics NAV EMEA

  • Microsoft Dynamics NAV Team Blog

    Announcing the Microsoft Dynamics ERP Translation Solution

    • 5 Comments

    The Microsoft Dynamics ERP Translation Solution is now available. This solution was developed by the MBS Engineering International team to improve the experience when Microsoft Dynamics AX and Microsoft Dynamics NAV partners translate our products or the solutions developed by them into existing and additional languages.

    The ERP Translation Solution is applicable to Microsoft Dynamics AX 2012 R3 and Microsoft Dynamics NAV 2015 or earlier releases. It provides automation for the translation related tasks through the ERP Translation Tool. Translation is done in the XLIFF format, a localization industry standard format, enabling partners to work with the translation editor of their choice.  The solution provides automated machine translation and access to MS linguistic assets through the Microsoft Translator Hub from Microsoft Research. Partners are also given the option to use the free light weight translation editor available in the Multilingual App Toolkit (MAT).

    Sign up in order to use  the ERP Translation Solution - the solution details and the sign up page are available at the Microsoft Dynamics Partner Localization and Translation Licensing Program Resource Center in Partner Source.

     

    Best regards,

    The Microsoft Business Solutions Engineering International team and the Microsoft Dynamics NAV team

  • Microsoft Dynamics NAV Team Blog

    Cumulative Update 4 for Microsoft Dynamics NAV 2015 has been released

    • 17 Comments

    Cumulative Update 4 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2015. 

     The cumulative update includes hotfixes that apply to all countries and hotfixes specific to the following local versions:

    •   AU - Australia
    •   AT - Austria
    •   BE - Belgium
    •   CH – Switzerland
    •   CZ – Czech Republic
    •   DE - Germany
    •   DK - Denmark
    •   ES - Spain
    •   FI  - Finland
    •   FR - France
    •   IS - Iceland
    •   IT - Italy
    •   NA - North America
    •   NL - Netherlands
    •   NO - Norway
    •   NZ - New Zealand
    •   RU – Russia
    •   SE - Sweden
    •   UK - United Kingdom

    Please note that Cumulative Update 4 requires a database conversion. This is caused by the introduction of the ability to return the Microsoft Dynamics NAV Tablet client as the current client type. You will be able to read about that in the MSDN Library after we complete the monthly update of the Microsoft Dynamics NAV 2015 content there on February 11, 2015. For more information, see Updated Help Content

    Where to find Cumulative Update 4

    You can download the cumulative update from KB 3035986  – Cumulative Update 4 for Microsoft Dynamics NAV 2015 (Build 39663). 

    Additional Information

    For information about how to install the cumulative update, see How to Install a Microsoft Dynamics NAV 2015 Cumulative Update

    For information about how to work around a recent process change, see How to Get Back the 'Hotfix Directories' from NAV 2015 Cumulative Update 1.

    For a list of all cumulative updates for this version, see Released Cumulative Updates for Microsoft Dynamics NAV 2015.  

  • Microsoft Dynamics NAV Team Blog

    Cumulative Update 16 for Microsoft Dynamics NAV 2013 R2 has been released

    • 4 Comments

    Cumulative Update 16 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2013 R2.

     The cumulative update includes hotfixes that apply to all countries and hotfixes specific to the following local versions:

    •   AU - Australia
    •   AT - Austria
    •   BE - Belgium
    •   CH – Switzerland
    •   CZ – Czech Republic
    •   DE - Germany
    •   DK - Denmark
    •   ES - Spain
    •   FI  - Finland
    •   FR - France
    •   IS - Iceland
    •   IT - Italy
    •   NA - North America
    •   NL - Netherlands
    •   NO - Norway
    •   NZ - New Zealand
    •   RU – Russia
    •   SE - Sweden
    •   UK - United Kingdom

    Where to find Cumulative Update 16

    You can download the cumulative update from KB 3035983  – Cumulative Update 16 for Microsoft Dynamics NAV 2013 R2 (Build 39665). 

    Additional Information

    For more information about cumulative updates for this version, see Announcement of update rollups for Microsoft Dynamics NAV 2013 R2.

    For a list of all cumulative updates for this version, see Released Cumulative Updates for Microsoft Dynamics NAV 2013 R2

    For a list of all hotfixes included in cumulative updates for this version, see the following CustomerSource and PartnerSource pages:

    CustomerSource:

    PartnerSource

  • Microsoft Dynamics NAV Team Blog

    Cumulative Update 23 for Microsoft Dynamics NAV 2013 has been released

    • 2 Comments

    Cumulative Update 23 includes all application and platform hotfixes and regulatory features that have been released for Microsoft Dynamics NAV 2013.

    The cumulative update includes hotfixes that apply to all countries and hotfixes specific to the following local versions: 

    • AU - Australia
    • AT - Austria
    • BE - Belgium
    • CH - Switzerland
    • DE - Germany
    • DK - Denmark
    • ES - Spain
    • FI - Finland
    • FR - France
    • IS - Iceland
    • IT - Italy
    • NA - North America
    • NL - Netherlands
    • NO - Norway
    • NZ - New Zealand
    • SE - Sweden
    • UK - United Kingdom

    Where to find Cumulative Update 23

    You can download the cumulative update from KB 3035980 - Cumulative Update 23 for Microsoft Dynamics NAV 2013 (Build 39671).

    Additional Information

    For a list of all cumulative updates for this version, see Released Cumulative Updates for Microsoft Dynamics NAV 2013

    For a list of all hotfixes included in cumulative updates for this version, see the following CustomerSource and PartnerSource pages:

    CustomerSource:

    PartnerSource:

  • Microsoft Dynamics NAV Team Blog

    Learn NAV PowerShell in your coffee breaks

    • 8 Comments

    For learning PowerShell in the lunch break we have this option.

    We thought that was a good idea. But we also thought we can do even better: Do some NAV PowerShell in your coffee breaks. This post is the first in a series of small script ideas of things you can do with NAV using PowerShell. If you find this useful or have ideas to improvements then please add your comments below and also suggest what you would like to see next.

     

    Coffee Break 1: Add AD users to NAV.

    User story

    Consider the following scenario: With the new security model in Microsoft Dynamics NAV 2013 and later versions, it is no longer possible to add users and permissions by merely adding Windows Groups. Besides, as of NAV 2013, you may not be using Windows authentication. The user wants to automate what is otherwise a trivial task of looking up Windows users, and entering them into NAV.
     
    The script below will give some ideas for adding NAV users in a batch.

    Pre requisites:

    Depending on which OS you run it on, you may need to install Remote Server Administration Tools (RSAT). Make sure to install the one that matches your OS and version. If you run Win 8.1 then install it from here:

    Remote Server Administration Tools for Windows 8.1
    http://www.microsoft.com/en-gb/download/details.aspx?id=39296

    If you run it on a server OS, you may just need to enable it. For more details:
    https://technet.microsoft.com/en-us/library/dd378937(v=ws.10).aspx

    To see if the module is installed, just try to import it and see if that works:

    Import-Module ActiveDirectory

     

     Coffee break 1 - importing NAV users from Active Directory

    #Suggestion: Run each line below one by one and then put them together as needed.

    #Install Remote Server Administration Tools (RSAT) first as described above, then import module

    Import-Module ActiveDirectory

     

    #Import NAV admin module for the version of Dynamics NAV you are using

    Import-Module 'C:\Program Files\Microsoft Dynamics NAV\80\Service\NavAdminTool.ps1'

     

    #Specify your Dynamics NAV Service name

    $NavServerName = "DynamicsNAV80"

     

    #AD filter for use in the next line. If you are not on a large domain, then run the next line (get-aduser) without this filter, or if you use the filter then adjust it to your scenario and domain.

    $Mysearchbase = "DC=<Domain>[,DC=<Corp Domain>,...]"

    #For example:

    $Mysearchbase = "DC=EUROPE,DC=CONTOSO,DC=com"

     

    #Next we will get AD users. If you want to import only users from a Windows group or a subdomain, you can filter the result set on sub-domain/group/...  Furthermore, we have chosen to retrieve only user name and alias in the example below, but choose any properties that fit your purpose. You can see the entire cmdlet output by running get-help <cmdletname>.Furthermore, we want to save this output into a list that we later can retrieve and modify if needed. The list format and default delimiter might vary depending on regional settings, a semicolon is defined here as a delimiter.

    get-aduser -filter 'samaccountname -like "*bill*"' -searchbase $Mysearchbase | Select-Object -Property Name,SAmaccountname | export-csv "c:\temp\userlist.csv" -notypeinformation  -Delimiter ';' -force 

    #Assign the list to a variable

    $myuserlist = Import-csv "c:\temp\userlist.csv"

    #Show the list

    $myuserlist

     

    #Another way of assigning the output to a variable is using outvariable. Next we want to  then pipe everything to New-NAVServerUser cmdlet to create new users in NAV. In the above example we have only read SamAccountName and User Name from  AD, so to add users as Windows users to NAV, following our Contoso scenario, we need to add the domain name too : DOMAIN\samaccountname. 

    import-csv C:\temp\userlist.csv -Delimiter ';' -OutVariable myuserlist | foreach {New-NAVServerUser -serverinstance $NavServerName -WindowsAccount "<DOMAIN>\$($_.samaccountname)"}

    #You can combine the above two actions (Reading AD users and then importing them into NAV) into one cmdlet, without saving the output as in the example above.

    #We're using a loop here and not the pipeline, as New-NAVServerUser doesn't seem to take the pipeline input

    get-aduser -filter 'samaccountname -like "*bill*"' -searchbase $Mysearchbase | foreach { New-NAVServerUser -serverinstance $NavServerName -WindowsAccount "<DOMAIN>$($_.samaccountname)"}

     

    <#Consider now the following scenario. User wants to get AD users using the export script above, but wants to add roles to this user list, before importing them into NAV. So he will break the above process into 2 steps again - in step 1 he will save AD users into a list, then assuming a modified list with added roles - he will import the list of users and their roles into NAV in step 2.

    Step one is then unchanged from the example above (using csv list). Next we will assume that the list is now modified to add roles to users.

    Example below shows step 2, where this list is imported to create users and assign permissions in NAV. Userlist2.csv file refered to in the script below is the name of the csv file containing users and permissions. Example below shows format of this file (csv, semicolon delimited) with Contoso users as examples:

     

    EUROPE\mrhill;BASIC,RAPIDSTART

    EUROPE\mssaddow;BASIC,COST,CASHFLOW

    EUROPE\joeroberts;SUPER

     

    If a user or a role defined in this list already exists in NAV, the cmdlet is expected to continue since the ErrorAction parameter is set to Continue (which is also the default value of this parameter). However it is singled out here to direct the attention to error handling opportunities that best fit the user's scenario. Review the possible values of this parameter and how to use them using get-help cmdlet. The following blog is worth checking:

    http://blogs.msdn.com/b/powershell/archive/2006/11/03/erroraction-and-errorvariable.aspx

    #>

     

    $NavServerName ="DynamicsNAV80"

    $list = Import-csv -Path C:\temp\userlist2.csv -Delimiter ';' -Header username,roleset

    foreach ($user in $list)

    {

      $navuser=Get-NAVServerUser -ServerInstance $NavServerName

       if(!($navuser.UserName -contains $user.username))

         { 

        New-NAVServerUser -ServerInstance $NavServerName -WindowsAccount $user.username -ErrorAction Continue

        }

    #In the csv file used in this example, the list of roles is divided by a comma

      $roleset=$user.roleset.Split(',')

         foreach ($role in $roleset)

        {

        $navrole=Get-NAVServerUserPermissionSet -ServerInstance $NavServerName -WindowsAccount $user.username

        if(!($navrole.PermissionSetID -contains $role))

            {

         New-NAVServerUserPermissionSet -ServerInstance $NavServerName -WindowsAccount $user.username -PermissionSetId $role -ErrorAction Continue

     

           }

        }

    }

     

     

    More coffee breaks to follow soon!

     

    Jasminka Thunes, Escalation Engineer Dynamics NAV EMEA

    Lars Lohndorf-Larsen, Escalation Engineer Dynamics NAV EMEA

     

     

  • Microsoft Dynamics NAV Team Blog

    .NET Exception Handling in C/AL

    • 2 Comments

    This pattern is brought to you by Mostafa Balat from the Dynamics NAV team here at MDCC in Denmark.

    Best regards,

    The NAV Patterns team

    Meet the Pattern

    When there is a need to use .NET classes within C/AL, one of the main challenges is to handle the exceptions the methods of these .NET classes may throw. Eventually, if not handled, they will basically bubble up as runtime errors, halting the current operation a user is doing without having a chance to properly display errors in a user-friendly format.

    Know the Pattern

    Using the .NET classes in order to extend the functionality in Microsoft Dynamics NAV usually triggers the need to create an add-in assembly. This is a pretty powerful approach and opens the door for empowering Microsoft Dynamics NAV with new and extra functionality while harnessing the full power of the .NET Framework.

    For example, integration with a web service in Microsoft Dynamics NAV can be done to extend the existing functionality, or to benefit from a service model offered through a 3rd party. To do so, it is possible to write a .NET add-in to handle the required bi-directional communication between Microsoft Dynamics NAV and the web service. Alternatively, the implementation itself can be done in C/AL, with no add-in dependency. The latter option simplifies customization, deployment and upgradeability. Additionally, it builds up on the knowledge Microsoft Dynamics NAV developers have with C/AL programming.

    On the other hand, not using an add-in exposes Microsoft Dynamics NAV to runtime errors due to unhandled exceptions that get thrown at different levels. The first is the communication layer, in which HTTP requests and responses are exchanged. The second is the business logic layer, at which the content of the requests and response is being prepared and groomed using XML Elements and being retrieved or edited based on the respective XPaths.

    Use the Pattern

    When .NET classes are used, they may throw exceptions upon failure. Some of these exceptions cannot pre-checked (e.g. like existence of a file on disk) and will only be figured out at runtime. Eventually, to present the error reason to a user and explain what needs to be done to address it, the exception needs to be handled gracefully. This also protects the client for unexpected crashes that may deteriorate the user experience.

    Read more about .NET Exception Handling on the Design Patterns Wiki..

  • Microsoft Dynamics NAV Team Blog

    Control Add-In dll’s files in Microsoft Dynamics NAV 2015

    • 4 Comments

    With Microsoft Dynamics NAV 2015 there comes one feature in Add-In files area – you do not need manually to copy add-in dll to client: when client doesn’t find it, NAV copies add-in from server.

    It is very good: If you’ve installed NAV client on some computer, you don’t care about all add-ins, when user needs it, he will have it.

    When NAV client can’t find add-in in client Add-ins folder, usually it is: c:\Program Files (x86)\Microsoft Dynamics NAV\71\RoleTailored Client\Add-ins\, then NAV copies whole add-ins folder from NST computer to client computer to folder C:\Users\[username]\AppData\Local\Temp\1\Microsoft Dynamics NAV\Add-Ins\

    But here are few points you need to know when updating add-ins or have strange issues related to your updated add-in functionality.

    • NAV recognizes add-ins by:

      • Product Name (it could be not the same as file name and file properties in windows file explorer doesn’t show it. You can see it by run power cmdlet “(Get-ItemProperty [filename]).VersionInfo.ProductName”);

      • Product version (it is not the same as file version, you can see it in file properties in windows file explorer or run powershell “(Get-ItemProperty [filename]).VersionInfo.ProductVersion”);

      • Public key token (you’ve set it in VisualStudio project when compiled add-in. You can see it by run developer command prompt statement “sn –T [filename]”). Details at http://msdn.microsoft.com/en-us/library/dd983825.aspx.
        So if any of these fields are different, NAV will recognize dll as different add-in.

    • NAV fill in assembly list table with these 3 fields and when NAV looks for dll it uses these fields to recognize which dll need to be loaded. If for some reasons you have 2 files with different names, but the same mentioned properties then for NAV there is only one add-in.

    • When NAV is looking for add-in, it looks in NAV add-ins folder, then in Temp folder and if hasn’t found then download from server add-ins folder. If you updated add-in on server and deleted it in client folder, it could be that old add-in version still remains in temp folder and NAV client will use it for work.

    • If you recompiled your add-in and have changed something, but you haven’t modified add-in properties, then you need to replace add-in files on server and on client computer (in NAV folder). It is not enough to replace file on server only, because NAV doesn’t recognize that new add-in needed to use and do not download add-in file from server. But it is also not enough to delete add-in file on client computer in NAV folder, just because old version could remain in temp folder too. Of course you can delete add-in file in both folders (in NAV and in Temp). But if computer is used by few users, then you need to delete files from every user temp folder, then maybe easier way is replace add-in file only in NAV folder. As soon as add-in file exists in folder, NAV doesn’t look it in temp folder.

     

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

    Gedas Busniauskas

    Microsoft Lithuania
    Microsoft Customer Service and Support (CSS) EMEA

  • Microsoft Dynamics NAV Team Blog

    How to control keyboards events in Add-in

    • 1 Comments

    With Microsoft Dynamics NAV Role Tailored Client we’ve received possibility to add ControlAddIn to any field on page. This opens huge possibilities to extend functionality with own controls.
    We can create any .Net control with Visual Studio, register it in NAV controls and add it to any field on page by describe control name in field “ControlAddIn” property.
    Then whenever user put focus on this field, NAV forwards full control to AddIn and now AddIn does whatever it wants.

    And here comes first issue: if AddIn controls everything then all NAV shortcuts are not active and then what to keyboard key to click if want to go on page to next field/control? Only way is to use mouse and click on another control. This is not best way for UX, especially if you want to do that fast.

    Issue was resolved with Cumulative Update 9 for Microsoft Dynamics NAV 2013 R2 (Build 37221) released in July 2014.
    https://mbs.microsoft.com/partnersource/global/deployment/downloads/hot-fixes/NAV2013R2PlatformHotfixOverview
    With this update NAV keyboard events are left for NAV – user can scroll per controls like in any other page.

    But here comes another issue: what to do if we want to leave some keyboard events to AddIn? For example we are using RichTextBox in AddIn for text managing, here <enter> key splits line and jumps to new line. But with CU9 cursor jumps to next page control as <enter> is used by NAV. What to do? We need something flexible: leave event to NAV or to AddIn depends what addin does.

    Here comes Cumulative Update 14 for Microsoft Dynamics NAV 2013 R2 (Build 38801) released in December 2014. It allows us to choose where <enter> must to be: in NAV or in Addin.

    With this update new interface is implemented in Microsoft.Dynamics.Framework.UI.Extensibility, it is “IControlAddInEnterKeyHandler”. And now we can decide how <enter> key is acting,
    will cursor stay in AddIn control

    public class ControlAddInWithKeyboardFilter : StringControlAddInBase, IControlAddInEnterKeyHandler

        {

            private RichTextBox rtb;

                     public override bool AcceptsEnterKey

            {

                //get { return false; }

                get { return true; }

            }

      

            protected override Control CreateControl()

            {

                rtb = new RichTextBox();

                rtb.Multiline = true;

                return rtb;

     

            }

     

    Or cursor jumps to next NAV control:
      public class ControlAddInWithKeyboardFilter : StringControlAddInBase, IControlAddInEnterKeyHandler

        {

            private RichTextBox rtb;

     

                    public override bool AcceptsEnterKey

            {

                //get { return true; }

                get { return false; }

            }

     

           

     

            protected override Control CreateControl()

            {

                rtb = new RichTextBox();

                rtb.Multiline = true;

                return rtb;

             }

     

     

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

    Gedas Busniauskas

    Microsoft Lithuania
    Microsoft Customer Service and Support (CSS) EMEA

  • Microsoft Dynamics NAV Team Blog

    Memory usage when is used .NET components

    • 4 Comments
    We already had few support request where NAV developers see big memory consumption increase when using .NET component.
    Especially when method is inside some loop.
    Like in this sample:

      FOR count := 1 TO 10000000 DO BEGIN
            varDOTNET :=varDOTNET.DotNetObject();
            varDOTNET.SetValue('par');
            CLEAR(varDOTNET);
       END;

     

    Even it looks like we create variable and then clear it – we can see continues memory usage increase in windows task manager.
    But this is not “memory leak” this is how NAV is managing memory. If you start process again then memory usage decrease and increase to the same number.
    So only during processing there could be issue that few users running the same code comes to memory limits.
    Resolution is to transfer .NET method execution to local function

     FOR count := 1 TO 10000000 DO 
     CallToFunction(‘par’);
    …………

    PROCEDURE CallToFunction@1(parameter@1170000001 : Text);
    VAR
      varDOTNET@1170000000 : DotNet "'MemoryExample, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.MemoryExample.DotNetObject";

            varDOTNET :=varDOTNET.DotNetObject();
            varDOTNET.SetValue(parameters);
            CLEAR(varDOTNET);

     

    Also here are other coding ways where you can transfer part DotNet variable execution to functions. But it is always more effective transfer execution to function where "garbage collector" can make his job faster and more effective.

     

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

    Gedas Busniauskas

    Microsoft Lithuania
    Microsoft Customer Service and Support (CSS) EMEA


  • Microsoft Dynamics NAV Team Blog

    “Timer” usage in Microsoft Dynamics NAV 2013

    • 2 Comments

    Last time we have seen our “old” NTimer.dll was Microsoft Dynamics NAV 2009. It was placed in  ..\Common\Microsoft Dynamics NAV\Timer\.. folder.
    Usually we have used it for NAS or other looping tasks.

    We want to have the same in Microsoft Dynamics 2013 and later, however we see that the same doesn’t work anymore.
    So how it is now?

    Since Microsoft Dynamics NAV 2013 timer becomes “.NET” type in add-in’s folder. Now it is named “Microsoft.Dynamics.Nav.Timer.dll” and placed on server in C:\Program Files\Microsoft Dynamics NAV\70\Service\Add-ins\Timer.. folder.
    Usage, manage and expected results are now different.

    First of all this is server side timer.

    We use timer as DotNet type variable like:
    Timer@1000 : DotNet "'Microsoft.Dynamics.Nav.Timer, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.Microsoft.Dynamics.Nav.Timer" WITHEVENTS;

    Use variable in code like:
    IF ISNULL(Timer) THEN BEGIN
                  Timer := Timer.Timer;
                  Timer.RedirectExceptions := TRUE;
                  Timer.Interval := 10000; // 10 seconds
                  Timer.Start();
                END;

    It has two events “Elapsed” and “ExceptionOccurred” (if RedirectExceptions = TRUE).
    Event “Elapsed” is executed when we want with code we want.
    If we use “Timer” in NAS then code in “Elapsed” event is code we want to be executed by NAS.

    And here comes big point:
    If error in our C\AL code occurs then error is logged to events, NAS stops and session is terminated. We have option in NAV service config – “Retry Attempts Per Day”. Default value is 3. It means that after error occurs and NAS stops, there will be NAS restart and this will be done 3 times. If we have started NAS first time manually then after error occurs there will be 3 attempts to restart NAS. Finally we’ll have 4 errors in event viewer and need to restart NAS manually.
    To avoid such situations we need move all our c\al code to codeunit and catch all errors with c\al code like:
    …….
    IF NOT CODEUNIT.Run(xxx) THEN
      InsertError(“A business logic error occurred: “ + GETLASTERRORTEXT);
    ……..
    Here in “Elapsed” event we execute some codeunit and if error during execution occurs, it is logged with some function InsertError.

    Event “ExceptionOccurred” is executed when unknown exceptions like polling data from http stream causing io/timeout etc. exception comes to timer. So in this event we can log some network issues with code like:
    InsertError(“A .NET exception occurred: “ + e.Exception.Message);
    Where “e.Exception.Message” is error message text received by timer. This error is logged to events and, NAS stops and session is terminated. We have the same situation like in “Elapsed” event: NAS will be restarted as many times as described in config settings.

    These postings are provided "AS IS" with no warranties and confer no rights. You assume all risk for your use.

    Gedas Busniauskas

    Microsoft Lithuania
    Microsoft Customer Service and Support (CSS) EMEA

Page 2 of 49 (729 items) 12345»