require 5.006; use strict; use warnings 'all'; use Tk 800.005; use Tk::TList; use Tk::Table; use Tk::Frame; use Tk::DirTree; use Tk::Adjuster; use Tk::Scrollbar; use Tk::DropSite; use Tk::DragDrop; use File::Find; use OLE; use Win32; use Win32::ODBC; use Win32::Perms; use Win32::NetAdmin; use Win32::AdminMisc; use Win32::FileSecurity; use Win32::NetResource; use Win32API::File; # $tk{widget_refs}, $dr{data_refs}, $im{image_refs} use vars qw/%tk %dr %im @global_groups @local_groups $counter $dnd_token1 $dnd_token2 $dnd_token3/; $counter = 0; $dr{domain} = 'MyDomain'; sub GetServer{ if (Win32::NetResource::GetUNCName(my $unc, $dr{path})){ $unc =~ m/^\\\\([^\\]+)\\/; $dr{server} = uc $1;} else{ $dr{server} = Win32::NodeName(); }} sub DragStart { my($token) = @_; my $w = $token->parent; # $w is the source listbox my $e = $w->XEvent; my $idx = $w->GetNearest($e->x, $e->y); # get the listbox entry under cursor if (defined $idx) { # Configure the dnd token to show the listbox entry $token->configure(-text => $w->entrycget($idx, '-text') ); # Show the token my($X, $Y) = ($e->X, $e->Y); $token->MoveToplevelWindow($X, $Y); $token->raise; $token->deiconify; $token->FindSite($X, $Y, $e); }} sub DropUserOnGroup{ my ($lb, $dnd_source) = @_; my $usr_item = $dnd_source->cget('-text'); # figure out where in the group listbox the drop occurred my $y = $lb->pointery - $lb->rooty; my $x = $lb->pointerx - $lb->rootx; my $nearest = $lb->nearest($x,$y); if (defined $nearest) { my $ggrp_item = $lb->entrycget($nearest, '-text'); my $rsp =Win32::MsgBox("Adding User to Global Group,\n\n\nUser: '$usr_item'\n\nTo\n\nGlobal Group: '$ggrp_item'\n", 0x00000004|0x00000020|0x00001000, "Group ACE permission"); &AddUserToGroup($usr_item, $ggrp_item) if (0x06==$rsp); $lb->see($nearest);} else{ Win32::MsgBox("Try again",0x00000000|0x00000040|0x00000000,"Drop failure");}} sub GetPerms{ my $path = $tk{dir_tree}->selectionGet(); &ShowPathInfo($path);} #sub GetUser{ #my $usr = $tk{output_list}-> curselection(); #print "\nSelected user '$usr'\n";} # This method is bound to the 'enter' key so that we can update # the path information from the entry widget. sub OnNewPath { $tk{dir_tree}-> delete('all'); $tk{dir_tree}->chdir( $dr{path} ); &ShowPathInfo( $dr{path} ); GetServer($dr{path}); $tk{localgroup_list}-> delete('0',"$counter"); @local_groups = (); Win32::AdminMisc::GetGroups("\\\\" . "$dr{server}", GROUP_TYPE_LOCAL, \ @local_groups) || die "\n$^E\n"; $counter = $#local_groups; $tk{localgroup_list}-> delete('0.1',"$counter"); map {$tk{localgroup_list}->insert('end', -itemtype=>'imagetext', -text=>"$_", -image=>$im{lgrp}) } @local_groups;} sub ShowPathInfo{ my ($path) = @_; my %perms; print "Path: $path \n"; $dr{perms} = "Permisssions: $path"; $tk{output_list}-> delete('0.1','end'); $tk{output_list}-> insert('end', -itemtype=> 'text', -text=> "***YOU CAN ONLY DRAG USER NOT GROUPS***\tPath [$path]"); Win32::FileSecurity::Get($path, \ %perms) || warn "\n$^E : $!\n"; while (my ($ACL_owner, $mask)= each %perms) { print "\n$ACL_owner $dr{pdc}\n"; $ACL_owner =~ s{.+\\}{}; Win32::FileSecurity::EnumerateRights($mask, \ my @perms) || warn "\n$^E : $!\n"; #my $rights = $perms[$#perms]; #my $desc = "$&" . $ACL_owner ."\t\t\tEnum Rights: " . $rights; if (Win32::NetAdmin::UsersExist("\\\\" . $dr{pdc}, $ACL_owner)) { $tk{output_list}->insert('end', -itemtype=> 'imagetext', -text=> $ACL_owner, -image=> $im{usr});} else{ if ($& =~ /RABOUK/i){ $tk{output_list}->insert('end', -itemtype=> 'imagetext', -text=> $ACL_owner, -image=> $im{ggrp});} else{ $tk{output_list}->insert('end', -itemtype=> 'imagetext', -text=> $ACL_owner, -image=> $im{lgrp});}}}} sub AddUserToGroup { my ($usr, $grp) = @_; my $result = Win32::NetAdmin::GroupAddUsers("\\\\"."londcn0001", $grp, $usr); if ($result){ my $msg = ("Account: '$usr' was added to: '$grp'"); Win32::MsgBox($msg,0x00000000|0x00000040|0x00000000,"Operation Successful");} else{ my $error = ("Failed to add '$usr' to '$grp'\n\n***PLEASE CONTACT THE ADMINISTRATOR***\n"); Win32::MsgBox($error,0x00000000|0x00000040|0x00000000,"Operation Failed");} print "\n$usr, $grp\n";} if (Win32::NetAdmin::GetDomainController('', $dr{domain}, my $pdc)){ $pdc =~ m/^\\\\([^\\]+)/; $dr{pdc} = uc $1; my $msg = "Accessing Domain Controller $dr{pdc} for domain $dr{domain}"; my $lngth = "*" x length $msg; print "\n\n\t$msg\n\t$lngth\n";} $dr{path} = "C:\\"; $dr{server} = GetServer($dr{path}); $dr{perms} = "Permissions " . $dr{path}; $tk{mw} = MainWindow->new(-background => 'white'); $tk{mw}->geometry('950x800'); $tk{top_frame} = $tk{mw}-> Frame; $tk{left_frame} = $tk{mw}-> Frame; $tk{adjuster} = $tk{mw}-> Adjuster(-widget=> $tk{left_frame}, -side=> 'left'); $tk{right_frame} = $tk{mw}-> Frame; $tk{bottom_frame} = $tk{mw}-> Frame; $tk{entry_box_label} = $tk{top_frame}-> Label(-text=> "Path: "); $tk{entry_box} = $tk{top_frame}-> Entry(-textvariable=> \ $dr{path}); $tk{dir_tree_label} = $tk{left_frame}-> Label(-textvariable=> \ $dr{server}); $tk{dir_tree} = $tk{left_frame}-> Scrolled('DirTree', -height=> '0', -width=> '0', -scrollbars=>'e',); $tk{output_label} = $tk{right_frame}->Label(-textvariable => \$dr{perms}); $tk{output_list} = $tk{right_frame}->Scrolled('TList', -height=>'1', -width=>'1', -scrollbars=>'osoe',); $tk{globalgroup_label} = $tk{right_frame}-> Label(-text=> "Global Groups List [ Domain: " . $dr{domain} . ", PDC: " . $dr{pdc} . " ]"); $tk{globalgroup_list} = $tk{right_frame}-> Scrolled('TList', -height=> '1', -width=> '1', -scrollbars=> 'osoe',); $im{usr} = $tk{mw}->Photo(-file => 'c:/perl/usr.gif'); $im{lgrp} = $tk{mw}->Photo(-file => 'c:/perl/lgrp.gif'); $im{ggrp} = $tk{mw}->Photo(-file => 'c:/perl/ggrp.gif'); $tk{dir_tree}->bind('',sub {GetPerms();}); #I am having problem with the folowing line #$tk{output_list}->bind('',sub { my $tk{output_list}->selectionSet(); # my $selected_object = $tk{output_list}->get($indx);}); $tk{entry_box}->bind('',sub {OnNewPath();}); $tk{top_frame}-> pack(qw/-side top -fill x/); $tk{left_frame}-> pack(qw/-side left -fill y/); $tk{bottom_frame}-> pack(qw/-side bottom -fill x/); $tk{adjuster}-> pack(qw/-side left -fill y/); $tk{right_frame}-> pack(qw/-side right -fill both -expand 1/); $tk{entry_box_label}-> pack(qw/-side left -fill both/); $tk{entry_box}-> pack(qw/-side top -fill both -expand 1/); $tk{dir_tree_label}-> pack(qw/-side top -fill both/); $tk{dir_tree}-> pack(qw/-side left -fill both -expand 1/); $tk{output_label}->pack(qw/-side top -fill both/); $tk{output_list} ->pack(qw/-side top -fill both -expand 1/); $tk{globalgroup_label}-> pack(qw/-side top -fill both/); $tk{globalgroup_list}-> pack(qw/-side top -fill both -expand 1/); $dnd_token1 = $tk{output_list}->DragDrop (-event=> '', -sitetypes=> [qw/Local/], -startcommand=> \&DragStart,); $tk{globalgroup_list}->DropSite (-droptypes => [qw/Local/], -dropcommand => [\&DropUserOnGroup, $tk{globalgroup_list}, $dnd_token1 ], ); if (Win32::AdminMisc::GetGroups("\\\\" . "$dr{pdc}", GROUP_TYPE_GLOBAL, \ @global_groups)){ map {$tk{globalgroup_list}->insert('end', -itemtype=>'imagetext', -text=>"$_", -image=>$im{ggrp}) } @global_groups;} else{ die "\n$^E\n";} MainLoop; exit 0;