Функция NetScheduleJobAdd

Declare Function NetScheduleJobAdd Lib "netapi32.dll" _
        (ByVal servername As String, Buffer As Any, _
        Jobid As Long) As Long

NetScheduleJobAdd добавляет задачу, которая должна быть выполнена в заданные дату и время. Это функция требует наличия службы Планировщик задач на компьютере, на которой добавляется новая задача. Для установки задачи на удаленном компьютере нужно обладать правами администратора.

Возвращаемое значение

В успешном случае функция возвращает NERR_Success. В случае ошибки функция возвращает коды ошибок

Параметры

servername
Указатель на строку, определяющую DNS или NetBIOS-имя удаленного сервера, на котором запускается функция. Строка должна начинаться с \\. Если параметр равен 0, то используется локальный компьютер
Buffer
Указатель на структуру AT_INFO, описывающую добавляемую задачу
JobId
Идентификатор добавляемой задачи

Пример

Private Declare Function GetComputerName Lib "kernel32.dll" _
        Alias "GetComputerNameA" _
        (ByVal lpBuffer As String, nSize As Long) As Long
        
Private Declare Function NetScheduleJobAdd Lib "netapi32.dll" _
        (ByVal servername As String, Buffer As Any, _
        Jobid As Long) As Long
        
Private Declare Function NetScheduleJobDel Lib "netapi32.dll" _
        (ByVal servername As String, ByVal MinJobId As Long, _
        ByVal MaxJobId As Long) As Long

Private Type AT_INFO
    JobTime     As Long
    DaysOfMonth As Long
    DaysOfWeek  As Byte
    Flags       As Byte
    dummy       As Integer
    Command     As String
End Type

'Schedule constants
'If you set this flag, the job runs, and
'continues to run, on each day for which a
'corresponding bit is set in the DaysOfMonth
'or DaysOfWeek member. The job is not deleted
'after it executes.
'If this flag is clear, the job runs only once
'for each bit set in these members. The job is
'deleted after it executes once.
Const JOB_RUN_PERIODICALLY = &H1

'If you set this flag, the job executes at the
'first occurrence of JobTime at the computer
'where the job is queued.
'Setting this flag is equivalent to setting
'the bit for the current day in the DaysOfMonth
'member.
Const JOB_ADD_CURRENT_DATE = &H8

'If you set this flag, the job does not run interactively.
'If this flag is clear, the job runs interactively.
Const JOB_NONINTERACTIVE = &H10

Const NERR_Success = 0

Public Enum enWeekDays
    enMonday = 1
    enTuesday = 2
    enWednesday = 4
    enThursday = 8
    enFriday = 16
    enSaturday = 32
    enSunday = 64
End Enum

Public Function AddScheduleTask(strTime As String, strCommand As String, _
                        Optional enDaysInWeek As enWeekDays = -1, _
                        Optional strDaysInMonth As String = "", _
                        Optional RunInteractive As Boolean = True, _
                        Optional ReOccuring As Boolean = True) As Long

On Error GoTo Hell

'Default return value (failure)
AddScheduleTask = -1

'Convert the computer name to unicode
Dim strComputerName As String
strComputerName = StrConv(GetCompName, vbUnicode)

'Setup Task Structure
Dim udtAtInfo As AT_INFO
With udtAtInfo
    .JobTime = (Hour(CDate(strTime)) * 3600 + Minute(CDate(strTime)) * 60) * 1000

    'Set the task period
    If enDaysInWeek > -1 Then
        'Get the days of the week from the constants
        .DaysOfWeek = enDaysInWeek
    ElseIf Len(strDaysInMonth) > 0 Then
        'Loop through all days of the month passed
        ' and set the bits
        Dim i As Long
        Dim strDates() As String
        strDates = Split(strDaysInMonth, ",")
        For i = 0 To UBound(strDates)
            .DaysOfMonth = .DaysOfMonth + 2 ^ (strDates(i) - 1)
        Next
    End If

    'Set Flags
    If ReOccuring Then
        .Flags = JOB_RUN_PERIODICALLY
    End If

    If Not RunInteractive Then
        .Flags = .Flags Or JOB_NONINTERACTIVE
    End If

    'Set the command to run
    .Command = StrConv(strCommand, vbUnicode)
End With

'Schedule
Dim lngJobID As Long
Dim retVal As Long
retVal = NetScheduleJobAdd(strComputerName, udtAtInfo, lngJobID)

'Check for success
If retVal = NERR_Success Then AddScheduleTask = lngJobID

Exit_For:
    On Error GoTo 0
    Exit Function

Hell:
     GoTo Exit_For

End Function

Public Function DeleteScheduleTask(lngID As Long) As Boolean

On Error GoTo Hell

'Convert the computer name to unicode
Dim strComputerName As String
strComputerName = StrConv(GetCompName, vbUnicode)

'Delete Task
Dim retVal As Long
retVal = NetScheduleJobDel(strComputerName, lngID, lngID)

'Return success
If retVal = NERR_Success Then DeleteScheduleTask = True

Exit_For:
    On Error GoTo 0
    Exit Function

Hell:
     GoTo Exit_For

End Function

Private Function GetCompName() As String

Dim retVal As Long

'Create a string buffer for the computer name
Dim strCompName As String
strCompName = Space(255)

'Retrieve the Computer name
retVal = GetComputerName(strCompName, 255)

'Remove the trailing null character from the string
GetCompName = Left(strCompName, InStr(strCompName, vbNullChar) - 1)

End Function

Private Sub Command1_Click()
    AddScheduleTask "28.08.2007", "AlertMe"
End Sub

Private Sub Command2_Click()
    DeleteScheduleTask 1
End Sub

Смотри также

NetSheduleJobDel, NetSheduleJobEnum

Категория

Network Management