May 29 2014

Multiple shortcuts with different access permissions

image_pdfimage_print

Let’s take the following scenario: you have a backend with a development, test, acceptance and production environment. Each environment is accessed with different shortcuts in the Start Menu. In that shortcut the environment is shown. The shortcut in the Start Menu is only shown if you are allowed to use that environment.

In the time of AppV 4.6, you simply made 4 OSD files, each of them pointing to the correct environment. In the ‘Application Virtualization Management Console’ you set the access permissions who may use that shortcut. So far so good.

Now, with AppV 5.0 that is less easy. But still it can be done. And I will show how.

Approach:

  1. Create the key ‘HKCU\Software\DemoShortcuts’ with Value ‘Environment’. The value ‘Environment’ will be filled in with ‘DEV’, ‘TEST’, ‘ACC’ or ‘PROD’
  2. Create a vbscript that reads the above mentioned key registry from the virtual registry and displays the value.
  3. The registry key is set in the user config xml file. This will be explained further later on.

The content of the shortcut.vbs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
' =======================================================================
' Demo: this shortcut is used multiple times
' It reads the content from 
'  - Key:        HKCU\Software\DemoShortcuts
'  - ValueName:  Environment
' And that value is displayed in the box.
' =======================================================================
 
  Option Explicit
  Dim objShell      : Set objShell = WScript.CreateObject("WScript.Shell")
  Dim strEnv        : strEnv       = ""
 
' =======================================================================
' Read the registry
' =======================================================================
 
  strEnv = objShell.RegRead("HKEY_CURRENT_USER\Software\DemoShortcuts\Environment")
 
  if IsNull(strEnv) then
     strEnv = "DUMMY"
  end if
 
' =======================================================================
' Display the message-box with the correct environment.
' =======================================================================
 
  msgbox "Welcome to the " & strEnv & " environment."

Packaging steps:

  1. Use the sequencer to install the vbscript in C:\Demo_MoreShortcuts_1.0_ENG.100
  2. Create the shortcut as per screenprint:
    During the sequencing phase create the Start Menu as per screen print.

    During the sequencing phase create the Start Menu as per screen print.

    Properties DEV shortcut:

    Properties of the shortcut pointing to the DEV environment.

    Properties of the shortcut pointing to the DEV environment.

    Properties TEST shortcut:

    Properties of the shortcut pointing to the TEST environment.

    Properties of the shortcut pointing to the TEST environment.

    Properties ACC shortcut:

    Properties of the shortcut pointing to the ACC environment.

    Properties of the shortcut pointing to the ACC environment.

    Properties PROD shortcut:

    Properties of the shortcut pointing to the PROD environment.

    Properties of the shortcut pointing to the PROD environment.

  3. After sequencing the shortcuts – except one – are gone. That is due to the fact that multiple shortcuts are pointing to the same vbscript. Thus the shortcuts should be made again.
    The sequencer screws up the shortcuts. That has to be corrected.

    The sequencer screws up the shortcuts. That has to be corrected.

    The corrected shortcuts in the sequencer.

    The corrected shortcuts in the sequencer.

Create the user config xml files for each environment:

It is mandatory to have an user config xml for each environment.

  1. Create 4 copies of the Demo_MoreShortcuts_1.0_ENG_UserConfig.xml file.
  2. Modify each copy to reflect the following:
    • Remove the shortcuts that are not needed in that environment.
    • Add the registry key
    • Remove parts that are not needed.
    • Rename it:
      • Demo_MoreShortcuts_1.0_ENG_UserConfig – DEV.xml
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        
        <!--
        This is your sample dynamic user configuration.  Use this to override per user
        elements within your sequenced package.  The document is pre-filled with data from your sequenced package.
        Customize the document to fit your needs before publishing with your package.
        -->
        <UserConfiguration PackageId="5fbcee91-803a-4103-957d-7f572bc90e6a" DisplayName="Demo_MoreShortcuts_1.0_ENG" IgnorableNamespaces="" xmlns="http://schemas.microsoft.com/appv/2010/userconfiguration">
          <Subsystems>
            <!--OVERRIDE BEHAVIOR OF MANIFEST AND CONFIGURATION FILES
          Integration Subsystems can be enabled and disabled independently of the content.
          Thus if Shortcuts are enabled, The client will use the shortcuts contained within
          the manifest by default.
         
          Each Integration Subsystem can contain an <Extensions /> node. If this child element
          is present, the client will ignore the content in the Manifest file for that subsystem
          and only use the content in the configuration file.
         
          e.g. for the shortcuts subsystem, 
          (A)
          if the user defined this in either the dynamic or deployment config file: 		
        	  <Shortcuts  Enabled="true">
        		  <Extensions>
        			  ...
        		  </Extensions>
        	  </Shortcuts>
         
          Content in the manifest will be ignored. 
         
          (B)
          IF the user defined only this: 		
        	  <Shortcuts  Enabled="true"/>
          Then the content in the Manifest will be integrated during publishing.
         
          (C)
          note that if the user defines this:
        	  <Shortcuts  Enabled="true">
        		  <Extensions/>
        	  </Shortcuts>
         
          Then all the Shortcuts within the manifest will still be ignored.
          There will be no shortcuts integrated.-->
            <!--
         
              Shortcuts
         
              -->
            <Shortcuts Enabled="true">
              <Extensions>
                <Extension Category="AppV.Shortcut">
                  <Shortcut>
                    <File>[{Programs}]\Demo Application\Start the DEV environment.lnk</File>
                    <Target>[{AppVPackageRoot}]\shortcut.vbs</Target>
                    <Icon>[{SystemX86}]\shell32.dll.159.ico</Icon>
                    <Arguments />
                    <WorkingDirectory>[{AppVPackageRoot}]</WorkingDirectory>
                    <ApplicationId>[{AppVPackageRoot}]\shortcut.vbs</ApplicationId>
                  </Shortcut>
                </Extension>
              </Extensions>
            </Shortcuts>
         
            <!--
         
              COM
         
              -->
            <COM Mode="Isolated">
              <IntegratedCOMAttributes OutOfProcessEnabled="true" InProcessEnabled="false" />
            </COM>
            <!--
         
              Objects
         
              -->
            <Objects Enabled="true" />
            <!--
         
              Virtual Registry
         
              -->
            <Registry Enabled="true">
                  <Include>
                    <Key Path="\REGISTRY\USER\[{AppVCurrentUserSID}]\Software\DemoShortcuts">
                      <Value Type="REG_SZ" Name="Environment" Data="DEV"/>
                    </Key>
                  </Include>
            </Registry>
            <!--
         
              Virtual File System
         
              -->
            <FileSystem Enabled="true" />
            <!--
         
              Fonts
         
              -->
            <Fonts Enabled="true" />
            <!--
         
              Environment Variables
         
              -->
            <EnvironmentVariables Enabled="true" />
            <!--
         
              Services
         
              -->
            <Services Enabled="true" />
          </Subsystems>
          <!--
         
            Applications
         
            -->
          <Applications>
            <Application Id="[{AppVPackageRoot}]\shortcut.vbs" Enabled="true">
              <VisualElements>
                <Name>Start the DEV environment</Name>
                <Icon />
                <Description />
              </VisualElements>
            </Application>
          </Applications>
         
        </UserConfiguration>
      • Demo_MoreShortcuts_1.0_ENG_UserConfig – TEST.xml
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        
        <!--
        This is your sample dynamic user configuration.  Use this to override per user
        elements within your sequenced package.  The document is pre-filled with data from your sequenced package.
        Customize the document to fit your needs before publishing with your package.
        -->
        <UserConfiguration PackageId="5fbcee91-803a-4103-957d-7f572bc90e6a" DisplayName="Demo_MoreShortcuts_1.0_ENG" IgnorableNamespaces="" xmlns="http://schemas.microsoft.com/appv/2010/userconfiguration">
          <Subsystems>
            <!--OVERRIDE BEHAVIOR OF MANIFEST AND CONFIGURATION FILES 
          Integration Subsystems can be enabled and disabled independently of the content.
          Thus if Shortcuts are enabled, The client will use the shortcuts contained within
          the manifest by default. 
         
          Each Integration Subsystem can contain an <Extensions /> node. If this child element
          is present, the client will ignore the content in the Manifest file for that subsystem
          and only use the content in the configuration file.
         
          e.g. for the shortcuts subsystem, 
          (A)
          if the user defined this in either the dynamic or deployment config file: 		
        	  <Shortcuts  Enabled="true">
        		  <Extensions>
        			  ...
        		  </Extensions>
        	  </Shortcuts>
         
          Content in the manifest will be ignored. 
         
          (B)
          IF the user defined only this: 		
        	  <Shortcuts  Enabled="true"/>
          Then the content in the Manifest will be integrated during publishing.
         
          (C)
          note that if the user defines this:
        	  <Shortcuts  Enabled="true">
        		  <Extensions/>
        	  </Shortcuts>
         
          Then all the Shortcuts within the manifest will still be ignored.
          There will be no shortcuts integrated.-->
            <!--
         
              Shortcuts
         
              -->
            <Shortcuts Enabled="true">
              <Extensions>
                <Extension Category="AppV.Shortcut">
                  <Shortcut>
                    <File>[{Programs}]\Demo Application\Start the TEST environment.lnk</File>
                    <Target>[{AppVPackageRoot}]\shortcut.vbs</Target>
                    <Icon>[{SystemX86}]\shell32.dll.77.ico</Icon>
                    <Arguments />
                    <WorkingDirectory>[{AppVPackageRoot}]</WorkingDirectory>
                    <ApplicationId>[{AppVPackageRoot}]\shortcut.vbs</ApplicationId>
                  </Shortcut>
                </Extension>
              </Extensions>
            </Shortcuts>
         
            <!--
         
              COM
         
              -->
            <COM Mode="Isolated">
              <IntegratedCOMAttributes OutOfProcessEnabled="true" InProcessEnabled="false" />
            </COM>
            <!--
         
              Objects
         
              -->
            <Objects Enabled="true" />
            <!--
         
              Virtual Registry
         
              -->
             <Registry Enabled="true">
                  <Include>
                    <Key Path="\REGISTRY\USER\[{AppVCurrentUserSID}]\Software\DemoShortcuts">
                      <Value Type="REG_SZ" Name="Environment" Data="TEST"/>
                    </Key>
                  </Include>
            </Registry>
            <!--
         
              Virtual File System
         
              -->
            <FileSystem Enabled="true" />
            <!--
         
              Fonts
         
              -->
            <Fonts Enabled="true" />
            <!--
         
              Environment Variables
         
              -->
            <EnvironmentVariables Enabled="true" />
            <!--
         
              Services
         
              -->
            <Services Enabled="true" />
          </Subsystems>
          <!--
         
            Applications
         
            -->
          <Applications>
            <Application Id="[{AppVPackageRoot}]\shortcut.vbs" Enabled="true">
              <VisualElements>
                <Name>Start the TEST environment</Name>
                <Icon />
                <Description />
              </VisualElements>
            </Application>
          </Applications>
         
        </UserConfiguration>
      • Demo_MoreShortcuts_1.0_ENG_UserConfig – ACC.xml
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        
        <!--
        This is your sample dynamic user configuration.  Use this to override per user
        elements within your sequenced package.  The document is pre-filled with data from your sequenced package.
        Customize the document to fit your needs before publishing with your package.
        -->
        <UserConfiguration PackageId="5fbcee91-803a-4103-957d-7f572bc90e6a" DisplayName="Demo_MoreShortcuts_1.0_ENG" IgnorableNamespaces="" xmlns="http://schemas.microsoft.com/appv/2010/userconfiguration">
          <Subsystems>
            <!--OVERRIDE BEHAVIOR OF MANIFEST AND CONFIGURATION FILES 
          Integration Subsystems can be enabled and disabled independently of the content.
          Thus if Shortcuts are enabled, The client will use the shortcuts contained within
          the manifest by default. 
         
          Each Integration Subsystem can contain an <Extensions /> node. If this child element
          is present, the client will ignore the content in the Manifest file for that subsystem
          and only use the content in the configuration file.
         
          e.g. for the shortcuts subsystem, 
          (A)
          if the user defined this in either the dynamic or deployment config file: 		
        	  <Shortcuts  Enabled="true">
        		  <Extensions>
        			  ...
        		  </Extensions>
        	  </Shortcuts>
         
          Content in the manifest will be ignored. 
         
          (B)
          IF the user defined only this: 		
        	  <Shortcuts  Enabled="true"/>
          Then the content in the Manifest will be integrated during publishing.
         
          (C)
          note that if the user defines this:
        	  <Shortcuts  Enabled="true">
        		  <Extensions/>
        	  </Shortcuts>
         
          Then all the Shortcuts within the manifest will still be ignored.
          There will be no shortcuts integrated.-->
            <!--
         
              Shortcuts
         
              -->
            <Shortcuts Enabled="true">
              <Extensions>
                <Extension Category="AppV.Shortcut">
                  <Shortcut>
                    <File>[{Programs}]\Demo Application\Start the ACC environment.lnk</File>
                    <Target>[{AppVPackageRoot}]\shortcut.vbs</Target>
                    <Icon>[{SystemX86}]\shell32.dll.112.ico</Icon>
                    <Arguments />
                    <WorkingDirectory>[{AppVPackageRoot}]</WorkingDirectory>
                    <ApplicationId>[{AppVPackageRoot}]\shortcut.vbs</ApplicationId>
                  </Shortcut>
                </Extension>
              </Extensions>
            </Shortcuts>
         
            <!--
         
              COM
         
              -->
            <COM Mode="Isolated">
              <IntegratedCOMAttributes OutOfProcessEnabled="true" InProcessEnabled="false" />
            </COM>
            <!--
         
              Objects
         
              -->
            <Objects Enabled="true" />
            <!--
         
              Virtual Registry
         
              -->
            <Registry Enabled="true">
                  <Include>
                    <Key Path="\REGISTRY\USER\[{AppVCurrentUserSID}]\Software\DemoShortcuts">
                      <Value Type="REG_SZ" Name="Environment" Data="ACC"/>
                    </Key>
                  </Include>
            </Registry>
            <!--
         
              Virtual File System
         
              -->
            <FileSystem Enabled="true" />
            <!--
         
              Fonts
         
              -->
            <Fonts Enabled="true" />
            <!--
         
              Environment Variables
         
              -->
            <EnvironmentVariables Enabled="true" />
            <!--
         
              Services
         
              -->
            <Services Enabled="true" />
          </Subsystems>
          <!--
         
            Applications
         
            -->
          <Applications>
            <Application Id="[{AppVPackageRoot}]\shortcut.vbs" Enabled="true">
              <VisualElements>
                <Name>Start the ACC environment</Name>
                <Icon />
                <Description />
              </VisualElements>
            </Application>
          </Applications>
         
        </UserConfiguration>
      • Demo_MoreShortcuts_1.0_ENG_UserConfig – PROD.xml
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        
        <!--
        This is your sample dynamic user configuration.  Use this to override per user
        elements within your sequenced package.  The document is pre-filled with data from your sequenced package.
        Customize the document to fit your needs before publishing with your package.
        -->
        <UserConfiguration PackageId="5fbcee91-803a-4103-957d-7f572bc90e6a" DisplayName="Demo_MoreShortcuts_1.0_ENG" IgnorableNamespaces="" xmlns="http://schemas.microsoft.com/appv/2010/userconfiguration">
          <Subsystems>
            <!--OVERRIDE BEHAVIOR OF MANIFEST AND CONFIGURATION FILES
          Integration Subsystems can be enabled and disabled independently of the content.
          Thus if Shortcuts are enabled, The client will use the shortcuts contained within
          the manifest by default.
         
          Each Integration Subsystem can contain an <Extensions /> node. If this child element
          is present, the client will ignore the content in the Manifest file for that subsystem
          and only use the content in the configuration file.
         
          e.g. for the shortcuts subsystem, 
          (A)
          if the user defined this in either the dynamic or deployment config file: 		
        	  <Shortcuts  Enabled="true">
        		  <Extensions>
        			  ...
        		  </Extensions>
        	  </Shortcuts>
         
          Content in the manifest will be ignored. 
         
          (B)
          IF the user defined only this: 		
        	  <Shortcuts  Enabled="true"/>
          Then the content in the Manifest will be integrated during publishing.
         
          (C)
          note that if the user defines this:
        	  <Shortcuts  Enabled="true">
        		  <Extensions/>
        	  </Shortcuts>
         
          Then all the Shortcuts within the manifest will still be ignored.
          There will be no shortcuts integrated.-->
            <!--
         
              Shortcuts
         
              -->
            <Shortcuts Enabled="true">
              <Extensions>
                <Extension Category="AppV.Shortcut">
                  <Shortcut>
                    <File>[{Programs}]\Demo Application\Start the PROD environment.lnk</File>
                    <Target>[{AppVPackageRoot}]\shortcut.vbs</Target>
                    <Icon>[{SystemX86}]\shell32.dll.137.ico</Icon>
                    <Arguments />
                    <WorkingDirectory>[{AppVPackageRoot}]</WorkingDirectory>
                    <ApplicationId>[{AppVPackageRoot}]\shortcut.vbs</ApplicationId>
                  </Shortcut>
                </Extension>
              </Extensions>
            </Shortcuts>
         
            <!--
         
              COM
         
              -->
            <COM Mode="Isolated">
              <IntegratedCOMAttributes OutOfProcessEnabled="true" InProcessEnabled="false" />
            </COM>
            <!--
         
              Objects
         
              -->
            <Objects Enabled="true" />
            <!--
         
              Virtual Registry
         
              -->
             <Registry Enabled="true">
                  <Include>
                    <Key Path="\REGISTRY\USER\[{AppVCurrentUserSID}]\Software\DemoShortcuts">
                      <Value Type="REG_SZ" Name="Environment" Data="PROD"/>
                    </Key>
                  </Include>
            </Registry>
            <!--
         
              Virtual File System
         
              -->
            <FileSystem Enabled="true" />
            <!--
         
              Fonts
         
              -->
            <Fonts Enabled="true" />
            <!--
         
              Environment Variables
         
              -->
            <EnvironmentVariables Enabled="true" />
            <!--
         
              Services
         
              -->
            <Services Enabled="true" />
          </Subsystems>
          <!--
         
            Applications
         
            -->
          <Applications>
            <Application Id="[{AppVPackageRoot}]\shortcut.vbs" Enabled="true">
              <VisualElements>
                <Name>Start the PROD environment</Name>
                <Icon />
                <Description />
              </VisualElements>
            </Application>
          </Applications>
        </UserConfiguration>

Importing in the AppV 5.0 Management Interface:

  1. Import the application in the AppV 5.0 with the ‘Application Virtualization’ web page.
    Add the package.

    Add the package.

    Select the .appv file.

    Select the .appv file.

    The package has been imported.

    The package has been imported.

    Specify the AD group name that is allowed to use that specific shortcut.

    Specify the AD group name that is allowed to use that specific shortcut.

    Enter the AD group name for that specific shortcut.

    Enter the AD group name for that specific shortcut.

    And grant access.

    And grant access.

  2. For each shortcut change the assigned configuration and use the correct user config xml file.
    Under 'Assigned configuration' select Custom.

    Under ‘Assigned configuration’ select Custom.

    Click 'Edit' to modify the shortcut.

    Click ‘Edit’ to modify the shortcut.

    You will see the settings as saved in the appv file. Click on [Advanced] to overwrite that configuration.

    You will see the settings as saved in the appv file.
    Click on [Advanced] to overwrite that configuration.

    Click on [Import and overwrite this configuration.]

    Click on [Import and overwrite this configuration.]

    And select the correct user config xml file. In this case the one for the DEV environment.

    And select the correct user config xml file. In this case the one for the DEV environment.

    Confirm that it is ok to overwrite the current configuration.

    Confirm that it is ok to overwrite the current configuration.

    The result.

    The result.

    Do the same for all the other environments.  Publish the package when done.

    Do the same for all the other environments.
    Publish the package when done.

    The final result.

    The final result.

Testing:

  1. Login with the test user account that has been assigned to the development shortcut.
  2. After a short while the icon is visible in the Start Menu.

    Only the DEV environment in the Start Menu.

    Only the DEV environment in the Start Menu.

  3. If you start the shortcut, you will see that the correct environment is shown.

    The DEV environment.

    The DEV environment.

  4. In the virtual registry you will see the settings as set in the user config xml file.
    Start regedit with the /appvve parameter.

    Start regedit with the /appvve parameter.

    And the correct environment is shown in regedit.  So the value that is mentioned in the user config xml is used.

    And the correct environment is shown in regedit.
    So the value that is mentioned in the user config xml is used.

  5. And the same for all the other environments:
    • The TEST environment:
      Only the TEST environment in the Start Menu.

      Only the TEST environment in the Start Menu.

      And the result.

      And the result.

    • The ACC environment:
      Only the ACC environment in the Start Menu.

      Only the ACC environment in the Start Menu.

      The result

      The result.

    • The PROD environment:
      Only the PROD environment in the Start Menu.

      Only the PROD environment in the Start Menu.

      The result.

      The result.

The files that are used are stored in this zip file: Demo_MoreShortcuts.

Permanent link to this article: https://www.vroom.cc/wordpress/multiple-shortcuts-with-different-access-permissions/