Sign in to follow this  
Followers 0
jelliott

Cannot automate visual studio 2010 install via AutoIt

16 posts in this topic

Hi Folks, new here and brand new to scripting in general. 

I have begun to make a script that will allow for an unattended installation of an addin my company is deploying. However, this executable has dependencies in its installer, and one is .NET. That part works fine. The Visual Studio part, however, when i insert a ControlClick command, it..... just doesnt do anything. I searched the forums and i didnt see anything about *installing* studio 2010 via AutoIt.

Thank you very much for anyone who can either point out an obvious blunder on my part or perhaps inform me as to why visual studio 2010 installer cant be controller by autoit.

Thanks!

 

#cs ----------------------------------------------------------------------------


 AutoIt Version: 3.3.8.1
 Author:         Josh Elliott


 Script Function:
Deploy NetSuite for Outlook Addin.


#ce ----------------------------------------------------------------------------


RunAs ( "myself", "domain", "password", 0, "\\\server\path\NetSuiteForOutlook.exe" )
WinWaitActive( "NetSuite for Outlook Installer")
ControlClick("NetSuite for Outlook Installer", "", 1000)
If RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Install", "1") Then 
   WinWaitActive("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup")
Else 
   WinWaitActive("Microsoft .NET Framework 4.0 - Client - Download")
   ControlClick("Microsoft .NET Framework 4.0 - Client - Download", "", 1012)
   WinWaitActive("Microsoft .NET Framework 4 Client Profile Setup")
   ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 104)
   ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 12324)
   ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 12325)
EndIf
;If RegRead (
   WinWaitActive("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup")
   Send("{Enter}")
   ;ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 29, 14)
   ;ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 285)
   ;ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 289)

 

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Why not just use Microsoft's documentation and create a silent install, so you're not having to ControlClick through it? The guide is for 2012, but works on 2010 as well.

 

http://msdn.microsoft.com/en-us/library/ee225237.aspx

Edited by JLogan3o13

√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

Thanks for your response! 

Apparently I can only make 8 more posts until the 3rd of August lol.

I do apologize, but I dont know fully what you mean. Do you mean create a second process that will install VS 2010 first and then run my script afterwards? Or is there a way to add a microsoft script into my autoit one? If thats the case, ill be sold :) 

Share this post


Link to post
Share on other sites

Basically, if you read through the post I linked to, you make your customizations and they get saved to an xml file. In your AutoIt script, you would then just call the execuatable. Something like this:

ShellExecute("\\server\share\vs_Product.exe", "/adminfile <path to xml> /quiet /norestart")

√-1 2^3 ∑ π, and it was delicious!

Share this post


Link to post
Share on other sites

Thanks! I will try that out and let you know :)

Share this post


Link to post
Share on other sites

I just figured out where the problem stems from, but i still don't know how to fix it. I made it pas everything, but when it came to do the NetSuite installer, it wont work either. So, I copied the controlclick code into a new script with nothing else in it and when the appropriate window was up, i ran the script and it clicked "next" for me! But in my script, it wont... I have no idea how to figure out why. Any help is greatly appreciated!

 

#cs ----------------------------------------------------------------------------


 AutoIt Version: 3.3.8.1
 Author:         Josh Elliott


 Script Function:
Deploy NetSuite for Outlook Addin.


#ce ----------------------------------------------------------------------------


RunAs ( "me", "domain", "secret", 0, "\\serverpath\NetSuiteForOutlook.exe" )
If RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\trin\Servicing\10.0\trir\1033", "1") Then 
   WinWaitActive( "NetSuite for Outlook Installer")
Else 
ShellExecute("\\serverpath\vstor40_x64.exe", "/adminfile <\\serverpath\gpo\netsuite.xml> /quiet /norestart")
WinWaitActive( "NetSuite for Outlook Installer")
EndIf


ControlClick("NetSuite for Outlook Installer", "", 1000)


If RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Install", "1") Then 
   WinWaitActive("NetSuite for Outlook Setup")
Else 
   WinWaitActive("Microsoft .NET Framework 4.0 - Client - Download")
   ControlClick("Microsoft .NET Framework 4.0 - Client - Download", "", 1012)
   WinWaitActive("Microsoft .NET Framework 4 Client Profile Setup")
   ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 104)
   ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 12324)
   ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 12325)
   WinWaitActive("NetSuite for Outlook Setup")
EndIf


ControlClick("NetSuite for Outlook Setup", "", 399)

Share this post


Link to post
Share on other sites

jelliott,

Your code is conditional based on use of If... so which ControlClick works and the state of .Net client installed is of concern? But rather then answering that question at present, I consider that your conditional logic may be the cause of your woes to first look at.

That registry location you posted is not what I have in registry and I have both v4 full and client of .Net installed.

Here is a test script I tested with.

; original attempt
If RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Install", "1") Then
    MsgBox(0, '1st', 'installed')
EndIf

; failure returns a string. success returns a double from this registry value. So I will cast the possible double to string to ensure a string comparison
If String(RegRead("HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client\1033", "Install")) = "1" Then
    MsgBox(0, '2nd', 'installed')
EndIf

I fail to see the 1st MsgBox yet I see the 2nd Msgbox. The 2nd attempt is with the information that I copied from my registry. The 1033 key is Locale ID for US language so it may be different depending on Locale ID set on another system.

This test shows that your original attempt with the registry path does the opposite behavior with RegRead then what my registry path does. I am not sure if that registry path that you are using is created during install and that it is removed at the end of the install. I do not use the software Network Suite For Outlook to know the behavior of the installation.

Share this post


Link to post
Share on other sites

When checking to determine whether or not a particular software application is installed, I think it's most reliable to check against Add/Remove Programs (WinXP) / Programs and Features (Vista and above):

  • HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
  • HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall - (For 32-bit software installations on a 64-bit OS)

These are what I always use.

Share this post


Link to post
Share on other sites

When checking to determine whether or not a particular software application is installed, I think it's most reliable to check against Add/Remove Programs (WinXP) / Programs and Features (Vista and above):

  • HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
  • HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall - (For 32-bit software installations on a 64-bit OS)

These are what I always use.

That didnt work for me at all :/

Share this post


Link to post
Share on other sites

jelliott,

That's the root of the registry keys that you'll need to begin searching for whether what you are looking for is installed. For instance, on my Win7 (64-bit) PC, here are the relevant registry values for the .NET Framework 4:

  • Microsoft .NET Framework 4 Extended = HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall{8E34682C-8118-31F1-BC4C-98CD9675E1C2}DisplayName (or DisplayVersion)
  • Microsoft .NET Framework 4 Client Profile = HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall{F5B09CFD-F0B2-36AF-8DF4-1DF6B63FC7B4}DisplayName (or DisplayVersion)

Does that make sense?

Share this post


Link to post
Share on other sites

Yes it does, and thank you. My problem might be with my regread function, since its not working at all. I tried yours and Mhz paths to .net and no luck. I tested it with a msgbox just to confirm it can read it and it cant. I wonder why?

If RegRead ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client\1033", "Install" = "1") Then 
MsgBox (4,"mybox","w00t")

Share this post


Link to post
Share on other sites

I think I'm going to just try "FileExists" instead of RegRead, any reasons why not?

Share this post


Link to post
Share on other sites

What OS and bitness are you testing this on? If WinXP or Win7 (32-bit), try this:

$Value = RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{8E34682C-8118-31F1-BC4C-98CD9675E1C2}", "DisplayName")
If @error = 0 Then
    MsgBox (0,"Installed?", $Value)
Else
    MsgBox(0, "Installed?", "Not installed")
EndIf

If you are running a 64-bit OS, try this:

$Value = RegRead("HKLM64\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{8E34682C-8118-31F1-BC4C-98CD9675E1C2}", "DisplayName")
If @error = 0 Then
    MsgBox (0,"Installed?", $Value)
Else
    MsgBox(0, "Installed?", "Not installed")
EndIf

Share this post


Link to post
Share on other sites

Actually, this is a more reliable way to verify, and how I usually do it...

Instead of:

If @error = 0 Then

I use:

If $Value = "Microsoft .NET Framework 4 Extended" Then

Of course, changing what you are specifically looking for per application name or version on the right-side of the equal sign (=).

1 person likes this

Share this post


Link to post
Share on other sites

 

Yes it does, and thank you. My problem might be with my regread function, since its not working at all. I tried yours and Mhz paths to .net and no luck. I tested it with a msgbox just to confirm it can read it and it cant. I wonder why?

If RegRead ("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client\1033", "Install" = "1") Then 
MsgBox (4,"mybox","w00t")

I am not going to test that as I know that the syntax is incorrect. The "1" is not part of the function parameter but a comparison value for testing with the function return value. Perhaps my adding String() initially confused you to change it  and to make this error.

So if you have .Net client installed then run this one line code in a script.

If RegRead("HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client", "Install") = "1" Then MsgBox(4, "mybox", "w00t")

The value of "install" is in the "Client" key as well as the "1033" key so use the "Client" key to avoid the concern of needing the Locale ID. My error for not seeing this before.

As an alternative to registry, you can use AdlibEnableRegister() to call a function periodically to see if the .Net Client windows exist and if exist then handle them with your ControlClicks.

You asked about a file test. Do you know of a file that is v4 .Net Client only? I am not sure if this could be reliable enough. As with attempts with reading the registry, you still have .Net Client windows showing. Sure, you seem to be reading the registry incorrect, but still the source of the problem is handling the unexpected windows. You make the choice, people are here to help you with your choice.

1 person likes this

Share this post


Link to post
Share on other sites

#16 ·  Posted (edited)

Wow, Ive learned alot in the past three days! (Still have a long ways to go though)

So I now have three scripts and they all work.... except for UAC!!!

I have read through all of the forum posts regarding UAC i could find, but none have worked for me. Permanently disabling UAC is not an option, any advice? My company is smaller and I am the only admin, so If I need to make any changes to our network to allow for AutoIT packages, ill do it! (besides permanently disable UAC ^_^ )

These are just a few of the things ive tried
#AutoIt3Wrapper_res_requestedExecutionLevel=HighestAvailable
RegWrite("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System", "EnableLUA", "REG_DWORD", "0")
#RequireAdmin
EnvSet("__COMPAT_LAYER", "RunAsInvoker")

And here are my scripts:

vs2010

RunAs ( "", ", "", 1, "\\Applications\vstor40_x64.exe" )
WinWaitActive ("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup")
ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 289)
ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 285)
ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 289)
ControlClick("Microsoft Visual Studio 2010 Tools for Office Runtime (x64) Setup", "", 2)

net4

RunAs ( "", "", "", 1, "\Applications\dotNetFx40_Client_x86_x64.exe" )
WinWaitActive("Microsoft .NET Framework 4 Client Profile Setup")
ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 104)
ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 12324)
ControlClick("Microsoft .NET Framework 4 Client Profile Setup", "", 12325)

NetSuite

RunAs ("", "", "", 1, "\\Applications\NetSuiteForOutlook.exe")
If Not FileExists ( "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\vbc.exe") Then
   Run ("\\Applications\net4.exe")
   ;MsgBox(0, "Error", "Please contact your Local IT to install .NET 4")
ElseIf Not FileExists ( "C:\Program Files\Common Files\Microsoft Shared\VSTO\10.0\Microsoft Visual Studio 2010 Tools for Office Runtime (x64)\install.exe") Then
   Run ("\\Applications\vs2010.exe")
   ;MsgBox(0, "Error", "Please contact your Local IT to install Visual Studio 2010")
ElseIf FileExists ( "C:\Program Files (x86)\NetSuite for Outlook\SD2Loader.exe") Then
   MsgBox(0, "Error", "Please contact your Local IT to uninstall Previous Version of NetSuite")
Else
WinWaitActive("NetSuite for Outlook Installer")
ControlClick("NetSuite for Outlook Installer", "", 1000)
WinWaitActive("NetSuite for Outlook Setup")
ControlClick("NetSuite for Outlook Setup", "", 399)
ControlClick("NetSuite for Outlook Setup", "", 459)
ControlClick("NetSuite for Outlook Setup", "", 399)
ControlClick("NetSuite for Outlook Setup", "", 370)
EndIf

 

Once again, thank you guys for your help, its truly been invaluable.

Edit: I forgot to mention why UAC is a problem here. I am on my machine, logged in as domain admin making these changes and my machine has uac disabled, therefore, when i hit f5 to test the script, it all goes smoothly. If I log onto a different machine with domain admin, it doesnt work because uac is enabled, but does work when i disable it. and it certainly doesnt work as a standard user with uac on.

Edited by jelliott

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0