Piszę oprogramowanie, które często musi uruchamiać polecenie z uprawnieniami roota.Zyskaj uprawnienia administracyjne dzięki aplikacji Swift dla komputerów Mac
W tej chwili robię to, prosząc użytkownika o jego hasło raz, zapisując je, a następnie przekazując to hasło do NSAppleScript
jako argument wraz z with administrator privileges
.
To oczywiście jest bardzo niebezpieczne dla użytkownika, ponieważ ktoś może uzyskać dostęp do jego hasła.
Szukałem lepszej części tygodnia i nie mogę znaleźć rozwiązania.
SMJobBless wydaje się pozwalać na zainstalowanie aplikacji z wyższymi uprawnieniami.
Podążyłem za przykładem aplikacji i otrzymuję błąd z ich skryptu SMJobBlessUtil.
Tutaj jest błąd:
SMJobBlessUtil.py: tool designated requirement (identifier "com.domain.AppName.SampleService" and anchor apple generic and certificate leaf[subject.CN] = "Mac Developer: firstName lastName (XXXXXXXXXX)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */) doesn't match entry in 'SMPrivilegedExecutables' (anchor apple generic and identifier "com.domain.AppName.SampleService" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.CN] = "Mac Developer: firstName lastName (XXXXXXXXXX)")
Oczywiście, coś jest nie tak. Oto poszczególne listy właściwości
Usługi Info 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>CFBundleIdentifier</key>
<string>com.domain.AppName.SampleService</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>SampleService</string>
<key>CFBundleVersion</key>
<string>6</string>
<key>SMAuthorizedClients</key>
<array>
<string>anchor apple generic and identifier "com.domain.AppName" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = xxxxxxxxxx)</string>
</array>
</dict>
</plist>
Aplikacje Informacje 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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<dict/>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleGetInfoString</key>
<dict/>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Away</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0.99</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>9</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
<key>LSUIElement</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2016 firstName lastName. All rights reserved.</string>
<key>NSMainStoryboardFile</key>
<string>Main</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>SMPrivilegedExecutables</key>
<dict>
<key>com.domain.AppName.SampleService</key>
<string>anchor apple generic and identifier "com.domain.AppName.SampleService" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.CN] = "Mac Developer: firstName lastName (XXXXXXXXXX)"</string>
</dict>
</dict>
</plist>
szukałem at this stackoverflow post i wiele innych lubią to. Jak je rozumiem, mam poprawnie ustawione pliki. Co ja robię źle?
Nie miałem zamiaru utrzymywać nagrody. Problem z twoim wpisem na Reddicie polega na tym, że mówi ciąg. Naprawdę przypadkowo natknąłem się na permutację. Ale odpowiedź jest wystarczająco dobra. Zalecam, aby edytować swoje pytanie, aby uwzględnić krok po kroku niezbędne zmiany w stosunku do pierwotnego pytania. Utknąłem na tym przez kilka dni i nadal nie rozumiem, jak niezupełna linia tożsamości jest wystarczająca, podczas gdy jabłko ma znacznie dłuższy ciąg – Cripto
Cóż, teraz nie czuję się głupcem. Ponownie, nagroda nie była konieczna, ale jest bardzo doceniana ... Zaktualizowałem swoją odpowiedź, aby spróbować wyjaśnić ogólne uzasadnienie, jak również szczegóły, o które prosiłeś; nie wahaj się, jeśli to nie obejmuje. –