# Kod ponownie uruchamia usug, zatrzymujc najpierw wszystkie
# zalene od niej usugi, a nastpnie j sam.
# W dalszej kolejnoci uaktywniana jest usuga, a nastpnie 
# wszystkie usugi od niej zalene

use Win32::OLE qw(in);
$Win32::OLE::Warn = 3;

use strict;

# ------ KONFIGURACJA SKRYPTU ------
my $strComputer = '.'; # np. fs-rtp01
my $strSvcName = '<NazwaUsugi>'; # np. dnscache
# ------ KONIEC KONFIGURACJI ---------
my $objWMI = Win32::OLE->GetObject('winmgmts:\\\\' . $strComputer . '\\root\\cimv2');
my $objService = $objWMI->Get('Win32_Service.Name=\'' . $strSvcName . '\'');

print 'Ponowne uruchamianie usugi ' . $objService->Name . '...', "\n";
RecursiveServiceStop($objService);
RecursiveServiceStart($objService);
print "Operacja ponownego uruchamiania usugi zostaa zakoczona powodzeniem.\n";

sub RecursiveServiceStop {
    my($objSvc) = @_;

    my $colServices;
    $colServices = $objWMI->ExecQuery('Associators of ' . '{Win32_Service.Name=\'' . $objSvc->Name . '\'} Where ' . 'AssocClass=Win32_DependentService Role=Antecedent');
    my $objS;
    foreach my $objS (in $colServices) {
        RecursiveServiceStop($objS);
    }

    my $intRC;
    $intRC = $objSvc->StopService;
    select(undef, undef, undef, 5000 / 1000.0);
    # zatrzymywanie usugi potrwa 5 sekund
    if ($intRC > 0) {
        print ' Podczas zatrzymywania usugi wystpi bd: ' . $objSvc->Name, "\n";
        exit 0;
    }
    else {
        print ' Operacja zatrzymywania usugi zostaa zakoczona powodzeniem: ' . $objSvc->Name, "\n";
    }
}


sub RecursiveServiceStart {
    my($objSvc) = @_;

    my $intRC;
    $intRC = $objSvc->StartService;
    if ($intRC > 0) {
        print ' Podczas uruchamiania usugi wystpi bd: ' . $objSvc->Name, "\n";
        exit 0;
    }
    else {
        print ' Operacja uruchamiania usugi zostaa zakoczona powodzeniem: ' . $objSvc->Name, "\n";
    }

    my $colServices;
    $colServices = $objWMI->ExecQuery('Associators of ' . '{Win32_Service.Name=\'' . $objSvc->Name . '\'} Where ' . 'AssocClass=Win32_DependentService Role=Antecedent');
    my $objS;
    foreach my $objS (in $colServices) {
        RecursiveServiceStart($objS);
    }

}

