<p>I know I can call the GetVersionEx Win32 API function to retrieve Windows version. In most cases returned value reflects the version of my Windows, but sometimes that is not so.</p>

<p>If a user runs my application under the compatibility layer, then GetVersionEx won't be reporting the real version but the version enforced by the compatibility layer. For example, if I'm running Vista and execute my program in "Windows NT 4" compatibility mode, GetVersionEx won't return version 6.0 but 4.0.</p>

<p>Is there a way to bypass this behaviour and get true Windows version?</p>

[{'answer_id': 57128, 'author': 'EBGreen', 'author_id': 1358, 'author_profile': 'https://Stackoverflow.com/users/1358', 'pm_score': 5, 'selected': False, 'text': '<p>WMI QUery:</p>\n\n<pre><code>"Select * from Win32_OperatingSystem"\n</code></pre>\n\n<p>EDIT: Actually better would be:</p>\n\n<pre><code>"Select Version from Win32_OperatingSystem"\n</code></pre>\n\n<p>You could implement this in Delphi like so:</p>\n\n<pre><code>function OperatingSystemDisplayName: string;\n\n  function GetWMIObject(const objectName: string): IDispatch;\n  var\n    chEaten: Integer;\n    BindCtx: IBindCtx;\n    Moniker: IMoniker;\n  begin\n    OleCheck(CreateBindCtx(0, bindCtx));\n    OleCheck(MkParseDisplayName(BindCtx, PChar(objectName), chEaten, Moniker));\n    OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result));\n  end;\n\n  function VarToString(const Value: OleVariant): string;\n  begin\n    if VarIsStr(Value) then begin\n      Result := Trim(Value);\n    end else begin\n      Result := \'\';\n    end;\n  end;\n\n  function FullVersionString(const Item: OleVariant): string;\n  var\n    Caption, ServicePack, Version, Architecture: string;\n  begin\n    Caption := VarToString(Item.Caption);\n    ServicePack := VarToString(Item.CSDVersion);\n    Version := VarToString(Item.Version);\n    Architecture := ArchitectureDisplayName(SystemArchitecture);\n    Result := Caption;\n    if ServicePack &lt;&gt; \'\' then begin\n      Result := Result + \' \' + ServicePack;\n    end;\n    Result := Result + \', version \' + Version + \', \' + Architecture;\n  end;\n\nvar\n  objWMIService: OleVariant;\n  colItems: OleVariant;\n  Item: OleVariant;\n  oEnum: IEnumvariant;\n  iValue: LongWord;\n\nbegin\n  Try\n    objWMIService := GetWMIObject(\'winmgmts:\\\\localhost\\root\\cimv2\');\n    colItems := objWMIService.ExecQuery(\'SELECT Caption, CSDVersion, Version FROM Win32_OperatingSystem\', \'WQL\', 0);\n    oEnum := IUnknown(colItems._NewEnum) as IEnumVariant;\n    if oEnum.Next(1, Item, iValue)=0 then begin\n      Result := FullVersionString(Item);\n      exit;\n    end;\n  Except\n    // yes, I know this is nasty, but come what may I want to use the fallback code below should the WMI code fail\n  End;\n\n  (* Fallback, relies on the deprecated function GetVersionEx, reports erroneous values\n     when manifest does not contain supportedOS matching the executing system *)\n  Result := TOSVersion.ToString;\nend;\n</code></pre>\n'}, {'answer_id': 57130, 'author': 'gabr', 'author_id': 4997, 'author_profile': 'https://Stackoverflow.com/users/4997', 'pm_score': 6, 'selected': True, 'text': '<p>The best approach I know is to check if specific API is exported from some DLL. Each new Windows version adds new functions and by checking the existance of those functions one can tell which OS the application is running on. For example, Vista exports <a href="http://msdn.microsoft.com/en-us/library/ms724451(VS.85).aspx" rel="noreferrer">GetLocaleInfoEx</a> from kernel32.dll while previous Windowses didn\'t.</p>\n\n<p>To cut the long story short, here is one such list containing only exports from kernel32.dll.</p>\n\n<pre>\n> *function: implemented in*  \n> GetLocaleInfoEx:       Vista  \n> GetLargePageMinimum:   Vista, Server 2003  \nGetDLLDirectory:         Vista, Server 2003, XP SP1  \nGetNativeSystemInfo:     Vista, Server 2003, XP SP1, XP  \nReplaceFile:             Vista, Server 2003, XP SP1, XP, 2000  \nOpenThread:              Vista, Server 2003, XP SP1, XP, 2000, ME  \nGetThreadPriorityBoost:  Vista, Server 2003, XP SP1, XP, 2000,     NT 4  \nIsDebuggerPresent:       Vista, Server 2003, XP SP1, XP, 2000, ME, NT 4, 98   \nGetDiskFreeSpaceEx:      Vista, Server 2003, XP SP1, XP, 2000, ME, NT 4, 98, 95 OSR2  \nConnectNamedPipe:        Vista, Server 2003, XP SP1, XP, 2000,     NT 4,                 NT 3  \nBeep:                    Vista, Server 2003, XP SP1, XP, 2000, ME,       98, 95 OSR2, 95  \n</pre>\n\n<p>Writing the function to determine the real OS version is simple; just proceed from newest OS to oldest and use <a href="http://msdn.microsoft.com/en-us/library/ms683212.aspx" rel="noreferrer">GetProcAddress</a> to check exported APIs. Implementing this in any language should be trivial.</p>\n\n<p>The following code in Delphi was extracted from the free <a href="http://gp.17slon.com/gp/dsiwin32.htm" rel="noreferrer">DSiWin32</a> library):</p>\n\n<pre><code>TDSiWindowsVersion = (wvUnknown, wvWin31, wvWin95, wvWin95OSR2, wvWin98,\n  wvWin98SE, wvWinME, wvWin9x, wvWinNT3, wvWinNT4, wvWin2000, wvWinXP,\n  wvWinNT, wvWinServer2003, wvWinVista);\n\nfunction DSiGetWindowsVersion: TDSiWindowsVersion;\nvar\n  versionInfo: TOSVersionInfo;\nbegin\n  versionInfo.dwOSVersionInfoSize := SizeOf(versionInfo);\n  GetVersionEx(versionInfo);\n  Result := wvUnknown;\n  case versionInfo.dwPlatformID of\n    VER_PLATFORM_WIN32s: Result := wvWin31;\n    VER_PLATFORM_WIN32_WINDOWS:\n      case versionInfo.dwMinorVersion of\n        0:\n          if Trim(versionInfo.szCSDVersion[1]) = \'B\' then\n            Result := wvWin95OSR2\n          else\n            Result := wvWin95;\n        10:\n          if Trim(versionInfo.szCSDVersion[1]) = \'A\' then\n            Result := wvWin98SE\n          else\n            Result := wvWin98;\n        90:\n          if (versionInfo.dwBuildNumber = 73010104) then\n             Result := wvWinME;\n           else\n             Result := wvWin9x;\n      end; //case versionInfo.dwMinorVersion\n    VER_PLATFORM_WIN32_NT:\n      case versionInfo.dwMajorVersion of\n        3: Result := wvWinNT3;\n        4: Result := wvWinNT4;\n        5:\n          case versionInfo.dwMinorVersion of\n            0: Result := wvWin2000;\n            1: Result := wvWinXP;\n            2: Result := wvWinServer2003;\n            else Result := wvWinNT\n          end; //case versionInfo.dwMinorVersion\n        6: Result := wvWinVista;\n      end; //case versionInfo.dwMajorVersion\n    end; //versionInfo.dwPlatformID\nend; { DSiGetWindowsVersion }\n\nfunction DSiGetTrueWindowsVersion: TDSiWindowsVersion;\n\n  function ExportsAPI(module: HMODULE; const apiName: string): boolean;\n  begin\n    Result := GetProcAddress(module, PChar(apiName)) &lt;&gt; nil;\n  end; { ExportsAPI }\n\nvar\n  hKernel32: HMODULE;\n\nbegin { DSiGetTrueWindowsVersion }\n  hKernel32 := GetModuleHandle(\'kernel32\');\n  Win32Check(hKernel32 &lt;&gt; 0);\n  if ExportsAPI(hKernel32, \'GetLocaleInfoEx\') then\n    Result := wvWinVista\n  else if ExportsAPI(hKernel32, \'GetLargePageMinimum\') then\n    Result := wvWinServer2003\n  else if ExportsAPI(hKernel32, \'GetNativeSystemInfo\') then\n    Result := wvWinXP\n  else if ExportsAPI(hKernel32, \'ReplaceFile\') then\n    Result := wvWin2000\n  else if ExportsAPI(hKernel32, \'OpenThread\') then\n    Result := wvWinME\n  else if ExportsAPI(hKernel32, \'GetThreadPriorityBoost\') then\n    Result := wvWinNT4\n  else if ExportsAPI(hKernel32, \'IsDebuggerPresent\') then  //is also in NT4!\n    Result := wvWin98\n  else if ExportsAPI(hKernel32, \'GetDiskFreeSpaceEx\') then  //is also in NT4!\n    Result := wvWin95OSR2\n  else if ExportsAPI(hKernel32, \'ConnectNamedPipe\') then\n    Result := wvWinNT3\n  else if ExportsAPI(hKernel32, \'Beep\') then\n    Result := wvWin95\n  else // we have no idea\n    Result := DSiGetWindowsVersion;\nend; { DSiGetTrueWindowsVersion }\n</code></pre>\n\n<p>--- updated 2009-10-09</p>\n\n<p>It turns out that it gets very hard to do an "undocumented" OS detection on Vista SP1 and higher. A look at the <a href="http://msdn.microsoft.com/en-us/library/aa383687(VS.85).aspx" rel="noreferrer">API changes</a> shows that all Windows 2008 functions are also implemented in Vista SP1 and that all Windows 7 functions are also implemented in Windows 2008 R2. Too bad :(</p>\n\n<p>--- end of update</p>\n\n<p>FWIW, this is a problem I encountered in practice. We (the company I work for) have a program that was not really Vista-ready when Vista was released (and some weeks after that ...). It was not working under the compatibility layer either. (Some DirectX problems. Don\'t ask.)</p>\n\n<p>We didn\'t want too-smart-for-their-own-good users to run this app on Vista at all - compatibility mode or not - so I had to find a solution (a guy smarter than me pointed me into right direction; the stuff above is not my brainchild). Now I\'m posting it for your pleasure and to help all poor souls that will have to solve this problem in the future. Google, please index this article!</p>\n\n<p>If you have a better solution (or an upgrade and/or fix for mine), please post an answer here ...</p>\n'}, {'answer_id': 57156, 'author': 'botismarius', 'author_id': 4528, 'author_profile': 'https://Stackoverflow.com/users/4528', 'pm_score': 4, 'selected': False, 'text': '<p>How about obtaining the version of a system file?</p>\n\n<p>The best file would be kernel32.dll, located in %WINDIR%\\System32\\kernel32.dll.</p>\n\n<p>There are APIs to obtain the file version. eg: I\'m using Windows XP -> "5.1.2600.5512 (xpsp.080413-2111)"</p>\n'}, {'answer_id': 57326, 'author': 'botismarius', 'author_id': 4528, 'author_profile': 'https://Stackoverflow.com/users/4528', 'pm_score': 3, 'selected': False, 'text': '<p>Another solution:</p>\n\n<p>read the following registry entry:</p>\n\n<pre><code>HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProductName\n</code></pre>\n\n<p>or other keys from</p>\n\n<pre><code>HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\n</code></pre>\n'}, {'answer_id': 8123929, 'author': 'Warren  P', 'author_id': 84704, 'author_profile': 'https://Stackoverflow.com/users/84704', 'pm_score': 1, 'selected': False, 'text': '<p><strong>Note:</strong> Gabr is asking about an approach that can bypass the limitations of <code>GetVersionEx</code>.  JCL code uses GetVersionEx, and is thus subject to  compatibility layer.  This information is for people who don\'t need to bypass the compatibility layer, only.</p>\n\n<p>Using the Jedi JCL, you can add unit JclSysInfo, and call function <code>GetWindowsVersion</code>. It returns an enumerated type TWindowsVersion.</p>\n\n<p>Currently JCL contains all shipped windows versions, and gets changed each time Microsoft ships a new version of Windows in a box:</p>\n\n<pre><code>  TWindowsVersion =\n   (wvUnknown, wvWin95, wvWin95OSR2, wvWin98, wvWin98SE, wvWinME,\n    wvWinNT31, wvWinNT35, wvWinNT351, wvWinNT4, wvWin2000, wvWinXP,\n    wvWin2003, wvWinXP64, wvWin2003R2, wvWinVista, wvWinServer2008,\n    wvWin7, wvWinServer2008R2);\n</code></pre>\n\n<p>If you want to know if you\'re running 64-bit windows 7 instead of 32-bit, then call <code>JclSysInfo.IsWindows64</code>.</p>\n\n<p>Note that JCL allso handles Editions, like Pro, Ultimate, etc. For that call GetWindowsEdition, and it returns one of these:</p>\n\n<pre><code>TWindowsEdition =\n   (weUnknown, weWinXPHome, weWinXPPro, weWinXPHomeN, weWinXPProN, weWinXPHomeK,\n    weWinXPProK, weWinXPHomeKN, weWinXPProKN, weWinXPStarter, weWinXPMediaCenter,\n    weWinXPTablet, weWinVistaStarter, weWinVistaHomeBasic, weWinVistaHomeBasicN,\n    weWinVistaHomePremium, weWinVistaBusiness, weWinVistaBusinessN,\n    weWinVistaEnterprise, weWinVistaUltimate, weWin7Starter, weWin7HomeBasic,\n    weWin7HomePremium, weWin7Professional, weWin7Enterprise, weWin7Ultimate);\n</code></pre>\n\n<p>For historical interest, you can check the NT-level edition too with the NtProductType function, it returns:</p>\n\n<pre><code> TNtProductType =\xa0 \xa0 \xa0 \xa0(ptUnknown, ptWorkStation, ptServer, ptAdvancedServer,\xa0 \xa0 \xa0 \xa0 \n        ptPersonal, ptProfessional, ptDatacenterServer, \n        ptEnterprise, ptWebEdition);\n</code></pre>\n\n<p>Note that "N editions" are detected above. That\'s an EU (Europe) version of Windows, created due to EU anti-trust regulations.  That\'s a pretty fine gradation of detection inside the JCL.</p>\n\n<p>Here\'s a sample function  that will help you detect Vista, and do something special when on Vista.</p>\n\n<pre><code>function IsSupported:Boolean;\nbegin\n  case GetWindowsVersion of\n     wvVista:  result := false; \n    else\n      result := true;\n  end;\nend;\n</code></pre>\n\n<p>Note that if you want to do "greater than" checking, then you should just use other techniques.  Also note that version checking can often be a source of future breakage. I have usually chosen to warn users and continue, so that my binary code doesn\'t become the actual source of breakage in the future.</p>\n\n<p>Recently I tried to install an app, and the installer checked my drive free space, and would not install, because I had more than 2 gigabytes of free space. The 32 bit integer  signed value in the installer became negative, breaking the installer.  I had to install it into a VM to get it to work.  Adding "smart code" often makes your app "stupider". Be wary.</p>\n\n<p>Incidentally, I found that from the command line, you can run WMIC.exe, and type <code>path Win32_OperatingSystem</code> (The "Select * from Win32_OperatingSystem" didn\'t work for me).  In future perhaps JCL could be extended to use the WMI information.</p>\n'}, {'answer_id': 24345510, 'author': 'Victor Fedorenkov', 'author_id': 3763602, 'author_profile': 'https://Stackoverflow.com/users/3763602', 'pm_score': 3, 'selected': False, 'text': '<p>real version store on PEB block of process information.</p>\n\n<p>Sample for Win32 app (Delphi Code)</p>\n\n<p></p>\n\n<pre><code>unit RealWindowsVerUnit;\n\ninterface\n\nuses\n  Windows;\n\nvar\n  //Real version Windows\n  Win32MajorVersionReal: Integer;\n  Win32MinorVersionReal: Integer;\n\nimplementation\n\ntype\n  PPEB=^PEB;\n  PEB = record\n    InheritedAddressSpace: Boolean;\n    ReadImageFileExecOptions: Boolean;\n    BeingDebugged: Boolean;\n    Spare: Boolean;\n    Mutant: Cardinal;\n    ImageBaseAddress: Pointer;\n    LoaderData: Pointer;\n    ProcessParameters: Pointer; //PRTL_USER_PROCESS_PARAMETERS;\n    SubSystemData: Pointer;\n    ProcessHeap: Pointer;\n    FastPebLock: Pointer;\n    FastPebLockRoutine: Pointer;\n    FastPebUnlockRoutine: Pointer;\n    EnvironmentUpdateCount: Cardinal;\n    KernelCallbackTable: PPointer;\n    EventLogSection: Pointer;\n    EventLog: Pointer;\n    FreeList: Pointer; //PPEB_FREE_BLOCK;\n    TlsExpansionCounter: Cardinal;\n    TlsBitmap: Pointer;\n    TlsBitmapBits: array[0..1] of Cardinal;\n    ReadOnlySharedMemoryBase: Pointer;\n    ReadOnlySharedMemoryHeap: Pointer;\n    ReadOnlyStaticServerData: PPointer;\n    AnsiCodePageData: Pointer;\n    OemCodePageData: Pointer;\n    UnicodeCaseTableData: Pointer;\n    NumberOfProcessors: Cardinal;\n    NtGlobalFlag: Cardinal;\n    Spare2: array[0..3] of Byte;\n    CriticalSectionTimeout: LARGE_INTEGER;\n    HeapSegmentReserve: Cardinal;\n    HeapSegmentCommit: Cardinal;\n    HeapDeCommitTotalFreeThreshold: Cardinal;\n    HeapDeCommitFreeBlockThreshold: Cardinal;\n    NumberOfHeaps: Cardinal;\n    MaximumNumberOfHeaps: Cardinal;\n    ProcessHeaps: Pointer;\n    GdiSharedHandleTable: Pointer;\n    ProcessStarterHelper: Pointer;\n    GdiDCAttributeList: Pointer;\n    LoaderLock: Pointer;\n    OSMajorVersion: Cardinal;\n    OSMinorVersion: Cardinal;\n    OSBuildNumber: Cardinal;\n    OSPlatformId: Cardinal;\n    ImageSubSystem: Cardinal;\n    ImageSubSystemMajorVersion: Cardinal;\n    ImageSubSystemMinorVersion: Cardinal;\n    GdiHandleBuffer: array [0..33] of Cardinal;\n    PostProcessInitRoutine: Cardinal;\n    TlsExpansionBitmap: Cardinal;\n    TlsExpansionBitmapBits: array [0..127] of Byte;\n    SessionId: Cardinal;\n  end;\n\n//Get PEB block current win32 process\nfunction GetPDB: PPEB; stdcall;\nasm\n  MOV EAX, DWORD PTR FS:[30h]\nend;\n\ninitialization\n  //Detect true windows wersion\n  Win32MajorVersionReal := GetPDB^.OSMajorVersion;\n  Win32MinorVersionReal := GetPDB^.OSMinorVersion;\nend.\n</code></pre>\n\n<p></p>\n'}, {'answer_id': 31755501, 'author': 'FredS', 'author_id': 5042682, 'author_profile': 'https://Stackoverflow.com/users/5042682', 'pm_score': 1, 'selected': False, 'text': '<p>Essentially to answer duplicate Q: <a href="https://stackoverflow.com/questions/31753092/getting-os-major-minor-and-build-versions-for-windows-8-1-and-up-in-delphi-200">Getting OS major, minor, and build versions for Windows 8.1 and up in Delphi 2007</a></p>\n\n<p>Starting with W2K you can use <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa370624%28v=vs.85%29.aspx" rel="nofollow noreferrer">NetServerGetInfo</a>. NetServerGetInfo returns the correct info on W7 and W8.1, unable to test on W10..</p>\n\n<pre><code>function GetWinVersion: string;\nvar\n  Buffer: PServerInfo101;\nbegin\n  Buffer := nil;\n  if NetServerGetInfo(nil, 101, Pointer(Buffer)) = NO_ERROR then\n  try\n     Result := &lt;Build You Version String here&gt;(\n      Buffer.sv101_version_major,\n      Buffer.sv101_version_minor,\n      VER_PLATFORM_WIN32_NT // Save since minimum support begins in W2K\n      );\n  finally\n    NetApiBufferFree(Buffer);\n  end;\nend;\n</code></pre>\n'}, {'answer_id': 31756711, 'author': 'Remy Lebeau', 'author_id': 65863, 'author_profile': 'https://Stackoverflow.com/users/65863', 'pm_score': 3, 'selected': False, 'text': "<p>The following works for me in Windows 10 without the Windows 10 GUID listed in the application manifest:</p>\n\n<pre><code>uses\n  System.SysUtils, Winapi.Windows;\n\ntype\n  NET_API_STATUS = DWORD;\n\n  _SERVER_INFO_101 = record\n    sv101_platform_id: DWORD;\n    sv101_name: LPWSTR;\n    sv101_version_major: DWORD;\n    sv101_version_minor: DWORD;\n    sv101_type: DWORD;\n    sv101_comment: LPWSTR;\n  end;\n  SERVER_INFO_101 = _SERVER_INFO_101;\n  PSERVER_INFO_101 = ^SERVER_INFO_101;\n  LPSERVER_INFO_101 = PSERVER_INFO_101;\n\nconst\n  MAJOR_VERSION_MASK = $0F;\n\nfunction NetServerGetInfo(servername: LPWSTR; level: DWORD; var bufptr): NET_API_STATUS; stdcall; external 'Netapi32.dll';\nfunction NetApiBufferFree(Buffer: LPVOID): NET_API_STATUS; stdcall; external 'Netapi32.dll';\n\ntype\n  pfnRtlGetVersion = function(var RTL_OSVERSIONINFOEXW): LONG; stdcall;\nvar\n  Buffer: PSERVER_INFO_101;\n  ver: RTL_OSVERSIONINFOEXW;\n  RtlGetVersion: pfnRtlGetVersion;\nbegin\n  Buffer := nil;\n\n  // Win32MajorVersion and Win32MinorVersion are populated from GetVersionEx()...\n  ShowMessage(Format('GetVersionEx: %d.%d', [Win32MajorVersion, Win32MinorVersion])); // shows 6.2, as expected per GetVersionEx() documentation\n\n  @RtlGetVersion := GetProcAddress(GetModuleHandle('ntdll.dll'), 'RtlGetVersion');\n  if Assigned(RtlGetVersion) then\n  begin\n    ZeroMemory(@ver, SizeOf(ver));\n    ver.dwOSVersionInfoSize := SizeOf(ver);\n\n    if RtlGetVersion(ver) = 0 then\n      ShowMessage(Format('RtlGetVersion: %d.%d', [ver.dwMajorVersion, ver.dwMinorVersion])); // shows 10.0\n  end;\n\n  if NetServerGetInfo(nil, 101, Buffer) = NO_ERROR then\n  try\n    ShowMessage(Format('NetServerGetInfo: %d.%d', [Buffer.sv101_version_major and MAJOR_VERSION_MASK, Buffer.sv101_version_minor])); // shows 10.0\n  finally\n    NetApiBufferFree(Buffer);\n  end;\nend.\n</code></pre>\n\n<p><strong>Update</strong>: <code>NetWkstaGetInfo()</code> would probably also work, similar to 'NetServerGetInfo()`, but I have not try it yet.</p>\n"}, {'answer_id': 31764902, 'author': 'Ivry Gates', 'author_id': 5181214, 'author_profile': 'https://Stackoverflow.com/users/5181214', 'pm_score': 1, 'selected': False, 'text': '<p>One note about using NetServerGetInfo(), which does work still on Windows 10 (10240.th1_st1)...</p>\n\n<p><a href="https://msdn.microsoft.com/en-us/library/windows/desktop/aa370903%28v=vs.85%29.aspx" rel="nofollow">https://msdn.microsoft.com/en-us/library/windows/desktop/aa370903%28v=vs.85%29.aspx</a></p>\n\n<blockquote>\n  <p>sv101_version_major</p>\n  \n  <p>The major version number and the server type.</p>\n  \n  <p>The major release version number of the operating system is specified\n  in the least significant 4 bits. The server type is specified in the\n  most significant 4 bits. The MAJOR_VERSION_MASK bitmask defined in the\n  Lmserver.h header {0x0F} should be used by an application to obtain\n  the major version number from this member.</p>\n</blockquote>\n\n<p>In other words, (sv101_version_major &amp; MAJOR_VERSION_MASK).</p>\n'}]
['https://Stackoverflow.com/questions/57124', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/4997/']