Можно ли разрешить использование приложения или программы в определенное время на Mac?

Я пытался добиться этого, используя вторую учетную запись (которая является учетной записью администратора) и родительский контроль, но мне показалось, что это невозможно.

Я знаю, что есть несколько программ, которые вы можете скачать, которые помогут вам в этом (например, Cold Turkey). Но было бы намного проще, если бы я мог сделать это, используя только инструменты, уже доступные в macOS.

Какие времена? Я создам сценарий.
Я хочу использовать приложение только с 12:01 до 23:59 каждую неделю по пятницам. Остальную часть недели он должен оставаться заблокированным. Заранее спасибо!
Вы имеете в виду "12:00 и 23:59"?

Ответы (2)

Вы можете сделать это с помощью двух встроенных инструментов:

  • Гейткипер для разрешения/запрета доступа к приложениям (я писал об этом в этом посте )
  • Запущен для обработки расписания

Привратник

Используя Gatekeeper, мы можем создавать «правила», которые позволяют вам блокировать/разрешать приложения. Используя ваш пример, мы можем создать список приложений, которые разрешено запускать только по пятницам:

spctl --add --label "FridayApps" /Applications/SomeApp.app 

Преимущество этого в том, что вы можете добавить несколько приложений с одним и тем же ярлыком и включить/отключить их одной командой:

sudo spctl --disable --label "FridayApps"   <---- For Saturday thru Thursday
sudo spctl --enable --label "FridayApps"    <---- For Friday

Запущен

Для этого вам понадобится простой скрипт для включения/отключения приложений, и вам нужно запустить его как демон (требуется sudoпривилегия), поэтому он должен находиться в /Library/LaunchDaemons.

Я использовал соглашение об именах com.user.FridayApps.plistи FridayApp.shдля сценария.

Баш-скрипт:

#!/bin/bash

DOW=$(date +%u)   # Sets the Day of Week; 5 = Friday
TOD=$(date +%T)   # Sets the time of Day
start="12:00:00"  # Sets start time   
end="23:59:00"    # Sets end time

if [ $DOW -eq 5 ]
then
    if [[ "$TOD" > "${start}"  &&  "$TOD" < "${end}" ]]
    then
      /usr/sbin/spctl --enable --label "FridayApps"
    fi
else
    /usr/sbin/spctl --disable --label "FridayApps"
fi

Запущен.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.FridayApps</string>
    <key>ProgramArguments</key>
    <array>
        <string>/User/MyName/script/location/FridayApps.sh</string>

    </array>
    <key>StartCalendarInterval</key>
    <!--  Weekdays are 1 - 5; Sunday is 0 and 7   -->
    <array>
        <dict>
            <key>Weekday</key>
            <integer>5</integer>
            <key>Hour</key>
            <integer>12</integer>
            <key>Minute</key>
            <integer>01</integer>
        </dict>

        <dict>
            <key>Weekday</key>
            <integer>6</integer>
            <key>Hour</key>
            <integer>00</integer>
            <key>Minute</key>
            <integer>00</integer>
        </dict>
    </array>

</dict>
<key>RunAtLoad</key> 
<true/>
</plist>

##Load the `.plist`

sudo launchctl load com.user.FridayApps.plist

Как это работает

Здесь происходят две вещи:

  • launchdзапускает скрипт дважды. Один раз, чтобы запустить его, а другой раз, чтобы выключить
  • простой скрипт bash для включения/выключения включенного приложения. Он проверяет дату, а затем запускает соответствующую команду
Не знал, что можно использовать гейткипер. Спасибо!
Есть одна небольшая проблема: если компьютер выключен ровно в ту секунду, когда запускается launchd, человек не может использовать приложение в течение всего дня.
@JBis - правда. Я забыл добавить ключ RunAtLoad, чтобы скрипт автоматически запускался и устанавливал правильное состояние при загрузке.
Забыл, как это работает. Теперь, подумав об этом, я мог бы изменить свой. Не возражаете, если я скопирую ваши календарные интервалы?
Скопируйте... здесь нет ничего проприетарного!
Кроме того, есть ли способ визуализировать (для пользователя), включен он или выключен, не открывая приложение?
@JBis - spctl -a /Applications/AppName.appсообщит вам, включен он или отключен. Я написал сценарий уведомления на основе контекста текстового файла — его несложно изменить для этого приложения: apple.stackexchange.com/q/257541/119271
Спасибо. Я предполагаю, что профили конфигурации взаимодействуют с привратником аналогичным образом. И можно ли обойти это, введя логин и пароль администратора?
Да. Если у вас есть права администратора, вы можете обойти это. Я запускаю его как демон, потому что для этого требуются привилегии root (sudo)

Прочитать введение

В следующем уроке вы сделаете следующее:

  1. Создайте профиль конфигурации , который будет блокировать приложения на определенном пути.
  2. Приложение , которое будет добавлять и удалять профиль в зависимости от дня
  3. LaunchDaemon , который будет запускать приложение через каждые 5 минут.

Создать приложение

Откройте это в редакторе сценариев и экспортируйте его как приложение только для чтения и убедитесь, что он остается открытым после того, как обработчик запуска не включен.

После экспорта следуйте этому руководству, чтобы оно не отображалось в доке.

   # Block Apps Based on Day By Josh Brown
    # Last Modified: Aug 23 2018
    on run
    if checkDay("Friday") then
        do shell script "sudo profiles remove -forced -identifier com.company.macos.blockapps"
    else
        do shell script "sudo profiles install forced -path /path/to/the.mobileconfig"
    end if
end run

on checkDay(myDay)
    set currentDay to weekday of (get current date)
    if (currentDay as string) is (myDay as string) then
        return true
    else
        return false
    end if
end checkDay

Создайте мобильную конфигурацию

Использовать

<key>pathBlackList</key>
                <array>
                    <string>/path/to/an.app</string>
                    <string>/path/to/asecond.app</string>
                </array>

чтобы контролировать, какие приложения блокировать.

Сохраните следующее в файл с расширением.mobileconfig

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadIdentifier</key>
    <string>com.company.macos.blockapps</string>
    <key>PayloadRemovalDisallowed</key>
    <true/>
    <key>PayloadScope</key>
    <string>System</string>
    <key>PayloadType</key>
    <string>Configuration</string>
    <key>PayloadUUID</key>
    <string>9c24d6b3-6233-4a08-a48d-9068f4f76cf0</string>
    <key>PayloadOrganization</key>
    <string>Company Name</string>
    <key>PayloadVersion</key>
    <integer>1</integer>
    <key>PayloadDisplayName</key>
    <string>Block Apps In User Folder</string>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>PayloadType</key>
            <string>com.apple.applicationaccess.new</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>PayloadIdentifier</key>
            <string>MCXToProfile.9c24d6b3-6233-4a08-a48d-9068f4f76cf0.alacarte.customsettings.2476221c-1870-4f3e-8c52-52386029c4cf</string>
            <key>PayloadEnabled</key>
            <true/>
            <key>PayloadUUID</key>
            <string>2476221c-1870-4f3e-8c52-52386029c4cf</string>
            <key>PayloadDisplayName</key>
            <string>Blocks all apps in the ~/ directory./string>
            <key>familyControlsEnabled</key>
            <true/>
            <key>pathBlackList</key>
            <array>
                <string>/path/to/an.app</string>
                <string>/path/to/asecond.app</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

Создайте LaunchDaemon

Примечание. Для этого вы должны быть администратором.

Сохраните следующий файл в/Library/LaunchDaemons/

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>com.PlzUpvoteMy.answer</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/bin/open</string>
            <string>-W</string>
            <string>**/path/to/application.app**</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StartCalendarInterval</key>
        <!--- Creds to @Allan for Calendar Interval -->
        <!--  Weekdays are 1 - 5; Sunday is 0 and 7   -->
    <array>
        <dict>
            <key>Weekday</key>
            <integer>5</integer>
            <key>Hour</key>
            <integer>12</integer>
            <key>Minute</key>
            <integer>01</integer>
        </dict>

        <dict>
            <key>Weekday</key>
            <integer>6</integer>
            <key>Hour</key>
            <integer>00</integer>
            <key>Minute</key>
            <integer>00</integer>
        </dict>
    </array>
        <key>UserName</key>
        <string>**UserToBlock**</string>
    </dict>
</plist>

Измените разрешения с помощью следующей команды:

sudo chown root:wheel /Library/LaunchDaemons/com.MyName.plist

Загрузите демон

Примечание. Для этого вы должны быть администратором.

Для запуска демона используйте эту команду:

sudo launchctl load /Library/LaunchDaemons/com.MyName.plist 

Программа будет сканировать приложения каждые 5 секунд и закрывать их, если они запущены.

Чтобы остановить демона, используйте эту команду

sudo launchctl unload /Library/LaunchDaemons/com.MyName.plist 

Аплодируйте себе

  1. Аплодируйте себе