如何以编程方式使用目标c在Mac OS X中启用或不启用文件共享?

时间:2016-02-18 08:09:15

标签: objective-c macos

我花了2天时间使用Objective C以编程方式查找文件共享的状态。我们可以使用SharingPreferences使用系统首选项启用文件共享。文件共享首选项窗格存储在/ System / Library / PreferencePanes位置。我们可以从PreferencePanes类中检索文件共享状态信息吗?如果那么我们如何检索?。

我们可以从系统存储的plist文件中获取文件共享状态,plist文件状态是否保持?

OR Objective C的任何其他API我们可以通过获取文件共享状态吗?

3 个答案:

答案 0 :(得分:1)

我认为没有直接的api来获得这种状态,但可以通过其他方式获得。

  1. 检查端口548和445是否已打开。 548用于当前未使用的AFP,但当您打开文件共享时,它也打开AFP。 445是新的SMB共享端口。
  2. 使用NSNetServiceBrowser,您可以查看广告_afpovertcp._tcp的计算机列表。或_smb._tcp。服务,看看你的电脑是否在其中。您可以使用IP或计算机名称来确定这一点。

答案 1 :(得分:0)

您可以通过检查相应的launchd守护进程的状态,使用ServiceManagement.framework来执行此操作。

@import ServiceManagement;

NSArray  *allJobs =  (NSArray *)CFBridgingRelease(SMCopyAllJobDictionaries(kSMDomainSystemLaunchd));
NSArray  *labels = [allJobs valueForKey:@"Label"];

BOOL AFPSharingIsEnabled = [labels containsObject:@"com.apple.AppleFileServer"];
BOOL SMBSharingIsEnabled = [labels containsObject:@"com.apple.smbd"];

NSLog(@"AFPSharingIsEnabled: %d - SMBSharingIsEnabled: %d", AFPSharingIsEnabled, SMBSharingIsEnabled);
传递SMCopyAllJobDictionaries的{​​p> kSMDomainSystemLaunchd与shell中的sudo launchctl list类似。

虽然不推荐使用SMCopyAllJobDictionaries,但没有替换,而且API在El Capitan中有效。

答案 2 :(得分:0)

我上面快速而肮脏地实施了Pradeeps的建议。 基本上我想快速确定(1秒或更短)哪个 尝试安装第一个,afp或smb。

请注意,这些对象/类特定于我的实现:

// my specific server implementation details
MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];

task.targetServerName

NSString * mountedBasePath

static BOOL hasAfp;
static BOOL hasSmb;
// delegate callback
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
   MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];
   if ( mbox && netServiceMboxName && [[mbox name] isEqualToString:netServiceMboxName] )
   {
      if ( [[aNetService type] rangeOfString:@"_afpovertcp"].length )
         hasAfp = YES;
      if ( [[aNetService type] rangeOfString:@"_smb"].length )
         hasSmb = YES;

   }
}

开始提供服务......

  /////////////////////////// AFP or SMB? //////////////////////////////////
  // quickly determine if afp or smb is enabled
  if ( !mountedBasePath && task.targetServerName )
  {
     netServiceMboxName = [task.targetServerName copy];
     if ( !netServiceBrowserAfp )
     {
        netServiceBrowserAfp = [[NSNetServiceBrowser alloc] init];
        if ( !netServices )
           netServices = [[NSMutableArray alloc] init];
        [netServiceBrowserAfp setDelegate:self];

        netServiceBrowserSmb = [[NSNetServiceBrowser alloc] init];
        if ( !netServices )
           netServices = [[NSMutableArray alloc] init];
        [netServiceBrowserSmb setDelegate:self];
     }
     hasAfp = hasSmb = NO;
     [netServiceBrowserAfp searchForServicesOfType:@"_afpovertcp._tcp." inDomain:@""];
     [netServiceBrowserSmb searchForServicesOfType:@"_smb._tcp." inDomain:@""];

     for (int i = 0; i < 10; i++ )  // afp is preferred over smb because it is less restrictive (no date/clock restriction)
     {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
        if (hasAfp) break;
     }
     NSLog( @"hasAfp %d hasSmb %d", hasAfp, hasSmb );
     if ( hasSmb && !hasAfp )
        tryingAfp = NO; // don't bother trying afp if only smb found

     [netServiceBrowserAfp stop];
     [netServiceBrowserSmb stop];
     /////////////////////////// AFP or SMB? ///////////////////////////////
  }