Quantumation Posted March 6, 2016 Posted March 6, 2016 (edited) expandcollapse popup#include <AD.au3> #include <Array.au3> ;~ GUI INCLUDES #include <GuiEdit.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= Global $Form1_1 = GUICreate("Get Managers", 592, 516, -1, -1) Global $Edit1 = GUICtrlCreateEdit("", 16, 112, 177, 361) GUICtrlSetData(-1, "") Global $Edit2 = GUICtrlCreateEdit("", 200, 112, 385, 177) GUICtrlSetData(-1, "") Global $Label1 = GUICtrlCreateLabel("GROUP NAMES", 16, 88, 135, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Label2 = GUICtrlCreateLabel("Group Name - Manager Names", 200, 88, 251, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Button1 = GUICtrlCreateButton("Get Managed By", 32, 52, 163, 31) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") Global $Button2 = GUICtrlCreateButton("Copy Automated", 456, 296, 99, 25) Global $Button3 = GUICtrlCreateButton("CLEAR ALL", 440, 24, 83, 25) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") Global $Label3 = GUICtrlCreateLabel("Created by - Clint Smith", 185, 480, 212, 24) GUICtrlSetFont(-1, 12, 800, 0, "Century") Global $Label4 = GUICtrlCreateLabel("Enter group names with no leading spaces", 16, 8, 244, 17) GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif") Global $Label5 = GUICtrlCreateLabel("Each Group name should be on its own line", 16, 32, 250, 17) GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif") Global $Edit4 = GUICtrlCreateEdit("", 200, 328, 385, 145) GUICtrlSetData(-1, "") Global $Label8 = GUICtrlCreateLabel("Automated Groups", 200, 304, 156, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Button4 = GUICtrlCreateButton("Copy All Output", 464, 80, 99, 25) Global $Label9 = GUICtrlCreateLabel("This will Clear all boxes", 328, 32, 112, 17) Global $Label6 = GUICtrlCreateLabel("Input", 160, 88, 28, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 GetManBy() Case $Button3 EndSwitch WEnd Func GetManBy() Local $dispname[0] Local $groupnames = StringSplit(GUICtrlRead($Edit1), @CR) _ArrayDisplay($groupnames) _AD_Open() If @error Then Exit MsgBox(16, "Active Directory", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) For $i = 1 To $groupnames[0] $GRPname = _AD_GetObjectProperties($groupnames[$i], "displayname") If $GRPname = @error Then Return MsgBox(16, "Group Not Found", $groupnames[$i] & " was not found") $info = _AD_GetObjectProperties($groupnames[$i], "info") Global $Managedby = _AD_GetObjectProperties($groupnames[$i], "managedBy,msExchCoManagedByLink") If $Managedby = @error Then MsgBox(1, "No Manager for group", $groupnames[$i] & " - Has no managers") EndIf _ArrayDisplay($Managedby) For $f = 1 To $Managedby[0][0] _ArrayDisplay($Managedby) ;~ Here is the problem below. $add = _AD_FQDNToDisplayname($Managedby[$f][1]) _ArrayAdd($dispname, $add, 0) Next $Managers = _ArrayToString($dispname, ",") $str = StringInStr($info[1][1], "automated") If $str = 0 Then GUICtrlSetData($Edit2, $GRPname & " - " & $Managers & @CRLF) ElseIf $str > 0 Then GUICtrlSetData($Edit4, $GRPname & " - Automated Group" & @CRLF) EndIf Next _AD_Close() EndFunc ;==>GetManBy I have two groups that i created with all the correct properties to make sure this script has data in all fields. Basically i'm trying to run a for look inside a for loop and the loops aren't playing well together for some reason. Can anyone help? Below is the error I get when i try to run this script. "C:\Users\casmith\Documents\Autoit Scripts\GetManAndCoMan.au3" (72) : ==> Subscript used on non-accessible variable.: For $f = 1 To $Managedby[0][0] For $f = 1 To $Managedby^ ERROR ->04:00:21 AutoIt3.exe ended.rc:1 +>04:00:21 AutoIt3Wrapper Finished. >Exit code: 1 Time: 10.42 Edited March 6, 2016 by Quantumation added proper error
AutoBert Posted March 6, 2016 Posted March 6, 2016 Extend your script by inserting some debuglines: ConsoleWrite('$Managedby[0][0]=' & $Managedby[0][0] & @CRLF) For $f = 1 To $Managedby[0][0] ConsoleWrite($f & ': ' & $Managedby[$f][1] & @CRLF) _ArrayDisplay($Managedby) ;~ Here is the problem below. $add = _AD_FQDNToDisplayname($Managedby[$f][1]) ConsoleWrite($add&@TAB&@error&' '&@extended) _ArrayAdd($dispname, $add); the column is only in 2D necesarry: , 0) Next The console output will help to find and solve the problem.
Quantumation Posted March 6, 2016 Author Posted March 6, 2016 @AutoBert Thank you, here is what i received but as i look through it i'm not quite sure why it's stopping there. --> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop $Managedby[0][0]=4 1: CN=Clint Smith,OU=Service Desk Clint Smith 0 02: CN=Tony Alzola,OU=Service Desk Tony Alzola 0 03: CN=Ryan McIntosh,OU=Service Desk Ryan McIntosh 0 04: CN=Kody Courter,OU=Service Desk Kody Courter 0 0"C:\Users\casmith\Documents\Autoit Scripts\GetManAndCoMan.au3" (72) : ==> Subscript used on non-accessible variable.: ConsoleWrite('$Managedby[0][0]=' & $Managedby[0][0] & @CRLF) ConsoleWrite('$Managedby[0][0]=' & $Managedby^ ERROR ->04:10:46 AutoIt3.exe ended.rc:1 +>04:10:46 AutoIt3Wrapper Finished. >Exit code: 1 Time: 27.05 It seems to me that when the Second loop happens for the $i loop it doesn't have anything in the $Managedby[0][0] variable. Is there something missing that's needed for nesting For loops?
AutoBert Posted March 6, 2016 Posted March 6, 2016 The 2. loop is currently starting in groups with no managers. So you have to change like this: expandcollapse popup#include <AD.au3> #include <Array.au3> ;~ GUI INCLUDES #include <GuiEdit.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= Global $Form1_1 = GUICreate("Get Managers", 592, 516, -1, -1) Global $Edit1 = GUICtrlCreateEdit("", 16, 112, 177, 361) GUICtrlSetData(-1, "") Global $Edit2 = GUICtrlCreateEdit("", 200, 112, 385, 177) GUICtrlSetData(-1, "") Global $Label1 = GUICtrlCreateLabel("GROUP NAMES", 16, 88, 135, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Label2 = GUICtrlCreateLabel("Group Name - Manager Names", 200, 88, 251, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Button1 = GUICtrlCreateButton("Get Managed By", 32, 52, 163, 31) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") Global $Button2 = GUICtrlCreateButton("Copy Automated", 456, 296, 99, 25) Global $Button3 = GUICtrlCreateButton("CLEAR ALL", 440, 24, 83, 25) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") Global $Label3 = GUICtrlCreateLabel("Created by - Clint Smith", 185, 480, 212, 24) GUICtrlSetFont(-1, 12, 800, 0, "Century") Global $Label4 = GUICtrlCreateLabel("Enter group names with no leading spaces", 16, 8, 244, 17) GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif") Global $Label5 = GUICtrlCreateLabel("Each Group name should be on its own line", 16, 32, 250, 17) GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif") Global $Edit4 = GUICtrlCreateEdit("", 200, 328, 385, 145) GUICtrlSetData(-1, "") Global $Label8 = GUICtrlCreateLabel("Automated Groups", 200, 304, 156, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Button4 = GUICtrlCreateButton("Copy All Output", 464, 80, 99, 25) Global $Label9 = GUICtrlCreateLabel("This will Clear all boxes", 328, 32, 112, 17) Global $Label6 = GUICtrlCreateLabel("Input", 160, 88, 28, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 GetManBy() Case $Button3 EndSwitch WEnd Func GetManBy() Local $dispname[0] Local $groupnames = StringSplit(GUICtrlRead($Edit1), @CR) _ArrayDisplay($groupnames) _AD_Open() If @error Then Exit MsgBox(16, "Active Directory", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) For $i = 1 To $groupnames[0] $GRPname = _AD_GetObjectProperties($groupnames[$i], "displayname") If $GRPname = @error Then Return MsgBox(16, "Group Not Found", $groupnames[$i] & " was not found") $info = _AD_GetObjectProperties($groupnames[$i], "info") Global $Managedby = _AD_GetObjectProperties($groupnames[$i], "managedBy,msExchCoManagedByLink") If $Managedby = @error Then MsgBox(1, "No Manager for group", $groupnames[$i] & " - Has no managers") ;EndIf ;deleted by autoBert Else ;inserted by autoBert _ArrayDisplay($Managedby) ConsoleWrite('$Managedby[0][0]=' & $Managedby[0][0] & @CRLF) For $f = 1 To $Managedby[0][0] ConsoleWrite($f & ': ' & $Managedby[$f][1] & @CRLF) _ArrayDisplay($Managedby) ;~ Here is the problem below. $add = _AD_FQDNToDisplayname($Managedby[$f][1]) ConsoleWrite($add & @TAB & @error & ' ' & @extended) _ArrayAdd($dispname, $add); the column is only in 2D necesarry: , 0) Next EndIf ;inserted by autoBert may be must be moved befor 91) Next $Managers = _ArrayToString($dispname, ",") $str = StringInStr($info[1][1], "automated") If $str = 0 Then GUICtrlSetData($Edit2, $GRPname & " - " & $Managers & @CRLF) ElseIf $str > 0 Then GUICtrlSetData($Edit4, $GRPname & " - Automated Group" & @CRLF) EndIf Next _AD_Close() EndFunc ;==>GetManBy
Quantumation Posted March 6, 2016 Author Posted March 6, 2016 Thank you for your quick replies @AutoBert Unfortunately that code still produces the same error. --> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop $Managedby[0][0]=4 1: CN=Clint Smith,OU=Service Desk Clint Smith 0 02: CN=Tony Alzola,OU=Service Desk Tony Alzola 0 03: CN=Ryan McIntosh,OU=Service Desk, Ryan McIntosh 0 04: CN=Kody Courter,OU=Service Desk Kody Courter 0 0"C:\Users\casmith\Documents\Autoit Scripts\GetManAndCoMan.au3" (73) : ==> Subscript used on non-accessible variable.: ConsoleWrite('$Managedby[0][0]=' & $Managedby[0][0] & @CRLF) ConsoleWrite('$Managedby[0][0]=' & $Managedby^ ERROR ->04:45:06 AutoIt3.exe ended.rc:1 +>04:45:06 AutoIt3Wrapper Finished. >Exit code: 1 Time: 4.911 It's as though the 2nd loop just wants to keep going even after it's met its threshold. It hits 4 but then it does one more and I can't figure out why. i've tested the second loop in a different script all by itself and it works just fine. #include <AD.au3> #include <Array.au3> _AD_Open() Global $Managedby = _AD_GetObjectProperties("TESTGROUP1", "managedBy,msExchCoManagedByLink") Global $dispname[0] For $f = 1 To $Managedby[0][0] $add = _AD_FQDNToDisplayname($Managedby[$f][1]) _ArrayAdd($dispname, $add, 0) $strarray = _ArrayToString($dispname, ",") Next $strarray = _ArrayToString($dispname, ",") _AD_Close() ;~This works like a charm This one is really baffling.
Quantumation Posted March 6, 2016 Author Posted March 6, 2016 expandcollapse popup#include <AD.au3> #include <Array.au3> ;~ GUI INCLUDES #include <GuiEdit.au3> #include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #Region ### START Koda GUI section ### Form= Global $Form1_1 = GUICreate("Get Managers", 592, 516, -1, -1) Global $Edit1 = GUICtrlCreateEdit("", 16, 112, 177, 361) GUICtrlSetData(-1, "") Global $Edit2 = GUICtrlCreateEdit("", 200, 112, 385, 177) GUICtrlSetData(-1, "") Global $Label1 = GUICtrlCreateLabel("GROUP NAMES", 16, 88, 135, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Label2 = GUICtrlCreateLabel("Group Name - Manager Names", 200, 88, 251, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Button1 = GUICtrlCreateButton("Get Managed By", 32, 52, 163, 31) GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif") Global $Button2 = GUICtrlCreateButton("Copy Automated", 456, 296, 99, 25) Global $Button3 = GUICtrlCreateButton("CLEAR ALL", 440, 24, 83, 25) GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif") Global $Label3 = GUICtrlCreateLabel("Created by - Clint Smith", 185, 480, 212, 24) GUICtrlSetFont(-1, 12, 800, 0, "Century") Global $Label4 = GUICtrlCreateLabel("Enter group names with no leading spaces", 16, 8, 244, 17) GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif") Global $Label5 = GUICtrlCreateLabel("Each Group name should be on its own line", 16, 32, 250, 17) GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif") Global $Edit4 = GUICtrlCreateEdit("", 200, 328, 385, 145) GUICtrlSetData(-1, "") Global $Label8 = GUICtrlCreateLabel("Automated Groups", 200, 304, 156, 24) GUICtrlSetFont(-1, 12, 800, 4, "MS Sans Serif") Global $Button4 = GUICtrlCreateButton("Copy All Output", 464, 80, 99, 25) Global $Label9 = GUICtrlCreateLabel("This will Clear all boxes", 328, 32, 112, 17) Global $Label6 = GUICtrlCreateLabel("Input", 160, 88, 28, 17) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $Button1 GetManBy() Case $Button3 EndSwitch WEnd Func GetManBy() _AD_Open() Local $dispname[0] Local $groupnames = StringSplit(GUICtrlRead($Edit1), @CR) ;~ _ArrayDisplay($groupnames) If @error Then Exit MsgBox(16, "Active Directory", "Function _AD_Open encountered a problem. @error = " & @error & ", @extended = " & @extended) For $i = 1 To $groupnames[0] $GRPname = _AD_GetObjectProperties($groupnames[$i], "displayname") If $GRPname = @error Then Return MsgBox(16, "Group Not Found", $groupnames[$i] & " was not found") $info = _AD_GetObjectProperties($groupnames[$i], "info") Global $Managedby = _AD_GetObjectProperties($groupnames[$i], "managedBy,msExchCoManagedByLink") If $Managedby = @error Then MsgBox(1, "No Manager for group", $groupnames[$i] & " - Has no managers") ;~ EndIf Else ;~ _ArrayDisplay($Managedby) ConsoleWrite('$Managedby[0][0]=' & $Managedby[0][0] & @CRLF) For $f = 1 To $Managedby[0][0] ConsoleWrite($f & ': ' & $Managedby[$f][1] & @CRLF) _ArrayDisplay($Managedby) ;~ Here is the problem below. $add = _AD_FQDNToDisplayname($Managedby[$f][1]) ConsoleWrite($add & @TAB & @error & '||' & @extended) _ArrayAdd($dispname, $add) Next EndIf $Managers = _ArrayToString($dispname, ",") $str = StringInStr($info[1][1], "automated") If $str = 0 Then GUICtrlSetData($Edit2, $GRPname & " - " & $Managers & @CRLF) ElseIf $str > 0 Then GUICtrlSetData($Edit4, $GRPname & " - Automated Group" & @CRLF) EndIf Next _AD_Close() EndFunc ;==>GetManBy Just for reference here is the code i used with the last error I posted.
AutoBert Posted March 6, 2016 Posted March 6, 2016 Sorry, i was a little bit to quick. Changine line 68 to If @error Then should solve the problem. I have no AD so i can not test it myself.
Quantumation Posted March 6, 2016 Author Posted March 6, 2016 That got me past that error. But I'm so curious...........How? Why would that make such a difference?
Jfish Posted March 6, 2016 Posted March 6, 2016 (edited) I don't know this specific function for AD but it is probably because if there is no manager only the first value of the array 0 is created to show 0 results. Then your loop tries to access 1 as in "for 1 to ..." and there is no element in the array at that position so it throws the error. If wondering why the specific change made a difference then I think it is because the array did not have a value of @error. Instead, I think the @error flag was set. Edited March 6, 2016 by Jfish Build your own poker game with AutoIt: pokerlogic.au3 | Learn To Program Using FREE Tools with AutoIt
AutoBert Posted March 6, 2016 Posted March 6, 2016 (edited) I have no Ad so i don't know the returned value of _AD_GetObjectProperties. But fact is $Managedby is no Array in case no managers found. And usualy when a function don't give the ecpected result @error and @extended are used to show show the error occured. The other way for you to solve is to test if returned variable type is the excpeted: If Not IsArray($Managedby) Then MsgBox(1, "No Manager for group", $groupnames[$i] & " - Has no managers") ;~ EndIf Else ;~ _ArrayDisplay($Managedby) ConsoleWrite('$Managedby[0][0]=' & $Managedby[0][0] & @CRLF) ;..... Your try for errorchecking: If $Managedby = @error Then only works if _AD_GetObjectProperties sets in case of an error return value of >=1 instead of a array. As i saw you are using same (not working) method for errorchecking in line 65: If $GRPname = @error Then Return MsgBox(16, "Group Not Found", $groupnames[$i] & " was not found") you have to change it here also, may be in future a group with no displayname throw a error without (correct) handled. In line 66 you use _AD_GetObjectProperties without any errorhandling, this may cause also future problems. Edited March 6, 2016 by AutoBert
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