Jul 28, 2022
07:40 PM
It is possible, but not necessarily easy. The DataSync process can read from any SQL data source. So, if you have an existing SQL data source that includes all of the information App Broker normally gets from SCCM, you can use the custom sync queries to connect to that custom data source. If you don't have an existing data source, you could write some scripts (e.g. PowerShell) to query Active Directory and write the necessary data to a custom table (either in your App Broker database or a separate database on an accessible SQL server). Then you can configure the custom sync queries to point to that custom table.
... View more
Jul 28, 2022
10:58 AM
You should find most (if not all) of what you're looking for in the [vMyRequestsCatalogUpdated] view. Install versus Uninstall should be either the Type column or the RequestType column. I don't recall which one (the latter, I think), and since the environment I'm looking at right now doesn't have any install/uninstall data, I can't tell you how 0/1 maps to install/uninstall. But off the top of my head, I think 0 maps to Install and 1 maps to Uninstall. @CharlesW keep me honest.
... View more
Jul 28, 2022
10:49 AM
You can also check this in the Admin UI under Site Management > Imported Users and Computers > Users. If the user isn't present, then you'll need to check your data sync settings under Site Management > Settings > Deployment > Common. If the settings look correct, check your DataSync.log, DataSyncExceptions.log, and DatabaseCalls_Error.log files to see if there are any errors syncing user data. If you don't see any errors, check your original data sources (SCCM/Active Directory).
... View more
Jul 27, 2022
11:11 AM
I can't speak for what Charlie tested, but yes, any time you see a reference to "Unique...Name", this is referring to the DOMAIN\UserName format that you would find in the UniqueName column of WD_User.
... View more
Jul 22, 2022
09:50 AM
Here's some additional context:
Visitor variables are only available during the shopping/checkout process and represent the currently logged in user for that browser session.
##Visitor_sAMAccountName## ##Visitor_givenName##
Requester and Target variables are related to a request that has been submitted in App Portal. In the context of My Apps, alerts are tied to an application (by Flexera ID) and a device (by inventory device name). These alerts may be associated with applications that were never requested through App Portal and are targeting devices, not users, so there is no Requester or Target in the My Apps context.
##Requester_UserName## ##Requester_Email## ##Requester_FirstName## ##Requester_PrimaryUser## ##Requester_UniqueName## ##TargetUserName##
One could argue that the following variables should be resolvable as part of My Apps email notifications, based on the user to whom the email is being sent (just a simple lookup on the WD_User table). It's just a matter of adding the code that resolves the variables in this area of the code. I would suggest submitting an Idea on our Ideas portal, describing the use case (not the technical solution). Then Product Management/Engineering can do some brainstorming to figure out the best option for providing the needed functionality (e.g. maybe they add some new ##MyApps_...## variables or maybe they just use existing variables - hopefully this would include custom catalog variables, though this could be problematic in the scenario of SmartUninstall where there is no catalog item associated with the alert).
##UserName## ##Username## ##Email## ##FullName## ##FirstName## ##UniqueName## ##UniqueUserName## ##Username##
... View more
Jul 21, 2022
09:57 AM
1 Kudo
I didn't even know this API existed or that there was documentation on it. 😀 It looks pretty straight-forward and should work as documented. But I will call out that the alternate approver feature (not specific to the API) does not allow groups or multiple individuals, and there is no recursive behavior. So, if you set an alternate approver that is also out of office, the approvals will not be routed to that alternate's alternate.
... View more
Jul 20, 2022
12:12 PM
2 Kudos
I've suggested to product management that they consider moving these settings to Site Management > Settings > Web Site > Catalog Behavior, which seems like a more logical place for them.
... View more
Jul 20, 2022
11:51 AM
1 Kudo
This has been raised with Product Management and added to their backlog for investigation. There is currently no detailed plan for updating the web extensions, but it will be looked at.
... View more
Jul 19, 2022
03:37 PM
1 Kudo
I also have some PowerShell code that I can share, but I need to clean it up a bit before I can post. It won't be exactly what you're looking for, but it should help as a starting point.
... View more
Jul 16, 2022
07:02 PM
1 Kudo
Yes, of course. In the oh-so-logical Site Management > Settings > Security page. LOL
https://docs.flexera.com/appportal2019r1/default.htm#helplibrary/APR_Settings_Security.htm
Don't ask me what that has to do with security. Maybe preventing denial of service attacks?
If I recall correctly, the max items in cart setting also comes into play (i.e. Items x Number of People Per Item = Total Items in Cart). But I could be wrong. It's been a while since I hit a situation where it mattered.
Also, please note that App Portal was developed as a "Self Service" tool, and as such, isn't really intended for large bulk deployments to a lot of users. Your mileage may vary.
... View more
Jun 21, 2022
07:20 PM
Another option is to use a simple SOAP web service to do the same as what Charlie suggested. Within Flexera Services, we've created a SOAP web service with a number of helpful utility methods in it. One of those is a method called AddRemoveADGroupMember. I've include code from a recent version of this web service. If you'd like to try it, just save the code as GCS_CustomWebService.asmx in the <App Portal>\Web\WS folder and then add the web service in the admin UI.
<%@ WebService Language="C#" Class="GCS_CustomWebService" %>
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Data;
using System.Data.SqlClient;
using System.Net.Mail;
using System.Text;
using System.Threading;
using System.Configuration;
using System.IO;
using System.Web.Services.Protocols;
using AppPortal.Business;
using AppPortal.Business.Common;
using AppPortal.Business.FNMP;
/// <summary>
/// Author's Name: Osagyefo Kouta-Lopatey
/// Author's Company: Flexera Software
/// Author's Department: Global Consulting Services
///
/// UPDATE LOG
/// DATE NAME DESCRIPTION
/// 06-SEP-2021 Jim Dempsey Fixed GetTargetUserForRequest;
/// Fixed GetLoggedInUserPropertyValue and GetUserPropertyValue to return string instead of datatable
/// Updated to dynamically retrieve App Portal connection string;
/// Removed dependency on BLTest web service;
/// Removed customer-specific web methods.
/// 30-SEP-2021 Jim Dempsey Added GetCatalogVariable and SetCatalogVariable web methods.
/// 19-JAN-2022 Jim Dempsey Updated SetCatalogVariable to update catalog item UpdatedOn
/// 26-JAN-2022 Jim Dempsey Added GCSLog and GCSErrorLog
/// 29-JAN-2022 Jim Dempsey Added GetABSetting
/// 11-FEB-2022 Jim Dempsey Added GetMachineDomainFromFNMS
///
/// </summary>
[WebService(Namespace = "http://flexerasoftware.com/AppPortal")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
// [System.Web.Script.Services.ScriptService]
public class GCS_CustomWebService : System.Web.Services.WebService
{
const string LogFile = "GCS_CustomWebService.log"; // The filename for the log file
const string ErrorLogFile = "GCS_CustomWebService_Error.log"; // The filename for the error log file
/// <summary>
/// Get the value of a specific request variable
/// </summary>
/// <param name="requestID"></param>
/// <param name="varName"></param>
/// <returns></returns>
[WebMethod(Description=@"Get the value of an App Portal request variable.")]
public string GetVariableValue(int requestID, string varName)
{
//Log.l1("Getting value for " + varName + " variable...", LogFile);
SelfService.ESD esd = new SelfService.ESD();
DataTable dt = esd.getEmailVariables(requestID);
dt.TableName = "EmailVariables";
foreach (DataRow row in dt.Rows)
{
if (row.Field<string>(0) == "##" + varName + "##")
{
Log.l1("Variable Name: " + (row.Field<string>(0)) + "; Variable Value = " + (row.Field<string>(1)), LogFile, (int)LoggingLevel.NORMAL);
return row.Field<string>(1);
}
}
string result = string.Format("Could not retrieve value for request variable {0}", varName);
Log.l1(result, LogFile, (int)LoggingLevel.NORMAL);
return result;
}
/// <summary>
/// Get the target user of a request.
/// </summary>
/// <param name="requestId">The App Portal request ID</param>
/// <returns>Unique user name (domain\userid) of the target user of the request.</returns>
[WebMethod(Description=@"Get the target user of a request.")]
public string GetTargetUserForRequest(int requestId) {
return GetVariableValue(requestId, "UniqueUserName");
}
/// <summary>
/// Get all the devices assigned to the logged in user.
/// </summary>
/// <param name=""></param>
/// <returns>List of devices</returns>
[WebMethod(Description=@"Get all the devices assigned to the logged in user.")]
public DataTable GetDevicesForLoggedInUser() {
string userUniqueId = GetUniqueIdForLoggedInUser();
SqlUtilities su = new SqlUtilities(ESDConfig.getConnString());
string sqlQuery = String.Format(@"
SELECT MachineName
FROM vUserComputerMap
WHERE Active = 1 AND UniqueName = '{0}'", userUniqueId);
DataTable dt = su.ExecuteSQLAndReturnDataSet(sqlQuery).Tables[0];
Log.l1(string.Format("Found '{0}' device(s) for {1}", (dt.Rows.Count).ToString(), userUniqueId), LogFile, (int)LoggingLevel.VERBOSE);
if (dt.Rows.Count > 0) {
foreach (DataRow row in dt.Rows)
{
Log.l1(row.Field<string>(0), LogFile, (int)LoggingLevel.VERBOSE);
}
}
return dt;
}
/// <summary>
/// Get the unique id of the logged in user.
/// </summary>
/// <param name="">The user's unique user name.</param>
/// <returns>The unique user name</returns>
[WebMethod(Description =@"Get the unique ID (domain\username) of the logged in user.")]
public string GetUniqueIdForLoggedInUser()
{
return System.Web.HttpContext.Current.User.Identity.Name; // who is logged into the machine from which you are accessing App Portal. Assuming that the same user is logged into App Portal
//string i = HttpContext.Current.Session("UniqueUserName").ToString();
//return i;
}
/// <summary>
/// Get all the devices assigned to a specific user.
/// </summary>
/// <param name="uniqueUserId">The user's unique user name (domain\userid).</param>
/// <returns>List of devices</returns>
[WebMethod(Description=@"Get all the devices assigned to a specific user.")]
public DataTable GetDevicesForUser(string userUniqueId) {
SqlUtilities su = new SqlUtilities(ESDConfig.getConnString());
string sqlQuery = String.Format(@"
SELECT MachineName
FROM vUserComputerMap
WHERE Active = 1 AND UniqueName = '{0}'", userUniqueId);
DataTable dt = su.ExecuteSQLAndReturnDataSet(sqlQuery).Tables[0];
Log.l1(string.Format("Found '{0}' device(s) for {1}", (dt.Rows.Count).ToDbString(), userUniqueId), LogFile, (int)LoggingLevel.VERBOSE);
return dt;
}
/// <summary>
/// Get a specific property of the logged in user from the App Portal database.
/// The logged in user is also the requester.
/// </summary>
/// <param name="propertyName">The name of the user property.</param>
/// <returns>The value of the user property.</returns>
[WebMethod(Description=@"Get a specific AD property of the logged in user.")]
public string GetLoggedInUserPropertyValue(string propertyName) {
string userUniqueId = GetUniqueIdForLoggedInUser(); //@"flex\jsmith";
string propertyValue = "";
SqlUtilities su = new SqlUtilities(ESDConfig.getConnString());
string sqlQuery = String.Format(@"
SELECT {0}
FROM WD_User
WHERE UniqueName = '{1}'", propertyName, userUniqueId);
//Log.l1(string.Format("sqlQuery: {0}", sqlQuery), LogFile, (int)LoggingLevel.VERBOSE);
propertyValue = su.ExecuteSQLAndReturnSingleValue(sqlQuery).ToDbString();
Log.l1(string.Format("User: {0}, Property name: {1}, Value: {2}", userUniqueId, propertyName, propertyValue), LogFile, (int)LoggingLevel.VERBOSE);
return propertyValue;
}
/// <summary>
/// Get a specific property of the specified user from the App Portal database.
/// </summary>
/// <param name="propertyName">The name of the user property.</param>
/// <param name="uniqueUserId">The user's unique user name (domain\userid).</param>
/// <returns>The value of the user property.</returns>
[WebMethod(Description=@"Get a specific AD property of a specific user.")]
public string GetUserPropertyValue(string userUniqueId, string propertyName) {
string propertyValue = "";
SqlUtilities su = new SqlUtilities(ESDConfig.getConnString());
string sqlQuery = String.Format(@"
SELECT {0}
FROM WD_User
WHERE UniqueName = '{1}'", propertyName, userUniqueId);
//Log.l1(string.Format("sqlQuery: {0}", sqlQuery), LogFile, (int)LoggingLevel.VERBOSE);
propertyValue = su.ExecuteSQLAndReturnSingleValue(sqlQuery).ToDbString();
Log.l1(string.Format("User: {0}, Property name: {1}, Value: {2}", userUniqueId, propertyName, propertyValue), LogFile, (int)LoggingLevel.VERBOSE);
return propertyValue;
}
/// <summary>
/// Add user to or remove user from an AD group.
/// </summary>
/// <param name="strUserName">The AD user id.</param>
/// <param name="strGroupName">The name of the AD group.</param>
/// <param name="strAction">The action to perform. Either 'add' or 'remove'.</param>
/// <returns>The value of the user property.</returns>
[WebMethod(Description=@"Add user to or remove user from an AD group. Valid values for strAction are 'Add' or 'Remove' (without the quotes). The default action is 'Add'.")]
public int AddRemoveADGroupMember(string strUserName, string strGroupName, string strAction)
{
string strADAction = string.Empty;
if (string.IsNullOrEmpty(strAction))
{
strADAction = "Add";
Log.l1(string.Format("AD action/operation has not been specified. '{0}' is the default operation", strADAction), LogFile, (int)LoggingLevel.VERBOSE);
}
else
{
// Make sure the action is in Title Case
TextInfo ti = new CultureInfo("en-US",false).TextInfo;
strADAction = string.Format("{0}{1}", ti.ToUpper(strAction[0]), ti.ToLower(strAction.Substring(1)));
}
Log.l1(string.Format("AddRemoveADGroupMember: {0} | {1} | {2}", strADAction, strUserName, strGroupName), LogFile, (int)LoggingLevel.VERBOSE);
DirectoryServices ds = new DirectoryServices();
// Get AD group GUID
string groupguid = ds.getGUIDFromName(strGroupName);
Log.l1(string.Format(" --GUID for AD Group '{0}': {1}", strGroupName, groupguid), LogFile, (int)LoggingLevel.VERBOSE);
// Get AD user DN
string userdn = ActiveDirectory.getDNFromName(strUserName);
Log.l1(string.Format(" --DN for AD User '{0}': {1}", strUserName, userdn), LogFile, (int)LoggingLevel.VERBOSE);
ActiveDirectory ad = new ActiveDirectory();
try
{
// Add user to or remove user from group
int oResult = ad.AddUserToGroup(userdn, groupguid, strADAction);
if (oResult == 1)
{
Log.l1(string.Format(" --'{0}' operation was completed successfully", strADAction), LogFile, (int)LoggingLevel.VERBOSE);
return oResult;
}
else
{
Log.l1(string.Format(" --'{0}' operation failed", strADAction), LogFile, (int)LoggingLevel.VERBOSE);
return oResult;
}
}
catch (Exception ex)
{
Log.l1(string.Format(" --Exception calling AddUserToGroup: {0}, {1}, {2}", strADAction, strUserName, strGroupName, ex), LogFile, (int)LoggingLevel.VERBOSE);
Log.l("AddUserToGroup", ex, LogFile);
}
return 0;
}
/// <summary>
/// Get the value of a specific catalog variable for the specified catalog item.
/// </summary>
/// <param name="packageId">The package ID of the desired catalog item (use 0 if getting a global catalog variable).</param>
/// <param name="variableName">The name of the catalog variable to be retrieved (use the full name, including the prefix and underscore).</param>
/// <returns>The value of the specified catalog variable.</returns>
[WebMethod(Description=@"Get the value of a specific catalog variable on a specific catalog item. (Use packageId=0 for a global variable. Use the full variableName, including the prefix and underscore - e.g. Custom_Template instead of Template.)")]
public string GetCatalogVariable(int packageId, string variableName) {
string variableValue = "";
SqlUtilities su = new SqlUtilities(ESDConfig.getConnString());
string sqlQuery = String.Format(@"
SELECT [Value]
FROM WD_CatalogVariable
WHERE [CatalogID] = {0} AND [Key] = '{1}'", packageId, variableName);
//Log.l1(string.Format("sqlQuery: {0}", sqlQuery), LogFile, (int)LoggingLevel.VERBOSE);
variableValue = su.ExecuteSQLAndReturnSingleValue(sqlQuery).ToDbString();
Log.l1(string.Format("Catalog Item: [{0}], Variable Name: [{1}], Variable Value: [{2}]", packageId, variableName, variableValue), LogFile, (int)LoggingLevel.VERBOSE);
return variableValue;
}
/// <summary>
/// Set the value of a specific catalog variable for the specified catalog item.
/// </summary>
/// <param name="packageId">The package ID of the desired catalog item (use 0 if setting a global catalog variable).</param>
/// <param name="variableName">The name of the catalog variable to be set (include the prefix and underscore).</param>
/// <param name="variableValue">The value to be set for the specified catalog variable.</param>
/// <param name="variableDescription">The description of the catalog variable to be set. [OPTIONAL]</param>
/// <returns>"Success" if the variable was set successfully or an error message if the variable was not set.</returns>
[WebMethod(Description=@"Set the value of a specific catalog variable on a specific catalog item. (Use packageId=0 for a global variable. Include the prefix and underscore in the variableName - e.g. Custom_Template instead of Template. variableDescription is optional.)")]
public string SetCatalogVariable(int packageId, string variableName, string variableValue, string variableDescription="") {
string retVal = "";
if (string.IsNullOrEmpty(variableName)) {
retVal = "Error: variableName must not be empty";
Log.l1(retVal, LogFile);
return retVal;
}
SqlUtilities su = new SqlUtilities(ESDConfig.getConnString());
string sqlQuery = String.Format(@"
DECLARE @Order int
SET @Order = ISNULL((SELECT MAX([Order]) FROM WD_CatalogVariable WHERE [CatalogID]={0}) + 1, 0)
IF EXISTS (SELECT * FROM WD_CatalogVariable WHERE [CatalogID] = {0} AND [Key] = '{1}')
BEGIN
UPDATE WD_CatalogVariable
SET [Value]='{2}', [IsSaasCatalog]=0, [Description]='{3}'
WHERE [CatalogID] = {0} AND [Key] = '{1}'
END
ELSE
BEGIN
INSERT INTO WD_CatalogVariable ([Key], [Value], [Order], [CatalogID], [IsSaasCatalog], [Description])
VALUES ('{1}', '{2}', @Order, {0}, 0, '{3}')
END", packageId, variableName, variableValue, variableDescription);
//Log.l1(string.Format("sqlQuery: {0}", sqlQuery), LogFile, (int)LoggingLevel.VERBOSE);
try {
int rows = su.ExecuteSQL(sqlQuery);
if (rows > 0) {
retVal = "Success";
Log.l1(string.Format("Successfully inserted or updated {0} row(s) in WD_CatalogVariable for Catalog Item: [{1}], Variable Name: [{2}], Variable Value: [{3}], Variable Description: [{4}]", rows, packageId, variableName, variableValue, variableDescription), LogFile, (int)LoggingLevel.VERBOSE);
string userUniqueId = GetUniqueIdForLoggedInUser(); //@"flex\jsmith";
sqlQuery = String.Format(@"
UPDATE WD_WebPackages
SET [UpdatedOn]=GETDATE(), [UpdatedBy]='{1}'
WHERE [PackageID] = {0}", packageId, userUniqueId);
rows = su.ExecuteSQL(sqlQuery);
}
else {
retVal = string.Format("Error: Unable to insert or update WD_CatalogVariable for Catalog Item: [{0}], Variable Name: [{1}]", packageId, variableName);
Log.l1(retVal, LogFile);
}
}
catch(Exception ex) {
retVal = string.Format("Error: {0}", ex.Message);
Log.l1(string.Format("Error: Unable to insert or update WD_CatalogVariable for Catalog Item: [{0}], Variable Name: [{1}]", packageId, variableName), LogFile);
Log.l1(retVal, LogFile);
}
return retVal;
}
/// <summary>
/// Add a message to the specified log file
/// </summary>
/// <param name="strMessage">The message to write to the log.</param>
/// <param name="strLogFile">The log file to which the message will be written.</param>
/// <returns>bool value indicating success/failure writing to the log.</returns>
[WebMethod(Description=@"Add a message to the specified log file.")]
public bool GCSLog(string strMessage, string strLogFile=LogFile)
{
try
{
Log.l1(strMessage, strLogFile);
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Add an error message to the specified log file and corresponding error log file
/// </summary>
/// <param name="strMessage">The message to write to the log.</param>
/// <param name="strLogFile">The log file to which the message will be written.</param>
/// <returns>bool value indicating success/failure writing to the log.</returns>
[WebMethod(Description=@"Add an error message to the specified log file and corresponding error log file.")]
public bool GCSLogError(string strMessage, string strLogFile=LogFile)
{
string strErrorLogFile = strLogFile.Substring(0,strLogFile.Length-4) + @"_Error.log";
try
{
Log.l1(strMessage, strLogFile);
Log.l1(strMessage, strErrorLogFile);
}
catch
{
return false;
}
return true;
}
/// <summary>
/// Get the value of an App Broker setting.
/// </summary>
/// <param name="strSetting">The name of the desired App Broker setting.</param>
/// <returns>The value of and App Broker setting.</returns>
[WebMethod(Description=@"Get the value of an App Broker setting.")]
public string GetABSetting(string strSetting)
{
if (strSetting=="ConnectionString")
{
return ESDConfig.getConnString();
}
return ESDConfig.getConfigValue(strSetting).ToDbString();
}
/// <summary>
/// Get MachineDomain for a device from FNMS.
/// </summary>
/// <param name="strMachineName">The name of the device for which to look up the domain.</param>
/// <returns>The domain "flat name" for the specified device.</returns>
[WebMethod(Description=@"Get all inventory devices from FNMS.")]
public string GetMachineDomainFromFNMS(string strMachineName) {
string strMachineDomain = "";
string fnmsServer = ESDConfig.getConfigValue("FNMSDBServer").ToDbString();
string fnmsDatabase = ESDConfig.getConfigValue("FNMSDBName").ToDbString();
string fnmsConnStr = String.Format("Data Source={0};Initial Catalog={1};Integrated Security=True;", fnmsServer, fnmsDatabase);
SqlUtilities su = new SqlUtilities(fnmsConnStr);
string sqlQuery = String.Format(@"
SELECT cd.FlatName AS [MachineDomain]
FROM ComplianceComputer cc
JOIN ComplianceDomain cd ON cc.ComplianceDomainID = cd.ComplianceDomainID
WHERE cc.ComputerName='{0}'", strMachineName);
strMachineDomain = su.ExecuteSQLAndReturnSingleValue(sqlQuery).ToDbString();
Log.l1(string.Format("MachineName: [{0}], MachineDomain: [{1}]", strMachineName, strMachineDomain), LogFile, (int)LoggingLevel.VERBOSE);
return strMachineDomain;
}
}
... View more
Jun 16, 2022
12:38 PM
1 Kudo
Sorry to contradict Charlie, but I'd like to provide some clarification, as I'm not sure I'm understanding your specific scenario. First, if the user receives the initial notification, clicks the link to go to My Apps, and then responds to the alert by choosing the Uninstall option, the uninstall request should get submitted immediately, not on the next run of the scheduled task. So, it doesn't make sense to send a reminder notification " a few days before the software is reclaimed ".
Second, when you set up the policy, you can set a "grace period" (i.e. if the user hasn't responded after XX days, automatically reclaim the software). As long as this grace period is set to be longer than the frequency of the My Apps notifications scheduled task, the user will continue to receive notifications each time the scheduled task runs, right up until the end of the grace period. After that time, the next cycle of the My Apps alert processing scheduled task will submit the uninstall request.
Now, if you're saying that you've modified the My Apps email notification to remove the link to My Apps and you are just asking them to reply to the email, then they will never be able to select the "Uninstall" or "Keep" actions (unless they happen to visit the My Apps tab in the UI on their own). In this case, they will still receive those scheduled reminders (weekly by default) until the grace period has lapsed. Keep in mind that the email notification will be the same every time the scheduled task runs. There is no distinction between a "first" notification and a "reminder" notification. So, if that's what you're trying to accomplish, then Charlie is correct that there is no separate "reminder" notification message.
... View more
May 27, 2022
10:01 AM
Don't feel bad, Charlie. I've never been good at regular expressions either, which is exactly why I keep that website bookmarked! 😀
... View more
May 26, 2022
06:08 PM
2 Kudos
If you only have a finite list of possible answers, why use a single line text entry instead of a drop-down list or radio buttons? Try adding a new expression under Catalog Management > Expressions, and use the expression ^[12]$. This should only match if a 1 or a 2 is entered with no other characters. For what it's worth, regex101.com is a great resource if you need help with regular expressions.
... View more
May 18, 2022
12:41 PM
If you ran setup on the new server and pointed to the existing DB (or a new copy of it), then everything should be pointing to the right server name except possibly the Site DNS Address setting under Site Management > Settings > Web Site > General, which you may or may not need to change (depends on if you were using the server name or an alias and whether that alias needs to change). Also, if you manually put in links back to the old server within any "user data" (i.e. catalog descriptions or other user-entered data), then you'd have to track those down (I'm not aware of a good way to look for all instances of a server name within any column of any database table).
... View more
Latest posts by jdempsey
Subject | Views | Posted |
---|---|---|
131 | Jan 09, 2023 04:59 PM | |
104 | Jan 03, 2023 05:39 PM | |
215 | Jan 03, 2023 02:35 PM | |
394 | Dec 27, 2022 05:19 PM | |
229 | Dec 27, 2022 05:10 PM | |
313 | Dec 18, 2022 03:04 PM | |
359 | Dec 01, 2022 04:05 PM | |
403 | Nov 30, 2022 05:09 PM | |
239 | Nov 17, 2022 01:55 PM | |
631 | Nov 03, 2022 01:23 PM |
Activity Feed
- Posted Re: App Portal Database Schema Question on App Broker Forum. Jan 09, 2023 04:59 PM
- Posted Re: Can Alternate Target Be Available To Specific Catalog Items? on App Broker Forum. Jan 03, 2023 05:39 PM
- Kudoed Can Alternate Target Be Available To Specific Catalog Items? for douglas_yee. Jan 03, 2023 05:36 PM
- Posted Re: Web Method Controlled Question Answers on App Broker Forum. Jan 03, 2023 02:35 PM
- Kudoed Web Method Controlled Question Answers for dcopher. Jan 03, 2023 02:31 PM
- Got a Kudo for Re: App Portal redundancy. Dec 28, 2022 11:50 PM
- Posted Re: Getting error while install web Service setup exe file in SCCM primary site on App Broker Forum. Dec 27, 2022 05:19 PM
- Posted Re: App Portal redundancy on App Broker Forum. Dec 27, 2022 05:10 PM
- Got a Kudo for Re: App Portal redundancy. Dec 27, 2022 05:10 PM
- Kudoed Re: App Portal redundancy for TeriStevenson. Dec 27, 2022 05:05 PM
- Kudoed App Portal redundancy for TeriStevenson. Dec 27, 2022 05:04 PM
- Kudoed Web Extension - Manifest v3 for Angersma. Dec 20, 2022 09:06 AM
- Kudoed Re: Web Extension - Manifest v3 for Shiremath. Dec 20, 2022 09:06 AM
- Posted Re: App Portal/App Broker and Flexera One ITAM Integration on App Broker Forum. Dec 18, 2022 03:04 PM
- Kudoed Expired My Apps alerts with Latest usage for AjaykumarPatil. Dec 18, 2022 02:48 PM
- Kudoed Re: Manager property not syncing during user-sync for CharlesW. Dec 14, 2022 11:23 AM
- Kudoed Forcing a Single User, Computer or User Computer Relationship to Sync in App Portal for CharlesW. Dec 14, 2022 10:52 AM
- Got a Kudo for Re: Workflow Skipping Step if Same Approver in Multiple Steps. Dec 02, 2022 03:26 PM
- Got a Kudo for Re: App Portal - Hide approver names. Dec 02, 2022 05:23 AM
- Got a Kudo for Re: App Portal - Hide approver names. Dec 01, 2022 04:07 PM