Saturday, December 6, 2014

Windows 8 Pro and multiple simultaneous logins

If you have Windows 8 Pro then Remote Desktop is available for you to log in remotely. Great! However with the version of RDP that comes with Win 8 Pro, only one login is allowed at a time. If someone is using the PC and someone else logs in remotely, the console user (and any other remotely logged in users) will get kicked off.

Enabling multiple simultaneous logins involves updating a system file, which also means changing file security so you can work with the file. I had to refer to a few different sources to figure out how to achieve this.

So for next time these are my consolidated steps for this:

  1. Bring up the Task Manager and stop Terminal Services (may also need to stop UMRDPService)
  2. In the Start menu, type File Explorer, and when it comes up, right-click and Run As Administrator. Say OK to any dialog boxes that pop up
  3. Find termsrv.dll in the c:\windows\system32 folder, right-click and select properties
  4. Select the Security tab, click the Advanced button
  5. Next to Owner, click Change
  6. Type Administrators in the text box and click Check Names. Your local administrators group should be found (named YourPC\Administrators). Click OK
  7. Click the Auditing tab, click Add then click Select a Principal
  8. Type Administrators in the text box and click Check Names. Your local administrators group should be found (named YourPC\Administrators). Click OK
  9. For Basic permissions, tick Full Control and click OK in all dialog boxes until you're back to File Explorer
  10. Right-click termsrv.dll again, select properties, click the Security tab and click Edit
  11. In the Groups or User Names box, make sure you have Administrators selected then click Full Control and click OK until you're back to File Explorer
  12. Copy termsrv.dll to a backup location. Can't be too careful!
  13. Download zip file from http://cdn.nextofwindows.com/download/win81rdp.zip
  14. Now you need to figure out which file to use. If your Windows is 32 bit then you want to use 32_termsrv.dll, otherwise 64_termsrv.dll. If you're not sure then compare the size of your existing file with these two - you want to use the one that's the same size (or nearly). Extract the dll you want from the zip and remove the prefix so the name is termsrv.dll.
  15. Copy the new file into c:\system\windows32
  16. Restart Terminal Services (and also UMRDPService if you have it)


References:

Kent Chen's info about the replacement dll
http://www.nextofwindows.com/how-to-allow-multiple-concurrent-users-log-in-windows-8-through-remote-desktop/

Usman Javaid's info about changing system file permissions
http://www.addictivetips.com/windows-tips/take-ownership-of-files-folder-and-change-permissions-in-windows-8/

Tuesday, August 5, 2014

profileID attribute is either null or invalid

Error

Salesforce Community Self-registration attempt fails with the following error:

A new user's attempt to register at failed because the value for the profileID attribute is either null or invalid. Set the profileID for new users on the ChatterAnswersRegistration Visualforce page for the site associated with community  or on the apex class associated with the Facebook authprovider.

Possible Cause


CommunitiesSelfRegController.cls doesn't have a valid ProfileId

The error doesn't mention this class at all.

Saturday, July 19, 2014

Invalid Id: An unexpected error has occurred. Your development organization has been notified

This obscure Salesforce error appears from time to time when fetching a custom url parameter in an extension controller class.

Id recordId;
recordId = ApexPages.currentPage().getParameters().get('rid');
if(rid!=null&&rid!=''){ //ERROR REPORTED ON THIS LINE

Resolution is to change the data type to String. There seem to be more implicit conversions from String to Id than the other way.

Friday, June 6, 2014

apex soql subselect weirdness with "with sharing"

I had some code similar to the following:

Public with sharing class MyClass{
...
    ParentObject__c[] pos = [select Id, (select MasterDetail_2__c from ChildObjects__r)
        from ParentObject__c];
...
   Set MasterDetail_1s = new Set();
    for(ParentObject__c po:pos){
        for(ChildObject__co: po.ChildObjects__r){
            MasterDetail_1s.add(co.MasterDetail_1__c);
        }
    }
...
}

But I was not getting any child records back in the select. Infuriatingly, running the query in the Developer Console Query Editor/Force.com IDE Schema/Force.com Explorer returned the expected results.

While checking that the problem wasn't related to permissions, I changed "with sharing" to "without sharing" and then immediately the following error was reported:

SObject row was retrieved via SOQL without querying the requested field: ChildObject__c.MasterDetail__1__c

With this simplified version of the code it's obvious there is a problem: ChildObject__c.MasterDetail_1__c is used without having been queried. However this error wasn't being reported when the class was declared as "with sharing".

In summary: if subselects are not behaving, "with sharing" may be hiding the errors. Switch to "without sharing" for debug purposes, fix the code and switch back again.

Edit: it actually seems to be more complicated than this - the code stopped working again even with "without sharing". The actual code had something more like

MasterDetail_1s.add(String.valueOf(co.MasterDetail_1__c));

which appeared to cause a problem, but again no exception was raised. I avoided this by removing the explicit conversion.

Tuesday, March 25, 2014

Installing Force.com IDE on Kepler behind proxy and firewall

I'm working behind proxy but also a mean, mean firewall. I can't download anything unless the site is specifically whitelisted. I couldn't even download Kepler without getting approval from a security team.

So naturally my Force.com IDE install will have some problems because it needs to go off and fetch resources from around the web.

Firstly the old site (http://www.adnsandbox.com/tools/ide/install/) seems to work better than the new one. It looks like plenty of people are aware of this.

My solution for getting the rest of the install working was to track down random versions of the files Eclipse was complaining about and drop them in the plugins directory. Eclipse has an install option "Update my installation to be compatible with the items being installed" which will update these files if they're out of date. But before you can even select this option, you have to have some version of the file in the right location.

The files I needed were:

  • org.apache.log4j - copied it from my old eclipse helios install
  • org.eclipse.update.ui - not in helios install, found on java2s.com
The first time I tried to install, I got another error. I tried again, and I got past it and was asked to restart Eclipse to complete installation. So it looks like the first attempt was partially successful which allowed the second attempt to complete.

Monday, March 17, 2014

Get serial number on remote Windows box

At the command line, type

wmic bios get serialnumber

http://support.microsoft.com/kb/558124

Wednesday, February 19, 2014

Deleting Salesforce apex classes from production org

Goal Scenario

Some temporary apex classes have been created in production and need to be deleted.

For change control reasons the developer does not have rights to use the Force.com IDE to achieve this.

The production administrator doesn't use Eclipse and only has the ability to do the following:
  • Manual configuration
  • Change sets
  • ANT deployments

Solution


Provide a package for ANT deployment containing only the meta files for the classes to be deleted.

Inside the meta, change the value of the status tag to Deleted.

     <?xml version="1.0" encoding="UTF-8"?>
     <ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
         <apiVersion>23.0</apiVersion>
         <status>Deleted</status>

Thursday, February 13, 2014

Force.com IDE - Password Required

Symptom

On startup, Eclipse Force.com IDE sits at "Pre-fetch SObjects" step for a long time, and then asks for username/password.

Possible Causes
Java seems to cause this problem.

First time I experienced it, it appeared that Java had become corrupted.
Second time was immediately after installing a Java update.

Update: this happened a third time and messing around with Java didn't fix it.

It turns out that the  Eclipse proxy settings screen is a bit buggy. A lot of corporate firewalls don't support SOCKS so this has to be disabled. When selecting Manual settings, it appears to be impossible to disable the SOCKS proxy settings. However selecting the setting and clicking Clear seems to fix the problem.

http://stackoverflow.com/questions/5857499/how-do-i-have-to-configure-the-proxy-settings-so-eclipse-can-download-new-plugin

Possible Resolutions

1. Check and correct Java proxy settings. It appears these can be lost sometimes

Start | Settings | Control Panel | Java | General tab | Network Settings...
Tick Use proxy server and enter the address and port
Click OK until all dialogs closed


If not sure what to use, see your Eclipse proxy settings (Window | Preferences | General | Network Connections)


2. Repair Java
3. If this doesn't work, uninstall and reinstall
4. It may be necessary to go back to a previous version

Monday, February 3, 2014

Windows Phone 8 to Windows tethering issues

Tethering a Windows Phone to Windows is surprisingly more problematic than tethering to iOS/Android. Various problems can occur including BSOD(!!!)

The fix is to enable FIPS (Federal Information Processing Standards) on the connection. The post below is a starting point for resolving issues and describes how to configure the wireless lan without triggering a BSOD and losing  your configuration.

http://waveformation.com/2013/10/02/win8-internet-connection-sharing-with-windows-phone-htc-8x-
fixed/

However this only works if there has been one successful tether to the phone in the past, as the fix is dependent on the existence of network "profiles" and "interfaces".

A solution that gets around this is to:

  1. Boot the PC into Safe Mode with Networking. See the link for how to do this for various OS versions http://www.computerhope.com/issues/chsafe.htm
  2. Tether to your phone. You'll get an annoying Limited Connectivity message, but the PC shouldn't crash
  3. Right-click your network connection (in the System Tray) and select Properties | select Security tab | click Advanced Settings | tick "Enable Federal Information Processing Standards (FIPS) compliance for this network" | click OK until all dialogs are closed
  4. Restart Windows into normal mode