kullanarak DNS ayarlarını değiştirme Mac'imdeki (10.10.4) DNS sunucularını PyObjC (3.0.4) kullanarak değiştirmeye çalışıyorum. görünüyor PyObjC
Her şey çalışmak: Ben bir kimlik doğrulama iletişim programım ağ ayarlarını değiştirmek için çalıştığını isteyen almak ve uygulamak/taahhüt komutları başarılı olup belirtmek istiyorum True
, dönün. Bununla birlikte, sistem ayarları aslında değişmez: daha önce olduğu gibi kalırlar. Neden "sopa" yapmıyorlar?
kodu (bağımsız, sen PyObjC bir üst sürümü yüklüyse çalışması gerekir):
#!/usr/bin/env python
import objc
from SystemConfiguration import *
# Open dynamic store and get primary interface
store = SCDynamicStoreCreate(None, 'MyApp', None, None)
primaryif = SCDynamicStoreCopyValue(store, 'State:/Network/Global/IPv4')['PrimaryInterface']
if primaryif:
print "Using %s as primary interface" % primaryif
else:
raise "Can't find primary interface"
# Load SecurityInterface framework to provide SFAuthorization
objc.initFrameworkWrapper(
frameworkName = "SecurityInterface",
frameworkIdentifier = "com.apple.securityinterface",
frameworkPath = objc.pathForFramework("/System/Library/Frameworks/SecurityInterface.framework"),
globals = globals()
)
# Access system preferences
preferences = SCPreferencesCreateWithAuthorization(None, 'MyApp', None, SFAuthorization.authorization().authorizationRef())
# Lock preferences
SCPreferencesLock(preferences, True)
# Get list of network services
networkSet = SCNetworkSetCopyCurrent(preferences)
networkSetServices = SCNetworkSetCopyServices(networkSet)
# Find the network service that belongs to the primary interface
for networkService in networkSetServices:
interface = SCNetworkServiceGetInterface(networkService)
if primaryif != SCNetworkInterfaceGetBSDName(interface):
continue
# Load currently configured DNS servers
networkProtocol = SCNetworkServiceCopyProtocol(networkService, kSCNetworkProtocolTypeDNS)
DNSDict = SCNetworkProtocolGetConfiguration(networkProtocol) or {}
# Set new DNS servers
DNSDict[kSCPropNetDNSServerAddresses] = [ '192.168.23.12', '8.8.4.4' ]
SCNetworkProtocolSetConfiguration(networkService, DNSDict)
# Unlock, commit and apply preferences
print "UL", SCPreferencesUnlock(preferences)
print "CO", SCPreferencesCommitChanges(preferences)
print "AP", SCPreferencesApplyChanges(preferences)
DÜZENLEME: Yukarıdaki kod çoğu da "dokunaklı" anlaşılacağı this page dayanmaktadır ayarları saklamak için dinamik mağaza (bunu yapmak için kod sonunda doğru yorumlanır). Ancak, hiçbir şey yapmıyor gibi görünüyor.
DÜZENLEME 2.: /usr/sbin/networksetup
demonte tarafından ben herhangi bir değişiklik kabul edilmeden önce belirli haklara (system.services.systemconfiguration.network
) bir dizi gerekir fikir alıyorum.
"sudo" kullanarak komut dosyasını çalıştırmayı denediniz mi? –
@ l'L'l evet, bu hiçbir şeyi değiştirmiyor (tam anlamıyla) :-( – robertklep
Sadece komut dosyasını denedim ve yetkilendirme istedikten sonra bir hata alıyorum: 'DNSDict [kSCPropNetDNSServerAddresses] = ['192.168.23.12' , '8.8.4.4'] TypeError: 'NoneType' nesnesi öğe atamasını desteklemiyor ' –