Ist es möglich, die Nutzung einer App oder eines Programms für bestimmte Zeiten auf einem Mac zuzulassen?

Ich habe versucht, dies mit einem zweiten Konto (das ist das Administratorkonto) und der Kindersicherung zu erreichen, aber es schien, dass dies nicht möglich ist.

Ich weiß, dass es einige Programme gibt, die Sie herunterladen können, die Ihnen dabei helfen (Cold Turkey zum Beispiel). Aber es wäre viel einfacher, wenn ich dies nur mit Tools tun könnte, die bereits auf macOS verfügbar sind.

Zu welchen Zeiten? Ich werde ein Skript erstellen.
Ich möchte die App nur zwischen 12:01 Uhr und 23:59 Uhr, jede Woche am Freitag, nutzen. Den Rest der Woche soll es gesperrt bleiben. Vielen Dank im Voraus!
Meinst du "12:00 Uhr und 23:59 Uhr"?

Antworten (2)

Sie können dies mit zwei integrierten Tools tun:

  • Gatekeeper, um den Zugriff auf Apps zuzulassen/zu verbieten (ich habe darüber in diesem Beitrag geschrieben )
  • Launchd, um den Zeitplan zu handhaben

Pförtner

Mit Gatekeeper können wir „Regeln“ erstellen, mit denen Sie Apps blockieren/aktivieren können. Anhand Ihres Beispiels können wir eine Liste von Apps erstellen, die nur freitags ausgeführt werden dürfen:

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

Der Vorteil davon ist, dass Sie mehrere Apps mit demselben Label hinzufügen und mit einem einzigen Befehl aktivieren/deaktivieren können:

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

Launchd

Dazu benötigen Sie ein einfaches Skript zum Aktivieren/Deaktivieren der Apps, und Sie müssen dieses als Daemon ausführen (benötigt sudoPrivilegien), sodass es sich in /Library/LaunchDaemons.

Ich habe die Namenskonvention com.user.FridayApps.plistund FridayApp.shfür das Skript verwendet.

Bash-Skript:

#!/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

Launchd.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

Wie das funktioniert

Was hier passiert, sind zwei Dinge:

  • launchdführt ein Skript zweimal aus. Einmal zum Einschalten und ein anderes Mal zum Ausschalten
  • ein einfaches Bash-Skript zum Ein-/Ausschalten der aktivierten App. Es überprüft das Datum und führt dann den entsprechenden Befehl aus
Wusste nicht, dass du Gatekeeper verwenden kannst. Danke!
Es gibt ein kleines Problem: Wenn der Computer genau in der Sekunde ausgeschaltet ist, in der launchd ausgeführt wird, kann die Person die App den ganzen Tag nicht verwenden.
@JBis - wahr. Ich habe vergessen, den RunAtLoad-Schlüssel hinzuzufügen, damit das Skript automatisch ausgeführt wird und beim Booten den richtigen Status einstellt.
Habe vergessen wie das geht. Wenn ich jetzt darüber nachdenke, könnte ich meine ändern. Darf ich Ihre Kalenderintervalle kopieren?
Wegkopieren...hier ist nichts proprietär!
Gibt es auch eine Möglichkeit (für den Benutzer) zu visualisieren, ob es ein- oder ausgeschaltet ist, ohne die Anwendung zu öffnen?
@JBis - spctl -a /Applications/AppName.appteilt Ihnen mit, ob es aktiviert oder deaktiviert ist. Ich habe ein Benachrichtigungsskript geschrieben, das auf dem Kontext einer Textdatei basiert – es ist nicht zu schwer, es für diese Anwendung zu ändern: apple.stackexchange.com/q/257541/119271
Danke. Ich vermute, Konfigurationsprofile interagieren ähnlich mit Gatekeeper. Und können Sie dies umgehen, indem Sie den Benutzernamen und das Passwort des Administrators eingeben?
Ja. Solange Sie Administratorrechte haben, können Sie dies umgehen. Ich führe es als Daemon aus, da dies Root-Privilegien erfordert (sudo)

Lesen Sie die Einleitung

Im folgenden Tutorial werden Sie Folgendes tun:

  1. Erstellen Sie ein Konfigurationsprofil , das Anwendungen in einem bestimmten Pfad blockiert
  2. Eine Anwendung , die das Profil je nach Tag hinzufügt und entfernt
  3. Ein LaunchDaemon , der die Anwendung in jedem Intervall (5 Minuten) ausführt

Erstellen Sie die App

Öffnen Sie dies im Skripteditor und exportieren Sie es als schreibgeschützte Anwendung und stellen Sie sicher, dass es geöffnet bleibt, nachdem der Run-Handler nicht aktiviert ist

Befolgen Sie nach dem Exportieren diese Anleitung, um zu verhindern, dass es im Dock angezeigt wird.

   # 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

Erstellen Sie die Mobile-Konfiguration

Verwenden

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

um zu steuern, welche Apps blockiert werden sollen.

Speichern Sie Folgendes in einer Datei mit der Erweiterung.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>

Erstellen Sie den LaunchDaemon

Hinweis: Sie müssen dazu Administrator sein.

Speichern Sie die folgende Datei unter/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>

Ändern Sie die Berechtigungen mit dem folgenden Befehl:

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

Laden Sie den Daemon

Hinweis: Sie müssen dazu Administrator sein.

Um den Daemon zu starten, verwenden Sie diesen Befehl:

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

Das Programm sucht alle 5 Sekunden nach den Apps und schließt sie, wenn sie ausgeführt werden.

Verwenden Sie diesen Befehl, um den Daemon zu stoppen

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

Applaudieren Sie sich selbst

  1. Applaudieren Sie sich