By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
438,646 Members | 2,063 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 438,646 IT Pros & Developers. It's quick & easy.

vb script with alternate credential

P: 14
Can anyone help me with this this to run under alternate credentials. What would be proper syntax for that. pls explain and show me how if you can.

Expand|Select|Wrap|Line Numbers
  1. Set GetWMIRegProvider=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & StrLine & "\root\default:StdRegProv")
  2.  
Thanks
Nov 13 '06 #1
Share this Question
Share on Google+
3 Replies


sashi
Expert 100+
P: 1,754
Can anyone help me with this this to run under alternate credentials. What would be proper syntax for that. pls explain and show me how if you can.

Expand|Select|Wrap|Line Numbers
  1. Set GetWMIRegProvider=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & StrLine & "\root\default:StdRegProv")
  2.  
Thanks
Hi there,

Am not trying to be rude here, pls explain to me on how are you come up with such a line of code without properly understanding / uncertain about syntax? Are you copying it from somewhere on the net?
Nov 13 '06 #2

P: 14
Hi Sashi,
Well, I have a scripts that collect the remote computer monitor information remotely but it only works now if you log on to a machine with administrator and if the remote machine and local machine has same administrator password. The script is too long, thats why i could not paste it here. But I will now in two separate post. pls have a look.
First Half
Expand|Select|Wrap|Line Numbers
  1. Const DISPLAY_REGKEY="HKLM\SYSTEM\CurrentControlSet\Enum\DISPLAY\"
  2.  
  3. Const DEBUGFILE="NUL"
  4.  
  5. Const DEBUGMODE=0
  6.  
  7. CompName  = Trim(inputbox("Enter name or IP address of local or remote computer"))
  8.  
  9. Set objArgs = WScript.Arguments
  10.  
  11. Set objFS = CreateObject("Scripting.FileSystemObject")
  12. Set objNewFile = objFS.CreateTextFile("monitor_Output.txt")
  13.  
  14. DebugOut "Execution Started " & cstr(now)
  15.  
  16. '------------------------------------------------------------------------
  17. GetMonitorInfo() 'just write the output to screen
  18. DebugOut "Execution Completed " & cstr(now)
  19.  
  20.  
  21. Function GetMonitorInfo()
  22. debugout "Getting all display devices"
  23. arrAllDisplays=GetAllDisplayDevicesInReg()
  24. debugout "Filtering display devices to monitors"
  25. arrAllMonitors=GetAllMonitorsFromAllDisplays(arrAllDisplays)
  26. debugout "Filtering monitors to active monitors"
  27. arrActiveMonitors=GetActiveMonitorsFromAllMonitors(arrAllMonitors)
  28. if ubound(arrActiveMonitors)=0 and arrActiveMonitors(0)="{ERROR}" then
  29. debugout "No active monitors found"
  30. strFormattedMonitorInfo="[Monitor_1]" & vbcrlf & "Monitor=Not Found" & vbcrlf & vbcrlf
  31. else
  32. debugout "Found active monitors"
  33. debugout "Retrieving EDID for all active monitors"
  34. arrActiveEDID=GetEDIDFromActiveMonitors(arrActiveMonitors)
  35. debugout "Parsing EDID/Windows data"
  36. arrParsedMonitorInfo=GetParsedMonitorInfo(arrActiveEDID,arrActiveMonitors)
  37. debugout "Formatting parsed data"
  38. strFormattedMonitorInfo=GetFormattedMonitorInfo(arrParsedMonitorInfo)
  39. end if
  40. debugout "Data retrieval completed"
  41. GetMonitorInfo=strFormattedMonitorInfo
  42. end function
  43.  
  44. Function GetFormattedMonitorInfo(arrParsedMonitorInfo)
  45. for tmpctr=0 to ubound(arrParsedMonitorInfo)
  46. tmpResult=split(arrParsedMonitorInfo(tmpctr),"|||")
  47. tmpOutput=tmpOutput & CompName & " monitor"  & vbcrlf & vbcrlf 
  48. tmpOutput=tmpOutput & "ManufacturerID = " & tmpResult(1) & vbcrlf
  49. tmpOutput=tmpOutput & "ManufactureDate = " & tmpResult(2) & vbcrlf
  50. tmpOutput=tmpOutput & "SerialNumber = " & tmpResult(0) & vbcrlf
  51. tmpOutput=tmpOutput & "ModelName = " & tmpResult(4) & vbcrlf
  52. next
  53. GetFormattedMonitorInfo=tmpOutput
  54. objNewFile.WriteLine CompName & " monitor"  & vbcrlf & vbcrlf
  55. objNewFile.WriteLine "ManufacturerID = " & tmpResult(1) & vbcrlf
  56. objNewFile.WriteLine "ManufactureDate = " & tmpResult(2) & vbcrlf
  57. objNewFile.WriteLine "SerialNumber = " & tmpResult(0) & vbcrlf
  58. objNewFile.WriteLine "ModelName = " & tmpResult(4) & vbcrlf
  59. Set objShell = Wscript.Createobject("Wscript.Shell")
  60. objShell.Run "monitor_output.txt"
  61. End Function
  62.  
  63. Function GetAllDisplayDevicesInReg()
  64. dim arrResult()
  65. redim arrResult(0)
  66. intArrResultIndex=-1
  67. arrtmpkeys=RegEnumKeys(DISPLAY_REGKEY)
  68. if vartype(arrtmpkeys)<>8204 then
  69. arrResult(0)="{ERROR}"
  70. GetAllDisplayDevicesInReg=false
  71. debugout "Display=Can't enum subkeys of display regkey"
  72. else
  73. for tmpctr=0 to ubound(arrtmpkeys)
  74. arrtmpkeys2=RegEnumKeys(DISPLAY_REGKEY & arrtmpkeys(tmpctr))
  75. for tmpctr2 = 0 to ubound(arrtmpkeys2)
  76. intArrResultIndex=intArrResultIndex+1
  77. redim preserve arrResult(intArrResultIndex)
  78. arrResult(intArrResultIndex)=DISPLAY_REGKEY & arrtmpkeys(tmpctr) & "\" & arrtmpkeys2(tmpctr2)
  79. debugout "Display=" & arrResult(intArrResultIndex)
  80. next 
  81. next
  82. end if
  83. GetAllDisplayDevicesInReg=arrResult
  84. End Function
  85.  
  86. Function GetAllMonitorsFromAllDisplays(arrRegKeys)
  87. dim arrResult()
  88. redim arrResult(0)
  89. intArrResultIndex=-1
  90. for tmpctr=0 to ubound(arrRegKeys)
  91. if IsDisplayDeviceAMonitor(arrRegKeys(tmpctr)) then
  92. intArrResultIndex=intArrResultIndex+1
  93. redim preserve arrResult(intArrResultIndex)
  94. arrResult(intArrResultIndex)=arrRegKeys(tmpctr)
  95. debugout "Monitor=" & arrResult(intArrResultIndex)
  96. end if
  97. next
  98. if intArrResultIndex=-1 then
  99. arrResult(0)="{ERROR}"
  100. debugout "Monitor=Unable to locate any monitors"
  101. end if
  102. GetAllMonitorsFromAllDisplays=arrResult
  103. End Function
  104.  
  105. Function IsDisplayDeviceAMonitor(strDisplayRegKey)
  106. arrtmpResult=RegGetMultiStringValue(strDisplayRegKey,"HardwareID")
  107. strtmpResult="|||" & join(arrtmpResult,"|||") & "|||"
  108. if instr(lcase(strtmpResult),"|||monitor\")=0 then
  109. debugout "MonitorCheck='" & strDisplayRegKey & "'|||is not a monitor"
  110. IsDisplayDeviceAMonitor=false
  111. else
  112. debugout "MonitorCheck='" & strDisplayRegKey & "'|||is a monitor"
  113. IsDisplayDeviceAMonitor=true
  114. end if
  115. End Function
  116.  
  117. Function GetActiveMonitorsFromAllMonitors(arrRegKeys)
  118. dim arrResult()
  119. redim arrResult(0)
  120. intArrResultIndex=-1
  121. for tmpctr=0 to ubound(arrRegKeys)
  122. if IsMonitorActive(arrRegKeys(tmpctr)) then
  123. intArrResultIndex=intArrResultIndex+1
  124. redim preserve arrResult(intArrResultIndex)
  125. arrResult(intArrResultIndex)=arrRegKeys(tmpctr)
  126. debugout "ActiveMonitor=" & arrResult(intArrResultIndex)
  127. end if
  128. next
  129.  
  130. if intArrResultIndex=-1 then
  131. arrResult(0)="{ERROR}"
  132. debugout "ActiveMonitor=Unable to locate any active monitors"
  133. end if
  134. GetActiveMonitorsFromAllMonitors=arrResult
  135. End Function
  136.  
  137. Function IsMonitorActive(strMonitorRegKey)
  138. arrtmpResult=RegEnumKeys(strMonitorRegKey)
  139. strtmpResult="|||" & join(arrtmpResult,"|||") & "|||"
  140. if instr(lcase(strtmpResult),"|||control|||")=0 then
  141. debugout "ActiveMonitorCheck='" & strMonitorRegKey & "'|||is not active"
  142. IsMonitorActive=false
  143. else
  144. debugout "ActiveMonitorCheck='" & strMonitorRegKey & "'|||is active"
  145. IsMonitorActive=true
  146. end if
  147. End Function
  148.  
  149. Function GetEDIDFromActiveMonitors(arrRegKeys)
  150. dim arrResult()
  151. redim arrResult(0)
  152. intArrResultIndex=-1
  153. for tmpctr=0 to ubound(arrRegKeys)
  154. strtmpResult=GetEDIDForMonitor(arrRegKeys(tmpctr))
  155. intArrResultIndex=intArrResultIndex+1
  156. redim preserve arrResult(intArrResultIndex)
  157. arrResult(intArrResultIndex)=strtmpResult
  158. debugout "GETEDID=" & arrRegKeys(tmpctr) & "|||EDID,Yes"
  159. next
  160.  
  161. if intArrResultIndex=-1 then
  162. arrResult(0)="{ERROR}"
  163. debugout "EDID=Unable to retrieve any edid"
  164. end if
  165. GetEDIDFromActiveMonitors=arrResult
  166. End Function
  167.  
  168. Function GetEDIDForMonitor(strMonitorRegKey)
  169. arrtmpResult=RegGetBinaryValue(strMonitorRegKey & "\Device Parameters","EDID")
  170. if vartype(arrtmpResult) <> 8204 then
  171. debugout "GetEDID=No EDID Found|||" & strMonitorRegKey
  172. GetEDIDForMonitor="{ERROR}"
  173. else
  174. for each bytevalue in arrtmpResult
  175. strtmpResult=strtmpResult & chr(bytevalue)
  176. next
  177. debugout "GetEDID=EDID Found|||" & strMonitorRegKey
  178. debugout "GetEDID_Result=" & GetHexFromString(strtmpResult)
  179. GetEDIDForMonitor=strtmpResult
  180. end if
  181. End Function
  182.  
  183. Function GetHexFromString(strText)
  184. for tmpctr=1 to len(strText)
  185. tmpresult=tmpresult & right( "0" & hex(asc(mid(strText,tmpctr,1))),2) & ","
  186. next
  187. GetHexFromString=left(tmpresult,len(tmpresult)-1)
  188. End Function
  189.  
  190. Function GetParsedMonitorInfo(arrActiveEDID,arrActiveMonitors)
  191. dim arrResult()
  192. for tmpctr=0 to ubound(arrActiveEDID)
  193. strSerial=GetSerialFromEDID(arrActiveEDID(tmpctr))
  194. strMfg=GetMfgFromEDID(arrActiveEDID(tmpctr))
  195. strMfgDate=GetMfgDateFromEDID(arrActiveEDID(tmpctr))
  196. strDev=GetDevFromEDID(arrActiveEDID(tmpctr))
  197. strModel=GetModelFromEDID(arrActiveEDID(tmpctr))
  198. strEDIDVer=GetEDIDVerFromEDID(arrActiveEDID(tmpctr))
  199. strWinVesaID=GetWinVESAIDFromRegKey(arrActiveMonitors(tmpctr))
  200. strWinPNPID=GetWinPNPFromRegKey(arrActiveMonitors(tmpctr))
  201. redim preserve arrResult(tmpctr)
  202. arrResult(tmpctr)=arrResult(tmpctr) & strSerial & "|||"
  203. arrResult(tmpctr)=arrResult(tmpctr) & strMfg & "|||"
  204. arrResult(tmpctr)=arrResult(tmpctr) & strMfgDate & "|||"
  205. arrResult(tmpctr)=arrResult(tmpctr) & strDev & "|||"
  206. arrResult(tmpctr)=arrResult(tmpctr) & strModel & "|||"
  207. arrResult(tmpctr)=arrResult(tmpctr) & strEDIDVer & "|||"
  208. arrResult(tmpctr)=arrResult(tmpctr) & strWinVesaID & "|||"
  209. arrResult(tmpctr)=arrResult(tmpctr) & strWinPNPID
  210. debugout arrResult(tmpctr)
  211. next
  212. GetParsedMonitorInfo=arrResult
  213. End Function
  214.  
  215. Function GetWinVESAIDFromRegKey(strRegKey)
  216. if strRegKey="{ERROR}" then
  217. GetWinVESAIDFromRegKey="Bad Registry Info"
  218. exit function
  219. end if
  220. strtmpResult=right(strRegKey,len(strRegkey)-len(DISPLAY_REGKEY))
  221. strtmpResult=left(strtmpResult,instr(strtmpResult,"\")-1) 
  222. GetWinVESAIDFromRegKey=strtmpResult
  223. End Function
  224.  
  225. Function GetWinPNPFromRegKey(strRegKey)
  226. if strRegKey="{ERROR}" then
  227. GetWinPNPFromRegKey="Bad Registry Info"
  228. exit function
  229. end if 
  230. strtmpResult=right(strRegKey,len(strRegkey)-len(DISPLAY_REGKEY))
  231. strtmpResult=right(strtmpResult,len(strtmpResult)-instr(strtmpResult,"\"))
  232. GetWinPNPFromRegKey=strtmpResult
  233. End Function
  234.  
Nov 13 '06 #3

P: 14
Hi Sashi,
Here is the 2nd half

Expand|Select|Wrap|Line Numbers
  1. Function GetSerialFromEDID(strEDID)
  2. 'a serial number descriptor will start with &H00 00 00 ff
  3. strTag=chr(&H00) & chr(&H00) & chr(&H00) & chr(&Hff)
  4. GetSerialFromEDID=GetDescriptorBlockFromEDID(strEDID,strTag)
  5. End Function
  6.  
  7. Function GetModelFromEDID(strEDID)
  8.  
  9. strTag=chr(&H00) & chr(&H00) & chr(&H00) & chr(&Hfc)
  10. GetModelFromEDID=GetDescriptorBlockFromEDID(strEDID,strTag)
  11. End Function
  12.  
  13. Function GetDescriptorBlockFromEDID(strEDID,strTag)
  14. if strEDID="{ERROR}" then
  15. GetDescriptorBlockFromEDID="Bad EDID"
  16. exit function
  17. end if
  18.  
  19. dim arrDescriptorBlock(3)
  20. arrDescriptorBlock(0)=mid(strEDID,&H36+1,18)
  21. arrDescriptorBlock(1)=mid(strEDID,&H48+1,18)
  22. arrDescriptorBlock(2)=mid(strEDID,&H5a+1,18)
  23. arrDescriptorBlock(3)=mid(strEDID,&H6c+1,18)
  24.  
  25. if instr(arrDescriptorBlock(0),strTag)>0 then
  26. strFoundBlock=arrDescriptorBlock(0)
  27. elseif instr(arrDescriptorBlock(1),strTag)>0 then
  28. strFoundBlock=arrDescriptorBlock(1)
  29. elseif instr(arrDescriptorBlock(2),strTag)>0 then
  30. strFoundBlock=arrDescriptorBlock(2)
  31. elseif instr(arrDescriptorBlock(3),strTag)>0 then
  32. strFoundBlock=arrDescriptorBlock(3)
  33. else
  34. GetDescriptorBlockFromEDID="Not Present in EDID"
  35. exit function
  36. end if
  37.  
  38. strResult=right(strFoundBlock,14)
  39.  
  40. if instr(strResult,chr(&H0a))>0 then
  41. strResult=trim(left(strResult,instr(strResult,chr(&H0a))-1))
  42. else
  43. strResult=trim(strResult)
  44. end if
  45.  
  46. if left(strResult,1)=chr(0) then strResult=right(strResult,len(strResult)-1)
  47.  
  48. GetDescriptorBlockFromEDID=strResult
  49. End Function
  50.  
  51. Function GetMfgFromEDID(strEDID)
  52. if strEDID="{ERROR}" then
  53. GetMfgFromEDID="Bad EDID"
  54. exit function
  55. end if
  56.  
  57. tmpEDIDMfg=mid(strEDID,&H08+1,2) 
  58. Char1=0 : Char2=0 : Char3=0 
  59. Byte1=asc(left(tmpEDIDMfg,1)) 'get the first half of the string 
  60. Byte2=asc(right(tmpEDIDMfg,1)) 'get the first half of the string
  61.  
  62. if (Byte1 and 64) > 0 then Char1=Char1+16 
  63.  
  64. if (Byte1 and 32) > 0 then Char1=Char1+8 
  65.  
  66. if (Byte1 and 16) > 0 then Char1=Char1+4 
  67. if (Byte1 and 8) > 0 then Char1=Char1+2 
  68. if (Byte1 and 4) > 0 then Char1=Char1+1 
  69.  
  70. if (Byte1 and 2) > 0 then Char2=Char2+16 
  71. if (Byte1 and 1) > 0 then Char2=Char2+8 
  72.  
  73. if (Byte2 and 128) > 0 then Char2=Char2+4 
  74. if (Byte2 and 64) > 0 then Char2=Char2+2 
  75. if (Byte2 and 32) > 0 then Char2=Char2+1 
  76.  
  77. Char3=Char3+(Byte2 and 16) 
  78. Char3=Char3+(Byte2 and 8) 
  79. Char3=Char3+(Byte2 and 4) 
  80. Char3=Char3+(Byte2 and 2) 
  81. Char3=Char3+(Byte2 and 1) 
  82. tmpmfg=chr(Char1+64) & chr(Char2+64) & chr(Char3+64)
  83. GetMfgFromEDID=tmpmfg
  84. End Function
  85.  
  86. Function GetMfgDateFromEDID(strEDID)
  87. if strEDID="{ERROR}" then
  88. GetMfgDateFromEDID="Bad EDID"
  89. exit function
  90. end if
  91.  
  92. tmpmfgweek=asc(mid(strEDID,&H10+1,1))
  93.  
  94. tmpmfgyear=(asc(mid(strEDID,&H11+1,1)))+1990
  95.  
  96. tmpmdt=month(dateadd("ww",tmpmfgweek,datevalue("1/1/" & tmpmfgyear))) & "/" & tmpmfgyear
  97. GetMfgDateFromEDID=tmpmdt
  98. End Function
  99.  
  100. Function GetDevFromEDID(strEDID)
  101. if strEDID="{ERROR}" then
  102. GetDevFromEDID="Bad EDID"
  103. exit function
  104. end if
  105. tmpEDIDDev1=hex(asc(mid(strEDID,&H0a+1,1)))
  106. tmpEDIDDev2=hex(asc(mid(strEDID,&H0b+1,1)))
  107. if len(tmpEDIDDev1)=1 then tmpEDIDDev1="0" & tmpEDIDDev1
  108. if len(tmpEDIDDev2)=1 then tmpEDIDDev2="0" & tmpEDIDDev2
  109. tmpdev=tmpEDIDDev2 & tmpEDIDDev1
  110. GetDevFromEDID=tmpdev
  111. End Function
  112.  
  113. Function GetEDIDVerFromEDID(strEDID)
  114. if strEDID="{ERROR}" then
  115. GetEDIDVerFromEDID="Bad EDID"
  116. exit function
  117. end if
  118.  
  119. tmpEDIDMajorVer=asc(mid(strEDID,&H12+1,1))
  120.  
  121. tmpEDIDRev=asc(mid(strEDID,&H13+1,1))
  122.  
  123. tmpver=chr(48+tmpEDIDMajorVer) & "." & chr(48+tmpEDIDRev)
  124. GetEDIDVerFromEDID=tmpver
  125. End Function
  126.  
  127. Function RegEnumKeys(RegKey)
  128. hive=SetHive(RegKey)
  129. set objReg=GetWMIRegProvider(CompName)
  130. strKeyPath = right(RegKey,len(RegKey)-instr(RegKey,"\"))
  131. objReg.EnumKey Hive, strKeyPath, arrSubKeys
  132. RegEnumKeys=arrSubKeys
  133. End Function
  134.  
  135. Function RegGetStringValue(RegKey,RegValueName)
  136. hive=SetHive(RegKey)
  137. set objReg=GetWMIRegProvider(CompName)
  138. strKeyPath = right(RegKey,len(RegKey)-instr(RegKey,"\"))
  139. tmpreturn=objReg.GetStringValue(Hive, strKeyPath, RegValueName, RegValue)
  140. if tmpreturn=0 then
  141. RegGetStringValue=RegValue
  142. else
  143. RegGetStringValue="~{{}}~"
  144. end if
  145. End Function
  146.  
  147. Function RegGetMultiStringValue(RegKey,RegValueName)
  148. hive=SetHive(RegKey)
  149. set objReg=GetWMIRegProvider(CompName)
  150. strKeyPath = right(RegKey,len(RegKey)-instr(RegKey,"\"))
  151. tmpreturn=objReg.GetMultiStringValue(Hive, strKeyPath, RegValueName, RegValue)
  152. if tmpreturn=0 then
  153. RegGetMultiStringValue=RegValue
  154. else
  155. RegGetMultiStringValue="~{{}}~"
  156. end if
  157. End Function
  158.  
  159. Function RegGetBinaryValue(RegKey,RegValueName)
  160. hive=SetHive(RegKey)
  161. set objReg=GetWMIRegProvider(CompName)
  162. strKeyPath = right(RegKey,len(RegKey)-instr(RegKey,"\"))
  163. tmpreturn=objReg.GetBinaryValue(Hive, strKeyPath, RegValueName, RegValue)
  164. if tmpreturn=0 then
  165. RegGetBinaryValue=RegValue
  166. else
  167. RegGetBinaryValue="~{{}}~"
  168. end if
  169. End Function
  170.  
  171. On Error Resume Next
  172. Function GetWMIRegProvider(CompName)
  173.  
  174. Set GetWMIRegProvider=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & CompName & "\root\default:StdRegProv")
  175. End Function
  176.  
  177. Function SetHive(RegKey)
  178. HKEY_CLASSES_ROOT=&H80000000
  179. HKEY_CURRENT_USER=&H80000001
  180. HKEY_CURRENT_CONFIG=&H80000005
  181. HKEY_LOCAL_MACHINE=&H80000002
  182. HKEY_USERS=&H80000003
  183. strHive=left(RegKey,instr(RegKey,"\"))
  184. if strHive="HKCR\" or strHive="HKR\" then SetHive=HKEY_CLASSES_ROOT
  185. if strHive="HKCU\" then SetHive=HKEY_CURRENT_USER
  186. if strHive="HKCC\" then SetHive=HKEY_CURRENT_CONFIG
  187. if strHive="HKLM\" then SetHive=HKEY_LOCAL_MACHINE
  188. if strHive="HKU\" then SetHive=HKEY_USERS
  189. End Function
  190.  
  191. Sub Pause
  192. set objStdin=wscript.stdin
  193. set objStdout=wscript.stdout
  194. objStdout.write "Press ENTER to continue..."
  195. strtmp=objStdin.readline
  196. end Sub
  197.  
  198. Sub DebugOut(strDebugInfo)
  199. if DEBUGMODE=0 then exit sub
  200. strCurrScriptHost=lcase(right(wscript.fullname,len(wscript.fullname)-len(wscript.path)-1))
  201. if strCurrScriptHost="cscript.exe" then wscript.echo "Debug: " & strDebugInfo
  202. AppendFileMode=8
  203. set objDebugFSO=CreateObject("Scripting.FileSystemObject")
  204. set objDebugStream=objDebugFSO.OpenTextFile(DEBUGFILE,AppendFileMode,True,False)
  205. objDebugStream.writeline strDebugInfo
  206. objDebugStream.Close
  207. set objDebugStream=Nothing
  208. set objDebugFSO=Nothing
  209. End Sub
  210.  
Nov 13 '06 #4

Post your reply

Sign in to post your reply or Sign up for a free account.