SharePoint People-Picker and Active Directory Part 1

SharePoint 2007 SharePoint 2010 SharePoint 2013







[UPDATED on 12/04/2012]

Introduction

In organizations operating SharePoint with multiple Active Directory forests/domains, configuring the people picker can be a challenge, particularely if trust relationships between the domain hosting SharePoint and the domain(s) hosting the users are "one-way".

I must confess that only documentation is poor and blog posts were sometimes unclear to me. Therefore I decided to make a digest but comprehensive attempt to document the people picker behavior and configuration in and AD/Integrated Windows Authentication (IWA) configurations/Classic Mode. Note: what applies to IWA also applies to Basic, Digest and client certificate mapping authentication as long as AD is used as repository for authentication information. It is critical to correctly understand how AD, domains, forests and trusts are working in order to get your people-picker working correctly (displays what you effectively want to see), rapidly (does not take ages to return a result) and reliably (its behavior is predictable and persistent over time).

Default Behavior

The people-picker is a SharePoint interface responsible for querying repositories for users or groups in order to grant them permission in the SharePoint application. It is implemented as part of the WFE role, this means that when you’re using it, the WFE you’re connected to will attempt to contact AD in order to returns items matching your query’s criteria. Here is, step by step, how it works:

  1. A user submits a query to the people-picker
  2. The SharePoint contacts a domain controller of the domains it belongs to in order to retrieve the list of trusted forests/domains with which a 2-way trust is established. Note: to do so, the system function DsEnumerateDomainTrusts is called.
  3. For each Forest/Domain retrieved as previous steps, The SharePoint (WFE) will perform the steps 4 to 6 hereunder
  4. The SharePoint performs a DNS query in order to locate a domain controller hosting the Global Catalog Service (in case of a Forest) or LDAP service (in case of a Domain). There are actually two possible DNS queries: The first query will include the server’s Active Directory site name, in order to locate a domain controller that reside on the same site or “covers” it (does not reside in the same site but is configured as a candidate to receive request from originating from that site).If that first query succeeds, there’ll be no secondone. It it fails and the DNS reports that there is no such name, a second query will take place without any reference to the server’s site.Note that, like with any DNS record resolution attempt in Windows, the result is cached according to the TTL of the record or put in the negative cache if the query failed
  5. With the IP address of a DC hosting GC or LDAP service in hand, SharePoint (WFE) will initiate a connection over port 3368 (Global Catalog LDAP over TCP for a forest) or 389 (LDAP over TCP for a Domain) against the selected domain controller. This first request, which is is anonymous, is necessary for the LDAP client and server to agree on a set of elements necessary for the protocol to work such as authentication, capabilities.This first contact is often known as the Root or RootDSE
  6. Once SharePoint know how to talk to an AD, it will perform a query whose part of the parameters are based on the user's input. This query is powered by the System.DirectoryService Namespace. If the AD requires authentication, which is by default the case, SharePoint will authenticate using the context of the IIS application pool the SharePoint web application runs under. It can be Local system or Network Service (DOMAIN\SERVERNAME$ is used) or a domain user used as service account
  7. SharePoint aggregates the results with user information which could already exist in the site the user originally accessed and initiated the people-picker from
  8. SharePoint displays the results to the user

The query, as stored in the code:

  • (&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(name={0}*)(displayName={0}*)(cn={0}*)(mail={0}*)(sn={0}*)(SamAccountName={1}*)(proxyAddresses=SMTP:{0})(proxyAddresses=sip:{0}){2}))", "(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(name={0})(displayName={0})(cn={0})(mail={0})(samAccountName={0})(proxyAddresses=SMTP:{0})(proxyAddresses=sip:{0})))", "(&(objectCategory=person)(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))(|(mail={0})(proxyAddresses=SMTP:{0})))"), new SearchParameter("(&(objectCategory=group)(|(name={0}*)(displayname={0}*)(cn={0}*)(SamAccountName={1}*)(mail={0}*)(proxyAddresses=SMTP:{0}){2}))", "(&(objectCategory=group)(|(name={0})(displayname={0})(SamAccountName={0})(mail={0})(proxyAddresses=SMTP:{0})))", "(&(objectCategory=group)(|(mail={0})(cn={0})(proxyAddresses=SMTP:{0})))"), new SearchParameter("(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(|(name={0}*)(displayname={0}*)(cn={0}*)(SamAccountName={1}*){2}))", "(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=2147483648)(|(name={0})(displayName={0})(cn={0})(samAccountName={0})))

The query criteria in clear:

  • A user or a group
  • If it is user, at least of of the following attribute must begin with the input the user provided: name, displayName, cn, mail, sn, SamAccountName, proxyAddresses (with SMTP or sip)
  • It it is a user it must not be disabled
  • If it is a group, at least of of the following attribute must begin with the input the user provided: name, displayname, cn, SamAccountName
  • if it is a group, it must be a security group (domain local, global or universal), not a distribution group

The following attributes are requested for each record found:

  • objectSID
  • mail
  • displayName
  • title
  • department
  • proxyAddresses
  • cn
  • samAccountName
  • groupType
  • userAccountControl
  • distinguishedName

Key points:

  • By default, SharePoint only knows about the AD domain its server(s) belong(s) to and the other forest or domains trusted by that domain
  • SharePoint uses DC locator DNS records to locate a DC, attempting to honor Active Directory's site awareness principle
  • SharePoint queries AD using the Global Catalog or LDAP Service
  • The same LDAP filter is used for every domain

Prerequisites for the people picker to work:

  • The SharePoint Server(s) must be able to resolve DNS names from the remote forests/domains
  • The network connectivity must be allowed from the SharePoint Server(s) and the Domain Controller of the remote forest/domain
  • A two-way trust relationship must be in-place. For one-way, see the section below

Custom Configuration for Querying Specific Forest/Domains

In some situation, you may want to restrict the forests/domain queried by the people. In this case, the list of forests/domains must be configured on a per web application-basis using the command STSADM.exe -o setproperty -pn peoplepicker –searchadforests. For each forest/domain, you need to gather the information below:

  • Do you query a forest or a domain
  • The DNS name of the forest or domain to be queried

Then, based on the information above, you can assemble the parameter correctly. The configuration of each forest or domain to be queried must be separated with a semi-colon and inside the configuration, the first word must be forest: or domain: and it must be followed by a valid DNS name. Example:

  • STSADM.exe -o setproperty -pn peoplepicker–searchadforests –pv “forest:dune.local;domain:carthag.local;domain:tuono.local”

Key points:

  • Using a custom configuration completely replaces the default behavior
  • SharePoint will not retrieve the list of forest/domain with which a 2-way trust is in place anymoire like it does at step 2 of Default Behavior
  • If you specify a forest, a forest trust must be in place, if you specify a domain, an external trust will be sufficient
  • If you still wish to query the forest/domain SharePoint belongs to, you’ll have to add it as part of the parameter too
  • If you configure a forest to be queried, it is not necessary to declare all or some child domains separately, they will be queried as well
  • If “forest” is specified, the Global Catalog Service will be used to perform the query while with domain, it will use the LDAP service
  • While the STSADM command is to be execute on one SharePoint server, an ISRESET must be performed on each SharePoint server for the configuration must be applied

Custom Configuration with One-Way trust Scenario

This configuration is identical to the above except that since the IIS application pool identity is unable to authenticate against the remote forest/domain due to the limitation imposed by one-way trust, alternate credentials must be supplied. Those credentials must be from the forest/domain to be queried or from a trusted domain, as long as it is allowed to authenticate.

The tough part of the job in this case is to apply the configuration.

First, a key must be generated in order to encrypt/decrypt the alternate credentials that will be used, in order to do so, you have to run the command hereunder on every SharePoint server:

  • STSADM.exe -o setapppassword -password MYPASSWORD. where MYPASSWORD is the key –> While it makes sense that the more complex, the better, it seems that too complex will prevent the people picker from working. Note: the complexity is not ruled by the Windows password policy

Secondly, you have to provide the list of forest/domains to be queried as well as the credentials to do so. Each block is separated by semi-colons and each element in a block is separated by comma. Example:

  • STSADM.exe -o setproperty -pn peoplepicker–searchadforests –pv “forest:dune.local,DUNE\PAULA,PasswordOfPaulA;domain:carthag.local,CARTHAG\Gurney,PasswordOfGurney;domain:tuono.local,TUONO\SHANIA,PasswordOfShania”

Key points:

  • Do not forget to execute STSADM.exe -o setapppassword on each SharePoint server
  • Make sure you have valid credentials for each forest/domain
  • Make sure each forest/domain element is correctly structured
  • Sure you can combined forest/domain with and without explicit credentials. If ceredentials are not supplied, the context of the IIS application pool account running the web application will be used

Worth Mentionning

The people picker configuration is not only used by the web interface of sites but also by some STSADM commands, Powerhsell Cmdlets and API's. Therefore, user or group-related interactions may faild if the configuration is incorrect or if the people picker is not operating correctly.

Moreover, if you wish to assign permission to users in the central admin (site collection owner, policy for web application...), it will also require people picker configuration, unless the default behavior is sufficient.

Some Troubleshooting Guidance

Useful tools

  • NTLTEST command-line: (part of the windows Server 2008 Support tools or built-in Windows Server 2008)
  • Wireshark network capture utility
  • LDP.exe simple LDAP client (part of the windows Server 2008 Support tools or built-in Windows Server 2008)
  • Active Directory User and computer (ADUC) Console
  • ADInsight from MS Sysinsternals (not super reliable alas)

Global Approach

The most straightforward way to trace the behavior of the people picker is to take a network capture while performing the search from the Web GUI, taking care of flushing the DNS resolver cache (ipconfig /flushdns). Take this capture of the WFE your target with your tests and filter the results as follows:

Apply a display filter to show only DNS requests, you should see requests like the following:

If you attempt to query a domain: _ldap._tcp.Site-Name._sites.domain.local: type SRV, class IN (first attempts, in order to locate a DC in the same site) or _ldap._tcp.domain.local: type SRV, class IN (any DC in that domain, regardless of the site)

If you specified to query a forest, you should see _gc instead of _ldap

If you don’t see those DNS request or if you see them but they fail, make sure the SharePoint servers are able to resolve names from remote domains ad are configured with the correct DNS Servers and optionally with a list of suffixes

Once name resolution is working fine, go back to the capture and make sure you see LDAP (port 389) or GC (same as LDAP but on port 3268).

for each domain or forest, you should see a “bindRequest” with a successful response followed by a “seachRequest” followed by a successful response as well. drill-down into the search request for the details about the query submitted: the filter and conditions applied in particular

Retrieving the server’s AD site

Execute the command “NLTEST /dsgetsite”. It should return the AD site the SharePoint server belongs to. If it does not, there is a serious AD configuration problem ;)

Retrieving a DC for a given domain

Execute the command “NLTEST /dsgetdc:mydomain.local

If the list of flags it return includes the following, you’re ok:

  • CLOSE_SITE= the DC is in the same AD site as the SharePoint server or is “covering” that site
  • LDAP: the DC is LDAP server (all DCs are but must advertise it)
  • GC: the DC is also global catalog (NOT all DCs are but if they are, they must advertise it too)

Note: Other information returned by the command might also be useful for troubleshooting: Name and IP address of the DC…

Simple LDAP connection test

1. On the SharePoint server, start ldp.exe

2. Go to the menu “Connection” and click “Connect”. Enter the IP or the host name of the remote DC. You should test with a FQ host name in order to test DNS too. Select port 389 for LDAP or 3268 for GC. If it works, it will return a list of server-related information

3. Repeat this test for each DC SharePoint would potentially target

Testing the credentials to connect to a remote domain using LDAP (one-way trust scenario)

If the test above works, proceed to this one:

1. Return to the menu “connection” then click “Bind” then enter the credential of the remote domain to be browsed (including the domain name in the 3rd textbox

2. If it fails, you’ll see a message such as

res = ldap_bind_s(ld, NULL, &NtAuthIdentity, 1158); // v.3

               {NtAuthIdentity: User=’myuser’; Pwd= <unavailable>; domain = ‘mydomain’.}

Error <49>: ldap_bind_s() failed: Invalid Credentials.

3. If it succeeds, it will report

res = ldap_bind_s(ld, NULL, &NtAuthIdentity, 1158); // v.3

               {NtAuthIdentity: User=’myuser’; Pwd= <unavailable>; domain = ‘mydomain’.}

Authenticated as dn:’myuser’.

People-Picker Reliability/Performance Killers

  • The more forest/domains there are two query, the slower it will be to get results
  • Problematic Name Resolution Process: In order to resolve DC locator records, Windows will exhaust all possible name resolution methods, from DNS to broadcast… And this for each declared forest/domain
  • Unresponsive DC brings major slow down
  • Suboptimal/Inconsistence AD Site configuration: Site-awareness is a key factor, this makes sure SharePoint always query the nearest DC
  • Network devices/Security devices breaking the TCP traffic: from broken NIC to firewall, anything generating TCP retransmit or “forcibly closing” connections
  • Load on Active Directory/Domain controller or security settings on the domain controller (preventing DoS attacks for example)
  • If custom filter is used: Improperly written filter: make sure the complexity of criteria remains reasonable, only indexed attributed are queried and of course if the GC is used, only attributed that are part of the partial attribute set

Additional information’s

What’s next?

In the next posts, I will cover:

  • Additional filtering capabilities of LDAP searches
  • Detailed configuration for each scenario
  • how people picker is related to authentication and profile import (MOSS only)
  • Guidance to optimize people-picker in different scenario’s

Happy people-picking!

Marc


Comments (16) -

Ivan Wilson
Ivan Wilson
5/27/2009 7:25:09 AM #

Great article Marc. I am troubleshooting a multi-domain forest environment that is taking 30 seconds to return results. My simple test so far has involved running a DSQuery fron the server, which returns results in less than a second.

Am I correct in thinking that by default, SharePoint should only search its own domain? Or will it include any domains that it has two-way trusts with?

I don't know enough about networks to use WireShark, but I will try to get hold of the LDP.exe and NLTest.exe utilities to see if I can find more information.

Looking forward to the second part of this article.

Marc
Marc
5/27/2009 8:57:45 PM #

Hi Ivan,
Thanks for the feedback. I will detail all the causes that may delay people picker response in the second part but in short, it goes like this:
JIT of .Net + DNS Lookup + Connection to AD and LDAP Query + Validating and displaying the paged results = total execution time. The first part (JIT) should only occured at the first query, DNS as well (cached response).
By default, SharePoint will only search domains from the AD forest it belong to using the global catalog, not from trusted domain(s) of other forest(s) or trusted forests.
Marc

Jonathan
Jonathan
6/5/2009 6:24:47 PM #

Really nice article.
I am having trouble with people picker not working at all.
I have my sharepoint sites spread over a couple of servers. I had to create a new central admin and then import my existing sites during the last service pack upgrade and since then I am having touble on the sites with people picker. Authentication works fine but people picker does not search the domains. The admin site works perfectly. I have moved sites between servers without changing the behavor and I have moved the admin site to a different server without changing the behavior. I've used stsadm to enumerate all the properties but have not been able to find the missing link. Can you point me in any direction.

Thanks in advance

Marc
Marc
6/8/2009 9:09:06 AM #

Jonathan, thanks for your comment.
Regarding your problem: the people picker settings are tight to a web app, not a site (or site collection). You should first review you web app configuration and re-apply it as necessary. Then, try to take a capture with Netmon/wireshark to see if there is any traffic going from SharePoint to any DC. Hope it helps.
Marc

Gavin
Gavin
6/9/2009 10:11:28 PM #

Jonathan, as with the others, appreciate the article and the additional insight into people picking from forests.

I've gone through the troubleshooting points you reference from a test forest (test.dom) attempting to query another forest (prod.dom) with no firewalls between the MOSS server nor the DC's. Using wireshark I see the MOSS server connect to the other forest's DC, good SASL bind with the credentials (Domain User), then a ton of packets which I assume is the GC being sent over.

Needless to say, a partial name query for a user in the test.dom domain doesn't appear. Should they appear even if I don't have a user profile import established on the SSP? Not seeing any errors or other bits in the Event Viewer.

You've got a lot experience with this, any ideas where I should check next? Smile

Marc
Marc
6/11/2009 8:14:04 AM #

Gavin, sorry for the delayed reply.
One important note: people picker works totally independently from the SSP/Profile Import configuration. PP is actually a WSS function.
Now for your problem, look for the following:
- In your network capture, you see GC traffic but do you see “searchresponse” entries which contain results (look deeper into the dissected LDAP packets)
- If so, do you have a trust in place and is it working. I have many times notices that the PP performs additional processing and even if the LDAP/GC search return something, it will not display it because the trust does not work
- Did you configure the setting “setsiteuseraccountdirectorypath”? If so, it may also prevent displaying results even though the LDSP/GC queries returns soemthing
Hope it helps, Marc.

Gavin
Gavin
6/12/2009 4:37:21 AM #

Marc,

It was the setsiteuseraccountdirectorypath setting. It was set for dc=tld,dc=dom (for our domain). So I did see search responses for that setting, but nothing after that (nor did it change no matter the settings I inputted for the searchadforests setting).

I set the user account directory to NULL and it started to work perfectly. Thanks again for the article, it helped me immensely get a better understanding of the WSS function.

Marc
Marc
6/12/2009 8:47:01 AM #

Gavin, thanks for the feedback! I have documented that problem in the second part. Marc

Ulrich
Ulrich
7/21/2009 6:05:53 PM #

Marc,
thank's a lot for your post. This is certainly the best write-up on the topic that I have encountered so far.
I'm troubleshooting a one-way-trust setup where the MOSS server is in the extranet domain (the trusting one) but running with an app-pool-account from the "inside" forest. PP is behaving quite strange: Accounts from the inside forest are easily resolved, but extranet accounts are only resolved if
- they already exist in the sitecollection
- one provides a UserPrincipalName or a NB-Domain\samAccountName notation.

So it is not completely broken but behaving just as though I had set the peoplepicker-onlysearchwithinsitecollection property - but for the single domain only. Which I did not, of course.

Did you ever see anything like this?

There is one peculiarity in the setup: the extranet-domain is called extranet.company.biz while the forest is company.biz, subdomain.company.biz but does NOT belong to the forest. Maybe this is really a don't. The "forest:a,b,c;domain:d,e,f" command doesn't change anything BTW.

Marc
Marc
7/22/2009 1:48:59 PM #

Hello Ulrich and thanks for your feedback. Sorry for the delayed reply, it was a long weekend here that I spent totally disconnected on a trip abroad.

Interesting, your setup is the one that I wanted to test one day: an application pool identity from a trusted forest/domain. I have already seen some of the behavior you describe but they were occurring in a different configuration.
What I would propose as configuration is the following:
Forest:company.biz,forest: extranet.company.biz
Since the application pool is already running in the appropriate security context to browse the forest company.biz, no need to provide alternate credentials. Same for the forest extranet.company.biz since it will make use of the trust in place.
Once you’ve configured this and applied the change (IISRESET), I’d suggest taking a network trace using Netmon or Wireshark and ensure 1) Dns name resolution is working as expected; 2) the identity of the application pool can authenticate against AD and get results from the query.
Do not hesitate to post back if the issue persists.
Marc

Ulrich
Ulrich
7/22/2009 5:54:08 PM #

Marc,

I tried your suggestion, but this didn't change anything (I'm beginning to doubt my typing skills...). The app-pool-account can successfully query the external GC and LDAP using ldp.exe.
Wireshark says:
- dns resolution is just as expected
- when looking for an account from the inside forest (where the app-pool-account comes from) OR using an expression that does not contain the netbios-domain or dns-domain part of an external account name, PP connects against the GC of the internal forest. If there is no search result, PP does not continue with the external domain.
- when looking for a "fully qualified" external account, PP asks against normal LDAP (NOT the GC) of the external domain.
nltest does willingly provide information on dcs, gcs, site (I had them renamed to match after reading your post).

I do get PRINCIPAL_UNKNOWN Kerberos-errors in the MOSS's EventLog: ldap/dc-name.extranet.company.biz@intranet.company.biz is obviously not an accepted target. That does make sense because there's is no way I could think of to have a spn for the external dc that is trusted for delegation in the internal domain (except for a direct two way trust and a complicated scenario with a chain of two-way, non transitive trusts).
I'll conference with a consultant tomorrow and keep you posted on our findings.

Marc
Marc
7/22/2009 7:51:54 PM #

Hi Ulrich. Thanks for the feedback. Yes please, let me know about your progress.
Marc

Paul Whitaker
Paul Whitaker
8/11/2009 11:32:17 PM #

Awesome post. Good round-up of available resources and new content as well. Thanks.

Marc
Marc
8/12/2009 7:43:22 AM #

Paul, thanks for the feedback. Indeed comprehensiveness was a primary goal for this serie of posts.
Marc

Roz
Roz
11/10/2012 12:29:48 AM #

Hi Marc,
By far this is the best resource I found for peoplepicker troubleshooting. I’ve been dealing with peoplepicker issue and exhausted all the resources without any luck. Hoping your expertize can shed me some lights. Smile

Here is where we stand now:

SharePoint 2010 peoplepicker configured to lookup 6 trusted (2 way) forests and 1 domain (native domain where SP servers belong). Peoplepicker can find the user from all domains just fine but when add the person from 4 of the configured forests I get a message on the UI saying ‘Multiple entries matched’…  when click the name ‘from Grant Permissions’ page to see what the multiple matches I only see one account that I chose from the ‘Select People and Groups’ dialog box. I select that name and get another error ‘No exact match was found’. :-(

Now SharePoint log shows the following error message. NLTest not revealing any obvious DNS issue.

Here are few interesting facts:
1.  I can add the same problem user through STSADM command
2.  I can add users from 2 other forests (out of 6 configured) just fine
3.  I’ve 2 other working SharePoint farms where Peoplepicker is working i.e. can add users from these 6 forests (while peoplepicker is configured exactly the same). Only difference is local DNS server for SP is different (as located in different location)
4.  Checks we’ve done so far shows same firewall ports are open from our end on both working and non working farm (tested for ports 53,88,750,389,636,3268,3269,135,137,138,139,445,749)
5.  Authentication for both working and non working farm are Kerberos
6.  In some cases when Peoplepicker configured to the forest level it fails to add the users (with the below error messages) but if I point peoplepicker to the domain where the actual user is located – peoplepicker can add that user.

Sorry about this long nessage – I’d appreciate any suggestion if you have. I’m willing to work with you on this if you feel we can resolve this issue Smile.

Many thanks in advanced!

Roz

SharePoint ULS log:
Unable to get domain DNS or forest DNS for domain XXX. ErrorCode=1355  bc368efd-ebdf-4b78-a2de-663d560649f4
Error in resolving user 'XXX\user' : System.ArgumentException: Specified value is not supported for the {0} parameter.     at Microsoft.SharePoint.Utilities.SPUserUtility.GetDomainControllerToSearch(SPWebApplication webApp, String domainName)     at Microsoft.SharePoint.Utilities.SPActiveDirectoryPrincipalBySIDResolver.ResolvePrincipal(String input, Boolean inputIsEmailOnly, SPPrincipalType scopes, SPPrincipalSource sources, SPUserCollection usersContainer)     at Microsoft.SharePoint.Utilities.SPUtility.ResolvePrincipalInternal(SPWeb web, SPWebApplication webApp, Nullable`1 urlZone, String input, SPPrincipalType scopes, SPPrincipalSource sources, SPUserCollection usersContainer, Boolean inputIsEmailOnly, Boolean alwaysAddWindowsResolver).  bc368efd-ebdf-4b78-a2de-663d560649f4

Marc
Marc
11/13/2012 9:52:53 PM #

Hi Roz and sorry for the delayed reply.

Although you seem to have exhasuted all possible issues with network connectivity/DNS I would still investigate in the direction of a DNS-related problem because the error code 1355 means "NO SUCH (DNS) DOMAIN". The problem might not come from the SharePoint server itself but from the DNS server/DC it uses.

Do not hesitate to coment back!

KR,
Marc

Pingbacks and trackbacks (2)+

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading

 Disclaimer

The information and materials in this site are provided "AS IS" with no warranties, and confering no rights.

This site does not represent the thoughts, intentions, plans or strategies of my employers, customers, friends or family, solely my own personal opinions.

You should not consider older, out-of-date posts to reflect my current thoughts and opinions.

 Announcements

Community Day Belgium 2013

MS TechEd Europe 2013

Recent Tweets

Note: For Customization and Configuration, CheckOut Recent Tweets Documentation

 Recommended Blogs

Download OPML file OPML