Ах, радости от попытки получить доступ к сетевым ресурсам с удаленного компьютера. Вы потеряете все, что связано с учетной записью домена, делая то, что вы делаете. Это просто, как это работает. Хорошей новостью является то, что есть еще способ получить нужную информацию, и вы даже можете использовать Get-WmiObject
, чтобы сделать это, если хотите. Если вы еще не переименовали группу «Администраторы» (потому что на самом деле, кто это делает?), Вы можете сделать это легко, но если вы это сделали и вам нужно искать группу по SID, как вы выше, вам придется запросить удаленный сервер, как вы, и внесите коррективы с помощью запроса ниже с измененным именем, которое вы получите. Вот что я бы порекомендовал сделать, используя вместо этого класс Win32_GroupUser:
Get-WmiObject -ComputerName $Server -Query "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$computerName',Name='Administrators'"""
Чтобы поставить его вместо того, что вы используете для своей функции, он может выглядеть примерно так:
function Get-LocalAdminGroupMember {
param(
[String] $computerName,
[System.Management.Automation.PSCredential] $credential
)
$params = @{
"ComputerName" = $computerName
"Query" = "SELECT * FROM win32_GroupUser WHERE GroupComponent = ""Win32_Group.Domain='$computerName',Name='Administrators'"""
}
if ( $credential ) {
if ( $computerName -eq [Net.Dns]::GetHostName() ) {
Write-Warning "The -Credential parameter is ignored for the current computer."
}
else {
$params.Add("Credential", $credential)
}
}
Get-WmiObject @params |
Where{ Ах, радости от попытки получить доступ к сетевым ресурсам с удаленного компьютера. Вы потеряете все, что связано с учетной записью домена, делая то, что вы делаете. Это просто, как это работает. Хорошей новостью является то, что есть еще способ получить нужную информацию, и вы даже можете использовать Get-WmiObject
, чтобы сделать это, если хотите. Если вы еще не переименовали группу «Администраторы» (потому что на самом деле, кто это делает?), Вы можете сделать это легко, но если вы это сделали и вам нужно искать группу по SID, как вы выше, вам придется запросить удаленный сервер, как вы, и внесите коррективы с помощью запроса ниже с измененным именем, которое вы получите. Вот что я бы порекомендовал сделать, используя вместо этого класс Win32_GroupUser:
[110] Чтобы поставить его вместо того, что вы используете для своей функции, он может выглядеть примерно так:
[111].PartComponent -match ':(.+?)\.Domain="(.+?)",Name="(.+?)"'}|
ForEach{
[PSCustomObject]@{
"ComputerName"=$computerName
"Name"='Administrators'
"Member"=$Matches[2..3] -join '\' -replace "^$computerName\\"
"Type"=$Matches[1]
}
}
}
Используя ItemContainerGenerator, вы можете получить сгенерированный контейнер для элемента и пройти по визуальному дереву вниз, чтобы найти ваш TextBox. В случае ItemsControl это будет ContentPresenter, но ListBox вернет ListBoxItem, ListView a ListViewItem и т. Д.
ContentPresenter cp = itemsControl.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
TextBox tb = FindVisualChild<TextBox>(cp);
if (tb != null)
{
// do something with tb
}
public static T FindVisualChild<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
return (T)child;
}
T childItem = FindVisualChild<T>(child);
if (childItem != null) return childItem;
}
}
return null;
}
Вы также можете получить контейнер по индексу, если хотите, используя
itemsControl.ItemContainerGenerator.ContainerFromIndex(0);
Вы можете попробовать использовать VisualTreeHelper . Свойства самого ItemsControl позволят вам получить только данные, к которым он привязан, но не экземпляры шаблонов, используемые для визуализации данных, в то время как VisualTreeHelper позволяет просматривать визуальное дерево по мере его визуализации WPF.
Если вы выполняете итерацию через визуальных дочерних элементов родительского ItemControl (рекурсивно), у вас не должно возникнуть проблем с поиском текстовых полей, которые вы видите на экране.
Thanks Bryce, I tried to tick the up arrow but it says my rating is too low! Sorry!
I amended the code to return all a list of all the children of the given type as it was what I needed and thought someone else might find it useful.
Thanks again Bryce, really helpful - sorry about the rating thing!
public static List<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
List<T> list = new List<T>();
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
list.Add((T)child);
}
List<T> childItems = FindVisualChildren<T>(child);
if (childItems != null && childItems.Count() > 0)
{
foreach (var item in childItems)
{
list.Add(item);
}
}
}
}
return list;
}
Если у вас есть грид данных и колонка шаблона, которая содержит шаблон данных, вы можете использовать следующий пример кода
<DataGridTemplateColumn x:Name="photoPathColumn" Header="{x:Static resx:FrmResource.Photo}">
<DataGridTemplateColumn.CellEditingTemplate x:Uid="keyelm">
<DataTemplate x:Name="dodo">
<StackPanel Orientation="Horizontal" Height="Auto">
<TextBlock x:Name="photo" x:Uid="imageFile" Text="{Binding Path=PhotoPath}" />
<Button x:Name="Browse" Content="..." Click="Browse_Click" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
photoPathColumn.CellEditingTemplate.FindName("photo",photoPathColumn.GetCellContent(CustomersDataGrid.CurrentItem))