graybags Posted February 5, 2020 Share Posted February 5, 2020 Hi, At work we have to set up PC's a specific way, and to do that I've written an AutoIT script to automate it. Bearing in mind we have 2000+ users, it saves us alot of time. Anyway, one of the things we need to do is to enable "File and Printer sharing for Microsoft Networks", so that we can do various things remotely. The part of the script that does this, works fine. Or at least I thought it did. It used to use a command that would uninstall and reinstall the "File and Printer Sharing for MS Networks" (can't remember the command now) but that stopped working (at least here) in Windows 10. So I just wrote a very crude script that just automates the mouse clicks and key presses. It checks to see if the box is ticked by looking at the pixel colour at the center of the box. If it's ticked already, leave it alone, if it's not, tick it. Very basic, and there's probably a better way of writing it, I'm sure, but I understand it and it works. At least I thought it did, On desktops, it works perfectly, but I tried it on a laptop and for some reason, pixel colour is not the same as what it is on a desktop. Here's the script: #RequireAdmin AutoItSetOption( "MouseCoordMode",0 ) AutoItSetOption( "PixelCoordMode",0 ) Run ('control ncpa.cpl') WinWait ( "Network Connections") SEND ("{TAB 6}") ; Tab to Ethernet icon Sleep ( 500 ) SEND ("{DOWN}") ; Highlight the Ethernet icon Sleep ( 500 ) SEND ("+{F10}") ; Right-click it Sleep ( 500 ) SEND ("{DOWN 8}") ; Cursor down to Properties Sleep ( 500 ) SEND("{ENTER}") ; Click Properties Sleep ( 2000 ) SEND("{DOWN}") ; Cursor down to File and Printer Sharing for Microsoft Networks sleep ( 500 ) Local $iColor = PixelGetColor(42, 195) ; Get the colour of a pixel in the checkbox If $iColor = 16777215 Then ; If the colour is white the box isn't ticked, so carry on and tick it SEND("{SPACE}") Sleep ( 1000 ) SEND("{TAB 3}") Sleep ( 500 ) SEND("{SPACE}") Sleep ( 500 ) Send ( "!{F4}") Sleep(2000) Else Send ( "!{F4}") ; If the colour isn't white, then the box is already ticked, so ignore it and move on Sleep ( 500 ) Send ( "!{F4}") Sleep(2000) EndIf What have I done wrong? How can it work on a desktop PC and not a laptop? Is there a completely (and better way) to do what I'm trying to do above? Thanks in advance. Gray Link to comment Share on other sites More sharing options...
Nine Posted February 5, 2020 Share Posted February 5, 2020 Your approach is completely random. Each computer has its own configuration. Each OS has its specificity. Trying to get things done with keys and colors are doom to fail. You need to get this at the level of the Windows API. Whether you want to use WMi or other means, you need to figure out what you want to achieve, and script it with those tools. I know it is a huge change of programming strategy, but believe me it will pay off at the end. “They did not know it was impossible, so they did it” ― Mark Twain Spoiler Block all input without UAC Save/Retrieve Images to/from Text Monitor Management (VCP commands) Tool to search in text (au3) files Date Range Picker Virtual Desktop Manager Sudoku Game 2020 Overlapped Named Pipe IPC HotString 2.0 - Hot keys with string x64 Bitwise Operations Multi-keyboards HotKeySet Recursive Array Display Fast and simple WCD IPC Multiple Folders Selector Printer Manager GIF Animation (cached) Screen Scraping Multi-Threading Made Easy Link to comment Share on other sites More sharing options...
AdamUL Posted February 5, 2020 Share Posted February 5, 2020 (edited) Here is a function that I use to enable file and print sharing on Windows 7 and Windows 10 PC. #RequireAdmin #include <Constants.au3> #include <WinAPIFiles.au3> Global Const $sSystemDir = @WindowsDir & "\System32" ;@SystemDir returns @WindowsDir & "\SYSWOW64" with a 32 bit script. Func _EnableFileAndPrintSharing() ;Enable File and Print Sharing. ;Disable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then _WinAPI_Wow64EnableWow64FsRedirection(False) Local $iPIDNetsh = Run('netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes', $sSystemDir, @SW_HIDE, $STDERR_MERGED) ;Enable File and Print Sharing ;Enable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then _WinAPI_Wow64EnableWow64FsRedirection(True) ProcessWaitClose($iPIDNetsh) Local $sNetshOutput = StringStripWS(StdoutRead($iPIDNetsh), $STR_STRIPLEADING + $STR_STRIPTRAILING) If StringRegExp($sNetshOutput, "Updated \d+ rule\(s\)\.\s*Ok\.") Then Return True Return SetError(1, 0, False) EndFunc ;==>_EnableFileAndPrintSharing Adam Edited February 6, 2020 by AdamUL Updated missing includes and constant. Subz 1 Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 9 hours ago, Nine said: Your approach is completely random. Each computer has its own configuration. Each OS has its specificity. Trying to get things done with keys and colors are doom to fail. You need to get this at the level of the Windows API. Whether you want to use WMi or other means, you need to figure out what you want to achieve, and script it with those tools. I know it is a huge change of programming strategy, but believe me it will pay off at the end. It might be random, but my method has worked for many years that I've worked there. We only use Dells, and the Windows are configured identically across all hardware. I really don't have the time to learn other "programming strategies" unfortunately. I'm not a programmer, and I have to support over 120 different systems to keep a huge production plant running. Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 9 hours ago, AdamUL said: Here is a function that I use to enable file and print sharing on Windows 7 and Windows 10 PC. Func _EnableFileAndPrintSharing() ;Enable File and Print Sharing. ;Disable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then _WinAPI_Wow64EnableWow64FsRedirection(False) Local $iPIDNetsh = Run('netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes', $sSystemDir, @SW_HIDE, $STDERR_MERGED) ;Enable File and Print Sharing ;Enable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then _WinAPI_Wow64EnableWow64FsRedirection(True) ProcessWaitClose($iPIDNetsh) Local $sNetshOutput = StringStripWS(StdoutRead($iPIDNetsh), $STR_STRIPLEADING + $STR_STRIPTRAILING) If StringRegExp($sNetshOutput, "Updated \d+ rule\(s\)\.\s*Ok\.") Then Return True Return SetError(1, 0, False) EndFunc ;==>_EnableFileAndPrintSharing Adam I couldn't get that script to work, it came up with all kinds of undefined errors. I'm pretty sure the "netsh" command was the one that no longer works on our PC's though. And will that script actually tick the box next to "File and printer sharing for Microsoft networks" in the Ethernet settings? That's what I need to tick, what we do doesn't work without it. Link to comment Share on other sites More sharing options...
water Posted February 6, 2020 Share Posted February 6, 2020 The function does not automate the GUI ("tick the box"), it uses a command to do the settings. Can you please post the script you run and the error messages you get? My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 5 minutes ago, water said: The function does not automate the GUI ("tick the box"), it uses a command to do the settings. Can you please post the script you run and the error messages you get? I literally just ran the function shown, I'm no expert with AutoIT so I just expected that to be enough Link to comment Share on other sites More sharing options...
water Posted February 6, 2020 Share Posted February 6, 2020 You need to add some include files and define the undefined variable. I added the corresponding lines: ; #RequireAdmin ; <== Maybe you need to activate this statement #include <Array.au3> #include <WinAPIFiles.au3> _EnableFileAndPrintSharing() Exit Func _EnableFileAndPrintSharing() ;Enable File and Print Sharing. Local $sSystemDir = @SystemDir ; <== Added as $sSystemDir is undefined ;Disable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then _WinAPI_Wow64EnableWow64FsRedirection(False) Local $iPIDNetsh = Run('netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes', $sSystemDir, @SW_HIDE, $STDERR_MERGED) ;Enable File and Print Sharing ;Enable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then _WinAPI_Wow64EnableWow64FsRedirection(True) ProcessWaitClose($iPIDNetsh) Local $sNetshOutput = StringStripWS(StdoutRead($iPIDNetsh), $STR_STRIPLEADING + $STR_STRIPTRAILING) If StringRegExp($sNetshOutput, "Updated \d+ rule\(s\)\.\s*Ok\.") Then Return True Return SetError(1, 0, False) EndFunc ;==>_EnableFileAndPrintSharing My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 (edited) Excellent thank you. I've ran it, and the script runs now, but it's still not clicking the box. I'm at home now so I can't test this at work, but I'm pretty sure in the tests I've done, unl;ess that box is ticked, copying files etc. across our network just doesn't work. Edited February 6, 2020 by graybags Link to comment Share on other sites More sharing options...
water Posted February 6, 2020 Share Posted February 6, 2020 Let's add some error checking (untested): ; #RequireAdmin ; <== Maybe you need to activate this statement #include <Array.au3> #include <WinAPIFiles.au3> Local $bRuleSet = _EnableFileAndPrintSharing() MsgBox(0, "Result", "Return value: " & $bRuleSet & @CRLF & "@error: " & @error) Exit ; @error = 1: Update of the rule didn't work ; @error = 2: _WinAPI_Wow64EnableWow64FsRedirection(False) didn't work ; @error = 3: _WinAPI_Wow64EnableWow64FsRedirection(True) didn't work Func _EnableFileAndPrintSharing() ;Enable File and Print Sharing. Local $sSystemDir = @SystemDir ; <== Added as $sSystemDir is undefined Local $bResult ;Disable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then If _WinAPI_Wow64EnableWow64FsRedirection(False) = False Then Return SetError(2, 0, False) Endif Local $iPIDNetsh = Run('netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes', $sSystemDir, @SW_HIDE, $STDERR_MERGED) ;Enable File and Print Sharing ;Enable x86 redirection mechanism for a 32-bit script. If @OSArch = "X64" And Not @AutoItX64 Then If _WinAPI_Wow64EnableWow64FsRedirection(True) = False Then Return SetError(3, 0, False) Endif ProcessWaitClose($iPIDNetsh) Local $sNetshOutput = StringStripWS(StdoutRead($iPIDNetsh), $STR_STRIPLEADING + $STR_STRIPTRAILING) If StringRegExp($sNetshOutput, "Updated \d+ rule\(s\)\.\s*Ok\.") Then Return True Return SetError(1, 0, False) EndFunc ;==>_EnableFileAndPrintSharing My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
water Posted February 6, 2020 Share Posted February 6, 2020 BTW: When posting please do not click on the quote button (we know what we have written ) but simply add your text at the end of the thread. My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 Ouch! OK Return value: False @error: 1 Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 If I make the #RequireAdmin active, the script runs with no errors, but the box remains unticked. Link to comment Share on other sites More sharing options...
water Posted February 6, 2020 Share Posted February 6, 2020 Could you please open a cmd prompt and run Quote netsh advfirewall firewall show rule "File and Printer Sharing" My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 I'm not at work, but here at home it says: No rules match the specified criteria. Link to comment Share on other sites More sharing options...
water Posted February 6, 2020 Share Posted February 6, 2020 You could list all rules, pipe them to a file and then check for the correct rule: Quote netsh advfirewall firewall show rule name=all > C:\temp\rules.txt When I list all rules I get more than one for "File and Printer Sharing" (my system is german so I get "Datei- und Druckerfreigabe") My UDFs and Tutorials: Spoiler UDFs: Active Directory (NEW 2024-07-28 - Version 1.6.3.0) - Download - General Help & Support - Example Scripts - Wiki ExcelChart (2017-07-21 - Version 0.4.0.1) - Download - General Help & Support - Example Scripts OutlookEX (2021-11-16 - Version 1.7.0.0) - Download - General Help & Support - Example Scripts - Wiki OutlookEX_GUI (2021-04-13 - Version 1.4.0.0) - Download Outlook Tools (2019-07-22 - Version 0.6.0.0) - Download - General Help & Support - Wiki PowerPoint (2021-08-31 - Version 1.5.0.0) - Download - General Help & Support - Example Scripts - Wiki Task Scheduler (2022-07-28 - Version 1.6.0.1) - Download - General Help & Support - Wiki Standard UDFs: Excel - Example Scripts - Wiki Word - Wiki Tutorials: ADO - Wiki WebDriver - Wiki Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 Wow, I get a file with 7000+ lines, and LOADS of name with different "File and Printer Sharing". Which do I want, and what do I do with when I know? Link to comment Share on other sites More sharing options...
AdamUL Posted February 6, 2020 Share Posted February 6, 2020 @graybags I have updated my code above. Sorry about that, I copied it from a larger script without using Au3Check, and missed adding the additional code. Adam Link to comment Share on other sites More sharing options...
graybags Posted February 6, 2020 Author Share Posted February 6, 2020 @AdamUL - thanks. I tried your edited script and it runs, but it still doesn't tick the box. Link to comment Share on other sites More sharing options...
AdamUL Posted February 6, 2020 Share Posted February 6, 2020 (edited) Have you rebooted the machine after running it, or logging out and back in again? Also, have you tried connecting to the PC from another PC? Adam Edited February 6, 2020 by AdamUL Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now