Uzun süre bilgisayarlarını kapatmayan kullanıcıların ekranına uyarı çıkartmak

Uzun süre bilgisayarlarını kapatmayan kullanıcıların ekranına uyarı çıkartmak

Kullanıcılar genelde bilgisayarlarını mesai bitiminde kapatmazlar. Bu bilgisayarları her gece uzaktan kapatabiliriz ama bu her kullanıcı için geçerli olmuyor bazen kullanıcılar mesaide yada evlerinde de çalışabiliyorlar. Birde rütbeli kullanıcılar var tabi.


Bilgisayarların her gece kapanması pek bir şey ifade etmiyor gibi gözükse de BT departmanını oldukça zor durumda bırakmakta.

Haftalık windows güncellemeleri,
Haftalık Anti virüs güncellemeleri,
Haftalık 3. taraf yazılımların güncellemeleri (Java, flash, chrome, Firefox, Adobe reader, Winrar, vb...)

Bilgisayarlar 20 -30 gün bırakın kapanmayı yeniden bile başlamıyor. Bu durum help desk departmanına arıza olarak düşmekte ve iş yükü getirmekte BT çalışanları her seferinde son kullanıcıya "kapat aç düzelir" demekten son kullanıcı da "sizde kapat aç demekten başka bir şey yapmıyorsunuz" demekten bıkmış durumda.
Birde işin güvenlik açığı tarafı var tabi ki.


Umarım konunun önemine dikkat çekebilmişimdir. Tabi birde işin her gece en az 500 bilgisayarın açık kalması sonucu elektrik israfı ve donanım yıpranması var ki bu konuya Türkiye'de hiç girmiyorum. Burası Türkiye sonuçta "Herkes nasılsa öleceğim" modunda yaşadığından bu konuları kimse önemsemez.

İşte bu durumda şu şekilde bir çözüm düşündük.

Kullanıcıların bilgisayarlarına uzaktan zamanlanmış görev göndererek 5 gün boyunca hiç yeniden başlamamış bilgisayarların ekranlarına popup çıkartarak bilgisayarını yeniden başlatana kadar her 5 dk'da bir bu şekilde taciz edebiliriz.

Ben comodo ITSM kullanarak son kullanıcıya script basmayı tercih ediyorum eğer bu yöntemi kullanacaksanız bu komutu ITSM'e yükleyip kullanıcıya göndermeniz yeterli. Boşluklara dikkat edin pyton dili buna kızıyor.

----------------------------------------------------------------------------------------------------------

vb_content ='''Dim ws
Set ws=CreateObject("WScript.Shell")
cmd="powershell -windowstyle hidden -nologo C:\ITSM1\itsm_1h.ps1"
ws.Run cmd, 0'''

ps_content='''

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

#Add-Content   "c:\Windows\Temp est.txt" "The End"

$reset = Get-WmiObject Win32_OperatingSystem | Select-Object CSName,LastBootUpTime

$rst = [Management.ManagementDateTimeConverter]::ToDateTime($reset.LastBootUpTime)
Write-Host $rst
$duration1 =  (New-TimeSpan -Start $rst -End (Get-Date )).TotalDays

#[System.Windows.Forms.MessageBox]::Show("deneme");
$duration = [int]$duration1

$Ertele=
{
  #[System.Windows.Forms.MessageBox]::Show("deneme");
 $Form.Close();
}
if ($duration -gt -1)
{
    $msg =  "Dikkat: $duration Gundur bilgisayarinizi kapatmiyorsunuz.
Lutfen bilgisayarinizi yeniden baslatiniz.
Bilgisayarinizi yeniden baslatana kadar bu mesaj her
1 dakikada bir ekraniniza cikacaktir.
Mesai bitiminde lutfen bilgisayarinizi kapatiniz.
---------------------------------
You haven't shut down your computer for $duration days.
Please restart your computer.
This message will appear every 1 minutes until you restart your computer.
Please turn off your computer after the end of work."



   $Form = New-Object system.Windows.Forms.Form
   $Form.TopMost = $True
   $Form.Text = " IT Service";
   $form.StartPosition = 1;
   $Form.FormBorderStyle = 0;
   $Form.ControlBox = 0;
   $Form.AutoSizeMode = 0;
   $Font = New-Object System.Drawing.Font("Arial",11,[System.Drawing.FontStyle]::Normal)

   $Image = [system.drawing.image]::FromFile("back.jpg")

   $Form.BackgroundImage = $Image

   $Form.BackgroundImageLayout = "None"

   $form.Size = New-Object System.Drawing.Size(600,285);


   $Label = New-Object System.Windows.Forms.Label
   $Label.Text = $msg;
   $Label.Font = $Font
   $Label.AutoSize = $True
   $Label.Location =  New-Object System.Drawing.Point(20,30);
   $Label.BackColor = "Transparent"
   $Form.Controls.Add($Label)
 
   $btn = New-Object System.Windows.Forms.Button
   $btn.Text = "1 dakika ertele / 1 minute skip ";
   $btn.Location =  New-Object System.Drawing.Point(270,230);
   $btn.Size =  New-Object System.Drawing.Size(300,32);
   $btn.Add_Click($Ertele);
   $Form.controls.add($btn);
   $Form.ShowDialog()
}

'''

import subprocess
import ctypes
import os

def ecmd(command):
    import ctypes
    from subprocess import PIPE, Popen
 
    class disable_file_system_redirection:
        _disable = ctypes.windll.kernel32.Wow64DisableWow64FsRedirection
        _revert = ctypes.windll.kernel32.Wow64RevertWow64FsRedirection
        def __enter__(self):
            self.old_value = ctypes.c_long()
            self.success = self._disable(ctypes.byref(self.old_value))
        def __exit__(self, type, value, traceback):
            if self.success:
                self._revert(self.old_value)
 
    with disable_file_system_redirection():
        obj = Popen(command, shell = True, stdout = PIPE, stderr = PIPE)
    out, err = obj.communicate()
    ret=obj.returncode
    if ret==0:
        if out:
            return out.strip()
        else:
            return ret
    else:
        if err:
            return err.strip()
        else:
            return ret

folder ='c:\ITSM1'

file_name='itsm_1h.ps1'
vbfile = 'itsm_1h.vbs'

ecmd ('mkdir %s'%folder)

ecmd (r'copy \\10.1.1.1\Source\logoUyariSilmeyin.jpg %s\back.jpg /y'%folder)

# os.environ['TEMP']
file_path=os.path.join(folder, file_name)
with open(file_path, 'wb') as wr:
    wr.write(ps_content)

vb_path=os.path.join(folder, vbfile)
with open(vb_path, 'wb') as wr:
    wr.write(vb_content)

ecmd('powershell "Set-ExecutionPolicy RemoteSigned" -Force')
#print ecmd('powershell "%s"'%file_path)

# ecmd('schtasks /create /RU "Users" /SC MINUTE /TN "ITSM Uptime mesaji" /TR "powershell -ExecutionPolicy RemoteSigned -WindowStyle Hidden %s"'%file_path)
ecmd('schtasks /create /RU "Users" /SC MINUTE /mo 5 /TN "ITSM Uptime mesaji" /TR "wscript.exe %s"'%vb_path)


---------------------------------------------------------------------------------------------------------

Eğer elle yüklemek isterseniz

Powershell komutu oluşturmalısınız. ve ps1 olarak kayıt etmelisiniz.


 --------------------------------------------------------------------------------------------------------



[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

#Add-Content   "c:\Windows\Temp est.txt" "The End"

$reset = Get-WmiObject Win32_OperatingSystem | Select-Object CSName,LastBootUpTime

$rst = [Management.ManagementDateTimeConverter]::ToDateTime($reset.LastBootUpTime)
Write-Host $rst
$duration1 =  (New-TimeSpan -Start $rst -End (Get-Date )).TotalDays

#[System.Windows.Forms.MessageBox]::Show("deneme");
$duration = [int]$duration1

$Ertele=
{
  #[System.Windows.Forms.MessageBox]::Show("deneme");
 $Form.Close();
}
if ($duration -gt -1)
{
    $msg =  "Dikkat: $duration Gundur bilgisayarinizi kapatmiyorsunuz.
Lutfen bilgisayarinizi yeniden baslatiniz.
Bilgisayarinizi yeniden baslatana kadar bu mesaj her
1 dakikada bir ekraniniza cikacaktir.
Mesai bitiminde lutfen bilgisayarinizi kapatiniz.
---------------------------------
You haven't shut down your computer for $duration days.
Please restart your computer.
This message will appear every 1 minutes until you restart your computer.
Please turn off your computer after the end of work."



   $Form = New-Object system.Windows.Forms.Form
   $Form.TopMost = $True
   $Form.Text = " IT Service";
   $form.StartPosition = 1;
   $Form.FormBorderStyle = 0;
   $Form.ControlBox = 0;
   $Form.AutoSizeMode = 0;
   $Font = New-Object System.Drawing.Font("Arial",11,[System.Drawing.FontStyle]::Normal)

   $Image = [system.drawing.image]::FromFile("back.jpg")

   $Form.BackgroundImage = $Image

   $Form.BackgroundImageLayout = "None"

   $form.Size = New-Object System.Drawing.Size(600,285);


   $Label = New-Object System.Windows.Forms.Label
   $Label.Text = $msg;
   $Label.Font = $Font
   $Label.AutoSize = $True
   $Label.Location =  New-Object System.Drawing.Point(20,30);
   $Label.BackColor = "Transparent"
   $Form.Controls.Add($Label)
 
   $btn = New-Object System.Windows.Forms.Button
   $btn.Text = "1 dakika ertele / 1 minute skip ";
   $btn.Location =  New-Object System.Drawing.Point(270,230);
   $btn.Size =  New-Object System.Drawing.Size(300,32);
   $btn.Add_Click($Ertele);
   $Form.controls.add($btn);
   $Form.ShowDialog()
}



-----------------------------------------------------------------------------------------------------------

zamanlanmış göreve eklemek içinse bir vb script dosyası oluşturup zamanlanmış göreve eklemelisiniz.


Dim ws
Set ws=CreateObject("WScript.Shell")
cmd="powershell -windowstyle hidden -nologo C:\ITSM1\itsm_1h.ps1"
ws.Run cmd, 0


-----------------------------------------------------------------------------------------------------------

Zamanlanmış göreve ekleme




Hepsi bu kadar...