Activity › Forums › Salesforce® Discussions › MetaData Api Call for Users with non-ModifyAllData Permission
Tagged: Metadata API, ModifyAllData, Salesforce Apex, Salesforce SOQL
-
MetaData Api Call for Users with non-ModifyAllData Permission
Posted by Akash on March 30, 2016 at 6:15 PMWe can call metadata api only for the users with ModifyAllData permission so Is there any solution that we can call metadata api for users with non-ModifyAllData permission?
shariq replied 7 years, 9 months ago 5 Members · 4 Replies -
4 Replies
-
http://salesforce.stackexchange.com/questions/68171/running-metadata-api-in-apex-as-a-specific-user
Have a look on this link, hoping it will help you.
- [adinserter block='9']
-
Hi,
The Wsdl2Apex based class will include some additional parts that identify the session.
There will be an inner class that contains the readMetadata method. It will probably be called something like MetadataPort or MetadataService. This class will include members like:
public soapSforceCom200604Metadata.SessionHeader_element SessionHeader;
private String SessionHeader_hns = ‘SessionHeader=http://soap.sforce.com/2006/04/metadata’;It SessionHeader here contains the active SessionId of the user who is making the request. If you replace the value with the SessionId of a user with the “Modify All Data” permission then the call should succeed.
The trick then becomes how does a non-admin user get a valid admin users session.
If you had access to the admin users credentials, say via a protected custom setting that is hidden in a managed package, then you could call the login method via the Partner API to get a valid session.
-
Hi,
I found this on forcetalks blog –
Running Metadata API in Apex as a specific user
Calling the metadata API in Apex requires admin permission or at least the “Modify All Data” permission. To run the code as a non-admin user, you need to first login as the system administrator, get a session ID, pass it to the request header, and then make the call.
To achieve this, we can call SOAP API of Partner or Enterprise WSDL for login as the system administrator, get a session ID and then pass it to the request header, and then make a call.
Steps for obtaining partner and metadata wsdl and then create a webservice class from it.
– Generate from Setup in Salesforce (enter API in the Quick Find box, then select API)
– Download the appropriate WSDL document and save it to a local directory.
– Generate a Class from WSDL, by clicking “Generate WSDL” Button.Example of accessing metadata for read listview with specific user:-
public static MetadataService.MetadataPort createService() {
Boolean orgType;
orgType = [SELECT Id, IsSandbox FROM Organization where Id = : UserInfo.getOrganizationId() LIMIT 1].IsSandbox;
if(orgType){
credentials = Credentials__c.getInstance(‘Sandbox’);
}
else{
credentials = Credentials__c.getInstance(‘Production’);
}final String USERNAME = credentials.User_Name__c;
final String PASSWORD = credentials.Password__c;
final String SECURITY_TOKEN = credentials.Security_Token__c;
// Calling Partner class for login with specific user
PartnerSoapSforceCom.Soap loginConnection = new PartnerSoapSforceCom.Soap();
PartnerSoapSforceCom.LoginResult config = loginConnection.login(USERNAME,PASSWORD+SECURITY_TOKEN);
userSessionId = config.sessionId;// Calling Metadata Class
MetadataService.MetadataPort service = new MetadataService.MetadataPort();
service.SessionHeader = new MetadataService.SessionHeader_element();
service.SessionHeader.sessionId = userSessionId;
return service;
}
// Calling createService method for reading list view.
MetadataService.MetadataPort metadataService = createService();
MetadataService.ListView readListView = (MetadataService.ListView)metadataService.readMetadata(‘ListView’, new String[] { ‘product2.’+listViewAPIName.DeveloperName}).getRecords()[0];
listviewCoumns.addAll(readListView.columns);Hope this helps.
Log In to reply.