2012-07-03 3 views
1

주어진 사용자가 볼 수있는 레코드를 감사하는 방법을 결정하려고합니다. 기록주어진 사용자가 SalesForce.com에서 볼 수있는 레코드의 감사

이상적으로

개체 유형

레코드 유형

카운트 또한 사용자가 볼 수있는 입력 각 개체/레코드의 필드를 볼 수있을 것입니다.

다른 사용자와 다른 조직에 대해이 작업을 자주 반복해야하므로 수동으로 결정하지 않으려합니다.

첫 번째 생각은 파트너 WSDL을 사용하여 앱을 만드는 것이었지만 더 쉬운 접근 방법이나 기존 솔루션이 있는지 묻고 싶습니다.

덕분에 모든

답변

0

난 당신이 이것과 같은 쿼리를 사용하여 documentation가 그것을 해결하기 위해 수행 할 수 있다고 생각 :

SELECT RecordId 
    FROM UserRecordAccess 
    WHERE UserId = [single ID] 
    AND RecordId = [single ID]  //or Record IN [list of IDs] 
    AND HasReadAccess = true 

다음 쿼리는 쿼리 사용자의 레코드를 반환을 에 대한 읽기 권한이 있습니다.

또한 제한 1을 추가하고 레코드 메타 데이터에서 개체 유형, 레코드 유형 등을 가져와야합니다.

+0

마틴, 나는 이것이 해결책의 일부일 수 있다고 생각하지만,이 쿼리에는 단일 ID 또는 ID 집합이 필요합니다. 모든 규모가 큰 조직에 존재하는 모든 레코드 ID를 전달하는 것은 잘 확장되지 않습니다. 다른 생각? –

0

사용자가 어떤 종류의 개체를 볼 수 있는지에 대한 아이디어를 얻기 위해 아래 (C# Partner WSDL 사용)를 사용했습니다.

내 자신 만의 사용을위한 quick'n'dirty 유틸리티 (읽기 - 코드하지 않음);

var service = new SforceService(); 

var result = service.login("UserName", "Password"); 

service.Url = result.serverUrl; 
service.SessionHeaderValue = new SessionHeader { sessionId = result.sessionId }; 

var queryResult = service.describeGlobal(); 

int total = queryResult.sobjects.Count(); 

int batcheSize = 100; 
var batches = Math.Ceiling(total/(double)batcheSize); 


using (var output = new StreamWriter(@"C:\test\sfdcAccess.txt", false)) 
{ 

    for (int batch = 0; batch < batches; batch++) 
    { 
     var toQuery = 
      queryResult.sobjects.Skip(batch * batcheSize).Take(batcheSize).Select(x => x.name).ToArray(); 

     var batchResult = service.describeSObjects(toQuery); 

     foreach (var x in batchResult) 
     { 
      if (!x.queryable) 
      { 
       Console.WriteLine("{0} is not queryable", x.name); 
       continue; 
      } 

      var test = service.query(string.Format("SELECT Id FROM {0} limit 100", x.name)); 

      if(test == null || test.records == null) 
      { 
       Console.WriteLine("{0}:null records", x.name); 
       continue; 
      } 

      foreach (var record in test.records) 
      { 
       output.WriteLine("{0}\t{1}",x.name, record.Id); 
      } 

      Console.WriteLine("{0}:\t{1} records(0)", x.name, test.size); 
     } 
    } 
    output.Flush(); 
} 
관련 문제