2013-08-06 73 views
3

如何查詢Mac OS X鑰匙串以僅檢索會話項目?區分Mac OS X鑰匙串中的會話和系統項目

當我試圖讓所有的項目是這樣的:

[SSKeychain accountsForService:nil]; 

會話項目和系統項目具有完全相同的鑰匙相同的屬性:ACCT,CDAT,階級,CRTR,LABL,MDAT,svce

y如何查詢鑰匙串只獲取會話項或區分它們?

謝謝你的幫助!

回答

0

我已經通過打開發現用戶鑰匙串:

NSArray *path = [NSHomeDirectory() pathComponents]; 
NSString *keychainPath = [NSString stringWithFormat:@"%@%@/%@%@",path[0],path[1],path[2],@"/Library/Keychains/login.keychain"]; 
SecKeychainRef ref = NULL; 
SecKeychainOpen([keychainPath UTF8String],&ref); 
0

您可以查詢會話密碼,就像這樣(用kSecMatchLimitAll取代kSecMatchLimitOne,如果你需要的所有密碼的attributes將在這種情況下CFArrayRef類型):

NSDictionary* passwordQuery = @{ 
    (__bridge id)kSecAttrService : sessionServiceName, 
    (__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, 
    (__bridge id)kSecReturnAttributes: (__bridge id)kCFBooleanTrue, 
    (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue, 
    (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne 
}; 

CFTypeRef attributes = nil; 
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)passwordQuery, &attributes); 
if (status != 0){ 
    return nil; 
} 
+0

我已經有所有項目但我只想要會話項目而不是系統項目 – malinois

+0

哦,好的。然後(可能)在創建項目時使用有效的'kSecAttrService'是以後找到這些項目的唯一方法。我剛剛檢查了我的系統(OS X 10.8),併爲acct屬性(Safari,AirPort等)獲得了許多不同的值。因此,作爲選項,您可以創建「標準」服務列表,然後將其過濾掉。 –

+0

我發現了,查看我的答案 – malinois