2017-06-06 140 views
0

我想知道是否可以从x字符到y字符读取某个长度的字符串,而不必将其分割为更小的片段。从某个字符读取字符串

我有以下字符串,在AD CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com的路径,我想能够只是读它的someName部分,斗而不破的=,第一。我如何实现这一目标?

原因是,我没有做组比较,因为我做的是现在:

SearchResult t1 = search.FindOne(); 
foreach (string s in t1.Properties["memberof"]) 
{ 
    foreach (string g in groups) 
    { 
     if (s.ToLower().Contains(g.ToLower())) 
     { 
      // do something 
     } 
    } 
} 

如果子句等号我宁愿做,但我不希望总是分裂上面的路径/组成一个数组两次。我怎么做?

+2

_“我没有做组间比较” _我不明白,是什么'groups'? –

+0

@TimSchmelter我正在比较某个用户是否在某个组中,为了检查权限,'groups'是一组有效的组。另外,正如我所说,我想避免使用数组,如果可能的话,我是相对较新的编程,所以我不知道所有的语法,例如LINQ等... – EInherjar

回答

4

使用简单的字符串操作与IndexOfSubstring

string s = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 

const string prefix = "CN="; 
int start = s.IndexOf(prefix); 
if (start >= 0) 
{ 
    string value = s.Substring(start + prefix.Length, s.IndexOf(',', start) - prefix.Length); 
    Console.WriteLine(value); 
} 

注意,这个简单的例子将失败如果CN=项是最后行(因为它不是由逗号结尾)。您可以通过查看第二个IndexOf调用的返回值来检查。

但是在这种情况下,无论如何CN=通常是第一件事。

0

With Split您可以检查是否有任何给定的键等于搜索值。

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
var prefix = "CN"; 
var searchValue = "someName"; 
var contains = val.Split(',').Any(value => value.Split('=')[0] == prefix && value.Split('=')[1] == searchValue); 

缺省情况下,检查值是否等于搜索值,您也可以返回该值。

var val = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
var prefix = "CN"; 
var foundValue = val.Split(',').FirstOrDefault(value => value.Split('=')[0] == prefix)?.Split('=')[1]; 

我还是习惯Split尽管你说你不想使用它,因为我认为它使一个很好的一个衬垫。

+0

我只想看看''CN =“'前缀,因为这是组名来自的地方,但是谢谢 – EInherjar

+0

@EInherjar我改变了它寻找CN =前缀的代码。或者我误解了你? – NtFreX

+0

@EInherjar并且此解决方案可以在字符串中的任何位置使用cn。 – NtFreX

0

您可以使用String.IndexOf查找正确的偏移量,然后使用String.SubString来读取所需的部分。

const string input = "CN=someName,OU=someGroup,OU=groups,DC=some,DC=domain,DC=com"; 
const string start = "CN="; 
const string stop = ","; 

int startIndex = input.IndexOf(start, 0); 
int stopIndex = input.IndexOf(stop, startIndex); 

var extracted = input.Substring(startIndex + start.Length, stopIndex - startIndex - start.Length); 

Console.WriteLine(extracted); 

.net Fiddle

PS:也许还看一看Is there a .NET class that can parse CN= strings out of LDAP?为您的特殊用例!

1

如果你正在做的组间比较,我会用System.DirectoryServices.AccountManagement命名空间

PrincipalContext Context = new PrincipalContext(ContextType.Domain, ""); 
UserPrincipal Usr = UserPrincipal.FindByIdentity(Context, "User"); 
GroupPrincipal G = GroupPrincipal.FindByIdentity(Context, "Group"); 

if(Usr.IsMemberOf(G)) { 

} 
+0

这会起作用,但是如果允许组的数组中存在组,但它在AD中不存在,则会中断。有什么办法可以绕过这个? – EInherjar